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

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

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

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

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


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

Процесс

Наши шаги:

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

  • Получаем внешний IP. Если у вас есть статичный внешний IP - просто узнаёте его (например, на [myip.ru myip.ru]). Если нет - добро пожаловать в инструкцию по настройке DynDNS.
  • Открываем порт Node-RED. Желательно, чтобы число отличалось от 1880 (выберите 4 цифры на свой вкус). Как настроить 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.