5 poin oleh GN⁺ 2024-03-05 | 1 komentar | Bagikan ke WhatsApp
  • Seorang engineer yang didiagnosis diabetes tipe 1 pada 2020 membuat sistem pemantauan pribadi berbasis Go untuk memperlakukan pengelolaan gula darah seperti respons insiden
  • Karena Libre tidak memiliki API atau SDK resmi, integrasi langsung sulit dilakukan, tetapi ia menemukan jalur untuk mengirim data gula darah setiap 2 menit ke endpoint eksternal melalui Miao Miao dan aplikasi Tomato
  • Dengan echo server Go dan deployment Encore, ia memeriksa format request Tomato, mengonversi nilai SGV, dan menampilkannya sebagai gauge gula darah real-time di dashboard Grafana
  • Bot Telegram mencatat anotasi konteks seperti makan, olahraga, dan suntikan insulin, sementara cron yang berjalan setiap 5 menit membuat insiden incident.io jika gula darah turun di bawah ambang batas
  • Workflow yang dilengkapi notifikasi, eskalasi, dan laporan ini berfungsi sebagai sistem observability kesehatan pribadi yang membantu agar gula darah rendah atau jeda pengukuran tidak harus ditangani sendirian

Memperlakukan diabetes tipe 1 sebagai masalah respons insiden

  • Diabetes tipe 1 adalah penyakit autoimun ketika pankreas membuat sedikit sekali atau sama sekali tidak membuat insulin yang dibutuhkan untuk mengubah karbohidrat menjadi energi
  • Insulin harus ditambahkan melalui suntikan, dan dosisnya bergantung pada makanan yang dimakan serta berbagai variabel lain
  • Tipe 1 bukan penyakit yang disebabkan oleh gaya hidup, dan saat ini belum ada obatnya
  • Gula darah harus terus dipantau
    • Jika terlalu tinggi dalam waktu lama, hal itu dapat menyebabkan kerusakan organ dan memperpendek umur
    • Jika terlalu rendah, bahkan dalam waktu singkat bisa berakibat fatal
    • Jika gula darah turun terlalu rendah, seseorang mungkin tidak dapat makan atau minum dengan aman sehingga membutuhkan bantuan orang lain
  • Setiap kali melihat makanan atau minuman, perlu menghitung jumlah karbohidrat dan jumlah insulin yang dibutuhkan, dan olahraga seperti berjalan kaki singkat pun harus mempertimbangkan jumlah insulin aktif di dalam tubuh
  • Situasi ketika visibilitas gula darah hilang dapat diperlakukan mirip dengan kondisi observability menjadi nol pada sistem kerja
    • Dalam pekerjaan, kita akan mendeklarasikan insiden dan tidak menutupnya sampai visibilitas pulih
    • Gula darah rendah adalah sinyal awal bahwa ada sesuatu yang tidak beres dan merupakan kondisi yang perlu segera ditangani

Mencari jalur data dengan Libre, Miao Miao, dan Tomato

  • Perangkat Libre yang ditempelkan di lengan dapat membaca gula darah saat ponsel didekatkan
    • Perangkat harus diganti setiap 2 minggu
    • Jika gula darah turun di bawah garis merah tertentu, karbohidrat perlu dikonsumsi
    • Jika keluar dari rentang hijau, tindakan seperti pemberian insulin dapat dipertimbangkan
  • Olahraga, kenaikan berat badan, dan penyakit mengubah sensitivitas insulin, sehingga pengelolaan gula darah menjadi target yang terus bergerak
  • Jika Libre menampilkan error, gula darah tidak dapat dibaca dari perangkat dan peringatan tingkat berbahaya juga tidak dapat diterima
  • Libre adalah perangkat tertutup, sehingga sulit mengambil data secara langsung tanpa API atau SDK
  • Miao Miao dipasang di atas Libre, memindai kira-kira setiap 2 menit, dan mengirim hasilnya ke aplikasi Tomato
    • Meski aplikasi Libre bawaan menampilkan error, jalur Miao Miao tetap terus menerbitkan data
    • Aplikasi bawaan tampaknya menganggap perubahan gula darah yang tajam sebagai outlier dan tidak mengirim data, sementara pengguna ingin menilai sendiri data seperti itu
  • Aplikasi Tomato memiliki fitur untuk menerbitkan gula darah sebagai event Google Calendar setiap 5 menit, sehingga gula darah dapat dilihat sebagai komplikasi Apple Watch

Memeriksa request Tomato dengan echo server Go

  • Di pengaturan aplikasi Tomato ada kolom input URL sinkronisasi data untuk Nightscout
  • Saat memasukkan alamat web server yang dioperasikan sendiri alih-alih URL Nightscout, jalur berikut muncul di log gateway
/id/e1d67817-4591-4e8e-9bca-58a07a1087d8/api/v1/devicestatus
  • Untuk memeriksa body request, ia menulis echo server sederhana dengan Go
  • Untuk deployment dan eksekusi, ia menggunakan encore.dev, dan dapat menjalankan sistem pemantauan secara gratis
// 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 adalah server yang mengembalikan apa adanya data yang dikirim klien, berguna untuk memecahkan masalah jaringan atau menguji perilaku aplikasi
  • Dengan cara yang sama, request lain juga diperiksa dan respons berisi data gula darah diperoleh
- date: 1696171541297
sgV: 73
delta: 0
sysTime: 1696171541381
dateString: "2023-10-01T14:45:41.297Z"
_id: "dOUXaI8HcaulCGrQfxe23UE0"
type: "sgv"
device: "Tomato"
direction: "Flat"
  • sgV adalah nilai gula darah, dan dibagi 18 agar sesuai dengan satuan yang digunakan di Inggris
  • Respons juga mencakup tanggal, waktu, dan arah tren
  • Panggilan ini terjadi setiap 2 menit

Dashboard Grafana dan gauge gula darah

  • Nilai gula darah yang diterima diatur sebagai Gauge metric
  • Gauge adalah metrik yang merepresentasikan satu nilai yang dapat naik dan turun, digunakan untuk mengukur nilai yang berubah seperti penggunaan memori, jumlah request bersamaan, atau suhu
  • Nilai gula darah dicatat setelah dikonversi dengan newValue / 18
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)
}
  • Data gula darah juga disimpan ke Postgres dengan pendekatan best-effort
    • Agar kegagalan penyimpanan DB tidak membuat logika lainnya gagal, hanya log yang ditinggalkan dan proses tetap berlanjut
  • Dashboard Grafana menampilkan gauge gula darah yang diperbarui setiap 2 menit secara real-time
  • Rentang gula darah target idealnya adalah antara 4 dan 9
  • Dengan membagikan dashboard atau menaruh monitor di rumah, status gula darah dapat dilihat sekilas

Menambahkan konteks gula darah dengan bot Telegram

  • Angka gula darah saja tidak cukup; seperti pemantauan sistem kompleks, konteks itu penting
  • Meski gula darah naik segera setelah makan, jika insulin sudah disuntikkan, itu mungkin bukan situasi yang perlu langsung dikhawatirkan
  • Grafana mendukung anotasi, tetapi cara harus login dan menambahkan anotasi secara manual terasa membebani
  • Ia membuat bot Telegram dan mengonfigurasinya agar setiap kali menerima pesan, anotasi ditambahkan melalui webhook
// 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 menerima request, memvalidasi pesan, melakukan unmarshal JSON, lalu mengembalikan hasil pemrosesan ke Telegram
  • Setelah validasi pesan, integer di-parse dan layanan anotasi dipanggil
  • Layanan anotasi menambahkan tag sesuai aktivitas
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"}
    }
}
  • Di Grafana, warna per tag dapat ditentukan dan query anotasi dapat dikonfigurasi
  • Ketika konteks seperti makan, olahraga, dan suntikan insulin ditampilkan di atas grafik, pengguna dan orang yang melihat dashboard dapat lebih mudah menafsirkan kondisi gula darah

