Алиса управляет Умным домом через Node-RED
Применение информации с этой страницы требует специальных знаний и навыков
Всё описанное на этой странице вы производите на свой страх и риск, включая нарушение работы программного обеспечения и выход из строя оборудования, а также риск поражения током и травмы.
Материал носит информационный характер, и не является прямым указанием к действию!
Содержание
Принцип работы
Алиса (как и её зарубежные аналоги) умеет запускать особые приложения - т.н. "Навыки" - из каталога Яндекса. Кратко - это программы, написанные сторонним (не из Яндекса) автором, которые можно активировать по их уникальным именам и затем все наши фразы Алиса передаёт вызванному Навыку. Навык принимает решение на основе полученной фразы, затем совершает какие-то действия и возвращает фразу-ответ (используя голос не только Алисы, но и, например, Оксаны или Эдварда, так что не пугайтесь его возможной смене).
Представьте, что вы совершаете заказ у официанта (Алиса), который идёт к повару (Навык). Повар готовит блюдо и отдает официанту, а официант приносит это блюдо (фразу и результат заказа) вам. Главный минус в этой схеме - вы с официантом находитесь в одном зале, но бегать к повару и обратно официанту приходится в соседний район (через Интернет).
Вам уже кажется, что обучить повара (т.е. написать код для навыка) сложно? Постараюсь вас переубедить. А заодно мы повесим замок на дверь, чтобы к нашему повару ходил только наш официант 😉
Процесс
Наши шаги:
- Создать Навык (не более 5 минут). Здесь самое сложное - придумать название по душе, которое не совпадает с другими Навыками.
- Написать сценарий навыка. С помощью Node-red это не сложнее сборки Lego!
- Открыть Навык наружу. По https, защитив доступ от злоумышленников.
- Пройти модерацию и опубликовать Навык. Получать удовольствие )
Создаём Навык
- Открываем «Вход для разработчиков» на сайте "Яндекс.Диалогов"
- Нажимаем «Создать диалог»,
- Выбираем «Навык в Алисе».
- Заполняем страницу «Настройки»:
- Название и Активационное имя. Поля должны быть созвучны и приблизительно одинаковы, поэтому текст в них просто дублируем. Важное условие: они должны состоять из двух слов. Подберите простое произношение ("Белый краб", "Помощник Фред", "Умная дача"), ведь вы сможете вызывать свой Навык только по его имени.
- Webhook URL. Позже мы получим и вставим сюда адрес нашего Навыка.
- Голос. По умолчанию - Оксана, но мы выбираем Алису, она звучит лучше всех.
- Приватность. Ставим галочку, так как не хотим, чтобы кто-то видел наш Навык.
- Имя разработчика. Придумываем себе имя (ни на что не влияет).
- Выбираем категорию, заполняем описание, добавляем логотип.
- Нажимаем "Сохранить".
Пишем сценарий
Нам даже не понадобится писать код! Воспользуемся стандартными блоками Node-red, чтобы:
- Создать webhook, который сможет получать запросы от Алисы и отдавать ответ;
- Разобрать строку с запросом от Алисы и превратить её в команду;
- Вернуть Алисе ответ в зависимости от действий Навыка.
По этой ссылке находится уже готовый flow, настроенный на работу с Алисой.
Скрипт по пунктам:
- Верхняя часть с кнопкой 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 часа вы сможете использовать свой Навык.
Заключение
Теперь вы можете управлять устройствами двумя способами:
- Полный вариант «Алиса, включи Навык такой-то», после чего произносить команды «включи лампу», «выключи подсветку».
- Сокращённый «Алиса, попроси такого-то включить лампу». Если название вашего навыка плохо склоняется, используйте фразу «Алиса, попроси навык такой-то включить лампу».
В ближайшее время Алиса, конечно же, научится управлять устройствами умного дома в более лояльном для пользователя стиле, но вы уже сейчас можете наслаждаться полноценным помощником Яндекса и не вымучивать произношение нашего любимого «зе, зэ, the» в кругу гостей и родственников.
Благодарности
Отдельное спасибо за толчок в развитии данной статьи чату о Node-red и пользователю @Sergey_Kostromin.
Редакция нашей вики, в свою очередь, благодарит автора статьи Алексея @donatelloth.
Материал перепечатан с сокращениями, изменениями и исправлениями, с разрешения автора с ресурса InDaHomeKit, не является прямым руководством к действию!