Симулятор инсулиновой помпы (версия «продакшн»)

в 19:30, , рубрики: инсулин, инсулиновая помпа, сахарный диабет, симулятор

Продолжая тему разработки симулятора инсулиновой помпы в формате телеграм бота, достиг некоторых успехов. В прошлой версии симулятора был очень ограниченный функционал, что не позволяло использовать его для обучения принципам помповой инсулинотерапии. Что сделано в новой версии:

1.      Все ключевые настройки (УК, ФЧИ и БП) представлены в виде списков из 12 значений (интервал 2 часа), что позволило у виртуального пациента ввести вариативность значений в течении суток. Соответственно, корректировка производится отдельно для каждого интервала или одно значение для всех, что очень удобно для первичной настройки симулятора.

Результат клика по кнопке "УК"
Результат клика по кнопке "УК"

2.      Значение глюкозы выводится в виде графиков, построенных с использованием библиотеки Pil. При этом реализован показ статистики изменения глюкозы за 3 дня, что позволяет выявить закономерности и сделать корректировку настроек. Исходник сбора статистики изменения глюкозы представлен ниже

  # добавление данных
        if users[call.from_user.id]['day'] % 3 == 1:
            users[call.from_user.id]['sug_1'][int(users[call.from_user.id]['chas']/2)] = users[call.from_user.id]['gluk_tek']
        elif users[call.from_user.id]['day'] % 3 == 2:
            users[call.from_user.id]['sug_2'][int(users[call.from_user.id]['chas']/2)] = users[call.from_user.id]['gluk_tek']
        elif users[call.from_user.id]['day'] % 3 == 0:
            users[call.from_user.id]['sug_3'][int(users[call.from_user.id]['chas']/2)] = users[call.from_user.id]['gluk_tek']

Построением графиков занимается модуль grafik.py

from PIL import Image, ImageDraw

def graf(data):
    image = Image.new("RGB", (215, 190), (0, 0, 0))
    draw = ImageDraw.Draw(image)

    for i in range(0,12):
        draw.text((10+i*15,10),str(i*2))
        draw.line(((15+i*15,30),(15+i*15,180)),fill="grey",width=1)

    for i in range(0,4):
        draw.line(((15, 149-i*35), (185, 149-i*35)), fill="grey", width=1)  # 5
        draw.text((190, 143-i*35), str(5+i * 5))
    draw.line(((15, 170), (185, 170)), fill="grey", width=1) #2 шаг по 7
    draw.text((190, 164), str(2))
    for i in range(0,12):
        if data[i]!=100:
            draw.ellipse((13+15*i,182-data[i]*7,17+15*i,186-data[i]*7),"red")
            if i>0:
                draw.line(((15+15*(i-1),184-data[i-1]*7),(15+15*i,184-data[i]*7)), fill="red", width=1)
            #draw.line(((15+i*15,30),(15+i*15,180)),fill="grey",width=1)

    del draw
    image.save("test.png", "PNG")

После этого остается только вывести графики в зависимости от номера текущего дня (для 1 дня выводится 1 график, для второго - 2, для третьего и последующих выводится по 3 последних дня).

 if call.data == "btn_graf":  # Обработка нажатия inline кнопки
        bot.send_message(call.message.chat.id,"График глюкозы "+str(users[call.from_user.id]['day'])+" день")
        if users[call.from_user.id]['day'] % 3 == 1:
            graf(users[call.from_user.id]['sug_1'])
        elif users[call.from_user.id]['day'] % 3 == 2:
            graf(users[call.from_user.id]['sug_2'])
        elif users[call.from_user.id]['day'] % 3 == 0:
            graf(users[call.from_user.id]['sug_3'])
        f = open("test.png", 'rb')
        bot.send_photo(call.message.chat.id, f)

        for j in range(1,3):
            if users[call.from_user.id]['day']>j:
                bot.send_message(call.message.chat.id, "График глюкозы " + str(users[call.from_user.id]['day']-j) + " день")
                if (users[call.from_user.id]['day']-j) % 3 == 1:
                    graf(users[call.from_user.id]['sug_1'])
                elif (users[call.from_user.id]['day']-j) % 3 == 2:
                    graf(users[call.from_user.id]['sug_2'])
                elif (users[call.from_user.id]['day']-j) % 3 == 0:
                    graf(users[call.from_user.id]['sug_3'])
                f = open("test.png", 'rb')
                bot.send_photo(call.message.chat.id, f)

3.      В боте предусмотрена сигнализация о высоком и низком уровнях глюкозы, а также о достижении компенсации (отклонение значений ключевых настроек не более 0.1 от эталонных (проверка поэлементная, а не суммарная)).

Сигнализация о высоком или низком сахаре

Сигнализация о высоком или низком сахаре

4.      Для администратора по ключевым словам доступна статистика подключения к боту, а также возможность очищения статистики.

Статистика подключения пользователей

Статистика подключения пользователей

