Периодически отключается Zigbee модуль и не работает zigbbe2mqtt

После обновления прошивки на 2606 периодически перестает работать модуль zigbee. естественно неработает zigbee2mqtt.


root@wirenboard-AU5E6WCW:~# systemctl status zigbee2mqtt
● zigbee2mqtt.service - zigbee2mqtt
Loaded: loaded (/lib/systemd/system/zigbee2mqtt.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Wed 2026-07-01 13:00:08 MSK; 19h ago
Process: 2087 ExecStart=/usr/bin/npm start (code=killed, signal=TERM)
Main PID: 2087 (code=killed, signal=TERM)
CPU: 27min 38.603s

Jul 01 12:59:59 wirenboard-AU5E6WCW zigbee2mqtt[3909]: [2026-07-01 12:59:59] info: z2m: Disconnecting from MQTT server
Jul 01 12:59:59 wirenboard-AU5E6WCW zigbee2mqtt[3909]: [2026-07-01 12:59:59] info: z2m: Stopping zigbee-herdsman…
Jul 01 13:00:08 wirenboard-AU5E6WCW zigbee2mqtt[3909]: [2026-07-01 13:00:08] info: zh:controller: Wrote coordinator backup to '/mnt/data/root/zigbee2mqtt/data/coor>
Jul 01 13:00:08 wirenboard-AU5E6WCW zigbee2mqtt[3909]: [2026-07-01 13:00:08] info: zh:zstack:znp: closing
Jul 01 13:00:08 wirenboard-AU5E6WCW zigbee2mqtt[3909]: [2026-07-01 13:00:08] info: zh:zstack:znp: Port closed
Jul 01 13:00:08 wirenboard-AU5E6WCW zigbee2mqtt[3909]: [2026-07-01 13:00:08] info: z2m: Stopped zigbee-herdsman
Jul 01 13:00:08 wirenboard-AU5E6WCW zigbee2mqtt[3909]: [2026-07-01 13:00:08] info: z2m: Stopped Zigbee2MQTT
Jul 01 13:00:08 wirenboard-AU5E6WCW systemd[1]: zigbee2mqtt.service: Succeeded.
Jul 01 13:00:08 wirenboard-AU5E6WCW systemd[1]: Stopped zigbee2mqtt.
Jul 01 13:00:08 wirenboard-AU5E6WCW systemd[1]: zigbee2mqtt.service: Consumed 27min 38.603s CPU time.

После перезагрузки Wirenboard работоспособность модуля возвращается, но через какое-то время опять модуль не работает

Доброго дня, взяли ваше обращение в работу.

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

приложен диагностический архив, доступен только сотрудникам поддержки
(352,5 КБ)

Алекс, разобрались по диагностическому архиву. Модуль Zigbee и адаптер исправны, дело в связке MQTT-брокера (mosquitto) и сервиса zigbee2mqtt.

Что происходит. Примерно раз в 1–3 дня mosquitto аварийно завершается (в журнале видно out of memory и выход с ошибкой). В этот же момент systemd штатно останавливает и zigbee2mqtt, так как сервис привязан к брокеру. Сам брокер сразу поднимается автоматически, а zigbee2mqtt обратно не стартует и остаётся выключенным до перезагрузки. Поэтому ребут временно всё возвращает.

Падение брокера не связано с нехваткой ОЗУ на контроллере, свободной памяти было достаточно. Брокер упирается в собственный внутренний лимит и начинает сбрасывать клиентов.

Обходной шаг, он вернёт Zigbee к работе после перезапуска брокера без полной перезагрузки. Сделайте zigbee2mqtt независимым от жизненного цикла mosquitto, переподключаться к MQTT он умеет сам. Создайте файл /etc/systemd/system/zigbee2mqtt.service.d/override.conf

[Unit]
BindsTo=
Requires=
Wants=mosquitto.service
After=mosquitto.service

и примените

systemctl daemon-reload
systemctl restart zigbee2mqtt

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

Это снимает симптом. Чтобы добить причину, то есть сами перезапуски mosquitto, пришлите, пожалуйста, при штатной работе вывод

mosquitto_sub -t '$SYS/broker/heap/#' -C 2 -v
grep -R memory_limit /usr/share/wb-configs/mosquitto/ /etc/mosquitto/

и уточните, есть ли у вас внешний подписчик, читающий все топики (например, Home Assistant или сторонний сервис, в архиве виден клиент с адреса 192.168.95.8). Это поможет понять, что переполняет память брокера.

Напишите, помог ли обходной шаг, и пришлите эти данные, продолжим по причине перезапусков.

root@wirenboard-AU5E6WCW:~# mosquitto_sub -t ‘$SYS/broker/heap/#’ -C 2 -v
grep -R memory_limit /usr/share/wb-configs/mosquitto/ /etc/mosquitto/
$SYS/broker/heap/current 57989416
$SYS/broker/heap/maximum 58765616
/usr/share/wb-configs/mosquitto/30limits.conf:memory_limit 100000000

работоспособность восстановлена, буду наблюдать…

У меня на внешнем сервере установлен HA с адресом 192.168.95.8

Спасибо за ваши данные, есть одна идея, сейчас посовещаюсь с коллегами по интеграциям и софту и дам вам ответ

Доброго утра.
Утром сегодня ситуация с отвалом Zigbee повторилась, чудо не произошло. При этом я наблюдал как все устройства касающиеся WB тоже отвалились, при этом я все это видел по удаленке через HA.
Еще один момент. У меня есть подозрение что проблема в самом контроллере WB, так как у меня есть еще один контроллер и с ним все хорошо, не смотря на то, что HA стоит на нем.

Добрый день. Ваше наблюдение как раз важное.

То, что разом отвалились все устройства WB, а не только Zigbee, указывает на общий MQTT-брокер (mosquitto), а не на Zigbee-модуль или сам контроллер. Брокер один на все сервисы, при его сбое связь разом теряют и Modbus, и входы, и Zigbee, поэтому в HA вы и видите всё дерево WB офлайн одновременно. Была бы неисправна железка, отвалился бы только Zigbee. А то, что второй контроллер живёт, это разница нагрузки на брокер, а не дефект первого.

Подтвердить, что сегодня был тот же сбой брокера, можно одной командой

journalctl -u mosquitto -S today | grep -iE "out of memory|status=255"

Если увидите out of memory и status=255, то это он. Отпишитесь, пожалуйста, если это так.

Чтобы Zigbee хотя бы поднимался сам после перезапуска брокера, без ручной перезагрузки, примените обходной шаг, если ещё не сделали. Если сделали, но не помогает - жду новый диагностический архив, будем тоже разбираться.

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

root@wirenboard-AU5E6WCW~# journalc.txt (50,1 КБ)

примените обходной шаг
все выполнил вчера

приложен диагностический архив, доступен только сотрудникам поддержки
(358,8 КБ)

Благодарим за оперативность и полноту данных, вы прислали ровно то, что требовалось, и это заметно ускорило разбор.

Что показал сегодняшний сбой. В 06:32 брокер mosquitto достиг внутреннего лимита памяти 100 МБ и около 7 минут отклонял подключения клиентов, в том числе zigbee2mqtt, который каждую секунду пытался переподключиться. В 06:39 брокер завершился и в 06:40 поднялся автоматически. По журналу видно, что память брокера заполняется равномерно примерно за 40 часов работы, поэтому сбой и возвращается каждые двое суток.

Судя по данным из архива, сервис zigbee2mqtt после сбоя запустился только в 07:32, похоже, вручную. Если бы обходной шаг с override действовал, сервис не остановился бы вовсе. Пришлите, пожалуйста, вывод команды

systemctl cat zigbee2mqtt

по нему проверим, применился ли override. Частая причина, файл создан, но не выполнен systemctl daemon-reload.

Добавлю для вас на будущее, что для восстановления не нужна перезагрузка контроллера, достаточно:

systemctl restart mosquitto
systemctl start zigbee2mqtt

Основной шаг. Ограничим очереди клиентов и добавим брокеру запас памяти. Текущие лимиты заданы в заводском файле /usr/share/wb-configs/mosquitto/30limits.conf, править его не нужно, при обновлении пакетов он перезаписывается и правки потеряются. Для локальных настроек предназначен каталог /etc/mosquitto/conf.d/, он читается после заводского и переопределяет его значения. Создайте файл /etc/mosquitto/conf.d/50-wb-support.conf со строками

max_queued_bytes 10485760
memory_limit 300000000

и выполните systemctl restart mosquitto, затем systemctl start zigbee2mqtt.

После этого возможны два исхода, и оба нам полезны. Либо рост памяти прекратится и сбои уйдут. Либо в журнале mosquitto появится строка Outgoing messages are being dropped for client ... с именем клиента, который переполняет очередь, тогда пришлите её нам. Также будем признательны, если раз в сутки снимете показание

mosquitto_sub -t '$SYS/broker/heap/maximum' -C 1

и сообщите значения, по ним увидим, остановился ли рост.

Да вы правы, сервис я перезапускал в ручную, когда приехал на работу. А все что я видел было с телефона, пока я ехал в метро)))
root@wirenboard-AU5E6WCW:~# systemctl cat zigbee2mqtt

