Zigbee2MQTT — открытый мост между Zigbee-координатором и MQTT-брокером. Устройства сопрягаются напрямую с вашим сервером, состояние уходит в локальные топики, а управление не зависит от облака производителя. Разберём адаптер, Docker, настройку сети, сопряжение и резервное копирование.
Зачем нужен свой Zigbee-мост
Фирменные хабы удобны, пока работают. Когда производитель закрывает сервис или вводит подписку, устройства превращаются в кирпичи. Zigbee2MQTT работает локально: координатор подключён по USB, MQTT-брокер стоит рядом, а сценарии выполняет Home Assistant, Node-RED или собственный скрипт.
Проект поддерживает сотни моделей и публикует готовые описания. Это снимает привязку к одному вендору: датчики Aqara, выключатели Sonoff, лампы Philips Hue и реле Tuya могут жить в одной сети.
Есть и ограничения. Zigbee2MQTT не заменяет полноценную систему умного дома, а только транслирует устройства в MQTT. Кроме того, проект требует внимания к координатору и помехам.
Координатор и подготовка
Нужен USB-координатор с прошивкой Zigbee 3.0. Распространённые варианты — Sonoff Zigbee 3.0 USB Dongle Plus на CC2652P, SMLIGHT SLZB-06 на EFR32MG21 с сетевым подключением и ConBee III. Дешёвые адаптеры на CC2531 устарели: мало памяти, слабый радиус, поддержка ограничена.
Обязательно используйте USB-удлинитель: порт компьютера и корпус создают помехи на 2,4 ГГц. Координатор лучше поднять на метр от Wi-Fi-роутера и металлических предметов. Канал Zigbee выбирайте подальше от канала Wi-Fi: например, Wi-Fi на 1 и Zigbee на 15 или Wi-Fi на 6 и Zigbee на 25.
ls -l /dev/serial/by-id/
sudo usermod -aG dialout "$USER"
dmesg | grep -i -E 'ch341|cp210|ttyUSB|ttyACM'
Путь /dev/ttyUSB0 может меняться после перезагрузки. В конфигурации указывайте стабильный путь из /dev/serial/by-id. Для сетевых координаторов вместо порта задаётся TCP-адрес.
Установка через Docker Compose
Держите брокер и мост в контейнерах. Mosquitto хранит сообщения и раздаёт их подписчикам, Zigbee2MQTT общается с координатором. Каталог data монтируется с хоста, чтобы настройки и база пережили пересоздание контейнера.
mkdir -p ~/zigbee2mqtt/data ~/zigbee2mqtt/mosquitto/config ~/zigbee2mqtt/mosquitto/data
sudo chown -R 1883:1883 ~/zigbee2mqtt/mosquitto
docker run --rm -it --user 1883:1883 -v ~/zigbee2mqtt/mosquitto/config:/mosquitto/config eclipse-mosquitto:2 mosquitto_passwd -c /mosquitto/config/passwd zigbee
nano ~/zigbee2mqtt/docker-compose.yml
docker compose up -d
В compose-файле укажите устройство координатора. Достаточно проброса devices и группы dialout.
services:
mosquitto:
image: eclipse-mosquitto:2
restart: unless-stopped
ports:
- "1883:1883"
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
zigbee2mqtt:
image: ghcr.io/koenkk/zigbee2mqtt:latest
restart: unless-stopped
depends_on:
- mosquitto
ports:
- "8080:8080"
devices:
- /dev/serial/by-id/usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_0000-if00-port0:/dev/ttyACM0
volumes:
- ./data:/app/data
Для Mosquitto создайте файл mosquitto.conf с прослушиванием порта и аутентификацией.
listener 1883
allow_anonymous false
password_file /mosquitto/config/passwd
persistence true
persistence_location /mosquitto/data/
Конфигурация Zigbee2MQTT
Файл data/configuration.yaml задаёт брокер, порт координатора, канал и ключ сети. Ключ генерируется один раз и хранится в тайне.
mqtt:
base_topic: zigbee2mqtt
server: mqtt://mosquitto:1883
user: zigbee
password: change_me
serial:
port: /dev/ttyACM0
adapter: zstack
frontend:
port: 8080
advanced:
channel: 15
network_key: GENERATE
pan_id: GENERATE
permit_join: false
Значение adapter зависит от чипа: zstack для CC2652, ember для EFR32, deconz для ConBee. Ошибка в этом поле приводит к тому, что мост стартует, но не видит устройства. После первого запуска проверьте логи и доступность веб-интерфейса.
docker compose logs -f zigbee2mqtt
curl -sI http://127.0.0.1:8080/
docker compose restart zigbee2mqtt
Сопряжение устройств
Разрешите подключение через веб-интерфейс или MQTT-команду, затем переведите устройство в режим pairing. Для датчиков обычно нужно удерживать кнопку, для выключателей — нажать несколько раз. Таймер по умолчанию 120 секунд.
mosquitto_pub -h 127.0.0.1 -u zigbee -P change_me -t zigbee2mqtt/bridge/request/permit_join \
-m '{"value":true,"time":180}'
mosquitto_sub -h 127.0.0.1 -u zigbee -P change_me -t 'zigbee2mqtt/#' -v
mosquitto_sub -h 127.0.0.1 -u zigbee -P change_me -t 'zigbee2mqtt/bridge/event' -v
После появления устройства дайте ему осмысленное имя: топики и сущности в Home Assistant наследуют его. Не переименовывайте без причины — автоматизации ссылаются на имя. Если интервью не завершилось, поднесите устройство к координатору и повторите.
Топики и автоматизации
Состояние устройства публикуется в zigbee2mqtt/<имя>, команды принимаются в тот же топик, доступность — в …/availability. Мост публикует список устройств и состояние сети в bridge-топиках. Этого достаточно для логики без фирменного приложения.
mosquitto_sub -h 127.0.0.1 -u zigbee -P change_me -t 'zigbee2mqtt/kitchen_lamp' -v
mosquitto_pub -h 127.0.0.1 -u zigbee -P change_me -t zigbee2mqtt/kitchen_lamp/set \
-m '{"state":"ON","brightness":180}'
mosquitto_pub -h 127.0.0.1 -u zigbee -P change_me -t zigbee2mqtt/kitchen_lamp/set -m '{"state":"OFF"}'
В Home Assistant включите MQTT-интеграцию и discovery — сущности появятся автоматически. В Node-RED подпишитесь на топик и обрабатывайте payload как JSON. Для сценарной логики «даже если сервер недоступен» часть выключателей умеет напрямую связываться с лампами через binding, но это настраивается отдельно.
OTA, сеть и резервная копия
Обновление прошивок запускается из веб-интерфейса кнопкой Update, а блок ota задаёт периодичность проверки. Батарейные датчики просыпаются редко, поэтому обновление может занять часы или дни.
ota:
update_check_interval: 1440
disable_automatic_update_check: false
Перед массовым обновлением сделайте копию каталога data. В нём лежат configuration.yaml, database.db и coordinator_backup.json. Последний файл позволяет восстановить сеть на новый координатор; без него перенос придётся делать повторным сопряжением всех устройств.
cd ~/zigbee2mqtt
tar -czf zigbee2mqtt-backup-$(date +%F).tar.gz -C ~ zigbee2mqtt/data
ls -lh zigbee2mqtt-backup-*.tar.gz
docker compose pull
docker compose up -d
Умные розетки с питанием работают как ретрансляторы и расширяют mesh. В карте сети у устройств должно быть несколько соседей, а не один дальний узел.
Безопасность
MQTT-брокер не должен быть доступен из интернета. Оставьте 1883 и 8080 только в локальной сети, а удалённый доступ настраивайте через собственный защищённый шлюз с аутентификацией. Включите пароль, отключите анонимный доступ и ограничьте права пользователей по топикам.
Ключ сети и пароль MQTT храните в менеджере секретов. Не публикуйте configuration.yaml в открытых репозиториях: в нём остаются ключи и адреса. Для гостевых устройств заведите отдельный SSID или VLAN.
Чек-лист
- Координатор подключён через удлинитель, путь /dev/serial/by-id стабилен.
- Канал Zigbee не пересекается с Wi-Fi, mesh имеет несколько маршрутизаторов.
- MQTT закрыт паролем и недоступен из интернета.
- Устройства названы осмысленно, автоматизации не зависят от старых имён.
- Каталог data и coordinator_backup.json сохранены.
- Обновления контейнеров выполняются после резервной копии.
Итог
Zigbee2MQTT даёт локальный, предсказуемый умный дом без привязки к облаку. Ключевые шаги — правильный координатор, свободный канал, закрытый MQTT и резервная копия сети. Дальше устройства превращаются в обычные MQTT-топики, и вы сами решаете, какая система будет ими управлять. Начните с двух-трёх датчиков, убедитесь в стабильности mesh и только потом расширяйте сеть.