Учим Алису управлять нашим умным домом

Или сказ о том, как официант к повару через улицу ходил…

Мы достаточно плотно рассказываем о всех новостях, связанных с Яндекс.Алисой или же умными колонками от Яндекса, потому что, наверное, на территории русскоязычного населения это наиболее прогрессивный умный помощник из всех имеющихся.

Хотя выбор-то не такой уж и широкий на текущий момент. Что мы имеем:

  • Google Assistant — умеет выполнять какие-то ущербные функции на русском языке. Вывод: все продолжают использовать на английском.
  • Siri — полнофункциональный русский помощник на телефоне — ноль функциональности, как помощник, на колонке. Вывод: HomePod на нашем рынке это редкость. Использовать Siri на телефоне? Ну такое….
  • Alexa — просто умничка и очень хорошо понимает даже наш «Товарищ-стайл английский», но снова только английский язык. Да еще и с музыкальными сервисами, представленными в России не дружит.
  • Алиса — идеальный помощник, который закрывает любой вопрос, кроме вопроса умного дома. Вывод: давайте попробуем закрыть и этот вопрос.

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

Алиса, как и более-менее адекватные её зарубежные коллеги, работает на основе сторонних приложений, доступных во внутреннем маркетплейсе: называемых навыками/диалогами.

Что такое навык? Навык, это некий код, которому Алиса отправляет фразу, сказанную вами… там эта фраза как-то переваривается этим неким кодом, делает внутри некоторую магию, а в ответ отдает точно такую же фразу, но которую уже говорит вам голосом Алисы (Оксаны, Эдварда и т.д.).

Простыми словами представьте картину с тремя участниками: вы, официант, повар.

Вы совершаете заказ у официанта, официант идет к повару, повар делает блюдо, отдает это блюдо официанту, а он приносит его обратно вам.

Дак вот Алиса здесь является официантом, Навык является поваром, а вы являетесь вами 🙂

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

Но если вам кажется, что сыграть роль повара (т.е. написать код для навыка) это сложно, то ниже я постараюсь вас в этом переубедить. Заодно и повесим замок на дверь, чтобы кроме официанта особо никто к нам и не смог зайти через улицу 😉

Процесс

И так, для того, чтобы заставить работать Алису с нашими устройствами умного дома, нам потребуется:

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

Создание навыка

В процессе создания навыка вам необходимо будет пройти следующие этапы: создание черновика, пройти премодерацию, опубликовать навык.

Для того, чтобы создать навык, переходим по ссылке. Нажимаем на «Вход для разработчика», там нажимаем на кнопку «создать диалог», выбираем «Навык в Алисе» и заполняем страницу «Настройки».

Название и Активационное имя: эти два поля должны быть созвучны и приблизительно одинаковы, поэтому просто повторяем их дважды. Важным условием является то, что они должны состоять их двух слов. Лучше чтобы это было что-то несложное для выговаривания, допустим: синий кит, белый краб и т.д., потому что вам нужно будет достаточно часто вызывать свой навык по имени.

Webhook URL: сюда мы вставим адрес нашего навыка (получим его чуть позже).

Голос: по-умолчанию стоит Оксана. Если честно, Яндекс, ваша Оксана совсем не Оксана. Выбираем Алису. Она звучит лучше всех.

Приватность: ставим галочку (не нужно нам, чтобы кто-то видел наш навык лишний раз)

Имя разработчика: придумываем себе имя (оно ни на что не влияет)

Выбираем категорию, пишем описание, добавляем логотип. После чего нажимаем на кнопку Сохранить.

Сценарий навыка

Для того, чтобы написать код для навыка нам даже не понадобится писать код, мы просто воспользуемся стандартными блоками Node-red.

Что нам нужно сделать в Node-red:

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

По этой ссылке вы можете скачать уже готовый flow, настроенный на работу с Алисой. По пунктам:

  1. Верхняя часть с кнопкой timestamp. Её мы нажимаем сразу же после публикации flow, тем самым мы задаем наши статичные параметры. Среди них: «приветственная фраза Алисы», «фраза, которую Алиса говорит чужакам, которые все-таки смогли запустить ваш навык», «фраза, когда она не нашла устройство». Советую использовать этот механизм и для будущих фраз, которые вы захотите добавить. Лучше всю статику иметь в одном месте.
  2. Светло-желтые кубики — это наш вебхук. Там мы пишем URL, по которому Алиса будет к нам стучаться. В нашем случае это урл /simple. Т.е. сюда Алиса будет присылать нам все наши запросы. Алиса присылает json внутри, которого и есть та фраза, которую вы ей сказали (+ массив из каждого слова по отдельности, но мы его не будем использовать). Эту фразу мы и берем для того, чтобы понять что Алиса хочет, чтобы сделал наш навык.
  3. Сам сценарий использования. По шагам: сначала мы проверяем, что это не просто команда ping (Яндекс отправляет такую команду раз в n времени для того, чтобы проверить, что ваш навык еще жив), дальше мы проверяем, что вы это вы (значение userId можно взять из любого запроса, который приходит к вам в консоль и использовать его в дальнейшем), после чего мы смотрим есть ли в составе фразы то или иное устройство, потом смотрим, что от нас хотят «включить» или «выключить», производим соответствующее действие с нашим устройством, отправляем фразу Алисе «включаю».

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

В данном случае вас ограничивает лишь ваша фантазия. Никаких ограничений.

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

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

Открываем Node-RED наружу

  • если у вас есть статичный внешний IP, то это уже пол беды, вы просто заходите на myip.ru и узнаете его, если нет, то добро пожаловать в инструкцию по настройке DDNS
  • далее открываем порт 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. Т.е. как-то так: https://beatifuldomain.ddns.net:1234

Уже на этом шаге вы можете взять данный урл, дописать к нему тот самый /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.

Подписывайтесь на канал InDaHomeKit в Telegram и Яндекс.Дзен, чтобы у вас всегда было что почитать: новости мира умного дома, обзоры новых устройств, инструкции по подключению.

Приходите в наш чат в Telegram

Так же у нас отличные паблики VK, Facebook, Instagram и Twitter.