/lib/systemd/system/zigbee2mqtt.service

[Unit]
Description=zigbee2mqtt
After=network.target mosquitto.service
BindsTo=mosquitto.service

[Service]
ExecStart=/usr/bin/npm start
SyslogIdentifier=zigbee2mqtt
WorkingDirectory=/mnt/data/root/zigbee2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3
User=root

[Install]
WantedBy=multi-user.target

Данными строками и перезапускал вчера днем и сегодня утром:
systemctl daemon-reload
systemctl restart zigbee2mqtt

Еще хотелось бы добавить что каталога zigbee2mqtt.service.d у меня не было, его пришлось вчера создавать. Файла override.conf соответственно.

Все что вы просили выполнено, присылаю показания после выполнения:
root@wirenboard-AU5E6WCW:~# systemctl restart mosquitto
root@wirenboard-AU5E6WCW:~# systemctl start zigbee2mqtt
root@wirenboard-AU5E6WCW:~# mosquitto_sub -t ‘$SYS/broker/heap/maximum’ -C 1
2457512

Спасибо, вывод systemctl cat дал точный ответ, почему обходной шаг не сработал.

Эта команда показывает все файлы юнита, включая override. В вашем выводе виден только основной юнит, а секции override.conf нет, и строка BindsTo всё ещё действует. Значит созданный вами файл лежит не по тому пути, который видит systemd, скорее всего опечатка в имени каталога или файла. Сами действия вы выполняли верно.

