Docker часть 7: Zigbee2MQTT
Настраиваем Zigbee2MQTT в Docker контейнере Home Assistant

Zigbee — это беспроводной протокол, подобный WiFi, но разработанный специально для устройств IoT. Устройства соединяются в ячеистую сеть, где устройства с питанием от сети (например, лампочки и умные розетки) выступают в качестве роутеров для увеличения радиуса действия сети. Координатор Zigbee находится в центре сети Zigbee и обеспечивает взаимодействие с устройствами, не относящимися к Zigbee.
Home Assistant предлагает 2 интеграции Zigbee: встроенную ZHA и deCONZ, которая работает через надстройку. Другой популярной альтернативой является Zigbee2MQTT, который использует обнаружение MQTT Home Assistant для создания устройств и объектов в Home Assistant.
В этом посте будет обсуждаться установка Zigbee2MQTT, так как он использует контейнер Docker для координатора (мы уже установили брокера MQTT).
Обнаружение Zigbee координатора
В нашей конфигурации создания Docker нам нужно назначить координатор Zigbee, который будет подключен через USB, к контейнеру Docker.
Подключите координатор по USB и введите команду в терминале
ls -l /dev/serial/by-id/

Мы будем использовать этот уникальный путь по by-id в нашей конфигурации позже вместо типичного /dev/ttyUSB0, потому что всегда существует риск того, что устройство получит новый TTY, назначенный после перезагрузки, особенно с другими подключаемыми устройствами.
В нашем случае используется Sonoff Zigbee 3.0 usb Dongle E.
Перейдем в .env файл и добавим новую переменную ZIGBEE_ADAPTER_TTY

Установка Zigbee2MQTT контейнера
Расширяем наш docker-compose.yaml конфигом для контейнера Zigbee2MQTT.
version: '3.0'
services:
portainer: # часть 2
[...]
homeassistant: # часть 3
[...]
hass-configurator: # часть 4
[...]
mariadb: # часть 5
[...]
adminer: # часть 5
[...]
mosquitto: # часть 6
[...]
zigbee2mqtt:
container_name: zigbee2mqtt
image: koenkk/zigbee2mqtt
restart: unless-stopped
devices:
- ${ZIGBEE_ADAPTER_TTY}:/dev/ttyACM0
ports:
- "8020:8020"
environment:
- TZ=Europe/Moscow
volumes:
- ./zigbee2mqtt:/app/data
- /run/udev:/run/udev:ro
depends_on:
- mosquitto
Мы пока не будем запускать наш контейнер, так как сначала мы хотим настроить нашу конфигурацию.
Конфигурация Zigbee2MQTT
Создаем папку с конфигурацией
mkdir zigbee2mqtt
Создаем файл конфигурации и записываем в него данные
sudo nano zigbee2mqtt/configuration.yaml
# записываем в него
homeassistant: true
permit_join: false
mqtt:
base_topic: zigbee2mqtt
server: '!secret server'
user: '!secret user'
password: '!secret password'
client_id: zigbee
serial:
port: /dev/ttyACM0
frontend:
port: 8020
Далее необходимо создать файл с секретами, в которых будет храниться наше соединение с MQTT
sudo nano zigbee2mqtt/secret.yaml
# записываем в него. Не забудьте поменять IP и PASSWORD
server: "mqtt://<IP>:1883"
user: "homeassistant"
password: "<PASSWORD>"
Имея эту конфигурацию, мы можем запустить контейнер, используя docker compose up -d zigbee2mqtt.

Добавление Zigbee2MQTT в Home Assistant
Для удобства использования добавим Z2M в боковую колонку, так же как мы делали с Portainer, File Editor, Adminer.
Для этого откроем configuration.yaml и в блоке panel_iframe добавим новую секцию
panel_iframe:
portainer: # часть 2
[...]
configurator: # часть 4
[...]
adminer: # часть 5
[...]
zigbee2mqtt:
title: Zigbee2MQTT
icon: mdi:zigbee
url: "http://<ip>:8020"
require_admin: true

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


