Алиса, IoBroker и MQTT
Большой гайд, как объединить голосового ассистента "Алиса" и систему автоматизации iobroker по протоколу MQTT.
Этот вариант подходит тем, кто не хочет использовать готовый драйвер, или не смог настроить, или не хватает функционала.
Так же, благодаря такому методу, мы можем поделиться (расшарить) своими устройствами на другие аккаунты Яндекса, например, для нескольких членов семьи.
Хочу отметить, что описанный мною способ (как мне кажется) не описывает весь потенциал данного протокола, в силу отсутствия знаний.
В описанных мною устройствах (к сожалению) я использую только одну функцию: включить/выключить. Хотя, если обратиться к доке Яндекса, поддерживаемых устройств там много больше.
Закончив с вводной частью, опишу требования к реализации проекта, а так же те ресурсы, которые будут нужны в работе:
требования к платформе Iobroker:
- домен, публичный IP с пробросом порта
- ssl сертификат к этому домену (достаточно let`s encrypt)
- плагин y2mqtt (ссылка на гит + там описан процесс установки)
- драйвер mqtt в роли "сервер/брокер"
в указанном способе, мы будет использовать платформу Яндекс.диалоги и создадим приватный навык. все доступные типы устройств описаны в документации Яндекса.
Теперь, если Вас не испугали указанные выше требования и используемые ресурсы, можно приступать к настройке.
за основу взята статья. только в моем случае я не использую прокси. мой сервер крутится на raspberry за NATом
Домен и SSL.
Первое, что нам понадобится, это домен. Возможно, он уже имеется у Вас. Я зарегал себе домен третьего уровня, alice.domain.ru. Затем, необходимо получить SSL сертификат к этому домену. Достаточно let`s encrypt.
Я не буду описывать процесс регистрации домена, установки ssl скриптов, поскольку этот процесс индивидуален: у каждого свои предпочтения по регистратору доменных имён, веб-серверу. Материалов в интернете достаточно, к тому же, если Вы продвинутый пользователь iobroker, вероятнее всего, у Вас уже это всё имеется.
Важный момент: необходимо запомнить/записать пути к полученным сертификатам, их нужно будет указать дальше в конфиге.
После того, как Вы зарегистрировали и получили сертификаты, проверьте его валидность на этом сайте. С этим пунктом не должно возникнуть трудностей и если проверка завершилась успешно, можно двигаться к следующему шагу.
Настройка драйвера MQTT Broker/Client
Из списка драйверов Iobroker устанавливаем "MQTT Broker/Client". Открываем настройки:
- тип - сервер/брокер
- порт - выбираем произвольный, запоминаем, главное, чтобы не совпадал с теми, что уже заняты. (у меня так дефолтный порт брокера совпадал с устройствам sonoff)
- и указываем какие-то данные аутентификации: логин, пароль. так же запоминаем, они понадобятся дальше. галочку SSL не ставим здесь.
На этом настройка окончена. Чтобы проверить его доступность, можно запустить на винде клиент и попробовать подключиться по указанным параметрам. В случае успешного подключения, иконка mqtt.0 драйвера должна загореться зеленым.
Настройка плагина y2mqtt
ссылка на гит данного плагина.
Я не буду переписывать шаги по установке, которые уже описаны в нескольких статьях. Я лишь буду делать какие-то пометки, уточнения, на что нужно обратить внимание.
После установки (npm install) не запускайте пост. Нужно настроить конфиг, добавить в автозагрузку. Всё согласно мануалу.
Важно! Автор настоятельно рекомендует НЕ редактировать конфиг из консоли. Лучше всего забрать файл на комп, через тот же WinScp, отредактировать в np++ и вернуть обратно.
Настройки конфиг файла (/mnt/data/root/yandex2mqtt/config.js) и комментарии:
- блок mqtt - сюда Вы прописываете адрес своего сервера, где крутится Iobroker, выбранный порт и логин/пароль. Все те данные, что были в пункте Настройка драйвера MQTT Broker/Client.
mqtt: {
host: '192.168.1.2',
port: 1234,
user: 'test',
password: 'test'
},
- блок https - сюда нужно прописать пути к SSL сертификатам, которые Вы получили в пункте Домен и SSL, а так же указать еще один свободный порт для работы этого плагина.
https: {
privateKey: '/etc/letsencrypt/live/alice.domain.ru/privkey.pem',
certificate: '/etc/letsencrypt/live/alice.domain.ru/fullchain.pem',
port: 4321
},
- блок clients - здесь указываем произвольные данные, которые будем использовать при создании навыка на платформе Яндекс.диалоги.
clients: [
{
id: '1',
name: 'Yandex',
clientId: 'login',
clientSecret: 'password',
isTrusted: false
},
],
- блок users - этот блок как раз отвечает за то, чтобы предоставить доступ устройств на другие аккаунты Яндекса. Создаем нужное количество профилей.
users: [{
id: '1',
username: 'user-1',
password: 'password',
name: 'Administrator'
},
{
id: '2',
username: 'user-2',
password: 'password',
name: 'Administrator'
},
],
- блок devices - и вот здесь описываем устройства, которыми планируем управлять. как я говорил, у меня на данный момент все устройства имеют одно свойство: вкл/выкл. Но, используя доку Яндекса, можно описывать много других устройств. Здесь добавлю комментарии, где что и как будет обзываться и появляться.
devices: [
//_______________Первое устройство______________//свет зал
{
name: 'свет', // имя устройства, которое отобразится в квазаре Яндекса, после объединения списка устройств. обозвать можно как угодно.
room: 'склад', // имя комнаты, в которую по-умолчанию будут помещаться устройства. можно сразу указать нужную, я кладу всё на склад, а потом из квазара распределяю.
type: 'devices.types.light', //тип устройства, которые описаны в доке.
mqtt: [
{
type: 'on',
set: '/devices/yandex/controls/svet_zal/on', //эти стейты появляются в mqtt брокере (svet_zal заменять на свои)
stat: '/devices/yandex/controls/svet_zal'
},
],
capabilities: [
{
type: 'devices.capabilities.on_off',
retrievable: true,
state: {
instance: 'on',
value: true
}
},
]
},
//__________Конец первого устройства__________//
После того, как файл отредактировали и закинули обратно в нужную папку (уточнение про редактирование в np++) вернемся к мануалу по настройке плагина и выполним npm start.
В мануале плагина об этом не сказано, но чтобы проверить доступность плагина, нужно открыть домен по порту, указанному в блоке "https", там, где указывали пути к сертификатам.
https://alice.domain.ru:4321
Если плагин корректно встал и работает, Вы должны увидеть следующее сообщение: (спасибо @Habaaaa за это)
OAuth 2.0 Server
Без этого сообщения дальнейшие действия бессмысленны. Если его нет, то вот список, на что обратить внимание:
- проверьте корректность установки плагина
- проверьте, доступны ли порты, указанные в конфиг файле
- проверьте корректность ssl сертификатов
Когда по указанному порту Вы получите нужное сообщение, переходите к созданию приватного навыка.
Создание приватного навыка
Переходим на платформу Яндекс.диалоги и создаем диалог. Выбираем пункт "умный дом".
- название - любое произвольное
- Backend - Endpoint URL - указываем ваш домен + порт (который был в https, по которому слушали OAuth 2.0 Server) и страницу: https://alice.domain.ru:4321/provider
- тип доступа - приватный
Заполняем обязательные поля (требования Яндекса) но которые ни на что не влияют. (имя, подзаголовок, описание, иконка)
Далее, в самом низу есть пункт "Связка аккаунтов", его так же необходимо создать:
- Идентификатор приложения - указываем из конфига: блок "clients" - "clientId"
- Секрет приложения - указываем из конфига: блок "clients" - "clientSecret"
- URL авторизации - https://alice.domain.ru:4321/dialog/authorize
- URL для получения токена - https://alice.domain.ru:4321/oauth/token
- URL для обновления токена - https://alice.domain.ru:4321/oauth/token
После этого жмем везде сохранить-сохранить, опубликовать.
Теперь объединяем навык и платформу Iobroker.
Здесь же, в навыке, есть вкладка "тестирование" - открываем её, жмём "плюсик", добавить "другое устройство" там будет единственный наш навык, выбираем его, откроется страница авторизации.
Теперь вводим логин/пароль от учетки, созданные в конфиге, в блоке "users". Везде разрешаем-предоставляем доступ.
Далее, обновить список устройств. И если всё прошло удачно, Вы увидите список устройств!
Перейдя в квазар, их можно переименовать, переместить по комнатам.
Топики в mqtt
После того, как устройства появились в квазаре, в mqtt брокере появятся виртуальные стейты, на каждое устройство, которое мы создали. В моем примере это "svet_zal". В моем примере будет всего одно состояние: on/off. Дальше, применяя скрипты, наращиваем управление нужными устройствами. Всё предельно просто: следим за изменением стейта и активируем нужное устройство.
Важное замечание: на тех скриптах, которые включают устройства иными способами: кнопками, из телеграма, по крону, иными способами, желательно прописать так же изменение стейта для брокера. У меня бывали сбои, когда устройство было включено с кнопки, и уже mqtt отказывался включать его повторно, поэтому я везде поставил заглушки, которые меняют стейты в брокере.
Предоставить доступ другим учёткам Яндекса
Очень часто, пользователей колонок Яндекса мучает вопрос: как предоставить доступ к своим устройствам другим членам семьи? В этой статье я уже отмечал, что в конфиг-файле плагина есть настройка нескольких учетных записей. После того, как Вы полностью настроили интеграцию Iobroker и "Алисы", у Вас всё отзывается на голос и включаются устройства, можно перейти к "шарингу" своих устройств.
- Создаем в блоке "users" нужное количество учетных записей;
- В том аккаунте, которому хотим предоставить доступ, переходим на платформу Яндекс.диалоги и создаем приватный навык, по аналогии с основным;
- После сохранения и публикации навыка, открываем вкладку "тестирование", добавляем наш навык, но авторизовываемся уже под другой учёткой, которую создали отдельно;
- Обновляем список устройств и можем по-своему переименовать устройства и комнаты;
- Если сильно разобраться и запотеть, я думаю, возможно даже заведомо указать, какие устройства будут доступны в каждом аккаунте. (например, чтобы дети не включали свет у родителей)
gl, hf