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 и только потом расширяйте сеть.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте