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

Алиса, IoBroker и MQTT: различия между версиями

Материал из Wiki yaboard
м Ark rusinov-9121383 переименовал страницу "Iobroker + алиса через mqtt" в "Алиса, IoBroker и mqtt" без оставления перенаправления
Нет описания правки
Строка 1: Строка 1:
Большой гайд, как объединить голосового ассистента "Алиса" и систему автоматизации iobroker по протоколу MQTT.
{{metadesc|{{PAGENAME}} | Задействуем мощный протокол MQTT и расшариваем устройства между несколькими аккаунтами Яндекса }}
__NOEDITSECTION__
__TOC__


Этот вариант подходит тем, кто не хочет использовать готовый [https://github.com/ioBroker/ioBroker.iot/blob/master/README.md драйвер], или не смог настроить, или не хватает функционала.


''Так же, благодаря такому методу, мы можем поделиться (расшарить) своими устройствами на другие аккаунты Яндекса, например, для нескольких членов семьи.''
== Введение ==


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


В описанных мною устройствах (к сожалению) я использую только одну функцию: включить/выключить. Хотя, если обратиться к доке Яндекса, поддерживаемых устройств там много больше.
Предлагаемый способ:
* Подойдёт тем, кто не хочет или не может использовать [https://github.com/ioBroker/ioBroker.iot/blob/master/README.md готовый драйвер], или в готовом оказалось недостаточно функционала.
* Позволяет поделиться '''(расшарить) свои устройства на другие аккаунты Яндекса''': например, для нескольких членов семьи.


Закончив с вводной частью, опишу требования к реализации проекта, а так же те ресурсы, которые будут нужны в работе:
В статье использована только функция "включить/выключить". На самом деле в [https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/device-types-docpage/ документации УДЯ] намного больше поддерживаемых устройств и их возможностей.


требования к платформе Iobroker:
# домен, публичный IP с пробросом порта
# ssl сертификат к этому домену (достаточно let`s encrypt)
# плагин y2mqtt ([https://github.com/munrexio/yandex2mqtt ссылка на гит] + там описан процесс установки)
# драйвер mqtt в роли "сервер/брокер"


в указанном способе, мы будет использовать платформу [https://dialogs.yandex.ru/developer Яндекс.диалоги] и создадим приватный навык.
== Требования и ресурсы ==
все доступные типы устройств описаны в [https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/device-types-docpage/ документации] Яндекса.


Теперь, если Вас не испугали указанные выше требования и используемые ресурсы, можно приступать к настройке.


<youtube>//youtu.be/ZGpq9yz_Z34</youtube>
Нам понадобятся:
# Домен + публичный IP с пробросом порта
# SSL-сертификат к этому домену.
# Плагин y2mqtt ([https://github.com/munrexio/yandex2mqtt ссылка на гит] + там описан процесс установки)
# Драйвер mqtt в роли "сервер/брокер"
# Платформа Яндекса [https://dialogs.yandex.ru/developer Диалоги] (мы будем создавать приватный навык).




'''за основу взята [https://sprut.ai/client/article/292 статья]. только в моем случае я не использую прокси. мой сервер крутится на raspberry за NATом'''
Если не испугали необходимые требования и ресурсы - приступаем к настройке.


'''За основу взята [https://sprut.ai/client/article/292 эта статья], только я не использую прокси. Мой сервер крутится на Raspberry за NATом'''


==== Домен и SSL. ====


Первое, что нам понадобится, это домен. Возможно, он уже имеется у Вас.
=== Домен и SSL ===
Я зарегал себе домен третьего уровня, alice.domain.ru.
Затем, необходимо получить SSL сертификат к этому домену. Достаточно let`s encrypt.


''Я не буду описывать процесс регистрации домена, установки ssl скриптов, поскольку этот процесс индивидуален: у каждого свои предпочтения по регистратору доменных имён, веб-серверу.
Материалов в интернете достаточно, к тому же, если Вы продвинутый пользователь iobroker, вероятнее всего, у Вас уже это всё имеется.''


'''Важный момент''': необходимо запомнить/записать пути к полученным сертификатам, их нужно будет указать дальше в конфиге.
Первое, что понадобится - это домен. Я выбрал себе домен третьего уровня, alice.domain.ru.
Затем необходимо получить SSL-сертификат к этому домену (достаточно Let`s Encrypt).


После того, как Вы зарегистрировали и получили сертификаты, проверьте его валидность на этом [https://www.sslshopper.com/ssl-checker.html сайте].
'''Необходимо запомнить/записать пути к полученным сертификатам''', это понадобится позже.
С этим пунктом не должно возникнуть трудностей и если проверка завершилась успешно, можно двигаться к следующему шагу.


==== Настройка драйвера MQTT Broker/Client ====
После того, как Вы зарегистрировали домен и получили сертификат, [https://www.sslshopper.com/ssl-checker.html проверьте его валидность].
Если проверка завершилась успешно - двигаемся к следующему шагу.


Из списка драйверов Iobroker устанавливаем "MQTT Broker/Client".
Открываем настройки:
* тип - сервер/брокер
* порт - выбираем произвольный, запоминаем, главное, чтобы не совпадал с теми, что уже заняты. (у меня так дефолтный порт брокера совпадал с устройствам sonoff)
* и указываем какие-то данные аутентификации: логин, пароль. так же запоминаем, они понадобятся дальше. галочку SSL не ставим здесь.


На этом настройка окончена. Чтобы проверить его доступность, можно запустить на винде [http://mqtt-explorer.com/ клиент] и попробовать подключиться по указанным параметрам.
=== Настройка драйвера MQTT Broker/Client ===
В случае успешного подключения, иконка mqtt.0 драйвера должна загореться зеленым.




==== Настройка плагина y2mqtt ====
Из списка драйверов Iobroker устанавливаем "MQTT Broker/Client". Открываем настройки:
* Тип - сервер/брокер
* Порт - произвольный. Главное, чтобы не совпадал с теми, что уже заняты (например, дефолтный порт брокера совпадает с устройствами sonoff).
* Данные аутентификации: логин, пароль. Галочку "SSL" не ставим, логин и пароль также понадобятся позже.


ссылка на [https://github.com/munrexio/yandex2mqtt гит] данного плагина.
Настройка окончена!


Я не буду переписывать шаги по установке, которые уже описаны в нескольких статьях. Я лишь буду делать какие-то пометки, уточнения, на что нужно обратить внимание.
Чтобы проверить доступность, можно запустить, например, [http://mqtt-explorer.com/ Windows-клиент] и попробовать подключиться по указанным параметрам.
В случае успеха иконка mqtt.0 драйвера загорится зелёным.


После установки (npm install) не запускайте пост. Нужно настроить конфиг, добавить в автозагрузку. Всё согласно мануалу.


'''Важно!''' Автор настоятельно рекомендует НЕ редактировать конфиг из консоли. Лучше всего забрать файл на комп, через тот же WinScp, отредактировать в np++ и вернуть обратно.
=== Настройка плагина y2mqtt ===
 
 
Используем [https://github.com/munrexio/yandex2mqtt этот плагин] (ссылка на Git). Шаги по его установке описаны во многих статьях, так что укажем только тонкости, на которые стоит обратить внимание:
# После установки (npm install) не запускайте пост. Нужно настроить конфиг, добавить в автозагрузку. Всё согласно мануалу.
# НЕ редактируйте конфиг из консоли! Лучше скачать файл на компьютер (например, WinScp), отредактировать (в np++) и вернуть обратно.
 


Настройки конфиг файла (/mnt/data/root/yandex2mqtt/config.js) и комментарии:
Настройки конфиг файла (/mnt/data/root/yandex2mqtt/config.js) и комментарии:


# блок mqtt - сюда Вы прописываете адрес своего сервера, где крутится Iobroker, выбранный порт и логин/пароль. Все те данные, что были в пункте Настройка драйвера MQTT Broker/Client.
==== блок mqtt ====
    mqtt: {
 
Сюда прописываете адрес сервера, где крутится Iobroker, порт, логин и пароль, запомненные раньше при настройке драйвера MQTT Broker/Client:
 
mqtt: {
         host: '192.168.1.2',
         host: '192.168.1.2',
         port: 1234,
         port: 1234,
         user: 'test',
         user: 'test',
         password: 'test'
         password: 'test'
    },
},
# блок https - сюда нужно прописать пути к SSL сертификатам, которые Вы получили в пункте Домен и SSL, а так же указать еще один свободный порт для работы этого плагина.
 
    https: {
 
==== блок https ====
 
 
Здесь нужно прописать пути к SSL-сертификатам, которые Вы получили в пункте Домен и SSL, а также указать еще один свободный порт - для работы этого плагина.
 
https: {
         privateKey: '/etc/letsencrypt/live/alice.domain.ru/privkey.pem',
         privateKey: '/etc/letsencrypt/live/alice.domain.ru/privkey.pem',
         certificate: '/etc/letsencrypt/live/alice.domain.ru/fullchain.pem',
         certificate: '/etc/letsencrypt/live/alice.domain.ru/fullchain.pem',
         port: 4321
         port: 4321
    },
},
* блок clients - здесь указываем произвольные данные, которые будем использовать при создании навыка на платформе Яндекс.диалоги.
 
 
==== блок clients ====
 
 
Впишем произвольные данные, которые потом укажем при создании навыка на платформе Яндекс.диалоги
 
     clients: [
     clients: [
     {
     {
Строка 89: Строка 104:
         },
         },
     ],
     ],
* блок users - этот блок как раз отвечает за то, чтобы предоставить доступ устройств на другие аккаунты Яндекса. Создаем нужное количество профилей.
 
 
==== блок users ====
 
 
Отвечает за шаринг устройств на другие аккаунты Яндекса. Создаём нужное количество профилей.
 
     users: [{
     users: [{
             id: '1',
             id: '1',
Строка 103: Строка 124:
         },
         },
     ],
     ],
* блок devices - и вот здесь описываем устройства, которыми планируем управлять. как я говорил, у меня на данный момент все устройства имеют одно свойство: вкл/выкл. Но, используя доку Яндекса, можно описывать много других устройств. Здесь добавлю комментарии, где что и как будет обзываться и появляться.
 
 
==== блок devices ====
 
 
Здесь описываем устройства, которыми планируем управлять. Комментарии поясняют, где, что и как будет обзываться и появляться.
 
     devices: [
     devices: [
     //_______________Первое устройство______________//свет зал
     //_______________Первое устройство______________//свет зал
Строка 133: Строка 160:




После того, как файл отредактировали и закинули обратно в нужную папку (уточнение про редактирование в np++) вернемся к мануалу по настройке плагина и выполним npm start.
После того, как файл /скачали, отредактировали и вернули в исходную папку/, вернемся к мануалу по настройке плагина и выполним <span class="tocopy">npm start</span>.
 
В мануале плагина об этом не сказано, но чтобы проверить доступность плагина, нужно открыть домен по порту, указанному в блоке "https", там, где указывали пути к сертификатам.


В мануале плагина об этом не сказано, но чтобы проверить его доступность, нужно открыть домен по порту, указанному в блоке "https" (где указывали пути к сертификатам), пример:
  https://alice.domain.ru:4321
  https://alice.domain.ru:4321


Если плагин корректно встал и работает, Вы должны увидеть следующее сообщение: (спасибо @Habaaaa за это)
Если плагин корректно встал и работает, Вы должны увидеть ответ (спасибо @Habaaaa за важное дополнение):


  OAuth 2.0 Server
  OAuth 2.0 Server


Без этого сообщения дальнейшие действия бессмысленны. Если его нет, то вот список, на что обратить внимание:
Без этого сообщения дальнейшие действия бессмысленны. Если оно не появилось, то проверьте:
*проверьте корректность установки плагина
* Корректность установки плагина
*проверьте, доступны ли порты, указанные в конфиг файле
* Доступность портов, указанных в конфиг-файле
*проверьте корректность ssl сертификатов
* Корректность ssl сертификатов


Когда по указанному порту Вы получите нужное сообщение, переходите к созданию приватного навыка.
Если сообщение есть - переходим к приватному навыку:




==== Создание приватного навыка ====
=== Создание приватного навыка ===


Переходим на [https://dialogs.yandex.ru/developer платформу] Яндекс.диалоги и создаем диалог. Выбираем пункт "умный дом".


* название - любое произвольное
Переходим на [https://dialogs.yandex.ru/developer платформу Диалоги] и создаем диалог, выбрав пункт "умный дом":
* Backend - Endpoint URL - указываем ваш домен + порт (который был в https, по которому слушали OAuth 2.0 Server) и страницу: https://alice.domain.ru:4321/provider
* Название - на ваш вкус
* тип доступа - приватный
* 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


Далее, в самом низу есть пункт "'''Связка аккаунтов'''", его так же необходимо создать:
Везде жмём "Сохранить", затем "Опубликовать".


*Идентификатор приложения - указываем из конфига: блок "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 ===


Теперь объединяем навык и платформу Iobroker.


Здесь же, в навыке, есть вкладка "тестирование" - открываем её, жмём "плюсик", добавить "другое устройство" там будет единственный наш навык, выбираем его, откроется страница авторизации.
Здесь же, в навыке, есть вкладка "тестирование" - открываем её, жмём "плюсик", добавить "другое устройство" там будет единственный наш навык, выбираем его, откроется страница авторизации.

Версия от 11:09, 25 сентября 2020

Введение

Предлагаемый способ:

  • Подойдёт тем, кто не хочет или не может использовать готовый драйвер, или в готовом оказалось недостаточно функционала.
  • Позволяет поделиться (расшарить) свои устройства на другие аккаунты Яндекса: например, для нескольких членов семьи.
В статье использована только функция "включить/выключить". На самом деле в документации УДЯ намного больше поддерживаемых устройств и их возможностей.

Требования и ресурсы

Нам понадобятся:

  1. Домен + публичный IP с пробросом порта
  2. SSL-сертификат к этому домену.
  3. Плагин y2mqtt (ссылка на гит + там описан процесс установки)
  4. Драйвер mqtt в роли "сервер/брокер"
  5. Платформа Яндекса Диалоги (мы будем создавать приватный навык).


Если не испугали необходимые требования и ресурсы - приступаем к настройке.

За основу взята эта статья, только я не использую прокси. Мой сервер крутится на Raspberry за NATом

Домен и SSL

Первое, что понадобится - это домен. Я выбрал себе домен третьего уровня, alice.domain.ru. Затем необходимо получить SSL-сертификат к этому домену (достаточно Let`s Encrypt).

Необходимо запомнить/записать пути к полученным сертификатам, это понадобится позже.

После того, как Вы зарегистрировали домен и получили сертификат, проверьте его валидность. Если проверка завершилась успешно - двигаемся к следующему шагу.

Настройка драйвера MQTT Broker/Client

Из списка драйверов Iobroker устанавливаем "MQTT Broker/Client". Открываем настройки:

  • Тип - сервер/брокер
  • Порт - произвольный. Главное, чтобы не совпадал с теми, что уже заняты (например, дефолтный порт брокера совпадает с устройствами sonoff).
  • Данные аутентификации: логин, пароль. Галочку "SSL" не ставим, логин и пароль также понадобятся позже.

Настройка окончена!

Чтобы проверить доступность, можно запустить, например, Windows-клиент и попробовать подключиться по указанным параметрам. В случае успеха иконка mqtt.0 драйвера загорится зелёным.

Настройка плагина y2mqtt

Используем этот плагин (ссылка на Git). Шаги по его установке описаны во многих статьях, так что укажем только тонкости, на которые стоит обратить внимание:

  1. После установки (npm install) не запускайте пост. Нужно настроить конфиг, добавить в автозагрузку. Всё согласно мануалу.
  2. НЕ редактируйте конфиг из консоли! Лучше скачать файл на компьютер (например, 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
                   }
               },
               
           ]
       },
   //__________Конец первого устройства__________//


После того, как файл /скачали, отредактировали и вернули в исходную папку/, вернемся к мануалу по настройке плагина и выполним 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
  • Тип доступа - приватный.
  • Остальные обязательные поля (имя, подзаголовок, описание, иконка) - так же на ваш вкус.

Далее, в самом низу есть пункт "Связка аккаунтов", также создаём:

Везде жмём "Сохранить", затем "Опубликовать".

Объединяем навык и платформу Iobroker

Здесь же, в навыке, есть вкладка "тестирование" - открываем её, жмём "плюсик", добавить "другое устройство" там будет единственный наш навык, выбираем его, откроется страница авторизации.

Теперь вводим логин/пароль от учетки, созданные в конфиге, в блоке "users". Везде разрешаем-предоставляем доступ.

Далее, обновить список устройств. И если всё прошло удачно, Вы увидите список устройств!

Перейдя в квазар, их можно переименовать, переместить по комнатам.

стейты в mqtt

После того, как устройства появились в квазаре, в mqtt брокере появятся виртуальные стейты, на каждое устройство, которое мы создали. В моем примере это "svet_zal". В моем примере будет всего одно состояние: on/off. Дальше, применяя скрипты, наращиваем управление нужными устройствами. Всё предельно просто: следим за изменением стейта и активируем нужное устройство.

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

Предоставить доступ другим учёткам Яндекса

Очень часто, пользователей колонок Яндекса мучает вопрос: как предоставить доступ к своим устройствам другим членам семьи? В этой статье я уже отмечал, что в конфиг-файле плагина есть настройка нескольких учетных записей. После того, как Вы полностью настроили интеграцию Iobroker и "Алисы", у Вас всё отзывается на голос и включаются устройства, можно перейти к "шарингу" своих устройств.

  • Создаем в блоке "users" нужное количество учетных записей;
  • В том аккаунте, которому хотим предоставить доступ, переходим на платформу Яндекс.диалоги и создаем приватный навык, по аналогии с основным;
  • После сохранения и публикации навыка, открываем вкладку "тестирование", добавляем наш навык, но авторизовываемся уже под другой учёткой, которую создали отдельно;
  • Обновляем список устройств и можем по-своему переименовать устройства и комнаты;
  • Если сильно разобраться и запотеть, я думаю, возможно даже заведомо указать, какие устройства будут доступны в каждом аккаунте. (например, чтобы дети не включали свет у родителей)


gl, hf