Где файл оказался на самом деле, покажет

find /etc/systemd -name "override.conf"
ls -la /etc/systemd/system/zigbee2mqtt.service.d/

Чтобы исключить опечатку, проще создать файл заново одним блоком, скопируйте его целиком и выполните

mkdir -p /etc/systemd/system/zigbee2mqtt.service.d
cat > /etc/systemd/system/zigbee2mqtt.service.d/override.conf << 'EOF'
[Unit]
BindsTo=
Requires=
Wants=mosquitto.service
After=mosquitto.service
EOF
systemctl daemon-reload
systemctl restart zigbee2mqtt

Проверка успеха двумя командами. В выводе systemctl cat zigbee2mqtt после основного юнита должна появиться секция с заголовком /etc/systemd/system/zigbee2mqtt.service.d/override.conf, а команда systemctl show zigbee2mqtt -p BindsTo должна вернуть пустое значение BindsTo=. Пришлите оба вывода, убедимся, что теперь применилось.

Заодно покажите cat /etc/mosquitto/conf.d/50-wb-support.conf, проверим, что и лимиты легли куда нужно.

По замеру памяти. Значение 2,5 МБ снято сразу после перезапуска, это нормальное стартовое значение. Рабочий уровень около 17 МБ наберётся в течение пары часов. Продолжайте, пожалуйста, снимать показание раз в сутки, нас интересует именно динамика за несколько дней.

это было сделано вчера:

root@wirenboard-AU5E6WCW:~# mkdir -p /etc/systemd/system/zigbee2mqtt.service.d
cat > /etc/systemd/system/zigbee2mqtt.service.d/override.conf << ‘EOF’
[Unit]
BindsTo=
Requires=
Wants=mosquitto.service
After=mosquitto.service
EOF
systemctl daemon-reload
systemctl restart zigbee2mqtt
root@wirenboard-AU5E6WCW:~# systemctl cat zigbee2mqtt

/lib/systemd/system/zigbee2mqtt.service

[Unit]
Description=zigbee2mqtt
After=network.target mosquitto.service
BindsTo=mosquitto.service

[Service]
ExecStart=/usr/bin/npm start
SyslogIdentifier=zigbee2mqtt
WorkingDirectory=/mnt/data/root/zigbee2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3
User=root

[Install]
WantedBy=multi-user.target

/etc/systemd/system/zigbee2mqtt.service.d/override.conf

[Unit]
BindsTo=
Requires=
Wants=mosquitto.service
After=mosquitto.service
root@wirenboard-AU5E6WCW:~# systemctl show zigbee2mqtt -p BindsTo
BindsTo=mosquitto.service
root@wirenboard-AU5E6WCW:~# cat /etc/mosquitto/conf.d/50-wb-support.conf
max_queued_bytes 10485760
memory_limit 300000000

17:32 03.07.2026
root@wirenboard-AU5E6WCW:~# mosquitto_sub -t ‘$SYS/broker/heap/maximum’ -C 1
10040720

Спасибо за замер. Память брокера пока растёт, это ожидаемо. Пришлите, пожалуйста, завтра два вывода.

mosquitto_sub -t '$SYS/broker/heap/maximum' -C 1
journalctl -u mosquitto -S yesterday | grep -i "dropped"

И по обходному шагу. Файл вы создали правильно, он виден в выводе systemctl cat. Но есть особенность systemd, которую я не учёл, но коллеги подсказали (давно уже не занимался линуксом). Через каталог override завсимости юнита можно только добавлять, а убрать существующую привязку BindsTo так нельзя. Приношу извинения за неточную рекомендацию.

Рабочий способ, переопределить юнит целиком. Скопируйте блок и выполните, брокер при этом не перезапускается и наблюдение за памятью не собьётся

cp /lib/systemd/system/zigbee2mqtt.service /etc/systemd/system/zigbee2mqtt.service
sed -i '/^BindsTo=/d' /etc/systemd/system/zigbee2mqtt.service
rm -r /etc/systemd/system/zigbee2mqtt.service.d
systemctl daemon-reload
systemctl restart zigbee2mqtt

Копия юнита в /etc имеет приоритет над заводской из /lib, в ней удалена только строка BindsTo. Ставший ненужным каталог override удаляем.

Проверка

systemctl show zigbee2mqtt -p BindsTo
systemctl status zigbee2mqtt | head -4

Первая команда должна вернуть пустое значение BindsTo=, вторая показать active (running) и путь /etc/systemd/system/zigbee2mqtt.service в строке Loaded. Пришлите оба вывода вместе с завтрашними данными.

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

Доброго времени суток.

направляю Вам результаты команд (вторая команда не выдает результата)
root@wirenboard-AU5E6WCW:~# mosquitto_sub -t ‘$SYS/broker/heap/maximum’ -C 1
70333352
root@wirenboard-AU5E6WCW:~# journalctl -u mosquitto -S yesterday | grep -i “dropped”
root@wirenboard-AU5E6WCW:~# mosquitto_sub -t ‘$SYS/broker/heap/maximum’ -C 1
journalctl -u mosquitto -S yesterday | grep -i “dropped”
70367664
root@wirenboard-AU5E6WCW:~#

Алекс, добрый день. Спасибо за новые данные. На данном этапе этого достаточно и суточные замеры более не потребуются. Мы передали разработчикам всю информацию, сейчас разбираемся с этой проблемой. Ждите обновлений от нас

Добрый день. Спасибо за Ваши ответы и обратную связь… Буду ждать дальнейших указаний.

Алекс, доброго дня! Коллеги спрашивают какую версию Home Assistant используете?

Добрый день.