Установка флага 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" нужно поправить файл

/usr/share/hassio/share/zigbee2mqtt/devices.yaml

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

'0x00158d000233781a':
  friendly_name: '0x00158d000233781a'
'0x00158d000309a2c3':
  friendly_name: '0x00158d000309a2c3'
'0x00158d000422fde9':
  friendly_name: '0x00158d000422fde9'

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

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

'0x00158d000233781a':
  friendly_name: '0x00158d000233781a'
'0x00158d000309a2c3':
  friendly_name: '0x00158d000309a2c3'
'0x00158d000422fde9':
  friendly_name: '0x00158d000422fde9'
  retain: true

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

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

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

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

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

Иван Бессарабов
ivan@bessarabov.ru

6 апреля 2020