5 पॉइंट द्वारा GN⁺ 2024-03-05 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • 2020 में Type 1 diabetes का निदान पाने वाले एक इंजीनियर ने blood sugar management को incident response की तरह संभालने के लिए Go-आधारित personal monitoring system बनाया
  • Libre में आधिकारिक API या SDK नहीं है, इसलिए सीधे integration करना मुश्किल था, लेकिन Miao Miao और Tomato app के जरिए हर 2 मिनट में blood sugar data को external endpoint पर भेजने का रास्ता मिला
  • Go echo server और Encore deployment के साथ Tomato request format की जांच की गई, sgV value को convert करके Grafana dashboard में real-time blood sugar gauge के रूप में दिखाया गया
  • Telegram bot भोजन·व्यायाम·insulin injection जैसी context annotations छोड़ता है, और हर 5 मिनट चलने वाला cron blood sugar threshold से नीचे जाते ही incident.io incident बनाता है
  • alerts, escalation और reports के साथ यह workflow low blood sugar या measurement gaps को अकेले न झेलने देने वाली personal health observability system की तरह काम करता है

Type 1 diabetes को incident response problem की तरह संभालना

  • Type 1 diabetes एक autoimmune disease है, जिसमें pancreas carbohydrates को energy में बदलने के लिए जरूरी insulin बहुत कम या बिल्कुल नहीं बनाता
  • insulin को injection से देना पड़ता है, और इसकी मात्रा खाने और कई दूसरे factors के अनुसार बदलती है
  • Type 1 जीवनशैली की वजह से होने वाली बीमारी नहीं है, और फिलहाल इसका कोई इलाज नहीं है
  • blood sugar की लगातार monitoring करनी पड़ती है
    • बहुत देर तक sugar बहुत high रहे तो organ damage और life expectancy कम होने का खतरा बढ़ सकता है
    • बहुत low sugar थोड़े समय में भी जानलेवा हो सकती है
    • blood sugar बहुत नीचे चली जाए तो सुरक्षित रूप से खाना-पीना भी संभव नहीं रह सकता और दूसरे लोगों की मदद की जरूरत पड़ सकती है
  • हर बार खाने-पीने की चीज देखते ही carbohydrate की मात्रा और जरूरी insulin की गणना करनी पड़ती है, और छोटी walk जैसी exercise में भी शरीर में active insulin की मात्रा को ध्यान में रखना पड़ता है
  • blood sugar visibility का गायब हो जाना workplace systems में observability 0 हो जाने जैसी स्थिति की तरह देखा जा सकता है
    • काम में ऐसा हो तो incident declare किया जाता है और visibility लौटने तक बंद नहीं किया जाता
    • low blood sugar इस बात का पहला संकेत है कि कुछ गलत हो रहा है और तुरंत action चाहिए

Libre, Miao Miao, Tomato के साथ data path खोजना

  • बांह पर लगाया जाने वाला Libre device phone को पास लाने पर blood sugar पढ़ सकता है
    • device को हर 2 हफ्ते में बदलना पड़ता है
    • blood sugar एक खास red line से नीचे जाए तो carbohydrates लेना चाहिए
    • green range से बाहर जाने पर insulin देने जैसी कार्रवाई पर विचार किया जा सकता है
  • exercise, weight gain और illness insulin sensitivity बदल देते हैं, इसलिए blood sugar management हमेशा बदलता हुआ target बन जाता है
  • Libre error दिखाए तो device से blood sugar नहीं पढ़ा जा सकता और danger-level alerts भी नहीं मिलते
  • Libre एक closed device है, इसलिए API या SDK के बिना सीधे data लेना मुश्किल है
  • Miao Miao को Libre के ऊपर लगाकर लगभग हर 2 मिनट में scan कराया जाता है और result Tomato app को भेजा जाता है
    • default Libre app error दिखाए तब भी Miao Miao path data publish करता रहता है
    • लगता है default app blood sugar के तेज बदलाव को outlier मानकर data नहीं भेजता, लेकिन उपयोगकर्ता ऐसे data पर भी खुद फैसला करना चाहता था
  • Tomato app में हर 5 मिनट पर blood sugar को Google Calendar event के रूप में publish करने का feature था, जिससे Apple Watch complication में blood sugar देखी जा सकती थी

Go echo server से Tomato request की जांच

  • Tomato app settings में Nightscout के लिए data sync URL डालने की जगह थी
  • Nightscout URL की जगह खुद चलाए गए web server का address डालने पर gateway logs में यह path दिखा
