Читаем данные с датчиков (DHT11, Blynk, Aimylogic)

Материал из База знаний
Перейти к навигации Перейти к поиску



Вступление

В этой статье мы научимся получать данные с датчика DHT11 посредством голосового запроса Алисе. Для этого подключим его к NodeMCU и добавим в проект Blynk.

Это лишь пример получения данных с помощью http GET-запроса. Аналогично можно "пробросить" датчики, возвращающие ответ и в других форматах.


Собираем датчик

Рис. 1. Подключение DHT11 к NodeMCU

Используем компоненты:

Собираем схему (рис. 1).

Внимание: для работы с nodemcu в Arduino IDE требуется настройка!
Также сначала нужно зарегистрироваться в Blynk И создать проект.


Подключаем плату к ПК и прошиваем следующей прошивкой:

Перед прошивкой впишем свои параметры:

  • char auth[] = "Полученный токен из проекта Blynk";
  • char ssid[] = "Имя нашей точки доступа Wi-Fi";
  • char pass[] = "Пароль к нашей точке Wi-Fi";


Читаем данные в Blynk

Проверим, работает ли датчик. Добавим 2 виджета в Blynk:

  1. Жмём кнопку "+" в заголовке проекта.
  2. Выбираем любой виджет из этих: Value Display, Labeled Value, Gauge. Для примера возьмём Gauge.
  3. Настраиваем оба виджета: выбрав в Source устройства, к которому привязан наш токен, виртуальные пины:
    • V0 - для значений влажности,
    • V1 - для значений температуры.
  4. Запускаем проект и видим текущие показания температуры и влажности.
Проверить работу датчика можно дыханием в сторону датчика - показания должны увеличиться.


Создаем Навык в Яндекс.Диалогах

На данный момент Умный дом Яндекса не поддерживает получение данных с датчиков, поэтому мы схитрим. Создадим обычный навык на платформе Яндекс.Диалогов простейшим образом, с помощью конструктора Aimylogic. Для этого:

  1. Пройдем регистрацию.
  2. После регистрации попадаем на главную страницу, где будут располагаться наши боты. Для создания нового бота (для навыка Алисы) нажимаем кнопку "Создать бота или обзвон".
  3. В следующем окне зададим (любое) имя бота, язык и категорию.
  4. Перед нами откроется рабочая область создания сценария, в которой будет предложено создать первый экран.
  5. Создадим блок "Текст", чтобы поприветствовать входящего в навык пользователя.
  6. Лучше задать текст, подобный примеру на рисунке, потому что по требованиям Яндекса приватный навык должен с первого экрана предупредить о том, что он приватный, а при запросе "Помощь" (об этом чуть ниже) выдать справку о функционале навыка. Без этого навык не сможет пройти модерацию.
  7. Здесь же добавим 2 блока "Интенты" и зададим шаблоны фраз, на которые будет откликаться Алиса:
    1. * ~температура * ~балкон * - для того чтобы узнать температуру для примера балкона (предположим, что наш датчик находится на балконе) и
    2. * ~влажность * ~балкон * - для того, чтобы узнать влажность балкона.
  8. Ниже создадим новый экран с двумя блоками:
    1. "Текст" (где укажем, что будет отвечать Алиса, если фраза не совпадает с шаблонами интентов) и
    2. "Переход" (чтобы вернуться на начальный экран).
  9. Соединим пункт "Любая другая фраза" с экраном неизвестной фразы, нажав на кружочек рядом, и протянув стрелку до соответствующего экрана. То же самое можно сделать от пункта "Переход" на экране неизвестной фразы до экрана приветствия. (Теперь, на фразы, непохожие на "температура балкона" или "влажность балкона", Алиса ответит, что такой команды нет, и вернется к начальному экрану).
  10. Чтобы наши шаблоны работали в любом месте диалога, в блоке "Интенты" нажимаем кнопку с шестеренкой рядом с его названием, и в открывшемся окне устанавливаем флажок "Сделать доступным из любой точки сценария".


Осталось прочитать данные и вывести их пользователю. Для этого каждому интенту создадим экран с блоком "HTTP-запрос", где создадим переменные и "положим" в них данные с датчиков:

  • $tempbal - для температуры,
  • $humbal - для влажности.

В блоках укажем ссылки на get-запрос вида:


К пунктам "Завершен с ошибкой" обязательно добавим экран с текстом о том, что получение данных не удалось (например, "Датчики не в сети") и автопереходом на начальный экран. Все, что осталось - это вывести данные пользователю и завершить сценарий.

Создадим для каждого пункта "Завершен успешно" экран с текстом с нашими переменными (например: "Температура балкона - $tempbal градусов") и блоком "Завершение сценария".

Мы получили готовый сценарий, который осталось сохранить соответствующей кнопкой.

Но, как уже упоминалось, для успешного прохождения модерации нашему навыку нужен раздел помощи. 

Для этого:

  • Переходим в FAQ-бот окна редактора,
  • Нажимаем кнопку "Создать пустую базу".
  • В новой базе создаем "знание" (Например, "Помощь") и указываем синонимы, по которым пользователь сможет вызвать наш раздел.
  • В разделе "Ответы" задаем описание того, как работает наш навык. А теперь сохраняем сценарий!



Мы получили данные после http-запроса из переменной $httpResponse.
В зависимости от используемого api можно принимать разные форматы (в нашем примере - обычный текст), но Aimylogic поможет распарсить и json. 

Подробнее о http-запросах - в официальной базе знаний сервиса.


Публикуем сценарий Aimylogic в Навыке

Рис. 2. Заполняем информацию

Сначала получаем ссылку на наш сценарий. Для этого в личном кабинете Aimylogic:

  1. Выбираем раздел "Каналы" и канал "Алиса",
  2. В открывшемся окне нажимаем ссылку "Получить OAuth-токен",
  3. На странице с токеном (для этого нужно быть авторизированным в сервисах Яндекс), копируем его и вставляем в поле "OAuth-токен".
  4. Нажимаем "Подключить".


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


Переходим к созданию Навыка:

  1. Открываем платформу Диалоги.
  2. Нажимаем кнопку "Создать диалог".
  3. Выбираем вариант "Навык в Алисе".


В заполнении данных Навыка есть свои нюансы (подробнее на рис. 2):

  • Имя навыка должно быть уникальным. В нашем случае навык можно назвать как угодно сложно, т.к. обращаться к нему в дальнейшем мы будем не по имени.
  • Несколько активационных фраз в разных склонениях сделают вызовы навыка удобнее.
  • Примеры запросов задать можно, но не обязательно.
  • Ссылку на вебхук (url) указываем здесь же.
  • "Нужно устройство с экраном" - обязательно отключаем, ведь нам нужен доступ к навыку на всех колонках.
  • "Не показывать в каталоге" - включаем (нам нужен приватный навык, который не будет отображаться в каталоге).
Имейте в виду, что ваш приватный навык все равно можно вызвать, зная его активационную фразу.
  • Описание Навыка должно быть достаточно подробным и точно описывать, что делает данный навык.
  • Логотип не должен нарушать авторских прав, поэтому лучше нарисовать что-нибудь своё.


После заполнения жмем "Сохранить", а потом - "На модерацию" (справа вверху).

Модерация может занимать до 3х дней, иногда быстрее - несколько часов. Наберитесь терпения. 
Если Навык отклонен - прочитайте рекомендации, исправьте описание и подайте на модерацию снова.

Когда модераторы одобрят Навык, на месте кнопки "На модерацию" появится кнопка "Опубликовать". Публикация обычно проходит быстро. Опубликованный Навык вызываем фразой "Алиса, запусти навык ВАШЕ_НАЗВАНИЕ_НАВЫКА" (Например, "Алиса, запусти навык Датчики Хоттабыча").


Добавляем сценарий Умного дома Яндекса

Хотя мы уже получаем данные запросами "Алиса, спроси у датчиков Хоттабыча температуру балкона" или "Спроси у датчиков Хоттабыча влажность балкона", но при наличии умной колонки с Алисой можно упростить эти фразы с помощью сценариев УДЯ:

То же самое повторяем для показаний влажности.

Теперь в ответ на команду "Алиса, температура балкона" ассистент будет отвечать фразой вроде "Температура балкона - 13 градусов."


Послесловие

Пример использует целую цепочку сервисов, зато предлагает вполне рабочее решение (при этом обходится без подключения сторонних навыков, как заслуженно популярный "Домовёнок Кузя"). Надеемся, статья получилась интересная и полезная.


И - как обычно - удачи в разработках!