Как стать автором
Обновить

Подсветка клавиатуры DasKeyboard в зависимости от уровня глюкозы в крови при помощи REST API

Время на прочтение 4 мин
Количество просмотров 3.8K
Автор оригинала: Scott Hanselman
Из блога Скотта Хансельмана, преподавателя, программиста и лектора.

Я давно уже пишу в своём блоге статьи на темы, находящиеся на пересечении диабета и технологий. В 2012 году состояние технологий, связанных с диабетом, было плачевным, но сейчас они испытывают многообещающий подъём.

Если у вас диабет I типа и вы используете аппарат для непрерывного измерения уровня глюкозы (continuous glucose meter, CGM), вам понадобится настроить сервис Nightscout, и у вас появится REST API для доступа к данным по уровню глюкозы в крови. CGM проверяет уровень глюкозы в моей крови каждые 5 минут, по каналу Bluetooth с низким энергопотреблением данные поступают в мой телефон, а оттуда – в облако. Но вам нужно хранить данные по глюкозе в облаке, находящемся под вашим контролем. Производители CGM предлагают собственные облака, но мы можем легко наладить экспорт оттуда в базу данных MongoDB.

Мой Nightscout работает в Azure и у моего тела есть свой REST API. Я могу сделать следующий запрос HTTP GET:

/api/v1/entries.json?count=3

и получить ответ такого рода:

[
{
  _id: "5c6066d477b2a69a0a7810e5",
  sgv: 143,
  date: 1549821626000,
  dateString: "2019-02-10T18:00:26.000Z",
  trend: 4,
  direction: "Flat",
  device: "share2",
  type: "sgv"
},
{
  _id: "5c6065a877b2a69a0a7801ce",
  sgv: 134,
  date: 1549821326000,
  dateString: "2019-02-10T17:55:26.000Z",
  trend: 4,
  direction: "Flat",
  device: "share2",
  type: "sgv"
},
{
  _id: "5c60647b77b2a69a0a77f381",
  sgv: 130,
  date: 1549821026000,
  dateString: "2019-02-10T17:50:26.000Z",
  trend: 4,
  direction: "Flat",
  device: "share2",
  type: "sgv"
}
]

Если я поменяю в URL .json на .txt, то получу следующее:

2019-02-10T18:00:26.000Z    1549821626000    143    Flat    
2019-02-10T17:55:26.000Z    1549821326000    134    Flat    
2019-02-10T17:50:26.000Z    1549821026000    130    Flat    

Значение flat в конце – это значение типа enum, дающее мне общее представление о поведении глюкозы. Диабетикам приходится следить за глюкозой ежечасно, а иногда и ежеминутно. Поэтому нам очень важно иметь перед глазами дисплеи, на которые можно быстро взглянуть. То есть, что угодно, что может дать представление о моём текущем состоянии.

К примеру:

  • Алекса, какой у меня уровень глюкозы?
  • Как добавить данные и тенденции по глюкозе в запрос Git/PATH в строку ввода.
  • Arduino с ЖК-дисплеем.
  • Настенный календарь dakBoard Family Calendar, показывающий уровень глюкозы.



Недавно я приобрёл себе Das Keyboard 5Q – а впервые я писал о Das Keyboard аж в 2006 году! У неё есть собственный REST API. И я работаю над тем, чтобы использовать Applet API от клавиатуры для того, чтобы подсвечивать её верхние клавиши в соответствии с изменениями уровня глюкозы в моей крови. Я буду использовать их библиотеки для Node и JavaScript, и всё будет работать в контексте их ПО.

Однако поскольку у клавиатуры есть REST API, работающий на localhost, и у моего уровня глюкозы тоже он есть, я сделал на коленке следующий скрипт. Я добавил его в cron, и теперь моя клавиатура меняет подсветку с оранжевого цвета (низкий уровень) до зелёного, жёлтого или красного (высокий уровень) параллельно с изменениями уровня глюкозы в моей крови. Получился неплохой фоновый индикатор. Кто-то писал в твиттере о том, что, дескать, никто не смотрит на клавиатуру. По-моему, это глупо. Я наверняка замечу, если моя клавиатура покраснеет. Это всё-таки фоновое предупреждение, но при необходимости я легко могу добавить в скрипт вызов какого-то более явного сообщения.

#!/bin/sh
# Скрипт окрашивает все светодиоды клавиатуры
# отправляя JSON-сигналы на десктопный API.
# на основе данных по уровню глюкозы от Nightscout
set -e # quit on first error.
PORT=27301

# Окрасить клавиатуру 5Q 
PID="DK5QPID" # product ID

# Зона светодиодов. На 5Q зон меньше, чем 166
# Это должно охватить их все.
MAX_ZONE_ID=166

# Получить данные по глюкозе с Nightscout в виде TEXT
red=#f00
green=#0f0
yellow=#ff0
# оранжевый цвет – низкий уровень глюкозы
COLOR=#f50 
bgvalue=$(curl -s  https://MYSITE/api/v1/entries.txt?count=1 | grep -Eo '000\s([0-9]{1,3})+\s' | cut -f 2)
if [ $bgvalue -gt 80 ]
then 
    COLOR=$green
    if [ $bgvalue -gt 140 ]
    then
        COLOR=$yellow
        if [ $bgvalue -gt 200 ]
        then
            COLOR=$red
        fi
    fi
fi

echo "Уровень глюкозы $bgvalue, а цвет $COLOR!"

for i in `seq $MAX_ZONE_ID`
do
    #echo "Отправка сигнала на zoneId: $i"
    # ВАЖНО: если оставить поля "name" и "message" пустыми, то сигнал
    # выводится только на светодиодах
    curl -s -S --output /dev/null -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{
        "name": "Nightscout",
        "id": "'$i'",
        "message": "Blood sugar is '$bgvalue'",
        "pid": "'$PID'",
        "zoneId": "'"$i"'",
        "color": "'$COLOR'",
        "effect": "SET_COLOR"
       
    }' "http://localhost:$PORT/api/1.0/signals"

done
echo "\nГотово.\n\"

Локальный API клавиатуры должен отправлять сигнал только для одной зоны, или клавиши, поэтому я применил небольшой хак, отправляя больше сотни запросов REST для окраски всей клавиатуры. Однако все эти вызовы происходят локально и не сильно загружают систему. После перехода на новый API всё станет аккуратнее.


Также по нажатию клавиши громкость совместно с любой подсвеченной клавишей появляется всплывающее окно с точным значением уровня глюкозы (это message во втором вызове curl). Это опять-таки хак, но я собираюсь сделать из этого формальное приложение, которое можно будет устанавливать из магазина приложений. Код можно взять тут.

Какие ещё у вас есть хорошие идеи по поводу фонового уведомления об уровне сахара? Светодиодная лента вокруг монитора? Умная лампочка Phillips Hue?

Кстати, идею с дисплеем, на который можно посмотреть, можно использовать и для отслеживания других показателей – пульса, тревожности, кровяного давления – всего, что можно измерять в своём теле в реальном (или почти реальном) времени.
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+14
Комментарии 4
Комментарии Комментарии 4

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн