В прошлой статье я рассказал про проект симулятора инсулинотерапии SugarNorm. Данный проект пока не нашел интереса со стороны медицинских учебных заведений. Главным его недостатком, на мой взгляд, является исполнение в виде декстопного приложения. Дополнительными фишками симулятора инсулинотерапии являлись калькулятор перехода на помповую инсулинотерапию и калькулятор болюса. Поэтому появилась идея устранения главного недостатка проекта путем разработки телеграмм бота, способного реализовать следующие функции:
- калькулятор перехода на помповую инсулинотерапию;
- калькулятор болюса;
- калькулятор расчета ХЕ по упаковке продукта;
- таблица продуктов с переводом в ХЕ.
Формат в виде телеграмм бота мне показался очень удобным – нет необходимости в установке приложения, нет зависимости от операционной системы, простота апгрейда путем допиливания исходника телеграмм бота на стороне сервера. В качестве языка программирования был выбран Python. Теперь об особенностях реализации модулей.
!!!Данный бот предназначен исключительно для тестирования и определения актуальности разработки и не может использоваться для определения настроек помпы или количества инсулина без рекомендации врача!!!
-
Калькулятор перехода. Калькулятор перехода предназначен для расчета параметров инсулинотерапии при переходе на помповую инсулинотерапию. Расчет осуществляется на основе книги Инсулиновая помпа. Помощь врачу и пациенту для эффективного управления диабетом. И.И. Дедов, В.А. Петеркова, Т.Л. Кураева, Д.Н. Лаптев.
В качестве исходных данных используются: возраст, вес, суточная доза инсулина, особенности инсулинотерапии. Код калькулятора перехода представлен ниже.
if users[message.from_user.id]['mode'] == 1: # Продолжение работы калькулятора перехода
if users[message.from_user.id]['vozr'] == 0 and users[message.from_user.id]['ves'] == 0 and \
users[message.from_user.id]['doza'] == 0 and users[message.from_user.id]['mode'] == 1:
if is_number(message.text):
users[message.from_user.id]['vozr'] = float(message.text)
bot.send_message(message.chat.id, "Введите вес [кг]")
else:
bot.send_message(message.chat.id, "Можно ввести только число")
bot.send_message(message.chat.id, "Введите возраст [лет]")
elif users[message.from_user.id]['vozr'] != 0 and users[message.from_user.id]['ves'] == 0 and \
users[message.from_user.id]['doza'] == 0 and users[message.from_user.id]['mode'] == 1:
if is_number(message.text):
users[message.from_user.id]['ves'] = float(message.text)
bot.send_message(message.chat.id, "Введите суточную дозу инсулина [ед.]")
else:
bot.send_message(message.chat.id, "Можно ввести только число")
bot.send_message(message.chat.id, "Введите вес [кг]")
elif users[message.from_user.id]['vozr'] != 0 and users[message.from_user.id]['ves'] != 0 and \
users[message.from_user.id]['doza'] == 0 and users[message.from_user.id]['mode'] == 1:
if is_number(message.text):
users[message.from_user.id]['doza'] = float(message.text)
bot.send_message(message.chat.id, "Частые гипогликемии, введите 1")
bot.send_message(message.chat.id,
"Хорошие показатели глюкозы в крови, редкие или вообще отсутствующие гипогликемии, введите 2")
bot.send_message(message.chat.id,
"Высокие показатели глюкозы в крови, редкие или вообще отсутствующие гипогликемии, введите 3")
else:
bot.send_message(message.chat.id, "Можно ввести только число")
bot.send_message(message.chat.id, "Введите суточную дозу инсулина [ед.]")
elif users[message.from_user.id]['vozr'] != 0 and users[message.from_user.id]['ves'] != 0 and \
users[message.from_user.id]['doza'] != 0 and users[message.from_user.id]['mode'] == 1:
if message.text == "1" or message.text == "2" or message.text == "3":
if message.text == "2":
users[message.from_user.id]['doza'] = users[message.from_user.id]['doza'] * 0.8
if message.text == "3":
users[message.from_user.id]['doza'] = users[message.from_user.id]['doza'] * 0.9
if users[message.from_user.id]['vozr'] <= 6.5:
baza = users[message.from_user.id]['doza'] * 0.33 / 24
UK = 1.25 * users[message.from_user.id]['doza'] / users[message.from_user.id]['ves']
if 6.5 < users[message.from_user.id]['vozr'] <= 12.5:
baza = users[message.from_user.id]['doza'] * 0.37 / 24
UK = 1.4 * users[message.from_user.id]['doza'] / users[message.from_user.id]['ves']
if 12.5 < users[message.from_user.id]['vozr'] <= 18.5:
baza = users[message.from_user.id]['doza'] * 0.45 / 24
UK = 2 * users[message.from_user.id]['doza'] / users[message.from_user.id]['ves']
if users[message.from_user.id]['vozr'] > 18.5:
baza = users[message.from_user.id]['doza'] * 0.45 / 24
UK = 1.74 * users[message.from_user.id]['doza'] / users[message.from_user.id]['ves']
if users[message.from_user.id]['vozr'] <= 17.5:
PHI = 110 / users[message.from_user.id]['doza']
if users[message.from_user.id]['vozr'] > 17.5:
PHI = 100 / users[message.from_user.id]['doza']
bot.send_message(message.chat.id, "Базальная профиль [ЕД/ч]: " + str(round(baza, 2)))
bot.send_message(message.chat.id, "Углеводный коэффициент [ЕД/ХЕ]: " + str(round(UK, 2)))
bot.send_message(message.chat.id, "Фактор чувствительности к инсулину [мМ/л]: " + str(round(PHI, 2)))
На выходе калькулятора получаем примерные настройки помпы: базальный профиль, углеводный коэффициент, фактор чувствительности к инсулину.
-
Калькулятор болюса. Калькулятор болюса предназначен для расчета необходимой дозы инсулина. Расчет осуществляется на основе книги Инсулиновая помпа. Помощь врачу и пациенту для эффективного управления диабетом. И.И. Дедов, В.А. Петеркова, Т.Л. Кураева, Д.Н. Лаптев. Код калькулятора болюса представлен ниже.
В качестве исходных данных используеются: углеводный коэффициент, фактор чувствительности к инсулину, текущее значение глюкозы, употребляемое количество ХЕ, целевое значение глюкозы.
if users[message.from_user.id]['mode_2'] == 1: # Продолжение работы калькулятора болюса
if users[message.from_user.id]['uk'] == 0 and users[message.from_user.id]['phi'] == 0 and \
users[message.from_user.id]['gluk_tek'] == 0 and users[message.from_user.id]['kol_xe'] == 0 and \
users[message.from_user.id]['mode_2'] == 1:
if is_number(message.text):
users[message.from_user.id]['uk'] = float(message.text)
bot.send_message(message.chat.id, "Введите фактор чувствительности к инсулину [мМ/л]")
else:
bot.send_message(message.chat.id, "Можно ввести только число")
bot.send_message(message.chat.id, "Введите углеводный коэффициент [ЕД/ХЕ]")
elif users[message.from_user.id]['uk'] != 0 and users[message.from_user.id]['phi'] == 0 and \
users[message.from_user.id]['gluk_tek'] == 0 and users[message.from_user.id]['kol_xe'] == 0 and \
users[message.from_user.id]['mode_2'] == 1:
if is_number(message.text):
users[message.from_user.id]['phi'] = float(message.text)
bot.send_message(message.chat.id, "Введите текущее значение глюкозы [мМ/л]")
else:
bot.send_message(message.chat.id, "Можно ввести только число")
bot.send_message(message.chat.id, "Введите фактор чувствительности к инсулину [мМ/л]")
elif users[message.from_user.id]['uk'] != 0 and users[message.from_user.id]['phi'] != 0 and \
users[message.from_user.id]['gluk_tek'] == 0 and users[message.from_user.id]['kol_xe'] == 0 and \
users[message.from_user.id]['mode_2'] == 1:
if is_number(message.text):
users[message.from_user.id]['gluk_tek'] = float(message.text)
bot.send_message(message.chat.id, "Введите количество углеводов [ХЕ]")
else:
bot.send_message(message.chat.id, "Можно ввести только число")
bot.send_message(message.chat.id, "Введите текущее значение глюкозы [мМ/л]")
elif users[message.from_user.id]['uk'] != 0 and users[message.from_user.id]['phi'] != 0 and \
users[message.from_user.id]['gluk_tek'] != 0 and users[message.from_user.id]['kol_xe'] == 0 and \
users[message.from_user.id]['mode_2'] == 1:
if is_number(message.text):
users[message.from_user.id]['kol_xe'] = float(message.text)
bot.send_message(message.chat.id, "Введите значение целевой глюкозы [мМ/л]")
else:
bot.send_message(message.chat.id, "Можно ввести только число")
bot.send_message(message.chat.id, "Введите количество углеводов [ХЕ]")
elif users[message.from_user.id]['uk'] != 0 and users[message.from_user.id]['phi'] != 0 and \
users[message.from_user.id]['gluk_tek'] != 0 and users[message.from_user.id]['kol_xe'] != 0 and \
users[message.from_user.id]['mode_2'] == 1:
if is_number(message.text):
ins = ((users[message.from_user.id]['gluk_tek'] - float(message.text)) / users[message.from_user.id]['phi']) + users[message.from_user.id]['kol_xe'] * users[message.from_user.id]['uk']
bot.send_message(message.chat.id, "Необходимо ввести " + str(round(ins, 1)) + " ЕД")
menu(message) # Вызов функции меню для выхода из режима калькулятора
else:
bot.send_message(message.chat.id, "Можно ввести только число")
bot.send_message(message.chat.id, "Введите значение целевой глюкозы [мМ/л]")
На выходе моделя получаем количество ЕД инсулина, необходимое ввести для приема пищи и коррекции.
-
Калькулятор расчета ХЕ по упаковке продукта позволяет определить количество инсулина при наличии продукта в упаковке. Допустим какой-нибудь батончик или другая вкусняшка. В этом случае надо определить сколько будет употребляться углеводов в граммах и поделить это значение на 11 ( 11 грамм это и есть 1 ХЕ). Ниже представлен код.
Исходными данным для калькулятора являются: вес порции продукта, количество углеводов в 100 грамм продукта.
if users[message.from_user.id]['mode_1'] == 1: # Продолжение работы калькулятора XE
if users[message.from_user.id]['ves_porc'] == 0 and users[message.from_user.id]['mode_1'] == 1:
if is_number(message.text):
users[message.from_user.id]['ves_porc'] = float(message.text)
bot.send_message(message.chat.id, "Введите количество углеводов в 100 г. [г.]")
else:
bot.send_message(message.chat.id, "Можно ввести только число")
bot.send_message(message.chat.id, "Введите вес порции продукта [г.]")
elif users[message.from_user.id]['ves_porc'] != 0 and users[message.from_user.id]['mode_1'] == 1:
if is_number(message.text):
xe = (users[message.from_user.id]['ves_porc'] * float(message.text) / 100) / 11
bot.send_message(message.chat.id, "В одной порции " + str(round(xe, 1)) + " ХЕ")
menu(message) # Вызов функции меню для выхода из режима калькулятора
else:
bot.send_message(message.chat.id, "Можно ввести только число")
bot.send_message(message.chat.id, "Введите количество углеводов в 100 г. [г.]")
На выходе модуля получаем количество ХЕ в одной порции продукта.
Таблица продуктов с переводом в ХЕ. Это классическая таблица с продуктами, которую вручают в больнице в каком-либо виде при выявлении сахарного диабета 1 типа. Данная таблица реализована в виде отдельного файла.
"""
Словарь для списка продуктов
"""
spisok=[["Абрикос", "средний 1 шт.", 120],
["Ананас", "1 ломтик с кожурой поперечный срез", 140],
["Апельсин", "с кожурой маленький 1 шт.", 130],
["Арбуз", "один ломтик с кожурой", 270],
["Банан", "средний 1/2 шт.", 70],
["Блин тонкий", "1 большой", 30],
["Виноград", "средний 10 шт.", 70],
["Грейпфрут", "крупный 1/2 шт.", 170],
["Грецкие орехи (очищенные)", "б.л. с горкой", 90],
["Груша", "средняя 1 шт.", 100],
["Дыня", "один ломтик с кожурой", 100],
["Карт. жар.", "1.5-2 ст. ложки в зависимости от нарезки", 35],
["Карт. пюре.", "2 ст. ложки", 75],
["Карт. чипсы", "1 маленький пакетик", 25],
["Карт. Фри.", "12 ломтиков", 35],
["Каша", "2 ст. ложки с горкой", 50],
["Кефир", "1 стакан", 250],
["Компот", "1 стакан", 250],
["Крекеры крупные", "2 шт.", 20],
["Кукуруза (початок)", "0.5 шт.", 100],
["Кукур. хлопья", "4 ст. ложки", 15],
["Макароны", "в зависимости от формы от 2 до 4 ст. ложек", 50],
["Мандарины", "мелкие 3 шт. с кожурой", 150],
["Мармелад", "-", 20],
["Мед", "1 ст. ложка", 11],
["Молоко", "1 стакан", 200],
["Мороженое", "-", 65],
["Морож. (глаз.)", "-", 50],
["Нектарин", "средний", 120],
["Оладьи", "1 средний", 30],
["Персик", "средний", 120],
["Пицца", "-", 50],
["Пряник", "1/2 шт.", 40],
["Сдобная булка", "-", 20],
["Сок", "0.5 стакана", 125],
["Сырник средний (с сахаром)", "1 штука", 75],
["Фундук", "3/4 стакана", 90],
["Хлеб белый", "1 кусок толщиной 1.5 см.", 20],
["Хлеб черный", "1 кусок толщиной 1 см.", 25],
["Хурма", "средняя 1 шт.", 70],
["Черешня", "10 шт. (или 1 стакан)", 100],
["Черника", "7 ст. ложек (или 1 стакан)", 140],
["Шоколад", "1/5 плитки", 20],
["Яблоко", "среднее 1 шт.", 90]]
А в самом модуле вывода добавлен поиск по первой букве названия продукта.
@bot.message_handler(content_types=["text"])
def gr_list(message):
"""
Функция для вывода списка продуктов (Полноcтью реализована в данной функции)
"""
fin_stroka = []
for i in range(len(spisok)):
stroka = spisok[i][0]
if stroka[0] == message.text.upper() or message.text == "*":
fin_stroka.append(' '.join([spisok[i][0], " || ", str(spisok[i][1]), " || ", str(spisok[i][2]), "г."]))
if fin_stroka != []:
bot.send_message(message.chat.id, "Название || количество на 1 ХЕ || вес на 1 ХЕ:")
bot.send_message(message.chat.id, '\n'.join(fin_stroka))
else:
bot.send_message(message.chat.id, "Продукты не найдены")
menu(message) # Вызов функции меню для выхода из режима вывода списка продуктов
Очень хотелось бы получить мнение лиц, заинтересованных в данной разработке. На текущий момент бот развернут только на локальном сервере, поэтому доступен с перебоями. @Sugarnorm_bot
!!!Данный бот предназначен исключительно для тестирования и определения актуальности разработки и не может использоваться для определения настроек помпы или количества инсулина без рекомендации врача!!!
olgapavlova
Удачи с проектом! Всегда восхищаюсь, когда кто-то делает что-то, что может оказаться полезным для «обычных людей» (не IT-шников).
Пара слов про эту проблематику. Возможно, вам пригодится. Мы делали большой проект по автоматизации некоторых аспектов медицинской поддержки инсулинозависимых. В профилях пользователей были и врачи, и пациенты, и даже третья сторона. Так вот, главная боль врачей в том проекте: люди не доводят своё лечение до конца. И две подболи: не связываются с врачом, когда нужно — и не сообщают всё, что нужно. Иначе говоря, осознанность у инсулинозависимых на том уровне, где автоматизировать что-то очень и очень непросто.
Насколько я вижу, вы пытаетесь решить не эту проблему. Но эта — она вам может неявным образом мешать. Или наоборот, что-то подскажет. Так что, возможно, есть смысл поболтать с кем-то из экспертов и на эту тему тоже.
Dmitry740 Автор
Рабочая ссылка на бота
https://t.me/Sugarnorm_bot