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

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

Материал из Wiki yaboard
Нет описания правки
Нет описания правки
 
(не показано 8 промежуточных версий 2 участников)
Строка 1: Строка 1:
{{metadesc|{{PAGENAME}} через Node-Red, не написав ни одной строки собственного кода. Да, это возможно) читайте и пробуйте сами! }}
{{metadesc|{{PAGENAME}} через Node-Red, не написав ни одной строки собственного кода. Да, это возможно) читайте и пробуйте сами! }}
__NOEDITSECTION__
{{Skills}}




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


[[Файл:%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: Строка 21:


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


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


[[Файл:%D0%A3%D1%87%D0%B8%D0%BC_%D0%90%D0%BB%D0%B8%D1%81%D1%83_2_indahomekit.jpg |thumb|right]]
[[Файл:%D0%A3%D1%87%D0%B8%D0%BC_%D0%90%D0%BB%D0%B8%D1%81%D1%83_2_indahomekit.jpg |thumb|right]]
Строка 31: Строка 35:
* Выбираем «Навык в Алисе».
* Выбираем «Навык в Алисе».
* Заполняем страницу «Настройки»:
* Заполняем страницу «Настройки»:
** '''Название''' и '''Активационное имя'''. Поля должны быть созвучны и приблизительно одинаковы, поэтому просто дублируем их текст. Важное условие: они должны состоять их двух слов. Подберите простое произношение ("Белый краб", "Помощник Фред", "Умная дача"), ведь вы сможете вызывать свой Навык строго по его имени.
** '''Название''' и '''Активационное имя'''. Поля должны быть созвучны и приблизительно одинаковы, поэтому текст в них просто дублируем. Важное условие: они должны состоять из двух слов. Подберите простое произношение ("Белый краб", "Помощник Фред", "Умная дача"), ведь вы сможете вызывать свой Навык только по его имени.
** '''Webhook URL'''. Позже мы получим и вставим сюда адрес нашего Навыка.
** '''Webhook URL'''. Позже мы получим и вставим сюда адрес нашего Навыка.
** '''Голос'''. По умолчанию - Оксана, но мы выбираем Алису, она звучит лучше всех.
** '''Голос'''. По умолчанию - Оксана, но мы выбираем Алису, она звучит лучше всех.
** '''Приватность'''. Ставим эту галочку, так как не хотим, чтобы кто-то видел наш Навык.
** '''Приватность'''. Ставим галочку, так как не хотим, чтобы кто-то видел наш Навык.
** '''Имя разработчика'''. Придумываем себе имя (ни на что не влияет).
** '''Имя разработчика'''. Придумываем себе имя (ни на что не влияет).
** Выбираем '''категорию''', заполняем '''описание''', добавляем '''логотип'''.  
** Выбираем '''категорию''', заполняем '''описание''', добавляем '''логотип'''.  
Строка 64: Строка 68:
Советую использовать этот механизм и для будущих фраз, которые вы захотите добавить. Лучше всю статику иметь в одном месте.
Советую использовать этот механизм и для будущих фраз, которые вы захотите добавить. Лучше всю статику иметь в одном месте.


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


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


Итак, внутри вебхука мы отработали весь сценарий работы с двумя устройствами (в моем случае они живут в Home Assistant). По желанию вы можете добавить в диалог возможность узнать у Алисы, включен ли свет в той или иной комнате, [//indahomekit.ru/2018/02/24/mi-humidifier-plagin-dlya-homebridge/ влажность], [//indahomekit.ru/2019/01/21/delaem-dattchik-co2-i-dobavlyaem-ego-v-homekit/ уровень CO2], есть ли дома кто-то, и так далее. Вас ограничивает только фантазия - других ограничений нет.
Итак, внутри вебхука мы отработали весь сценарий работы с двумя устройствами (в моем случае они живут в Home Assistant). По желанию вы можете добавить возможность узнать у Алисы, включен ли свет в той или иной комнате, каковы [//indahomekit.ru/2018/02/24/mi-humidifier-plagin-dlya-homebridge/ влажность] или [//indahomekit.ru/2019/01/21/delaem-dattchik-co2-i-dobavlyaem-ego-v-homekit/ уровень CO2], есть ли кто-то дома, и так далее. Вас ограничивает только фантазия - других ограничений нет.




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


* '''Получаем внешний IP.''' Если у вас есть статичный внешний IP - просто узнаёте его (например, на [myip.ru myip.ru]). Если нет - добро пожаловать в инструкцию по настройке [https://www.indahomekit.ru/2018/03/22/nastraivaem-udalenny-dostup-k-raspberry-pi-tcherez-no-ip/ DynDNS].
* '''Получаем внешний IP.''' Если у вас есть статичный внешний IP - просто узнаёте его (например, на [myip.ru myip.ru]). Если нет - добро пожаловать в инструкцию по настройке [https://www.indahomekit.ru/2018/03/22/nastraivaem-udalenny-dostup-k-raspberry-pi-tcherez-no-ip/ DynDNS].


* '''Открываем порт Node-RED.''' Желательно, чтобы число отличалось от 1880 (выберите 4 цифры на свой вкус). Как настроить forwarding, смотрите в инструкции к вашему роутеру.
* '''Открываем порт Node-RED.''' Желательно выбрать нестандартный порт (любые 4 цифры на ваш вкус, но не 1880, не 8080,и не 3128).
* Настройте на этот порт forwarding (как - смотрите в инструкции к вашему конкретному роутеру).


Вы уже можете зайти в браузер по вашему ip/домену с портом и увидеть интерфейс вашего Node-RED!  
...и вы уже можете зайти в браузер по вашему <ip|домен>:порт и увидеть интерфейс Node-RED!  
  Пример: http://beatifuldomain.ddns.net:1234
  Пример: http://beatifuldomain.ddns.net:1234


Строка 94: Строка 101:
Делаем запрос на сертификат
Делаем запрос на сертификат
  openssl req -new -sha256 -key node-key.pem -out node-csr.pem
  openssl req -new -sha256 -key node-key.pem -out node-csr.pem
после чего отвечаем на все вопросы, которые задает openssl — они простые, достаточно писать что-то адекватное, и в конце указать ip/домен вашего node-red.
и отвечаем на все вопросы, которые задает openssl (они простые, достаточно писать что-то адекватное), в конце указываем ip/домен вашего node-red.


Подписываем сертификат
Подписываем сертификат
Строка 126: Строка 133:


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


Дальше будет перевод базовой инструкции с сайта Node-red. Знающим английский язык советую [https://nodered.org/docs/security#usernamepassword-based-authentication пройти к оригиналу].
Дальше будет перевод базовой инструкции с сайта Node-red. Знающим английский язык советую [https://nodered.org/docs/security#usernamepassword-based-authentication пройти к оригиналу].
Строка 170: Строка 178:
Редакция нашей вики, в свою очередь, благодарит автора статьи Алексея [https://t.me/donatelloth @donatelloth].
Редакция нашей вики, в свою очередь, благодарит автора статьи Алексея [https://t.me/donatelloth @donatelloth].


Перепечатано с сокращениями, изменениями и исправлениями, с разрешения автора с адреса [https://www.indahomekit.ru/2019/04/13/utchim-alisu-upravlyaty-nashim-umnm-domom/ ресурса InDaHomeKit].
'''Материал перепечатан с сокращениями, изменениями и исправлениями, с разрешения автора с [https://www.indahomekit.ru/2019/04/13/utchim-alisu-upravlyaty-nashim-umnm-domom/ ресурса InDaHomeKit], не является прямым руководством к действию!'''




[[Category: Yandex IO]][[Category: Своими руками]]
[[Category:Умный дом]]

Текущая версия от 07:26, 23 ноября 2020

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

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

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

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

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

Процесс

Наши шаги:

  • Создать Навык (не более 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 часа вы сможете использовать свой Навык.

Заключение

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

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

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

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

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



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

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