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

-        калькулятор перехода на помповую инсулинотерапию;

-        калькулятор болюса;

-        калькулятор расчета ХЕ по упаковке продукта;

-        таблица продуктов с переводом в ХЕ.

Формат в виде телеграмм бота мне показался очень удобным – нет необходимости в установке приложения, нет зависимости от операционной системы, простота апгрейда путем допиливания исходника телеграмм бота на стороне сервера. В качестве языка программирования был выбран Python. Теперь об особенностях реализации модулей.

!!!Данный бот предназначен исключительно для тестирования и определения актуальности разработки и не может использоваться для определения настроек помпы или количества инсулина без рекомендации врача!!!

  1. Калькулятор перехода. Калькулятор перехода предназначен для расчета параметров инсулинотерапии при переходе на помповую инсулинотерапию. Расчет осуществляется на основе книги Инсулиновая помпа. Помощь врачу и пациенту для эффективного управления диабетом. И.И. Дедов, В.А. Петеркова, Т.Л. Кураева, Д.Н. Лаптев.

    В качестве исходных данных используются: возраст, вес, суточная доза инсулина, особенности инсулинотерапии. Код калькулятора перехода представлен ниже.

    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)))

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

  1. Калькулятор болюса. Калькулятор болюса предназначен для расчета необходимой дозы инсулина. Расчет осуществляется на основе книги Инсулиновая помпа. Помощь врачу и пациенту для эффективного управления диабетом. И.И. Дедов, В.А. Петеркова, Т.Л. Кураева, Д.Н. Лаптев. Код калькулятора болюса представлен ниже.

    В качестве исходных данных используеются: углеводный коэффициент, фактор чувствительности к инсулину, текущее значение глюкозы, употребляемое количество ХЕ, целевое значение глюкозы.

    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, "Введите значение целевой глюкозы [мМ/л]")

На выходе моделя получаем количество ЕД инсулина, необходимое ввести для приема пищи и коррекции.

  1. Калькулятор расчета ХЕ по упаковке продукта позволяет определить количество инсулина при наличии продукта в упаковке. Допустим какой-нибудь батончик или другая вкусняшка. В этом случае надо определить сколько будет употребляться углеводов в граммах и поделить это значение на 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. Таблица продуктов с переводом в ХЕ. Это классическая таблица с продуктами, которую вручают в больнице в каком-либо виде при выявлении сахарного диабета 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

!!!Данный бот предназначен исключительно для тестирования и определения актуальности разработки и не может использоваться для определения настроек помпы или количества инсулина без рекомендации врача!!!

Комментарии (2)


  1. olgapavlova
    18.08.2024 15:47
    +6

    Удачи с проектом! Всегда восхищаюсь, когда кто-то делает что-то, что может оказаться полезным для «обычных людей» (не IT-шников).

    Пара слов про эту проблематику. Возможно, вам пригодится. Мы делали большой проект по автоматизации некоторых аспектов медицинской поддержки инсулинозависимых. В профилях пользователей были и врачи, и пациенты, и даже третья сторона. Так вот, главная боль врачей в том проекте: люди не доводят своё лечение до конца. И две подболи: не связываются с врачом, когда нужно — и не сообщают всё, что нужно. Иначе говоря, осознанность у инсулинозависимых на том уровне, где автоматизировать что-то очень и очень непросто.

    Насколько я вижу, вы пытаетесь решить не эту проблему. Но эта — она вам может неявным образом мешать. Или наоборот, что-то подскажет. Так что, возможно, есть смысл поболтать с кем-то из экспертов и на эту тему тоже.


    1. Dmitry740 Автор
      18.08.2024 15:47
      +1

      Рабочая ссылка на бота

      https://t.me/Sugarnorm_bot