Алиса, Яндекс.Станция и Nigthscout

от автора

Родители детей с диабетом знают, как сложно убедить ребенка постоянно следить за уровнем глюкозы. Поэтому любой дополнительный интерфейс «лишним» не будет: виджет на телефоне, смарт-часы, уведомления в мобильном приложении.

Сервис Nightscout, представляющий собой веб-приложение с базой данных об уровне глюкозы и событиях терапии, позволяет обращаться к себе по API с запросом информации. А всем известная голосовая помощница и колонка с ней — позволяет разрабатывать для себя индивидуальные варианты диалогов «запрос» — «ответ».

Например, «скажи, какой уровень глюкозы у … ?». а в ответ: «уровень такой-то, снижение/рост на столько-то, за последние Х минут снижение/рост умеренный/сильный на Y ммоль на литр.» (немного легкой аналитики и выводов).

Итак, по шагам.

  1. Заводим аккаунт в Яндекс.Cloud и создаем Virtual Private Cloud (своё личное облако). Это бесплатно в «минимальной комплектации» и при умеренном потреблении ресурсов (как и всё остальное, перечисленное ниже). Выполните шаги из раздела «Перед началом работы» и «Создайте облачную сеть» из инструкции по ссылке https://cloud.yandex.ru/docs/vpc/quickstart?from=int-console-help-center-or-nav

    Теперь у вас есть облако и каталог в нём, где можно создавать функции (программы, которые можно запускать по команде).

  2. Создаем функцию в облаке. В ней будет программный код, который Алиса запустит по команде и получит от него результат, который сообщит голосом.

    1. В консоли управления перейдите в каталог. Выберите сервис Cloud Functions. Нажмите кнопку Создать функцию. Введите имя функции — get-glucose-from-nightscout (имя не имеет значения, введите любое понятное). Нажмите кнопку Создать. Система предложит выбор языка программирования и его версии, выбираем Python 3.7, галку «Добавить файлы с примерами кода» оставляем на месте.

    2. В появившемся интерфейсе функции есть разделы: обзор, редактор, тестирование. Сейчас мы находимся в редакторе. Он состоит из трех областей: список файлов в левой части, открытые файлы справа (пока один — index.py) и параметры функции внизу.

    3. В области справа открыт файл index.py, удаляем всё из него и вставляем туда код, указывая в нем свои апи-секрет Найтскаута и свой адрес сайта (домен):

import requests import datetime  NS_API_SECRET = 'апи-секрет найтскаута'  NS_DOMAIN = r'https://сайт.доменнаязона'  # главная функция - она же указана в параметрах как точка входа def handler(event, context):     # запрашиваем последние 6 показаний из Найтскаута (~30 минут для примера)     a = requests.get(fr'https://{NS_API_SECRET}@{NS_DOMAIN}/api/v1/entries.json?count=6').json()     # вычисляем количество минут между первым и последним показанием     minutes = int((a[0]['date'] - a[len(a)-1]['date'])/(1000*60))     # вычисляем разницу в ммоль между первым и последним уровнем ГК     delta_big = round((a[0]['sgv'] - a[len(a)-1]['sgv'])/18, 1)     # начало части сообщения - о динамике за последние 6 периодов     delta_big_txt = '. Последние ' + str(minutes) + ' минут'     # детали динамики за последние 6 периодов в зависимости от величины отклонения     if 0.5 >= delta_big > 0 or -0.5 <= delta_big < 0:         delta_big_txt += ' изменение небольшое, в пределах 0,5 миллимоль'     elif 0.5 < delta_big <= 2:         delta_big_txt += ' рост умеренный - ' + str(abs(delta_big)).replace('.', ',')                           + ' миллимоль'     elif -0.5 > delta_big >= -2:         delta_big_txt += ' снижение умеренное - '                           + str(abs(delta_big)).replace('.', ',') + ' миллимоль'     elif delta_big > 2:         delta_big_txt += ' сильный рост на '                           + str(abs(delta_big)).replace('.', ',') + ' миллимоль'     elif delta_big < -2:         delta_big_txt += ' сильное снижение на '                           + str(abs(delta_big)).replace('.', ',') + ' миллимоль'     elif delta_big == 0:         delta_big_txt += ' нулевое изменение.'     else:         delta_big_txt += ' не смог определить отклонение.'              current_level = 0     delta = 0     # перебираем все 6 сообщений до первой встречи с сообщением "с уровнем"     for i in a:         if 'type' in i and i['type'] == 'sgv':             current_level = i['sgv']/18             delta = i['delta']/18             break     # готовим текст с текущим уровнем и величиной отклонения от предыдущего сообщения     if delta < 0:         delta_text = ' снижение на ' + str(round(abs(delta), 2)).replace('.', ',')              + ' миллимоль за последние 5 минут'     elif delta > 0:         delta_text = ' повышение на ' + str(round(abs(delta), 2)).replace('.', ',')              + ' миллимоль за последние 5 минут'     else:         delta_text = ' за последние 5 минут не менялся.'     # возвращаем результат в формате, съедобном для Алисы     # всё, что она произнесет - указано после ключа 'text'       return {         'version': event['version'],         'session': event['session'],         'response': {             # тут всё, что Алиса в итоге произнесет             'text': 'Уровень ' + str(round(current_level, 1)).replace('.', ',')                      + ' миллимоль.' + delta_text + delta_big_txt,             # true - завершить сессию после возврата ответа, Алиса освободится             'end_session': 'true'         },     } 
  1. Нажимаем Создать файл и называем его requirements.txt

  2. Добавляем в файл две строки — requests и datetime

  1. Нажимаем в правом верхнем углу Создать версию и переходим в раздел Тестирование.

  2. В разделе Тестирование выбираем шаблон данных Навык Алисы и нажимаем кнопку «Запустить тест». Прокручиваем результат теста вниз и видим возле ключа text результат:

Теперь идем в Яндекс.Диалоги (dialogs.yandex.ru). Нажимаем Создать диалог, вариант диалога — Навык Алисы. В настройках указываем имя навыка (оно будет частью ключевой фразы, я выбрал «уровень глюкозы»). Параметр «Backend» переключаем в «Функция в Яндекс Облаке», из выпадающего списка выбираем вышесозданную функцию. Выбираем голос. Тип доступа — приватный. Дальше ввести формулу команды, имя разработчика, выбрать категорию, краткое описание и установить иконку. Это всё, чего будет достаточно для «публикации» навыка (в приватном режиме).

Выбрать в качестве иконки любую картинку, нажать Сохранить внизу и нажать справа вверху «Опубликовать». Навык перейдет в стадию «опубликован».

После этого можно запустить Алису на своем мобильном телефоне или если есть Яндекс.Станция — сказать ей: Алиса, скажи уровень глюкозы у …

В ответ будет произнесена фраза, которую сформировал код функции.

Дальше я буду попробовать реализовать голосовой ввод данных о терапии и съеденных углеводах в Nightscout, и включать Яндекс.Лампочку в качестве сигнализации о высоком или низком уровне глюкозы (и тенденции) в спальне.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Стоит писать дальше о таких экспериментах?
88.89% Да 8
11.11% Нет 1
Проголосовали 9 пользователей. Воздержался 1 пользователь.

ссылка на оригинал статьи https://habr.com/ru/post/710736/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *