Алиса управляет Умным домом через Node-RED

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


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


Принцип работы

Учим Алису 1 indahomekit.png

Алиса (как и её зарубежные аналоги) умеет запускать особые приложения - т.н. "Навыки" - из каталога Яндекса. Кратко - это программы, написанные сторонним (не из Яндекса) автором, которые можно активировать по их уникальным именам и затем все наши фразы Алиса передаёт вызванному Навыку. Навык принимает решение на основе полученной фразы, затем совершает какие-то действия и возвращает фразу-ответ (используя голос не только Алисы, но и, например, Оксаны или Эдварда, так что не пугайтесь его возможной смене).

Представьте, что вы совершаете заказ у официанта (Алиса), который идёт к повару (Навык). Повар готовит блюдо и отдает официанту, а официант приносит это блюдо (фразу и результат заказа) вам. Главный минус в этой схеме - вы с официантом находитесь в одном зале, но бегать к повару и обратно официанту приходится в соседний район (через Интернет).

Вам уже кажется, что обучить повара (т.е. написать код для навыка) сложно? Постараюсь вас переубедить. А заодно мы повесим замок на дверь, чтобы к нашему повару ходил только наш официант 😉


Процесс

Наши шаги:

  • Создать Навык (не более 5 минут). Здесь самое сложное - придумать название по душе, которое не совпадает с другими Навыками.
  • Написать сценарий навыка. С помощью Node-red это не сложнее сборки Lego!
  • Открыть Навык наружу. По https, защитив доступ от злоумышленников.
  • Пройти модерацию и опубликовать Навык. Получать удовольствие )


Создаём Навык

Учим Алису 2 indahomekit.jpg
  • Открываем «Вход для разработчиков» на сайте "Яндекс.Диалогов"
  • Нажимаем «Создать диалог»,
  • Выбираем «Навык в Алисе».
  • Заполняем страницу «Настройки»:
    • Название и Активационное имя. Поля должны быть созвучны и приблизительно одинаковы, поэтому текст в них просто дублируем. Важное условие: они должны состоять из двух слов. Подберите простое произношение ("Белый краб", "Помощник Фред", "Умная дача"), ведь вы сможете вызывать свой Навык только по его имени.
    • Webhook URL. Позже мы получим и вставим сюда адрес нашего Навыка.
    • Голос. По умолчанию - Оксана, но мы выбираем Алису, она звучит лучше всех.
    • Приватность. Ставим галочку, так как не хотим, чтобы кто-то видел наш Навык.
    • Имя разработчика. Придумываем себе имя (ни на что не влияет).
    • Выбираем категорию, заполняем описание, добавляем логотип.
    • Нажимаем "Сохранить".


Пишем сценарий

Нам даже не понадобится писать код! Воспользуемся стандартными блоками Node-red, чтобы:


  • Создать webhook, который сможет получать запросы от Алисы и отдавать ответ;
  • Разобрать строку с запросом от Алисы и превратить её в команду;
  • Вернуть Алисе ответ в зависимости от действий Навыка.


По этой ссылке находится уже готовый flow, настроенный на работу с Алисой.


Учим Алису 3 indahomekit.jpg

Скрипт по пунктам:

  • Верхняя часть с кнопкой timestamp. Её нажимаем сразу после публикации flow, тем самым задаем наши статичные параметры. Среди них:
    • «приветственная фраза Алисы»,
    • «фраза, которую Алиса говорит чужакам, которые случайно запустили наш Навык»,
    • «фраза, когда Алиса не нашла устройство».

Советую использовать этот механизм и для будущих фраз, которые вы захотите добавить. Лучше всю статику иметь в одном месте.

  • Светло-желтые кубики — это наш вебхук (URL, по которому Алиса будет к нам стучаться). В нашем случае - /simple. Сюда Алиса будет присылать запросы в формате json. Внутри кроме прочего находится переданная фраза (а также массив из каждого слова по отдельности, но его в этот раз использовать не будем). По фразе мы решаем, что должен сделать Навык.
  • Сам сценарий использования. Проверяем по шагам:
    • что это не команда ping (Яндекс отправляет их, чтоб проверить "исправность" навыка),
    • что мы это мы (значение userId можно взять из любого запроса, который приходит в консоль, и использовать его в дальнейшем),
    • что в составе фразы указано то или иное устройство,
    • что присутствует команда («включить» или «выключить») для этого устройства.

Дальше - производим нужное действие с нашим устройством, и отправляем Алисе ответ («включаю», «выключаю», итд).

Итак, внутри вебхука мы отработали весь сценарий работы с двумя устройствами (в моем случае они живут в Home Assistant). По желанию вы можете добавить возможность узнать у Алисы, включен ли свет в той или иной комнате, каковы влажность или уровень CO2, есть ли кто-то дома, и так далее. Вас ограничивает только фантазия - других ограничений нет.


Открываем webhook наружу по https

Самая муторная, но необходимая процедура, чтобы у нас всё взлетело.

  • Получаем внешний IP. Если у вас есть статичный внешний IP - просто узнаёте его (например, на [myip.ru myip.ru]). Если нет - добро пожаловать в инструкцию по настройке DynDNS.
  • Открываем порт Node-RED. Желательно выбрать нестандартный порт (любые 4 цифры на ваш вкус, но не 1880, не 8080,и не 3128).
  • Настройте на этот порт forwarding (как - смотрите в инструкции к вашему конкретному роутеру).

...и вы уже можете зайти в браузер по вашему <ip|домен>:порт и увидеть интерфейс Node-RED!

Пример: http://beatifuldomain.ddns.net:1234


  • Делаем node-red доступным по HTTPS:

Создаем приватный ключ командой в терминале

openssl genrsa -out node-key.pem 2048

Делаем запрос на сертификат

openssl req -new -sha256 -key node-key.pem -out node-csr.pem

и отвечаем на все вопросы, которые задает openssl (они простые, достаточно писать что-то адекватное), в конце указываем ip/домен вашего node-red.

Подписываем сертификат

openssl x509 -req -in node-csr.pem -signkey node-key.pem -out node-cert.pem

Открываем текстовым редактором settings.js самого Node-red

sudo nano .node-red/settings.js

Раскомментируем линию

var fs=require("fs")

Ищем закомментированный раздел 'https' и вставляем рядом следующие строки:

https: {
 key: fs.readFileSync('/home/pi/node-key.pem'),
 cert: fs.readFileSync('/home/pi/node-cert.pem')
},

Внимание! В моём случае генерация ключа происходила в корне домашней папки пользователя pi. Если вы что-то делали не по инструкции, или вашего пользователя зовут не pi - пути могут отличаться.

Сохраняем файл и перезапускаем node-red:

node-red-restart && node-red-log

Теперь вы можете зайти в свой node-red

Пример: https://beatifuldomain.ddns.net:1234

Дописываем к основному url тот самый /simple (т.е. https://beatifuldomain.ddns.net:1234/simple) и отправляем Навык на модерацию.

Но перед этим - для наиболее мнительных пользователей - сделаем еще один шаг, чтобы обезопасить Node-red от злоумышленников:


Задаем логин/пароль на вход

Дальше будет перевод базовой инструкции с сайта Node-red. Знающим английский язык советую пройти к оригиналу.

Устанавливаем node-red-admin

npm install -g node-red-admin

Создаем хэш пароля, вводим команду, после чего нас просят написать свой пароль и выдают его хэш

node-red-admin hash-pw

Заходим в settings.js нашего Node-red, находим раздел AdminAuth, раскомментируем его и вставляем туда наш логин (admin) и хэш пароля, который мы получили шагом ранее. После перезапуска node-red потребует логин и пароль для входа в интерфейс.


Модерация и публикация Навыка

Теперь необходимо отправить навык на модерацию.

Если вы всё правильно заполнили по инструкции, то через 1-2 дня вас попросят опубликовать навык (также через интерфейс Яндекс.Диалогов).

Примерно через 3 часа вы сможете использовать свой Навык.


Заключение

Теперь вы можете управлять устройствами двумя способами:

  1. Полный вариант «Алиса, включи Навык такой-то», после чего произносить команды «включи лампу», «выключи подсветку».
  2. Сокращённый «Алиса, попроси такого-то включить лампу». Если название вашего навыка плохо склоняется, используйте фразу «Алиса, попроси навык такой-то включить лампу».

В ближайшее время Алиса, конечно же, научится управлять устройствами умного дома в более лояльном для пользователя стиле, но вы уже сейчас можете наслаждаться полноценным помощником Яндекса и не вымучивать произношение нашего любимого «зе, зэ, the» в кругу гостей и родственников.


Благодарности

Отдельное спасибо за толчок в развитии данной статьи чату о Node-red и пользователю @Sergey_Kostromin.




Редакция нашей вики, в свою очередь, благодарит автора статьи Алексея @donatelloth.

Материал перепечатан с сокращениями, изменениями и исправлениями, с разрешения автора с ресурса InDaHomeKit, не является прямым руководством к действию!

Источник — https://wiki.yaboard.com/index.php?title=Алиса_управляет_Умным_домом_через_Node-RED&oldid=4637 // MOD ext links // End MOD