- 2020'de tip 1 diyabet teşhisi alan bir mühendis, kan şekeri yönetimini bir arıza müdahalesi gibi ele almak için Go tabanlı kişisel bir izleme sistemi kurdu
- Libre'nin resmi bir API veya SDK'si olmadığı için doğrudan entegrasyon zordu; ancak Miao Miao ve Tomato uygulaması üzerinden kan şekeri verisini her 2 dakikada bir harici bir endpoint'e gönderen bir yol bulundu
- Go echo server ve Encore dağıtımıyla Tomato'nun istek biçimi incelendi,
sgV değeri dönüştürülerek Grafana panosunda gerçek zamanlı bir kan şekeri göstergesi olarak gösterildi
- Telegram botu, yemek, egzersiz, insülin enjeksiyonu gibi bağlamsal notlar bırakıyor ve her 5 dakikada bir çalışan cron, kan şekeri eşik değerin altına düşerse incident.io üzerinde bir incident oluşturuyor
- Uyarılar, escalation ve raporlarla desteklenen bu iş akışı, düşük kan şekeri veya ölçüm boşluklarını tek başına yönetmek zorunda bırakmayan bir kişisel sağlık gözlemlenebilirliği sistemi olarak çalışıyor
Tip 1 diyabeti bir arıza müdahalesi problemi olarak ele almak
- Tip 1 diyabet, pankreasın karbonhidratları enerjiye dönüştürmek için gereken insülini çok az ya da hiç üretemediği bir otoimmün hastalıktır
- İnsülin enjeksiyonla alınmalıdır ve doz, yenilen yiyecekler ile çeşitli değişkenlere göre değişir
- Tip 1, yaşam tarzı nedeniyle ortaya çıkan bir hastalık değildir ve bugün için bir tedavisi yoktur
- Kan şekeri sürekli izlenmelidir
- Çok yüksek seviyelerin uzun süre devam etmesi organ hasarına ve yaşam süresinin kısalmasına yol açabilir
- Çok düşük seviyeler kısa sürede bile ölümcül olabilir
- Kan şekeri fazla düştüğünde güvenli şekilde yemek yemek ya da bir şey içmek mümkün olmayabilir ve başka birinin yardımına ihtiyaç duyulabilir
- Bir yiyecek ya da içecek görüldüğünde karbonhidrat miktarı ve gereken insülin miktarı hesaplanmalı; kısa bir yürüyüş gibi egzersizlerde bile vücuttaki aktif insülin miktarı dikkate alınmalıdır
- Kan şekeri görünürlüğünün kaybolduğu durumlar, iş sistemlerinde gözlemlenebilirliğin 0'a düşmesi gibi ele alınabilir
- İş ortamında olsaydı bir incident ilan edilir ve görünürlük geri gelene kadar kapatılmazdı
- Düşük kan şekeri, bir şeylerin ters gittiğinin ilk sinyalidir ve anında müdahale gerektirir
Libre, Miao Miao ve Tomato ile veri yolunu bulmak
- Kola takılan Libre cihazı, telefon yaklaştırıldığında kan şekerini okuyabilir
- Cihazın 2 haftada bir değiştirilmesi gerekir
- Kan şekeri belirli bir kırmızı çizginin altına düşerse karbonhidrat alınmalıdır
- Yeşil aralığın dışına çıkarsa insülin uygulaması gibi önlemler düşünülebilir
- Egzersiz, kilo artışı ve hastalık insülin duyarlılığını değiştirdiği için kan şekeri yönetimi sürekli hareket eden bir hedef haline gelir
- Libre hata verdiğinde cihazdan kan şekeri okunamaz ve risk seviyesi uyarıları da alınamaz
- Libre kapalı bir cihaz olduğu için API ya da SDK olmadan veriyi doğrudan almak zordur
- Miao Miao, Libre'nin üstüne takılarak yaklaşık her 2 dakikada bir tarama yapar ve sonuçları Tomato uygulamasına gönderir
- Varsayılan Libre uygulaması hata gösterse bile Miao Miao yolu veri yayımlamaya devam eder
- Varsayılan uygulama, kan şekerindeki ani değişimleri aykırı değer sayıp veri göndermiyor gibi görünüyordu; kullanıcı ise bu verileri de kendisi değerlendirmek istiyordu
- Tomato uygulamasında kan şekerini her 5 dakikada bir Google Calendar etkinliği olarak yayımlayan bir özellik vardı; bu sayede Apple Watch complication üzerinde kan şekeri görülebiliyordu
Go echo server ile Tomato isteklerini incelemek
- Tomato uygulaması ayarlarında Nightscout için veri senkronizasyon URL'si alanı vardı
- Nightscout URL'si yerine doğrudan yönetilen web sunucusunun adresi girilince, gateway loglarında şu yol göründü
/id/e1d67817-4591-4e8e-9bca-58a07a1087d8/api/v1/devicestatus
- İstek gövdesini incelemek için Go ile basit bir echo server yazıldı
- Dağıtım ve çalıştırma için encore.dev kullanıldı ve böylece izleme sistemi ücretsiz çalıştırılabildi
// encore:api public raw method=POST path=/id/:id/api/v1/devicestatus
func Echo(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", req.Header.Get("Content-Type"))
if _, err := io.Copy(w, req.Body); err != nil {
http.Error(w, "Failed to echo request", http.StatusInternalServerError)
return
}
}
- Echo server, istemcinin gönderdiği veriyi aynen geri döndüren bir sunucudur; ağ sorunlarını gidermede veya uygulama davranışını test etmede faydalıdır
- Aynı yöntemle başka istekler de incelendi ve kan şekeri verisini içeren bir yanıt elde edildi
- date: 1696171541297
sgV: 73
delta: 0
sysTime: 1696171541381
dateString: "2023-10-01T14:45:41.297Z"
_id: "dOUXaI8HcaulCGrQfxe23UE0"
type: "sgv"
device: "Tomato"
direction: "Flat"
sgV, kan şekeri değeridir; Birleşik Krallık'ta kullanılan birime uyması için 18'e bölünür
- Yanıtta tarih, saat ve trend yönü de bulunur
- Bu çağrı her 2 dakikada bir gerçekleşir
Grafana panosu ve kan şekeri göstergesi
- Alınan kan şekeri değeri bir Gauge metric olarak ayarlandı
- Gauge, yükselip alçalabilen tek bir sayısal değeri temsil eden bir metriktir; bellek kullanımı, eşzamanlı istek sayısı ve sıcaklık gibi değişken değerlerin ölçümünde kullanılır
- Kan şekeri değeri
newValue / 18 olarak dönüştürülüp kaydedildi
var BloodSugar = metrics.NewGauge[float64]{
name: "blood_sugar",
metrics.GaugeConfig{},
}
BloodSugar.Set(float64(newValue) / 18)
if err := insertReading(ctx, newValue); err != nil {
rlog.Error(msg: "failed to insert blood sugar, proceeding", keysAndValues: "db_err", err)
}
- Kan şekeri verisi en iyi çaba yaklaşımıyla Postgres'e de kaydedildi
- Veritabanına yazma hatası, geri kalan mantığın başarısız olmasına yol açmasın diye yalnızca log bırakılıp işleme devam edildi
- Grafana panosu, her 2 dakikada bir güncellenen kan şekeri göstergesini gerçek zamanlı gösterir
- Hedef kan şekeri aralığı ideal olarak 4 ile 9 arasıdır
- Pano paylaşıldığında veya eve bir monitör konduğunda kan şekeri durumu tek bakışta görülebilir
Telegram botuyla kan şekeri bağlamı eklemek
- Yalnızca kan şekeri sayısı yeterli değildir; karmaşık sistem izlemede olduğu gibi bağlam önemlidir
- Kan şekeri yemekten hemen sonra yükselse bile insülin zaten yapılmışsa bu durum hemen endişe gerektirmeyebilir
- Grafana açıklama notlarını destekler, ancak giriş yapıp elle not bırakmak zahmetlidir
- Bunun yerine, mesaj aldıkça webhook üzerinden not ekleyen bir Telegram botu oluşturuldu
// encore:api public raw method=POST path=/webhook
func Webhook(w http.ResponseWriter, req *http.Request) {
body, err := io.ReadAll(req.Body)
if err != nil {
http.Error(w, "could not read request body", http.StatusBadRequest)
return
}
defer req.Body.Close()
var update Update
err = json.Unmarshal(body, &update)
if err != nil {
http.Error(w, "could not unmarshal JSON", http.StatusBadRequest)
return
}
}
- Webhook istek alır, mesajı doğrular, JSON'u unmarshal eder ve ardından işleme sonucunu Telegram'a geri döndürür
- Mesaj doğrulandıktan sonra tam sayı parse edilir ve anotasyon servisi çağrılır
- Anotasyon servisi, etkinlik içeriğine göre tag ekler
func getTags(ctx context.Context, activity string) []string {
a := strings.ToLower(activity)
switch a {
case "walk", "run", "ran", "gym":
return []string{"exercise"}
case "eat", "ate":
return []string{"food eaten"}
case "inject":
return []string{"inject"}
default:
return []string{"other"}
}
}
- Grafana'da her tag için renk atanabilir ve anotasyon sorguları yapılandırılabilir
- Yemek, egzersiz ve insülin enjeksiyonu gibi bağlamlar grafikte gösterildiğinde, hem kişinin kendisi hem de panoya bakanlar kan şekeri durumunu daha kolay yorumlayabilir
Düşük kan şekerini bir incidente dönüştürmek
- Kan şekeri görünürlüğü sağlandı, ancak uyarı olmadan gerçek zamanlı müdahale zordur
- Hemşireden alınan yönlendirmeye göre kan şekeri 4'ün altına düştüğünde müdahaleye başlanmalıdır
- Her 5 dakikada bir ölçümleri kontrol eden küçük bir cron yazıldı ve önceden tanımlanan alt sınırın altına inilirse bir incident tetiklendi
var _ = cron.NewJob(
id: "monitor-blood",
cron.JobConfig{
Title: "monitor blood to check if there is reason to open an incident",
Every: 5 * cron.Minute,
Endpoint: BloodIncidentCron,
},
)
if r < BloodLowerLimit {
if err := triggerIncident(ctx); err != nil {
return fmt.Errorf("failed to trigger an incident: %w", err)
}
}
- Telegram botuna
"i need help" mesajıyla manuel incident açan kod da eklendi
- Incident tetiklendiğinde ayrı bir mikroservis, incident.io üzerinde bir incident oluşturur
- incident.io'nun seçilme nedeni, Cloudflare'in şirket içi incident aracına en çok benzemesi ve tamamen Go ile yazılmış olmasıydı
payload := Payload{
IdempotencyKey: idemKey.String(),
Mode: incidentModeStandard,
Name: fmt.Sprintf("Matt's blood sugar is currently #%s", blood),
SeverityID: incidentSeverityCritical,
Summary: "Matt's blood sugar is low!",
Visibility: "public",
}
- Gerçek bir incident aracı kullanıldığında escalation policy tanımlanabilir ve incident durumunda geçirilen süre gibi raporlar görülebilir
- incident.io iş akışı, Zapier'e benzer kurallar kurabilir ve abonelere SMS uyarıları gönderebilir
- Örnek iş akışında incident açıldığında önce kişiye SMS gider, 20 dakika içinde kapanmazsa partnerine veya kardeşlerine otomatik escalation yapılır
Raporlar ve gelecekteki iyileştirmeler
- Bir incident aracı kullanıldığında, düşük kan şekeri incident'larının zaman içinde ne kadar yaşandığı raporlarla görülebilir
- Örnek grafik, blog için hazırlanmış demo veridir; gerçek veriler neyse ki daha sıkıcıdır
- Düşük kan şekeri olayları artış eğilimindeyse bu, mevcut tedavi yönteminin uygun olmayabileceğine işaret edebilir ve doktorla görüşmek için dayanak sağlar
- Mevcut veya planlanan iyileştirmeler şunlardır
- Otomatik kapatma: Şu anda veriyi gözden geçirmek için incident'lar elle kapatılıyor; ancak bazen geç kapatıldığı için escalation yaşandı, bu yüzden yaklaşık 15 dakika boyunca kan şekeri stabil kalırsa otomatik kapatma düşünülebilir
- Veriyle sohbet: Yıllara yayılan kan şekeri verisi saklanıyor; bir LLM eğitilip “Neden hep öğleden sonra 3'te düşüyor?” gibi sorular sorulmak ve Google Calendar gibi diğer verilerle birlikte değerlendirmek isteniyor
- Grafiği genişletme: Mevcut grafik basit, ancak diyabet yönetiminin başarısını değerlendiren hba1c gibi göstergeler eklenebilir
- Arıza önlemeyi güçlendirme: Sistem kritik olduğu için ne kadar çok hatayı önleyebilirse o kadar iyi
Kodla kurulmuş kişisel bir sağlık işletim sistemi
- Tip 1 teşhisinin ilk dönemlerinde, hastalığın hayatı zorlaştıracağı korkusu vardı
- Bu proje, tip 1 durumunu anlamaya, yönetmeye ve izlemeye yardımcı oluyor
- Kan şekeri yönetimi bir dağıtık sistem gibi ele alınarak gözlemlenebilirlik, uyarılar, incident, escalation ve raporlarla kişisel bir işletim sistemine dönüştürüldü
- Kod yazma becerisi, 1920'lere kadar fiilen ölüm fermanı sayılan bir hastalığın yönetimini bir ölçüde otomatikleştirmeyi mümkün kıldı
1 yorum
Hacker News yorumları
16 yıldır diyabetle yaşıyorum; yazarın havası çok güzel ve saygı uyandırıcı. Hastalık yüzünden üzgün ya da öfkeli olduğunda bu yazıyı tekrar okuyup, her şeyin üstesinden gelebileceğine emin olduğu bu anı hatırlamasını dilerim.
Kolay değil. Hem zihinsel olarak hem de pratikte; benim durumumda yıllar boyunca “keyifli biçimde kontrolden çıkmış” denecek bir haldeydim.
Daha dün, diyabet hayatımda ilk kez 36 saat hedef aralıkta kalmayı görünce gerçekten ağladım. 36 saat boyunca %100 yeşildi. Belki de artık anlamış olabilirim.
Birkaç yıl sonra yaşam kalitemin %60 seviyesine kadar sıçraması; CGM’ye bağlı mikro infüzyon cihazı, diğer diyabetlilerle deneyim paylaşımı, telefonumda, saatimde, masaüstü widget’ımda, çalar saatimde, buzdolabımda, her yerde kan şekerimi ve trendleri görebilmek için NightScout VM kurulumu ve Alman titizliğiyle karbonhidrat sayıp yemekten tam 15 dakika önce bolus yapmam sayesinde oldu. Böyle yaşamak gerçekten hoşuma gitmiyor ama işe yarıyor.
Dayan. Dağılma.
Yazım tarzı gerçekten çok iyi ve okuması keyifliydi. Tesadüfen ben de sızma testi işi yapıyorum; ekip arkadaşlarımdan biri tip 1 diyabet hastası.
Bu yazıdaki genel tabloyu ve bunun getirdiği karmaşıklıkları görünce, her gün bu zorlukların üstesinden gelip yine de ekipteki en nazik ve en kolay yaklaşılabilen insanlardan biri olarak kalan çalışma arkadaşımla daha fazla empati kurdum.
Ama bu yazıyı okuduktan sonra, böyle yaşayabilmek için gereken öz disiplin düzeyini gerçekten hissediyorsunuz.
Elbette sızma testindeki gibi sistemlere girip kırmaya çalışmak da olabilir; acaba yaptığı iş bu mu, merak ettim.
Yakın zamanda, herkesin terfi etmesini beklediği halde terfi alamayan bir çalışanla ilgili bir örnek okudum. Tek “suçu”, bir çalışma arkadaşına arabasının bozulduğunu ve sık sık tamir ettirmekten yorulduğunu kısaca söylemesiydi.
Terfi edince bir miktar işe gidip gelmesi gerekecekti; yöneticisi de “Seni terfi ettirecektim ama arabanın durumunun iyi olmadığını duydum” demiş.
Matt bu sunumu GopherConSG’de yaptıktan sonra, kendi verilerimize sahip olamama sorununu konuştuk. Veri sağlayıcıları tarafında, yani kan şekerini izleyen şirketlerin üstlenmesi gereken çok sayıda yasal sorumluluk olduğu için konunun epey karmaşık olması etkileyiciydi; büyük şirketlerin açılmakta neden tereddüt ettiğini de anlayabiliyorum.
Öte yandan, kullanıcıların meşru olarak kendilerine ait olan ve gerçek eylemlerde kullanabilecekleri verilere erişememesi oldukça haksız görünüyor.
Dün bununla ilgili bir şey yaptım. Kan şekeri verilerini terminal durum simgesi olarak gösteren bir tmux eklentisi.
Ben de tip 1 diyabetliyim ve CGM olarak Dexcom kullanıyorum; şimdilik bu ortama göre çalışacak şekilde ayarladım ama başka cihazları da desteklemek ve daha fazla özellik eklemek istiyorum. İlgileniyorsanız buradan bakabilirsiniz:
https://github.com/Cian911/tmux-xdrip
Miao Miao fikri ilginç. Tip 1 diyabetli biri olarak Freestyle Libre hayatımı gerçekten değiştiren inanılmaz bir cihaz ama yazılımı oldukça kötü.
Bir yıldan uzun süre önce bir hata bildirdim; Abbott hâlâ bunun hata olduğunu kabul etmedi. İnternette ve Google Play uygulama yorumlarında aynı bildirimin çok sayıda olmasına rağmen.
İlgilenen ya da Abbott’un kabul etmesine yardımcı olabilecek kişiler için söyleyeyim: LibreLink’i rahatsız etmeyin modu istisna uygulamaları listesine eklemek işe yaramıyor; rahatsız etmeyin moduna girince hemen “alarmlar kullanılamıyor” uyarısı çıkıyor. İş ortamında rahatsız etmeyin modunu açınca kan şekeri alarmları da kapandığı için can sıkıcı oluyor.
Biraz bağlantılı bir konu olarak, 6 ay önce obstrüktif uyku apnesi teşhisi aldım ve uyurken hava yolunun kapanmasını engellemek için sabit basınçta hava üfleyen bir CPAP makinesi kullanmam gerekiyor. Tip 1 diyabet kadar görev açısından kritik düzeyde değil ama bu makineler beklediğimden çok daha fazla günlük kaydı tutuyor.
Bu yazıyı okurken, uyku apnesi tarafında da izleme için ya da daha ağır vakalar için benzer biçimde hack’lenmiş şeyler var mı diye merak ettim.
OSCAR’ı zaten biliyorum ve gerçekten minnetle kullanıyorum; ama başka neler var merak ediyorum.
1: https://www.sleepfiles.com/OSCAR/
Uyku testinde en kötü anda, nefes durması olayları dakikada yaklaşık 48 kez kaydedilmişti. Diliniz hava yoluna doğru yuvarlanınca nefes almak epey zorlaşıyor.
İlginç ama bu alandaki açık kaynak yazılımlar olan Nightscout, xDrip vb.’ne neden bakılmadığını merak ediyorum.
Bu yeni bir sorun değil; pek çok kişi bunu çok daha zengin özellikli ve iyi çalışan çözümlerle zaten çözmüş durumda.
Scott Hanselman yıllardır blogunda ve YouTube’da tip 1 diyabet ve çeşitli teknoloji hack’leri hakkında içerik üretiyor. Eskiden kan şekerinin terminal prompt’unda görünmesini sağlayan bir hack de yapmıştı: https://www.youtube.com/watch?v=_meKUIm9NwA
“Bu süre boyunca cihazla kan şekeri ölçülemiyor ve kan şekeri tehlikeli seviyelere ulaşsa bile bildirim alamıyorsunuz. Bu hatanın en stresli anlarda ortaya çıkma alışkanlığı vardı” ve “İnceleyince, ana uygulamanın kan şekeri değeri aniden değişip aykırı değer gibi görünen verilerin gönderilmesinden hoşlanmadığı anlaşılıyordu” kısımları hayatı tehdit eden bir hata gibi geliyor.
Kesin konuşmak gerekirse, yalnızca CGM verilerine dayanarak tedavi kararı vermemeniz gerekir.
Dexcom sensörlerinde bazı uygulamalar ham değerleri alıp bu süreci baypas edebilir. Libre’de, en azından Libre 3’te, belirli durumlarda bunun hatalı bir ölçüm değil de kan şekerinin hızla değişmekte olduğu sonucuna varıldığında verinin sonradan doldurulduğunu gördüm.
Teknoloji tabanlı değil ama diyabet uyarı köpekleri de var.
İyi eğitilmiş köpeklerin, teknoloji tabanlı izleme ve uyarı sistemlerini tamamlayıp bakıcıları uyarmada büyük başarı gösterdiğini son zamanlarda öğreniyorum.