Zigbee2mqtt assistant не работает

Установка флага retain в zigbee2mqtt

У меня уже где-то с полгода установлена система умного дома Home Assistant. Сначала появился HA со всякими WiFi устройствами, а через некоторое время я купил Zigbee свисток CC2531 и настроил его через zigbee2mqtt. Так что теперь у меня в Home Assistant попадают данные с zigbee датчиков температуры/влажности, датчиков открытия дверей/окон и я могу управлять умными zigbee лампочками.

Но все это время у меня была проблема. После перезагрузки Home Assistant в интерфейсе нет данных про температуру-влажность. Должно пройти какое-то время перед тем как появятся цифры температуры и влажности. С датчиком открытия все еще хуже. Окно физически открыто. В HA показывается «Открыто». Перезагружаю HA. К окну не прикасался, оно все так же и открыто. Но HA после перезагрузки показывает что окно «Закрыто».

Я достаточно часто перезагружаю HA (постоянно что-то настраиваю и переделываю) и мне неудобно такое поведение.

Оказывается, это совершенно просто поправить.

Для начала — вообще, почему это происходит? Это специфика MQTT. В MQTT есть сервер (он называется «брокер»). К этому брокеру подключаются клиенты. Клиенты могут либо посылать сообщения, либо подписываться на то что они будут получать сообщения. Когда приходит сообщение брокер пересылает его всем клиентам, которые подписались на получение этих сообщений. В общем случае mqtt брокер не хранит сообщения, а сразу их удаляет после того как получил и переслал всем тем кому они интересны. Но если сообщение отправлено со специальным флагом «retain», то тогда оно сохраняется в брокере. Новый клиент подключается к брокеру и получает из него все сообщения с флагом «retain».

Система zigbee2mqtt отправляет в MQTT сервер сообщения которое получает от zigbee устройств. HA подписан на все сообщения из MQTT сервера и когда он видит новое сообщение от MQTT, он обновляет данные у себя. По умолчанию zigbee2mqtt отправляет сообщения без флага «retain».

HA показывает температуру-влажности на основании данных из MQTT. Перезагружаем HA. НА поднялся, подключился к MQTT серверу. HA ничего не получил из MQTT, поэтому HA не показывает данные. Через некоторое время датчик отправит текущую температуру-влажность, она появится в MQTT, HA увидит и отобразит эти данные.

У меня HA установлен на Raspberry Pi. На этом устройстве установлена операционная система Raspbian, а уже на ней работает HA в виде набора докер контейнеров Hassio. zigbee2mqtt установлен адоном.

Чтобы zigbee2mqtt отправлял флаг «retain» нужно поправить файл

В этом файле находятся настройки всех zigbee устройств, с которыми работает zigbee2mqtt. В моем случае этот файл выглядел так:

(строк чуть больше, но формат такой)

Для того чтобы zigbee2mqtt отправлял статус устройства с флагом «retain» нужно поправить этот файл. Для того устройства которого нужна отправка флага «retain» нужно дописать «retain: true». Вот как я поправил этот файл:

После этого я зашел в Supervisor -> Dashboard и перезагрузил аддон.

Потом я подождал минут 15, данные со всех устройств появились в HA и перезагрузил HA. Результат — после перезагрузки сразу показывается температура-влажность, а открытое окно сразу правильно показывается в статусе «Открыто».

В настройках zigbee2mqtt я добавил отправку флага «retain» только для датчиков температуры-влажности и датчиков открытия окон-дверей. Для кнопок и ламп я не делал отправку этого флага (прямо сейчас у меня нет с ними явных проблем, поэтому я не трогал их настройки, возможно в будущем как-то поменяется).

Я слышал несколько мнений что добавление флага «retain» усложнит определение что в устройстве села батарейка. Но меня это не сильно беспокоит: батарейки в zigbee устройствах садятся исключительно редко (работают несколько лет), а перезагружаю HA я несколько раз в неделю.

Мне кажется что установка флага «retain» для датчиков температуры- влажности и открытия окон — это то как zigbee2mqtt должен вести себя по умолчанию. Если бы он так себя вел, то с самого начала работы с z2m у меня просто не было бы проблемы что после перезагрузки он не сразу показывает данные. Я написал это предложение в тикет GitHub проекта z2m,

Читайте также:  Player payfine не работает

Источник

CC2531 + ZigBee2MQTT, отказываемся от шлюзов производителей

Для подключения ZigBee устройств и датчиков необходим шлюз, который обеспечит взаимодействие между ними. Зачастую каждый производитель выпускает шлюзы поддерживающие только устройства своей экосистемы. Не все шлюзы возможно подключить к альтернативным системам управления и не все, подключенные через шлюз устройства, могут поддерживаться, бывает, что у устройств ограничен функционал. Решить подобные проблемы и объединить наши устройства поможет USB координатор CC2531 стоимостью 5$. Заказать можно на одной известной торговой китайской торговой площадке, устройства предлагаются в двух вариантах, со встроенной и внешней подключаемой антенной, предпочтительнее второй вариант, т.к. при недостаточном уровне сигнала можно заменить антенну на более мощную.

Для подключения устройств необходимы:

  • USB координатор CC2531.
  • Компьютер для подключения координатора и установки необходимого программного обеспечения, для этих целей прекрасно подходит Raspberry Pi.
  • Программное обеспечение ZigBee2MQTT.
  • Программное обеспечение для работы протокола MQTT (так называемый MQTT брокер), например, Mosquitto.

Преимущества данного подключения устройств:

  • Датчики и устройства можно подключить к альтернативным системам, таким как Home Assistant, не имея шлюза производителя.
  • Обширный список устройств разных производителей. Полный список поддерживаемых устройств.
  • Можно использовать гибридную систему, часть устройств подключены к шлюзу производителя, часть напрямую к СС2531.
  • Некоторые устройства имеют функции, которых нет при подключении к шлюзу своей экосистемы.

Схема подключения будет выглядеть следующим образом:

На сайте проекта ZigBee2MQTT подробно расписан порядок действий, ниже будет представлен вольный перевод того, что необходимо выполнить:

Прошивка CC2531

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

  • При помощи CC Debugger, покупается на той же площадке где и плата, стоит как два устройства CC2531. Можно поискать у знакомых, которые уже купили данное устройство. Минус, то что оно нужно всего на один-два раза, прошить/обновить плату и. возможно прошить еще одну, которая будет выступать как роутер. Необходим Debug кабель, покупается там же вместе с CC Debugger’ом или отдельно.
  • Прошить с помощью Paspberry Pi. [Инструкция]

Ниже описан первый вариант для Windows. Оригинал был описан на сайте ZigBee2MQTT. UPD.: на 10.11.2020 страница перенесена, но в общем списке ссылка на нее отсутствует.

Скачиваем и устанавливаем программу SmartRF Flash Programmer, необходимо зарегистрироваться на сайте, после чего будет доступна ссылка на скачивание. Будьте внимательны! SmartRF Flash Programmer v2 не подходит. [Зеркало]

Скачиваем и устанавливаем драйвер для CC Debugger, подключите CC Debugger к USB порту, в диспетчере устройств убедитесь, что драйвер установился корректно и устройство определилось. При возникновении проблем установите драйвер вручную. Отключите CC Debugger. [Зеркало]

Подключить СС2531 к CC Debugger’у при помощи Debug кабеля. Подключить оба устройства (CC2531 и CC Debugger) к USB портам компьютера. Если индикатор на CC Debugger светит красным, то нажать кнопку Reset на CC Debugger, индикатор должен загореться зеленым цветом.

Скачиваем и распаковываем прошивку для CC2531. Прошивки есть для ZigBee версии 1.2 и 3. Для версии 1.2 есть два вида прошивок Default и Source Routing, автор комментирует так:

  • Если в ZigBee сети до 30 устройств, то рекомендуется версия Default.
  • Если в ZigBee сети более 30 устройств, то рекомендуется версия Source Routing. Данная прошивка поддерживает только 5 прямых подключений к координатору, остальные устройства подключаются через роутеры. Роутером в ZigBee сети обычно выступает любое устройство, подключенное к постоянному питанию, розетки, выключатели, светильники, но выключатели Xiaomi без нулевой линии не являются роутерами. Так же в качестве роутера можно использовать другое устройства CC2531 или CC2530, но прошитые специальной прошивкой.

Запускаем SmartRF Flash Programmer и выбираем:

  • What do you want to program: Program CCxxxx SoC or MSP430
  • Во вкладке Sisten-on-Chip выбираем CC2531
  • Interface: Fast
  • Flash Image File выбираем файл прошивки с расширением *.hex .
  • Location: Primary
  • Actions: Erace, program and verify
Читайте также:  Как настроить модуль яндекс деньги

Нажимаем Perfom actions, ждем окончания прошивки модуля.