Mengubah gula darah rendah menjadi insiden

  • Visibilitas gula darah sudah tersedia, tetapi tanpa notifikasi, respons real-time sulit dilakukan
  • Sesuai panduan yang diberikan perawat, penanganan harus dimulai jika gula darah turun di bawah 4
  • Ia menulis cron kecil yang memeriksa nilai pengukuran setiap 5 menit, dan memicu insiden jika nilainya lebih rendah dari batas bawah yang telah didefinisikan sebelumnya
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)
    }
}
  • Pada bot Telegram, kode untuk membuka insiden manual dengan pesan "i need help" juga ditambahkan
  • Saat insiden terpicu, microservice terpisah membuat insiden di incident.io
  • incident.io dipilih karena paling mirip dengan alat insiden internal Cloudflare dan sepenuhnya ditulis dalam 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",
}
  • Dengan alat insiden sungguhan, kebijakan eskalasi dapat diatur dan laporan seperti waktu yang dihabiskan dalam status insiden dapat dilihat
  • Workflow incident.io dapat mengonfigurasi aturan mirip Zapier dan mengirim notifikasi SMS kepada subscriber
  • Dalam contoh workflow, SMS dikirim ke dirinya sendiri saat insiden dibuka, dan jika tidak ditutup selama 20 menit, otomatis dieskalasikan ke pasangan atau saudara kandung

Laporan dan peningkatan berikutnya

  • Dengan alat insiden, laporan dapat menunjukkan seberapa sering insiden penurunan gula darah terjadi dari waktu ke waktu
  • Grafik contoh adalah data demo untuk blog, dan untungnya data sebenarnya jauh lebih membosankan
  • Jika event gula darah rendah menunjukkan tren meningkat, itu bisa menjadi tanda bahwa metode pengobatan saat ini tidak cocok dan menjadi dasar untuk berkonsultasi dengan dokter
  • Peningkatan yang sedang berjalan atau direncanakan adalah sebagai berikut
    • Penutupan otomatis: Saat ini insiden ditutup secara manual untuk meninjau data, tetapi karena beberapa kali terlambat ditutup sehingga tereskalasi, insiden dapat ditutup otomatis jika gula darah stabil selama sekitar 15 menit
    • Percakapan dengan data: Ia menyimpan data gula darah selama bertahun-tahun dan ingin melatih LLM untuk mengajukan pertanyaan seperti “mengapa selalu turun pada pukul 3 sore?” serta memanfaatkan data lain seperti Google Calendar bersama-sama
    • Perluasan grafik: Grafik saat ini sederhana, tetapi dapat menambahkan metrik seperti hba1c yang digunakan untuk menilai keberhasilan pengelolaan diabetes
    • Memperkuat pencegahan kegagalan: Karena sistem ini penting, semakin banyak kegagalan yang dapat dicegah, semakin baik

Sistem operasi kesehatan pribadi yang dibuat dengan coding

  • Pada masa awal diagnosis tipe 1, ada ketakutan bahwa penyakit ini akan membuat hidup menjadi sulit
  • Proyek ini membantu memahami, mengelola, dan memantau kondisi tipe 1
  • Pengelolaan gula darah diperlakukan seperti sistem terdistribusi, dan dijadikan sistem operasi pribadi dengan observability, notifikasi, insiden, eskalasi, dan laporan
  • Kemampuan coding memungkinkan pengelolaan penyakit yang hingga 1920-an masih dianggap sebagai vonis mati ini diotomatisasi sampai batas tertentu

1 komentar

 
GN⁺ 2024-03-05
Komentar Hacker News
  • Saya sudah hidup dengan diabetes selama 16 tahun, dan nuansa tulisan penulisnya terasa bagus serta patut dihormati. Saat merasa sedih atau marah karena penyakit ini, semoga ia membaca lagi tulisan ini dan mengingat momen sekarang ketika ia yakin bisa menanggung semuanya
    Ini tidak mudah. Baik secara mental maupun praktis; dalam kasus saya, selama bertahun-tahun saya hampir “dengan gembira tak terkendali”
    Baru kemarin, untuk pertama kalinya dalam hidup saya dengan diabetes, saya benar-benar menangis saat melihat 36 jam tetap berada dalam rentang target. Selama 36 jam, 100% hijau. Mungkin sekarang saya mulai mengerti
    Beberapa tahun kemudian, kualitas hidup saya melonjak sampai sekitar 60% berkat mikro-infuser yang terhubung ke CGM, berbagi pengalaman dengan sesama penyandang diabetes, memasang VM NightScout sehingga gula darah dan trennya bisa dilihat di ponsel, jam tangan, widget desktop, jam alarm, kulkas, di mana saja, serta menghitung karbohidrat dengan ketelitian ala Jerman dan memberikan bolus tepat 15 menit sebelum makan. Saya benar-benar tidak suka hidup seperti ini, tetapi memang efektif
    Bertahanlah. Jangan goyah

  • Gaya penulisannya sangat bagus dan menyenangkan untuk dibaca. Kebetulan saya bekerja di bidang penetration testing, dan salah satu rekan saya mengidap diabetes tipe 1
    Melihat gambaran dalam tulisan ini dan kerumitan yang ditimbulkannya membuat saya lebih berempati kepada rekan saya, yang setiap hari melewati kesulitan seperti itu tetapi tetap menjadi salah satu orang paling ramah dan mudah didekati di tim

    • Meski punya diabetes, seseorang tetap bisa menjalani hidup normal, bahkan menjadi petenis papan atas: https://en.wikipedia.org/wiki/Alexander_Zverev#Personal_life
      Namun setelah membaca tulisan ini, saya benar-benar menyadari tingkat disiplin diri yang dibutuhkan untuk bisa hidup seperti itu
    • Kalau “pentesting” berarti menguji pena diabetes, sebagian pengujiannya mungkin bisa dilakukan dengan pena dan kertas, begitu kira-kira leluconnya
      Tentu saja bisa juga berarti mencoba membobol sistem seperti penetration testing, jadi saya penasaran apakah itu yang dimaksud
    • Sepertinya ia menemukan pemberi kerja yang baik. Banyak perusahaan tidak mau merekrut karyawan yang sakit atau bahkan memecatnya, dan memang saran umum di tempat kerja adalah jangan membagikan informasi medis
      Baru-baru ini saya membaca kasus seorang karyawan yang semua orang perkirakan akan dipromosikan, tetapi ternyata tidak. Kesalahannya hanya sempat berkata singkat kepada rekan kerja bahwa mobilnya rusak dan ia lelah karena sering memperbaikinya
      Jika dipromosikan, ia perlu cukup sering komuter, dan manajernya kabarnya berkata, “Saya tadinya mau mempromosikanmu, tapi saya dengar kondisi mobilmu tidak bagus”
  • Setelah Matt memberikan presentasi ini di GopherConSG, kami membicarakan masalah bahwa kita tidak memiliki data kita sendiri. Yang berkesan bagi saya adalah betapa rumitnya persoalan ini karena ada banyak tanggung jawab hukum yang harus dipikul pihak penyedia data, yaitu perusahaan yang memantau gula darah, dan saya juga bisa memahami mengapa perusahaan besar ragu untuk membukanya
    Di sisi lain, tampaknya cukup tidak adil jika pengguna tidak bisa mengakses data yang secara sah merupakan miliknya dan bisa benar-benar dipakai untuk mengambil tindakan

    • Bagian ini selalu tidak saya pahami. Apakah ini mirip seperti saat membeli pulpen BIC, lalu kita menandatangani perjanjian lisensi wajib bahwa semua entropi yang dihasilkan dengan pulpen itu menjadi milik pembuat alat, bukan penulis datanya? Kalau orangnya tidak ada, data itu juga tidak akan ada
  • Kemarin saya membuat sesuatu yang terkait. Ini adalah plugin tmux yang menampilkan data gula darah sebagai ikon status terminal
    Saya juga penyandang diabetes tipe 1 dan memakai Dexcom sebagai CGM, jadi untuk saat ini saya membuatnya berjalan sesuai lingkungan itu, tetapi saya ingin mendukung perangkat lain dan menambah lebih banyak fitur. Kalau tertarik, bisa dilihat di sini
    https://github.com/Cian911/tmux-xdrip

    • Andai Dexcom bisa sinkron langsung dengan jam tangan. Saya sudah menunggu bertahun-tahun, tetapi mungkin itu akan banyak menguras baterai jam tangan
    • Sebagai penyandang diabetes tipe 1 yang hidup di dalam tmux, ini benar-benar keren. Saya harus mencobanya secepat mungkin
  • Ide Miao Miao menarik. Sebagai penyandang diabetes tipe 1, Freestyle Libre adalah perangkat luar biasa yang benar-benar mengubah hidup, tetapi perangkat lunaknya cukup buruk
    Saya melaporkan bug lebih dari setahun lalu, tetapi Abbott sampai sekarang masih belum mengakuinya sebagai bug. Padahal ada banyak laporan serupa di internet dan ulasan aplikasi Google Play
    Untuk siapa pun yang tertarik atau bisa membantu agar Abbott mengakuinya: bug-nya adalah meski LibreLink dimasukkan ke daftar aplikasi pengecualian mode Jangan Ganggu, itu tidak berpengaruh, dan begitu masuk mode Jangan Ganggu, langsung muncul peringatan “alarm tidak dapat digunakan”. Ini merepotkan karena saat mengaktifkan mode Jangan Ganggu di lingkungan kerja, alarm gula darah ikut mati

  • Sedikit terkait, 6 bulan lalu saya didiagnosis obstructive sleep apnea dan harus memakai mesin CPAP yang meniupkan udara dengan tekanan tertentu saat tidur untuk mencegah saluran napas tertutup. Tidak sampai sepenting misi seperti diabetes tipe 1, tetapi mesin-mesin ini mencatat log jauh lebih banyak daripada yang saya kira
    Saat membaca tulisan ini, saya jadi penasaran apakah di ranah sleep apnea juga ada pemantauan atau hack serupa untuk kasus yang lebih berat
    Saya sudah tahu OSCAR dan sangat berterima kasih menggunakannya, tetapi juga penasaran apa lagi yang ada di luar itu
    1: https://www.sleepfiles.com/OSCAR/

    • Menurut saya justru ini berkaitan langsung dengan nyawa. CPAP mengubah hidup saya, dan sleep apnea yang tidak ditangani dalam jangka panjang menyebabkan berbagai masalah kesehatan, termasuk jantung
      Saat studi tidur, pada kondisi terburuk saya tercatat sekitar 48 kejadian berhenti bernapas per menit. Kalau lidah tergulung masuk ke saluran napas, bernapas jadi cukup sulit
    • Jika mendukung perangkatnya, https://home.sleephq.com/ menangani data ini dengan baik
  • Menarik, tetapi saya penasaran mengapa tidak melihat perangkat lunak open-source di area ini seperti Nightscout, xDrip, dan sebagainya
    Ini bukan masalah baru, dan sudah banyak orang menyelesaikannya dengan solusi yang jauh lebih kaya fitur dan berjalan baik

    • Saya memang sudah melihatnya. Untuk hal yang ingin saya lakukan, rasanya lebih cepat membuat dari awal, dan itu juga pengalaman belajar yang menyenangkan
  • Scott Hanselman selama bertahun-tahun membahas diabetes tipe 1 dan berbagai hack teknologi di blog dan YouTube. Dulu ia juga pernah melakukan hack agar gula darahnya ditampilkan di prompt terminal: https://www.youtube.com/watch?v=_meKUIm9NwA

  • Bagian “selama periode ini perangkat tidak bisa mengukur gula darah, dan meski gula darah mencapai tingkat berbahaya, tidak ada notifikasi yang diterima. Error ini punya kebiasaan muncul pada momen paling membuat stres” serta “setelah diperiksa, aplikasi utama tampaknya tidak suka mengirim data ketika kadar gula darah berubah tiba-tiba sehingga terlihat seperti outlier” terdengar seperti bug yang mengancam nyawa

    • Kebanyakan sensor bekerja seperti ini. Sensor diasumsikan selalu akurat, padahal kenyataannya tidak. Misalnya, jika saat tidur tubuh berguling menindih sensor, strip glukosa oksidase bisa terdorong lebih dalam ke tubuh dan mengubah hasil pembacaan
      Secara ketat, keputusan terapi tidak seharusnya diambil hanya berdasarkan data CGM
      Untuk sensor Dexcom, beberapa aplikasi bisa mengambil nilai mentah dan melewati proses ini. Pada Libre, setidaknya Libre 3, saya pernah melihat dalam situasi tertentu datanya diisi belakangan jika sistem menilai itu bukan pembacaan yang salah, melainkan gula darah yang sedang berubah cepat
  • Ini bukan berbasis teknologi, tetapi ada juga anjing peringatan diabetes
    Belakangan saya mengetahui bahwa anjing yang terlatih dengan baik sangat berhasil melengkapi sistem pemantauan dan notifikasi berbasis teknologi untuk memperingatkan pemiliknya