Алиса управляет Умным домом через Node-RED: различия между версиями
Нет описания правки |
Нет описания правки |
||
| Строка 6: | Строка 6: | ||
[[Файл:%D0%A3%D1%87%D0%B8%D0%BC_%D0%90%D0%BB%D0%B8%D1%81%D1%83_1_indahomekit.png|thumb|right]] | [[Файл:%D0%A3%D1%87%D0%B8%D0%BC_%D0%90%D0%BB%D0%B8%D1%81%D1%83_1_indahomekit.png|thumb|right]] | ||
Алиса (как и её зарубежные аналоги) | Алиса (как и её зарубежные аналоги) умеет запускать особые приложения - т.н. "Навыки" - из каталога Яндекса. Кратко - это программы, написанные сторонним (не из Яндекса) автором, которые можно активировать по их уникальным именам и затем все наши фразы Алиса передаёт вызванному Навыку. Навык принимает решение на основе фразы, затем совершает какие-то действия и возвращает фразу-ответ, используя голос не только Алисы, но и, например, Оксаны или Эдварда, так что не пугайтесь его смене. | ||
Представьте, что вы совершаете заказ у официанта (Алиса), который идёт к повару (Навык). Повар готовит блюдо и отдает официанту, а официант приносит это блюдо (фразу и результат заказа) вам. | Представьте, что вы совершаете заказ у официанта (Алиса), который идёт к повару (Навык). Повар готовит блюдо и отдает официанту, а официант приносит это блюдо (фразу и результат заказа) вам. | ||
| Строка 18: | Строка 18: | ||
Наши шаги: | Наши шаги: | ||
* Создать Навык (не более 5 минут). Здесь самое сложное - | * Создать Навык (не более 5 минут). Здесь самое сложное - придумать название по душе, которое не совпадает с другими Навыками. | ||
* Написать сценарий навыка. С помощью Node-red это не сложнее сборки Lego! | * Написать сценарий навыка. С помощью Node-red это не сложнее сборки Lego! | ||
* Открыть Навык наружу. По https, защитив доступ от злоумышленников. | * Открыть Навык наружу. По https, защитив доступ от злоумышленников. | ||
| Строка 34: | Строка 34: | ||
** '''Webhook URL'''. Позже мы получим и вставим сюда адрес нашего Навыка. | ** '''Webhook URL'''. Позже мы получим и вставим сюда адрес нашего Навыка. | ||
** '''Голос'''. По умолчанию - Оксана, но мы выбираем Алису, она звучит лучше всех. | ** '''Голос'''. По умолчанию - Оксана, но мы выбираем Алису, она звучит лучше всех. | ||
** '''Приватность'''. Ставим | ** '''Приватность'''. Ставим галочку, так как не хотим, чтобы кто-то видел наш Навык. | ||
** '''Имя разработчика'''. Придумываем себе имя (ни на что не влияет). | ** '''Имя разработчика'''. Придумываем себе имя (ни на что не влияет). | ||
** Выбираем '''категорию''', заполняем '''описание''', добавляем '''логотип'''. | ** Выбираем '''категорию''', заполняем '''описание''', добавляем '''логотип'''. | ||
| Строка 64: | Строка 64: | ||
Советую использовать этот механизм и для будущих фраз, которые вы захотите добавить. Лучше всю статику иметь в одном месте. | Советую использовать этот механизм и для будущих фраз, которые вы захотите добавить. Лучше всю статику иметь в одном месте. | ||
* Светло-желтые кубики — это наш вебхук (URL, по которому Алиса будет к нам стучаться). В нашем случае - /simple. Сюда Алиса будет присылать запросы в формате json. Внутри кроме прочего находится фраза | * Светло-желтые кубики — это наш вебхук (URL, по которому Алиса будет к нам стучаться). В нашем случае - /simple. Сюда Алиса будет присылать запросы в формате json. Внутри кроме прочего находится переданная фраза (а также массив из каждого слова по отдельности, но его в этот раз использовать не будем). По фразе мы определим, что должен сделать Навык. | ||
* Сам сценарий использования. Проверяем по шагам: | * Сам сценарий использования. Проверяем по шагам: | ||
Версия от 03:12, 25 апреля 2019
Принцип работы

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