Продолжая тему разработки симулятора инсулиновой помпы в формате телеграм бота, достиг некоторых успехов. В прошлой версии симулятора был очень ограниченный функционал, что не позволяло использовать его для обучения принципам помповой инсулинотерапии. Что сделано в новой версии:
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. Также добавился хелп. Каким бы интуитивно понятным не был интерфейс телеграм бота, без хелпа обойтись нельзя.
Полевые испытания...
Протестируем все нововведения в общей концепции
После появления стартовой заставки бот предлагает нам нажатькнопку «Старт»
После старта выводится сообщение предупреждение — это всего лишь бот, а не Ваш лечащий врач и краткая последовательность действий. После клика на кнопке «Меню» выводится основное меню симулятора.
В соответствии с первым пунктом справки сформируем пациента. В ответном сообщении бот прислал нам описание пациента.
Введем начальные настройки УК. Кнопка УК, бот присылает текущие значения. Отсылаем боту 13 и вводим 2.
Проверяем, изменились ли настройки УК. Да все хорошо. Выходим без коррекции.
Аналогичным образом поступаем с ФЧИ (введем значение 5) и БП (введем значение 0.5). Сделаем первый шаг симуляции «Перемотка 2 часа».
Да, базы мало. Добавим базу до 1.
Уже лучше, но все равно мало. Добавляем еще и смотрим, что получится. За несколько итераций удалось добиться более-менее адекватной базы.
Да, такиемы «редиски» у нас виртуальный пациент не ест второй день. Ладно, для полевых испытаний простительно.
Пробуем прикинуть ФЧИ. Точное значение глюкозы можно можно посмотреть с помощью кнопки «Инфо».
Ставим единицу инсулина. Клик «Инсулин» и не обращая внимания на помощник болюса ставим 1.
Перематываем на 2 часа и смотрим подробную информацию.
Сахар был 11.4 мМ/л, мы поставили 1 единицу инсулина и сахар стал 10.2 мМ/л. Если база примерно правильная, то ФЧИ равно, примерно, 1.2 мМ/л. Вводим данное значение в настройки симулятора.
Протестим правильность ФЧИ. Сейчас глюкоза 10.2 мМ/л. Мы скорректировали ФЧИ, поэтому доверимся помощнику болюса на снижение.
Помощник предлагает 2.7 единицы на коррекцию. Согласимся. Перемотка 2 часа. ФЧИ получился чуть завышен. Мне кажется можно пока поставить 1.1 мМ/л.
От ФЧИ пока отстанем. Пробуем УК. Давайте примем пищу на 2 ХЕ. Кликаем «Еда» и вводим 2 ХЕ. Дальше помощник болюса. Он нам предлагает поставить 4 единицы инсулина на еду. Ставим и перематываем на 2 часа.
Получаем значение глюкозы 8.5 мМ/л, а до еды было 7.9 мМ/л. Добавим УК. Было 2, сделаем 2.5. Также едим 2 ХЕ и помощник болюса предлагает поставить 5 единиц инсулина. Соглашаемся и мотаем. Через 2 часа глюкоза 8.5 мМ/л.
Таким образом мы очень грубо настроили симулятор по основным параметрам без учета колебаний в течении суток. При этом мы не учитывали распорядок приемов пищи пациента, что очень плохо. Симулятор нам не выдал сообщения о достижения компенсации. Но для сокращения повествования я предлагаю по паролю вывести сравнение нашего варианта настройки с правильным.
По БП мы почти справились. Отклонение ФЧИ в пределах допуска, а вот УК надо еще подбирать и подбирать.
Плюсы данного симулятора:
не зависит от операционной системы, работает везде где есть телеграм;
генерит уникальные варианты, что не позволяет «передрать» у соседа;
вносит в освоение подбора параметров инсулиновой помпы момент «игры», что повышает заинтересованность обучаемых;
Может применяться в школах диабета, мед.учреждениях при изучении методики настройки инсулиновых помп.