Отключаем модуль от компьютера и CC Debugger’а.

Установка MQTT брокера Mosquitto

Дальнейшие инструкции описывают установку программного обеспечения на Ubuntu и другие системы на базе Debian, в том числе Raspberry Pi OS.

В файле /etc/mosquitto/mosquitto.conf должно быть следующее:

Создадим файл default.conf для внесения своих настроек:

Для установки пароля в файл /etc/mosquitto/conf.d/default.conf внесем следующее:

Создаем нового пользователя usermosquitto с паролем passmosquitto для подключения к Mosquitto:

Вводим пароль для нового пользователя и перезапускаем сервис Mosquitto:

Установка ZigBee2MQTT

Подключаем CC2531 координатор к компьютеру, работающему 24/7, самый распространенный вариант это Raspberry Pi где крутится сервис автоматизации, но на самом деле это могут быть разные компьютеры, первый MQTT брокером, второй с сервисом ZigBee2MQTT, третий с сервисом автоматизации 🙂 Но обычно это один компьютер.

Проверяем подключение устройства в системе:

Как видно из ответа, наше устройство обнаружилось как ttyACM0 , проверяем:

Устанавливаем репозиторий Node.js :

Проверяем версии Node.js и npm:

Версия Node.js должна быть 10.x или 12.x, npm — 6.x

Делаем клон репозитория ZigBee2MQTT:

где user — пользователь, под которым будет работать сервис, group — группа имеющая доступ к папке. Для Raspberry Pi это обычно pi:pi. Пользователь должен входить в группу dialout.

При корректной установке в ответ будет выведено сообщение вида:

Предупреждающие сообщения Warning игнорируем.

Редактируем файл настроек /opt/zigbee2mqtt/data/configuration.yaml :

homeassistant: true — если вы собираетесь используете интеграцию с Home Assistant.
permit_join: false — подключение новых устройств. Для подключения новых устройств необходимо выставить в true, рекомендуемое значение false во избежании подключения случайных устройств.
server: ‘mqtt://localhost‘ — адрес сервера MQTT. Если это тоже самое устройство, то оставляем localhost .
user: usermosquitto — пользователь с доступом к MQTT серверу.
password: passmosquitto — Пароль пользователя MQTT сервера.
port: /dev/ttyACM0 — устройсво CC2531 в системе.
network_key: GENERATE — ключ безопасности сети ZigBee. GENERATE — при старте будет сгенерирован новый ключ, можно задать вручную: network_key: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5]

При правильной настройке будет сообщение вида:

Останавливаем программу Ctrl+C .

Создаем файл для запуска сервиса при старте системы.

User=pi — Пользователь, с правами которого запускается сервис. Для Raspberry Pi это обычно пользователь pi.

Добавляем сервис в автозагрузку и запускаем его:

Обновление ZigBee2MQTT

Делаем резервную копию данных:

Восстановление данных и запуск сервиса:

Подключение устройств

Для подключения устройств в файле /opt/zigbee2mqtt/data/configuration.yaml надо установить permit_join: true и перезагрузить сервис.

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

После подключения всех устройств для повышения безопасности и избежании случайного подключения других устройств в файле /opt/zigbee2mqtt/data/configuration.yaml необходимо установить permit_join: false после чего перезагрузить сервис.

Выявленные проблемы

На Ubuntu было лень создавать отдельного пользователя для работы сервиса и программа запускалась от пользователя homeassistant вместе с самим Home Assistant. После нескольких минут работы у Home Assistant отваливалась связь со шлюзами и светильниками Xiaomi. После создания в системе отдельного пользователя и настройки запуска от его имени проблема ушла.

Источник

Как добавить неподдерживаемое устройство в Zigbee2mqtt

В последнее время, благодаря опытным умельцам стали один за одним появляться интересные DIY устройства для умного дома, работающие на протоколе Zigbee. Многие из них можно найти на сайте проекта https://modkam.ru/, а многие появляются в единичных экземплярах и часто не имеют официальной поддержки в zigbee2mqtt или поддерживают работу только с SLS шлюзом. Встает вопрос, как добавить их поддержку? Есть официальная документация об этой процедуре, но она весьма поверхностна, а русскоязычных подробных инструкций я лично не встречал.

Читайте также:  Не работает обратная связь брелок или сигнализация

И вот попалась мне в руки плата от уважаемого Grigory, реализующая zigbee датчик CO2 на базе популярных датчиков MH-Z19B или Senseair S8. Плата изначально предназначалась для работы с SLS шлюзом и поддержки zigbee2mqtt не имела. Встал вопрос как ее туда добавить так, чтобы датчик полноценно был интегрирован в HomeAssistant.

Внимательно изучив официальную документацию я решил, что попробую это сделать сам и не ждать, пока кто-то когда-то добавит эту поддержку. Или не добавит.

У меня работает Supervised HomeAssistant на базе Raspbian, или, как этот вариант называется в документации — Hass.io.

Первым делом нам нужно получить дебаг лог нашего неподдерживаемого устройства после спаривания его с вашей сетью zigbee. Для этого в аддоне zigbee2mqtt включаем опцию дебаг логирования и разрешаем новым устройствам подключаться:

Включаем устройство в режим спаривания и перезапускаем аддон zigbee2mqtt. Вскоре, после того, как устройство подключится к сети, в логе аддона мы должны увидеть искомое, в моем случае что-то вроде:

Видно, что устройство отдает показания значений температуры и уровня CO2 с разными endpoint. Это то, что нам нужно, чтобы написать код конвертеров.

Тем, кто пользуется Supervised HomeAssistant, добавлять поддержку устройства придется внутрь докер контейнера zigbee2mqtt. Для начала нужно найти его ID. Это делается командой:

Далее, согласно документации, нам нужно добавить сами конвертеры в файл /app/node_modules/zigbee-herdsman-converters/converters/fromZigbee.js но на самом деле, в реальности, внутри докер контейнера файл находится по пути node_modules/zigbee-herdsman-converters/converters/fromZigbee.js

Для этого входим внутрь докер контейнера с помощью команды:

Внимательный читатель заметил, что ID контейнеров на картинке выше и в приведенной выше команде отличаются. Действительно, в этом основная проблема этого метода — после каждого перезапуска аддона zigbee2mqtt в интерфейсе вашего HomeAssistant, контейнер создается заново с новым ID и все ваши изменения внутри него пропадают. Как этого избежать я напишу ниже.

Итак, мы внутри докер контейнера и нам нужно добавить наши конвертеры. Я совершенно не умею писать код, я никогда не был программистом, но с помощью примеров и советов Grigory я написал код на JavaScript для конвертеров CO2 и температуры, которые все-таки заработали. Открываем файл node_modules/zigbee-herdsman-converters/converters/fromZigbee.js на редактирование (это делается с помощью редактора vi внутри контейнера) и вставляем следующий код между какими-нибудь уже существующими контейнерами:

Далее в файл node_modules/zigbee-herdsman-converters/devices.js необходимо добавить описание нашего нового zigbee устройства. Делаем это также с помощью редактора vi, добавляя следующий код:

И для того, чтобы наши датчики распознались в HomeAssistant с помощью discovery, в файл lib/extension/homeassistant.js добавляем сенсор для CO2 и описание. Для температуры сенсор добавлять не нужно, будет использоваться уже существующий там:

После этого осталось перезапустить докер контейнер (но ни в коем случае не аддон zigbee2mqtt. ) со всеми нашими изменениями и убедиться, что наше устройство добавилось:

Мы добавили поддержку нового zigbee устройства. Вышенаписанное предлагаю рассматривать лишь как достаточно подробный пример, не более. Описывать код не задача этой сугубо практической статьи.

Осталась проблема, состоящая в том, что для сохранения поддержки, необходимо перезапускать именно докер, и ни в коем случае не аддон в интерфейсе HomeAssistant,

Проблема решена в последнем апдейте zigbee2mqtt версии 1.14.1, где разработчики добавили очень крутую вещь — возможность внешних подключаемых конвертеров с помощью опции external_converters в конфигурационном файле zigbee2mqtt.

С помощью уважаемого Аноним я даже написал внешний конвертер в виде отдельного файла airqmon.js помещенного внутрь директории zigbee2mqtt, там, где находятся конфигурационный файл, база данных и важный файл devices.yaml. Его содержимое такое:

В конфигурацию zigbee2mqtt добавил загрузку этого внешнего конвертера с помощью новейшей опции:

Но проблема оказалась там, где ее не ждали. Оказывается, текущая версия аддона zigbee2mqtt никак, к сожалению, не поддерживает в конфигурации эту саму новейшую опцию external_converters и воспользоваться внешним конвертером в итоге пока не удалось. Остается только ждать выпуска новой версии аддона, где уже зарепорченая проблема будет решена.

Источник

Оцените статью