/id/e1d67817-4591-4e8e-9bca-58a07a1087d8/api/v1/devicestatus
  • request body देखने के लिए Go में एक simple echo server लिखा गया
  • deployment और execution के लिए encore.dev का इस्तेमाल हुआ, जिससे monitoring system को मुफ्त में चलाया जा सका
// 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 ऐसा server होता है जो client द्वारा भेजा गया data उसी रूप में वापस लौटा देता है; यह network troubleshooting या application behavior testing में काम आता है
  • इसी तरीके से दूसरी requests भी जांची गईं और blood sugar data वाली response मिली
- date: 1696171541297
sgV: 73
delta: 0
sysTime: 1696171541381
dateString: "2023-10-01T14:45:41.297Z"
_id: "dOUXaI8HcaulCGrQfxe23UE0"
type: "sgv"
device: "Tomato"
direction: "Flat"
  • sgV blood sugar value है, और UK में इस्तेमाल होने वाली unit के हिसाब से इसे 18 से divide किया गया
  • response में date·time और trend direction भी शामिल थी
  • यह call हर 2 मिनट में आती है

Grafana dashboard और blood sugar gauge

  • आने वाली blood sugar value को Gauge metric के रूप में सेट किया गया
  • gauge ऐसा metric है जो ऊपर-नीचे होने वाली एक single value दिखाता है; इसे memory usage, concurrent requests, temperature जैसी बदलती values मापने में इस्तेमाल किया जाता है
  • blood sugar value को newValue / 18 में convert करके record किया गया
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)
}
  • blood sugar data को best-effort basis पर Postgres में भी store किया गया
    • DB write fail हो जाए तो बाकी logic fail न हो, इसलिए सिर्फ log छोड़कर processing जारी रखी गई
  • Grafana dashboard हर 2 मिनट में refresh होने वाला real-time blood sugar gauge दिखाता है
  • target blood sugar range ideally 4 से 9 के बीच है
  • dashboard share करके या घर में monitor लगाकर blood sugar status एक नजर में देखा जा सकता है

Telegram bot से blood sugar context जोड़ना

  • सिर्फ blood sugar numbers काफी नहीं हैं; complex system monitoring की तरह context भी अहम है
  • अगर खाना खाने के तुरंत बाद blood sugar बढ़ी हो लेकिन insulin पहले ही लिया जा चुका हो, तो जरूरी नहीं कि वह तुरंत चिंता की बात हो
  • Grafana annotations सपोर्ट करता है, लेकिन login करके manually annotation डालना झंझट भरा था
  • इसलिए एक Telegram bot बनाया गया जो हर message मिलने पर webhook के जरिए annotation जोड़ता है
// 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 request लेता है, message को validate करता है, JSON को unmarshal करता है, फिर processing result Telegram को वापस भेजता है
  • message validation के बाद integer parse करके annotation service को call किया जाता है
  • annotation service activity के अनुसार tags जोड़ती है
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 में tag के हिसाब से रंग तय किए जा सकते हैं और annotation query सेट की जा सकती है
  • जब भोजन, exercise, insulin injection जैसे context graph पर दिखते हैं, तो खुद उपयोगकर्ता और dashboard देखने वाले लोग blood sugar situation को आसानी से समझ सकते हैं

low blood sugar को incident में बदलना

  • blood sugar visibility मिल गई थी, लेकिन alerts के बिना real-time response मुश्किल था
  • nurse से मिले guidance के मुताबिक blood sugar 4 से नीचे जाए तो treatment शुरू करना चाहिए
  • हर 5 मिनट measurement जांचने वाला एक छोटा cron लिखा गया, और predefined lower limit से नीचे जाते ही incident trigger किया गया
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 bot में "i need help" message से manual incident खोलने वाला code भी जोड़ा गया
  • incident trigger होते ही एक अलग microservice incident.io में incident बनाती है
  • incident.io चुनने की वजह यह थी कि यह Cloudflare के internal incident tool के सबसे करीब लगा और पूरी तरह Go में लिखा गया है
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",
}
  • असली incident tool इस्तेमाल करने पर escalation policy सेट की जा सकती है और incident state में बिताए गए समय जैसी reports देखी जा सकती हैं
  • incident.io workflow Zapier जैसे rules configure कर सकता है और subscribers को SMS alerts भेज सकता है
  • example workflow में incident खुलते ही खुद को SMS जाता है, और 20 मिनट तक बंद न होने पर partner या siblings तक automatic escalation होती है

reports और आगे के improvements

  • incident tool के जरिए यह report में देखा जा सकता है कि low blood sugar incidents समय के साथ कितनी बार हुए
  • example graph blog demo data है; सौभाग्य से वास्तविक data इससे कहीं ज्यादा साधारण है
  • अगर low blood sugar events बढ़ने लगें, तो यह इस बात का संकेत हो सकता है कि current treatment approach सही नहीं है और doctor से बात करने का आधार बन सकता है
  • मौजूदा या planned improvements इस प्रकार हैं
    • automatic close: अभी data review करने के लिए incidents manually बंद किए जाते हैं, लेकिन कुछ बार देर से बंद करने पर escalation हो चुकी है; इसलिए करीब 15 मिनट तक stable blood sugar रहने पर auto-close किया जा सकता है
    • data conversations: कई सालों का blood sugar data store किया जा रहा है, और LLM को train करके “मैं हमेशा दोपहर 3 बजे low क्यों हो जाता हूँ?” जैसे सवाल पूछना चाहते हैं, साथ में Google Calendar जैसे दूसरे data का भी उपयोग करना चाहते हैं
    • graph expansion: अभी graph simple है, लेकिन diabetes management की सफलता मापने वाले hba1c जैसे metrics जोड़े जा सकते हैं
    • stronger failure prevention: system महत्वपूर्ण है, इसलिए failures को जितना ज्यादा रोका जा सके उतना बेहतर है

coding से बना personal health operating system

  • Type 1 diagnosis के शुरुआती दौर में यह डर था कि यह बीमारी जीवन को बहुत कठिन बना देगी
  • इस project ने Type 1 condition को समझने, manage करने और monitor करने में मदद की
  • blood sugar management को distributed system की तरह संभालते हुए, observability, alerts, incidents, escalation और reports के साथ इसे personal operating system बना दिया गया
  • coding skills ने ऐसी बीमारी के management को कुछ हद तक automate करना संभव बनाया, जो 1920s तक लगभग मौत की सजा मानी जाती थी

1 टिप्पणियां

 
GN⁺ 2024-03-05
Hacker News टिप्पणियाँ
  • मैं 16 साल से डायबिटीज़ के साथ जी रहा हूँ, और लेखक का अंदाज़ बहुत अच्छा और सम्मानजनक लगा। जब भी बीमारी की वजह से दुख या गुस्सा आए, इस लेख को फिर से पढ़ना अच्छा रहेगा, और उस पल को याद करना भी, जब मुझे यक़ीन था कि मैं यह सब संभाल सकता हूँ
    यह आसान नहीं है। मानसिक रूप से भी नहीं, व्यावहारिक रूप से भी नहीं, और मेरे मामले में तो कई साल तक हालत “खुशी-खुशी नियंत्रण से बाहर” जैसी थी
    अभी कल ही, मैंने डायबिटीज़ के साथ अपनी ज़िंदगी में पहली बार 36 घंटे target range में बने रहने का नतीजा देखा और सच में रो पड़ा। 36 घंटे तक 100% हरा था। शायद अब मुझे कुछ समझ आने लगा है
    कुछ साल बाद मेरी जीवन-गुणवत्ता लगभग 60% तक उछल गई, और इसका श्रेय CGM से जुड़े micro-infusion pump, दूसरे डायबिटीज़ मरीजों के साथ अनुभव साझा करने, NightScout VM सेटअप करने ताकि फ़ोन, घड़ी, desktop widget, alarm clock, fridge—हर जगह blood glucose और trend दिखें, और जर्मन-स्तर की precision से carbs गिनने व खाने से ठीक 15 मिनट पहले bolus लेने को जाता है। इस तरह जीना मुझे सच में नापसंद है, लेकिन असर होता है
    डटे रहो। बिखरो मत

  • लिखने का अंदाज़ सचमुच बहुत अच्छा था और पढ़ने में मज़ा आया। संयोग से मैं penetration testing का काम करता हूँ, और मेरे सहकर्मियों में से एक को type 1 diabetes है
    इस लेख का सार और उससे जुड़ी जटिलता देखकर, अब मैं उस सहकर्मी के प्रति और ज़्यादा सहानुभूति महसूस करता हूँ, जो हर दिन ऐसी मुश्किलों से जूझते हुए भी टीम के सबसे दयालु और approachable लोगों में से एक है

    • डायबिटीज़ के साथ भी सामान्य जीवन जिया जा सकता है, और यहाँ तक कि आप शीर्ष स्तर के tennis player भी बन सकते हैं: https://en.wikipedia.org/wiki/Alexander_Zverev#Personal_life
      लेकिन यह लेख पढ़ने के बाद अब सच में महसूस होता है कि ऐसा जीवन जीने के लिए self-discipline का स्तर कितना ऊँचा होना चाहिए
    • अगर “pentesting” का मतलब डायबिटीज़ pen की testing होता, तो मज़ाक किया जा सकता था कि इसका कुछ हिस्सा pen और paper से होने वाला test भी होगा
      बेशक, यह penetration testing की तरह systems को तोड़कर अंदर घुसने वाला काम भी हो सकता है, और मैं सोच रहा हूँ कि क्या वही काम करते हो
    • लगता है तुम्हें अच्छा employer मिला है। कई कंपनियाँ बीमार कर्मचारियों को नौकरी पर नहीं रखतीं या निकाल देती हैं, और वास्तव में workplace में medical information साझा न करने की सलाह आम है
      हाल ही में मैंने एक ऐसे कर्मचारी के बारे में पढ़ा, जिसके promotion की सबको उम्मीद थी, लेकिन उसे promotion नहीं मिला। उसका कसूर बस इतना था कि उसने एक सहकर्मी से संक्षेप में कहा था कि उसकी car बार-बार खराब हो रही है और उसे ठीक करवाते-करवाते वह थक गया है
      promotion के बाद कुछ commuting करनी पड़ती, और बताया गया कि manager ने कहा, “हम उसे promote करना चाहते थे, लेकिन हमने सुना कि उसकी car की हालत ठीक नहीं है”
  • GopherConSG में Matt की इस talk के बाद, हमने इस समस्या पर बात की कि हम अपने ही data के मालिक नहीं हैं। data provider की तरफ़, यानी blood glucose monitoring करने वाली कंपनियों पर काफ़ी legal liability होती है, इसलिए मामला काफ़ी जटिल है—यह बात प्रभावशाली लगी, और यह भी समझ आता है कि बड़ी कंपनियाँ openness से क्यों हिचकती हैं
    दूसरी तरफ़, यह काफ़ी अनुचित लगता है कि user को उस data तक पहुँच नहीं मिलती जो सही मायने में उसी का है और जिसे वह वास्तविक actions के लिए इस्तेमाल कर सकता है

    • यह हिस्सा मुझे हमेशा समझ नहीं आता। क्या यह ऐसा है जैसे आप BIC pen खरीदते समय एक mandatory license agreement पर हस्ताक्षर करें, जिसमें कहा जाए कि उस pen से पैदा हुई सारी entropy का मालिक data लिखने वाला नहीं बल्कि tool बनाने वाला है? इंसान न होता तो वह data भी मौजूद न होता
  • मैंने कल इसी से जुड़ी एक चीज़ बनाई। यह terminal status icon में blood glucose data दिखाने वाला एक tmux plugin है
    मुझे भी type 1 diabetes है और मैं CGM के लिए Dexcom इस्तेमाल करता हूँ, इसलिए अभी इसे उसी setup के हिसाब से चलने लायक बनाया है, लेकिन मैं दूसरे devices का support और ज़्यादा features भी जोड़ना चाहता हूँ। दिलचस्पी हो तो यहाँ देख सकते हैं
    https://github.com/Cian911/tmux-xdrip

    • अच्छा होता अगर Dexcom सीधे watch के साथ sync कर पाता। मैं कई साल से इंतज़ार कर रहा हूँ, लेकिन शायद इससे watch battery बहुत ज़्यादा खर्च होगी
    • tmux के अंदर जीने वाले एक type 1 diabetic के रूप में, यह सच में कमाल है। मुझे इसे जितनी जल्दी हो सके आज़माना होगा
  • Miao Miao का विचार दिलचस्प है। एक type 1 diabetic के रूप में, Freestyle Libre वाकई ज़िंदगी बदल देने वाला शानदार device है, लेकिन इसका software काफ़ी खराब है
    मैंने एक साल से भी ज़्यादा पहले bug report किया था, लेकिन Abbott ने अब तक इसे bug मानने से इनकार किया है। जबकि online और Google Play app reviews में भी इसी तरह की कई reports हैं
    जो लोग दिलचस्पी रखते हैं या Abbott से इसे मानने के लिए दबाव बना सकते हैं, उनके लिए बता दूँ: bug यह है कि LibreLink को Do Not Disturb mode की exception app list में डालने से भी कोई असर नहीं होता, और जैसे ही Do Not Disturb mode चालू होता है, तुरंत “alarm का इस्तेमाल नहीं किया जा सकता” की warning आ जाती है। काम के माहौल में Do Not Disturb mode चालू रखने पर blood glucose alarms भी बंद हो जाते हैं, जो बहुत असुविधाजनक है

  • थोड़ा संबंधित विषय, मुझे 6 महीने पहले obstructive sleep apnea का diagnosis मिला, और मुझे सोते समय एक CPAP machine इस्तेमाल करनी पड़ती है, जो एक तय pressure पर हवा भेजकर airway blockage रोकती है। यह type 1 diabetes जितना mission-critical तो नहीं, लेकिन ये machines उम्मीद से कहीं ज़्यादा logs छोड़ती हैं
    यह लेख पढ़ते हुए मैं सोचने लगा कि sleep apnea के क्षेत्र में भी monitoring या ज़्यादा गंभीर मामलों के लिए कुछ ऐसा ही hacking किया गया है या नहीं
    मुझे OSCAR के बारे में पहले से पता है और मैं उसका बहुत आभारी हूँ, लेकिन उसके अलावा और क्या है, यह भी जानना चाहता हूँ
    1: https://www.sleepfiles.com/OSCAR/

    • मेरी नज़र में यह भी जीवन से सीधा जुड़ा मामला है। CPAP ने मेरी ज़िंदगी बदल दी, और लंबे समय तक बिना इलाज के sleep apnea दिल समेत कई स्वास्थ्य समस्याएँ पैदा करता है
      sleep study में सबसे बुरे समय पर मेरी सांस रुकने की घटनाएँ लगभग 48 बार प्रति मिनट दर्ज हुई थीं। जब जीभ airway में मुड़कर चली जाती है, तो सांस लेना काफ़ी मुश्किल हो जाता है
    • अगर वह आपके device को support करता है, तो https://home.sleephq.com/ इस data को अच्छी तरह संभालता है
  • दिलचस्प है, लेकिन मैं सोच रहा हूँ कि इस क्षेत्र के open source software जैसे Nightscout, xDrip वगैरह को न देखने की कोई वजह थी क्या
    यह नई समस्या नहीं है, और पहले से कई लोगों ने इसे कहीं ज़्यादा feature-rich और अच्छी तरह काम करने वाले solutions से हल कर रखा है

    • देखा था। लेकिन जो मैं करना चाहता था, उसके लिए मुझे लगा कि शुरू से बनाना ज़्यादा तेज़ होगा, और यह एक मज़ेदार learning experience भी था
  • Scott Hanselman कई सालों से type 1 diabetes और तरह-तरह के technical hacks पर blog और YouTube में बात करते रहे हैं। पहले उन्होंने blood glucose को terminal prompt में दिखाने वाला hack भी किया था: https://www.youtube.com/watch?v=_meKUIm9NwA

  • “इस दौरान आप device से blood glucose नहीं माप सकते, और blood glucose ख़तरनाक स्तर तक पहुँच जाए तब भी alert नहीं मिलेगा। इस error की आदत थी कि यह सबसे ज़्यादा stressful पलों में सामने आए” और “जाँच करने पर लगा कि main app को ऐसे data भेजना पसंद नहीं था जिसमें blood glucose values अचानक बदल जाएँ और outlier जैसी दिखें” — ये हिस्से life-threatening bug जैसे लगते हैं

    • ज़्यादातर sensors इसी तरह काम करते हैं। हम मान लेते हैं कि sensor हमेशा accurate है, लेकिन वास्तव में ऐसा नहीं होता। उदाहरण के लिए, अगर सोते समय आप sensor के ऊपर लुढ़क जाएँ, तो glucose oxidase strip शरीर के अंदर की तरफ़ और दब सकती है और reading बदल सकती है
      सख़्ती से कहें तो सिर्फ़ CGM data के आधार पर treatment decisions नहीं लेने चाहिए
      Dexcom sensor के मामले में कुछ apps raw values लेकर इस process को bypass कर सकती हैं। Libre, कम से कम Libre 3 में, मैंने देखा है कि कुछ परिस्थितियों में अगर उसे लगे कि यह गलत reading नहीं बल्कि blood glucose का तेज़ी से बदलना है, तो वह बाद में data भर देता है
  • यह tech-based नहीं है, लेकिन diabetic alert dogs भी होते हैं
    हाल में मैं सीख रहा हूँ कि अच्छी तरह trained dogs, tech-based monitoring और alert systems को complement करते हुए, अपने handler को चेतावनी देने में काफ़ी सफल रहे हैं