Итоговая структура проекта
home-assistant
├── .env
├── docker-compose.yaml
├── fileeditor
├── homeassistant
├── mosquitto
├── portainer
└── zigbee2mqtt
└── ...
Docker часть 6: Mosquitto MQTT
Добавляем Docker контейнер в Home Assistant.
Docker часть 8: ESPHome
Добавляем ESPHome Docker контейнер в Home Assistant
Обсуждение
Вероятно, сетевой порт, если 8020 был занят
ports:
– “{8020->8030}:8020”
Добрый день, а что за порт вы меняли и как?
Обновил прошивку Sonoff Zigbee, дописал в конфигурацию adapter: ember, поменял порт на малинке и Все заработало.
Добрый вечер. Спасибо за подсказку. Контейнер удалось запустить. Но, судя по логу, контейнер перезапускается по watchdog.
2025-03-15 20:32:27 info: z2m: Starting zigbee-herdsman (3.2.7)
2025-03-15 20:32:28 info: zh:adapter:discovery: Matched adapter: {“path”:”/dev/ttyUSB0″,”manufacturer”:”ITead”,”serialNumber”:”58e9c4813114ef11842075b8bf9df066″,”pnpId”:”usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_58e9c4813114ef11842075b8bf9df066-if00-port0″,”vendorId”:”10c4″,”productId”:”ea60″} => zstack: path=/dev/ttyUSB0, score=4
2025-03-15 20:32:28 info: zh:zstack:znp: Opening SerialPort with {“path”:”/dev/ttyUSB0″,”baudRate”:115200,”rtscts”:false,”autoOpen”:false}
2025-03-15 20:32:28 info: zh:zstack:znp: Serialport opened
2025-03-15 20:32:28 info: zh:zstack:znp: Writing CC2530/CC2531 skip bootloader payload
2025-03-15 20:32:30 info: zh:zstack:znp: Skip bootloader for CC2652/CC1352
2025-03-15 20:32:48 error: z2m: Error while starting zigbee-herdsman
2025-03-15 20:32:48 error: z2m: Failed to start zigbee-herdsman
2025-03-15 20:32:48 error: z2m: Check https://www.zigbee2mqtt.io/guide/installation/20_zigbee2mqtt-fails-to-start_crashes-runtime.html for possible solutions
2025-03-15 20:32:48 error: z2m: Exiting…
2025-03-15 20:32:49 error: z2m: Error: Failed to connect to the adapter (Error: SRSP – SYS – ping after 6000ms)
at ZStackAdapter.start (/app/node_modules/.pnpm/zigbee-herdsman@3.2.7/node_modules/zigbee-herdsman/src/adapter/z-stack/adapter/zStackAdapter.ts:113:27)
at Controller.start (/app/node_modules/.pnpm/zigbee-herdsman@3.2.7/node_modules/zigbee-herdsman/src/controller/controller.ts:136:29)
at Zigbee.start (/app/lib/zigbee.ts:69:27)
at Controller.start (/app/lib/controller.ts:142:13)
at start (/app/index.js:161:5)
Using ‘/app/data’ as data directory
Starting Zigbee2MQTT without watchdog.
2025-03-15 20:33:00 info: z2m: Logging to console, file (filename: log.log)
2025-03-15 20:33:00 info: z2m: Starting Zigbee2MQTT version 2.1.3 (commit #ba337bd329aeb4ca17735c0cf09b31293c8cff06)
В чем может быть дело?
Что указано в секции devices? должно быть /dev/ttyACM0, а не ../../ttyACM0
Не запускается контейнер zigbee2MQTT/ Portainer пишет : Failed starting container: error gathering device information while adding custom device “/dev/serial/by-id/usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_58e9c4813114ef11842075b8bf9df066-if00-port0 -> ../../ttyACM0”: no such file or directory
Как будто не видит хаб.
Файлы configuration.yaml и secret.yaml должны быть созданы в директории zigbee2mqtt/data иначе плагин будет стучаться по дефолтному адресу localhost и не дойдет до mosquitto.
После перезагрузки подключенные устройства не отображаются в “Zigbee2MQTT – Устройства” В интеграции MQTT пишет “Этот объект больше не предоставляется интеграцией mqtt. Вы можете удалить его на вкладке “Настройки”, если он больше не будет использоваться.”
Добрый день! Большое спасибо за столь подробную серию статей, но у меня, в процессе установки возникла следующая проблема: У меня не USB-устройство, а Xiaomi Gateway. Не определятся сервером по USB и не могу конфигурацию корректно указать. Может сталкивались с таким? Заренее спасибо!
Столкнулся с неприятным моментом, если отключить сетевой кабель от малины, зигби устройства перестают работать. Это не большая проблема, но если ты решил перезагрузить роутер и в этот момент у тебя срабатывают автоматизации, можно словить глюки из-за которых часть устройств работает, а часть нет. (надеюсь что именно перезагрузка роутера была тому виной).
Что бы сделать работу zigbee2mqtt не зависящей от наличия локального сетевого адреса, я использовал адрес 172.19.0.3, который показывается в portainer для контейнера mosquitto.
В этом случае указать localhost или прочие аналоги не получалось, zigbee2mqtt отказывался работать.
Так же в настройках интеграции MQTT в HA я указал localhost заместо локального адреса.