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

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

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




Строка 5: Строка 7:




Алиса (как и более-менее адекватные её зарубежные коллеги) работает на основе сторонних приложений, доступных во внутреннем маркетплейсе, и называемых Навыками. Кратко - это программа, написанная сторонним (не из Яндекса) автором, которой Алиса передаёт вашу фразу. В ответ Навык возвращает собственную фразу, по результатам своих действий, при этом используя голос как Алисы, так и Оксаны, Эдварда или другого. Представьте, что вы совершаете заказ у официанта (Алиса), который идёт к повару (Навык), повар производит обработку, отдает официанту готовое блюдо, а тот приносит блюдо (фразу-результат) вам. Самый главный минус в этой схеме - вы с официантом находитесь в одном ресторане, но повар принимает и отдаёт заказы в соседнем квартале (Интернет), куда каждый раз бегает официант.
[[Файл:%D0%A3%D1%87%D0%B8%D0%BC_%D0%90%D0%BB%D0%B8%D1%81%D1%83_1_indahomekit.png|thumb|right]]


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


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




Строка 15: Строка 21:


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




Строка 24: Строка 30:




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




Строка 41: Строка 47:




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




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


По [//wiki.yaboard.com/images/9/96/%D0%A3%D1%87%D0%B8%D0%BC_%D0%90%D0%BB%D0%B8%D1%81%D1%83_4_flow-indahomekit.zip этой ссылке находится уже готовый flow], настроенный на работу с Алисой.


По '''[123123123 этой ссылке находится уже готовый flow]''', настроенный на работу с Алисой.
 
[[Файл:%D0%A3%D1%87%D0%B8%D0%BC_%D0%90%D0%BB%D0%B8%D1%81%D1%83_3_indahomekit.jpg|thumb|right]]


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


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


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


Итак, внутри вебхука мы отработали весь сценарий работы с двумя устройствами (в моем случае они живут в Home Assistant). По желанию вы можете добавить в диалог возможность узнать у Алисы, включен ли свет в той или иной комнате, влажность, уровень 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


Строка 89: Строка 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.


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


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


Дальше будет перевод базовой инструкции с сайта Node-red. Знающим английский язык советую [https://nodered.org/docs/security#usernamepassword-based-authentication пройти к оригиналу].
Дальше будет перевод базовой инструкции с сайта Node-red. Знающим английский язык советую [https://nodered.org/docs/security#usernamepassword-based-authentication пройти к оригиналу].
Строка 165: Строка 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, не является прямым руководством к действию!