Перейти к содержанию

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

Материал из Wiki yaboard

Вступление

В данной статье рассмотрим вариант получения данных с датчиков посредством голосового запроса Алисе. Для примера будем использовать датчик DHT11 подключенный к NodeMCU и добавленный в проект Blynk.
Данная статья будет являться лишь примером получения данных с датчиков с помощью http get запроса. По данному примеру можно будет "пробросить" датчики, возвращающие ответ в различных форматах.

Собираем простейший датчик

В данном примеру будут использованы следующие компоненты:

  1. NodeMcu
  2. Датчик температуры/влажности DHT11

Собираем простейшую схему, как на рис.1.

Рис. 1. Собираем простейшую схему
Внимание! Для работы с nodemcu в Arduino IDE требуется настройка с платой. Пример настройки можно найти здесь: https://robotclass.ru/articles/node-mcu-arduino-ide-setup/. Также потребуется установка библиотек Blynk - скачать можно здесь: http://help.blynk.cc/en/articles/512105-how-to-install-blynk-library-for-arduino-ide.

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

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include "DHT.h"

int custT = 0;
int custH = 0;

char auth[] = "Токен_Blynk";
char ssid[] = "Имя_точки_доступа_Wifi";
char pass[] = "Пароль_Wifi";

#define DHTPIN D1 
#define DHTTYPE DHT11 // DHT 11

DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  dht.begin();
}

void loop()
{
  Blynk.run();
  int h = dht.readHumidity(); //получаем влажность
  int t = dht.readTemperature(); //получаем температуру
  if (h != custH){	//если показания отличаются от прошлых - отправляем их на виртуальный пин
    Blynk.virtualWrite(V0, h);
    custH = h;
  }
  if (t != custT){	//если показания отличаются от прошлых - отправляем их на виртуальный пин
    Blynk.virtualWrite(V1, t);
    custT = t;
  }
}

Не забываем изменить параметры:
char auth[] = "Токен_Blynk";
char ssid[] = "Имя_точки_доступа_Wifi";
char pass[] = "Пароль_Wifi";
Подробнее о том, как создать проект в Blynk и получить токен можно узнать ЗДЕСЬ

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

Проверим, работает ли датчик. Для этого в нашем проекте Blynk добавим 2 виджета:

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

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

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

  1. После регистрации мы попадаем на главную страницу, где будут располагаться наши боты. Для создания нового бота (для навыка Алисы) нажимаем кнопку "Создать бота или обзвон".
  2. В следующем окне зададим имя бота (любое), язык и категорию.
  3. Перед нами откроется рабочая область создания сценария, в которой будет предложено создать первый экран. Для начала создадим блок "Текст", чтобы поприветствовать входящего в навык пользователя.
  4. Рекомендую задать что-то похожее на текст, указанный на рисунке, т.к. по требованиям Яндекс приватный навык должен с первого экрана предупреждать о том, что он приватный, а также при запросе "Помощь" (об этом чуть ниже) должна появляться справка о функционале навыка. Без данных требований навык не сможет пройти модерацию.
  5. В этом же экране создадим новый блок "Интенты", где зададим шаблоны фраз, на которые будет откликаться Алиса. В данном случае будет 2 интента (* ~температура * ~балкон * - для того чтобы узнать температуру для примера балкона (предположим, что наш датчик находится на балконе) и * ~влажность * ~балкон * - для того, чтобы узнать влажность балкона).
  6. Чуть ниже создадим новый экран с двумя блоками: "Текст" - где укажем, что будет отвечать Алиса, если фраза не совпадает с шаблонами интентов и "Переход", чтобы вернуться на начальный экран.
  7. Соединим Пункт "Любая другая фраза" с экраном неизвестной фразы нажав на кружочек рядом с данным пунктом и протянув стрелку до соответствующего экрана. Тоже самое можно сделать от пункта "Переход" на экране неизвестной фразы до экрана приветствия. (Теперь если фраза не будет похожей на "температура балкона" или "влажность балкона", Алиса скажет, что такой команды нет и вернется к начальному экрану).
  8. Также в блоке "Интенты" стоит установить флажок "Сделать доступным из любой точки сценария", для того, чтобы наши шаблоны работали в любом месте. Для этого нажимаем кнопку с шестеренкой рядом с названием блока и устанавливаем соответствующий флажок в открывшемся окне.
  9. * Осталось только прочитать данные с датчиков и вывести их пользователю. Для этого каждому интенту создадим экран с блоком HTTP-запрос, где создадим переменные, в которые "положим" данные с датчиков ($tempbal - для температуры, $humbal - для влажности). В данных блоках мы указываем ссылки на get-запрос вида http://blynk-cloud.com/токен_blynk/get/V1 - для температуры, http://blynk-cloud.com/токен_blynk/get/V0 - для влажности.
  10. К пунктам "Завершен с ошибкой" стоит добавить экран с текстом, в котормо будет указано, что получение данных не удалось (например датчики не в сети) и переходом на начальный экран.
  11. Все, что осталось - это вывести данные пользователю и завершить сценарий. Для этого создадим для каждого пункта "Завершен успешно" - экран с текстом, где укажем текст с нашими переменными (например - Температура балкона - $tempbal градусов.) и блоком "Завершение сценария".
  12. В конечном итоге получим готовый сценарий, который останется только сохранить соответствующей кнопкой.
  13. Но как и говорилось выше, чтобы пройти модерацию стоит добавить раздел помощи в сценарий. Для этого переходим в FAQ-бот окна редактора, где нажимаем кнопку "Создать пустую базу".
  14. В новой базе создаем "знание" (Например "помощь") и указываем синонимы, по которым пользователь сможет вызвать наш раздел.
  15. А в разделе "Ответы" задаем ответ, т.е. описание того, как должен работать навык. После проделанного сохраняем сценарий.
* В данном пункте мы получаем данные после http-запроса из переменной $httpResponse. В зависимости от используемого api получить можно разные форматы (в данном примере мы получаем обычный текст), но, даже если данные будут прилетать в json, средствами Aimylogic также можно "распарсить" их. Подробнее о http-запросах можно узнать в официальной базе знаний сервиса: https://help.aimylogic.com/ru/article/http-zapros-1kpratf/

Публикуем наш сценарий в Яндекс Диалогах

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

Перед тем как передать наш навык на модерацию в системе Яндекс Диалоги нужно получить ссылку на наш сценарий. Для этого в личном кабинете Aimylogic:

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

Теперь можем перейти к созданию навыка в Яндекс Диалогах по следующей ССЫЛКЕ.

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

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

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

После заполнения жмем кнопку "Сохранить", а потом справа вверху "На модерацию".
Модерация может занимать до 3х дней, иногда быстрее - несколько часов. Наберитесь терпения. Если Навык отклонен - прочитайте рекомендации, исправьте описание и подайте на модерацию снова.
Когда модерация будет ободрена, на месте кнопки "На модерацию" появится кнопка "Опубликовать". Обычно публикация проходит быстро. После публикации можно попробовать вызвать навык фразой "Алиса, запусти навык датчики Хоттабыча" (естественно "Датчики Хоттабыча" - лишь пример. Тут будет ваше активационное имя)))).

Создаем сценарий на основе опубликованного навыка

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

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

Послесловие

Соглашусь, данный способ слегка замороченный, но как сказал Владимир Ильич Ленин: "Учиться, учиться и еще раз учиться!". А текст статьи содержит примеры довольно интересных сервисов и любопытных ходов (ладно костылей)))). Надеюсь вам было интересно. И желаю удачи в ваших разработках.=)