На текущий момент бот добавил в статистику только мои подключения. Имя пользователя определяется по идентификатору

    UsrInfo = bot.get_chat_member(message.chat.id, message.chat.id).user
    zapis(str(UsrInfo.first_name))

Функция zapis просто осуществляет запись в файл статистики.

5.      На текущий момент доступна опция просмотра разницы установленных параметров от эталонных (в том случае если вообще никак) по паролю.

6.Также добавился хелп. Каким бы интуитивно понятным не был интерфейс телеграм бота, без хелпа обойтись нельзя.

Полевые испытания...

Протестируем все нововведения в общей концепции

Стартовая заставка

Стартовая заставка

После появления стартовой заставки бот предлагает нам нажать кнопку "Старт"

Симулятор инсулиновой помпы (версия «продакшн») - 5

После старта выводится сообщение предупреждение - это всего лишь бот, а не Ваш лечащий врач и краткая последовательность действий. После клика на кнопке "Меню" выводится основное меню симулятора.

Меню симулятора

Меню симулятора

В соответствии с первым пунктом справки сформируем пациента. В ответном сообщении бот прислал нам описание пациента.

Описание пациента

Описание пациента

Введем начальные настройки УК. Кнопка УК, бот присылает текущие значения. Отсылаем боту 13 и вводим 2.

Начальные значения УК

Начальные значения УК

Проверяем, изменились ли настройки УК. Да все хорошо. Выходим без коррекции.

Значения УК

Значения УК

Аналогичным образом поступаем с ФЧИ (введем значение 5) и БП (введем значение 0.5). Сделаем первый шаг симуляции "Перемотка 2 часа".

График глюкозы

График глюкозы

Да, базы мало. Добавим базу до 1.

График глюкозы

График глюкозы

Уже лучше, но все равно мало. Добавляем еще и смотрим, что получится. За несколько итераций удалось добиться более-менее адекватной базы.

График глюкозы за неполных 2 дня

График глюкозы за неполных 2 дня

Да, такие мы "редиски" у нас виртуальный пациент не есть второй день. Ладно, для полевых испытаний простительно.

Пробуем прикинуть ФЧИ. Точное значение глюкозы можно можно посмотреть с помощью кнопки "Инфо".

Ответ бота на клик "Инфо"

Ответ бота на клик "Инфо"

Ставим единицу инсулина. Клик "Инсулин" и не обращая внимания на помощник болюса ставим 1.

Введение 1 инсулина

Введение 1 инсулина

Перематываем на 2 часа и смотрим подробную информацию.

Подробная информация

Подробная информация

Сахар был 11.4 мМ/л, мы поставили 1 единицу инсулина и сахар стал 10.2 мМ/л. Если база примерно правильная, то ФЧИ равно, примерно, 1.2 мМ/л. Вводим данное значение в настройки симулятора.

Контроль правильности введения ФЧИ

Контроль правильности введения ФЧИ

Протестим правильность ФЧИ. Сейчас глюкоза 10.2 мМ/л. Мы скорректировали ФЧИ, поэтому доверимся помощнику болюса на снижение.

Помощник болюса

Помощник болюса

Помощник предлагает 2.7 единицы на коррекцию. Согласимся. Перемотка 2 часа. ФЧИ получился чуть завышен. Мне кажется можно пока поставить 1.1 мМ/л.

Глюкоза 7,9 при целевом значении 7

Глюкоза 7,9 при целевом значении 7

От ФЧИ пока отстанем. Пробуем УК. Давайте примем пищу на 2 ХЕ. Кликаем "Еда" и вводим 2 ХЕ. Дальше помощник болюса. Он нам предлагает поставить 4 единицы инсулина на еду. Ставим и перематываем на 2 часа.

Получаем значение глюкозы 8.5 мМ/л, а до еды было 7.9 мМ/л. Добавим УК. Было 2, сделаем 2.5. Также едим 2 ХЕ и помощник болюса предлагает поставить 5 единиц инсулина. Соглашаемся и мотаем. Через 2 часа глюкоза 8.5 мМ/л.

Таким образом мы очень грубо настроили симулятор по основным параметрам без учета колебаний в течении суток. При этом мы не учитывали распорядок приемов пищи пациента, что очень плохо. Симулятор нам не выдал сообщения о достижения коррекции. Но для сокращения повествования я предлагаю по паролю вывести сравнение нашего варианта настройки с правильным.

Результат сравнения значений по БП и ФЧИ

Результат сравнения значений по БП и ФЧИ
Результат сравнения по УК

Результат сравнения по УК

По БП мы почти справились. Отклонение ФЧИ в пределах допуска, а вот УК надо еще подбирать и подбирать.

Плюсы данного симулятора:

1) не зависит от операционной системы, работает везде где есть телеграм;

2) генерит уникальные варианты, что не позволяет "передрать" у соседа;

3) вносит в освоение подбора параметров инсулиновой помпы момент "игры", что повышает заинтересованность обучаемых;

Может применяться в школах диабета, мед.учреждениях при изучении методики настройки инсулиновых помп.

Автор: Dmitry740

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js