Как подключить координатор для управления IoT устройствами?

Цель и необходимость

Когда начал заниматься темой «умного дома», то для себя составил требования к выбираемой технологии (взаимодействие с IoT устройствами):

  1. Энергоэффективность.

  2. Стабильность и зрелость технологии.

  3. Дешевые и взаимозаменяемые устройства.

По всем этим критериям на тот момент победу одержала технология Zigbee. Были и недостатки в виде несовместимости некоторых устройств, производители которых используют свои закрытые прошивки и при этом указывают «Zigbee». Также есть ограничение по скорости, поэтому не рекомендуется передавать потокового видео, например. Для меня это были не проблемы, поэтому пошел в выбранную сторону. В этой статье буду описывать как я настроил работу координатора Zigbee, который занимает центральное место в сети IoT устройств. Концептуальная схема выглядит так:

@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml
!include <eip/EIP-PlantUML>

!procedure $CreateTag ($alias, $description="")
    AddElementTag($alias, $legendText=$description, $sprite=%string("img:../../_images/100x100/"+$alias+".png{scale=0.5}"))
!endprocedure

$CreateTag(docker, "Docker")
$CreateTag(zigbee, "Zigbee устройства")
$CreateTag(home_assistant, "home_assistant")
$CreateTag(mosquitto, "Брокер сообщений mosquitto")
$CreateTag(zigbee2mqtt, "Мост zigbee2mqtt")
$CreateTag(zigbee_coordinator, "Координтатор zigbee")


title "Схема взаимодействия с IoT устройствами"

Person(users, "Пользователи умного дома")

  System_Boundary(docker, "Docker"){
    Component(home_assistant, "Home Assistant", "Умный дом", "Управление умным домом", $tags="home_assistant")
    Component(mosquitto, "Mosquitto", "Брокер сообщений", "Брокер сообщений", $tags="mosquitto")
    Component(zigbee2mqtt, "Zigbee2MQTT", "Мост", "Мост", $tags="zigbee2mqtt")
}

  System_Boundary(zigbee_system, "Zigbee"){
    Component(zigbee_coordinator, "Координтатор", "Координтатор", "Координтатор", $tags="zigbee_coordinator")
    Component(zigbee, "Zigbee", "Zigbee", "Устройства", $tags="zigbee")
}


Rel(users, home_assistant, "Запросы")
Rel(home_assistant, users, "Ответы")
Rel(home_assistant, mosquitto, "Запросы")
Rel(mosquitto, home_assistant, "Ответы")
Rel(zigbee2mqtt, mosquitto, "Запросы")
Rel(mosquitto, zigbee2mqtt, "Ответы")
Rel(zigbee2mqtt, zigbee_coordinator, "Запросы")
Rel(zigbee_coordinator, zigbee2mqtt, "Ответы")
Rel(zigbee_coordinator, zigbee, "Запросы")
Rel(zigbee, zigbee_coordinator, "Ответы")

@enduml

Покупка координатора

Для себя взял координатор SONOFF Zigbee 3.0 USB Dongle Plus ZBDongle-P.

Установка координатора в Proxmox

Подключаем в USB разъем, устройство в Proxmox добавляем к VM по аналогии c видеокартой.

Заходим в VM и проверяем (должен быть похожий вывод):

$ ls -l /dev/serial/by-id/
lrwxrwxrwx 1 root root 13 Jun 11 07:36 usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_baf0b5bdd7e7ed11b34cd6770b2af5ab-if00-port0 -> ../../ttyUSB0

docker-compose

Создаем папки и необходимые файлы:

mkdir -p {config_mosquitto,config_zigbee2mqtt/zigbee2mqtt/data,config_mosquitto/config}
sudo touch {docker-compose.yml,config_zigbee2mqtt/zigbee2mqtt/data/configuration.yaml,config_mosquitto/config/mosquitto.conf,config_mosquitto/config/mqttuser}

Редактируем sudo nano config_mosquitto/config/mosquitto.conf:

# Listen on port 1883 on all IPv4 interfaces
listener 1883
socket_domain ipv4
# save the in-memory database to disk
persistence true
persistence_location /mosquitto/data/
# Log to stderr and logfile
log_dest stderr
log_dest file /mosquitto/log/mosquitto.log
# Require authentication
allow_anonymous false
password_file /mosquitto/config/mqttuser

Редактируем через nano docker-compose.yaml:

  mosquitto:
    container_name: mosquitto
    image: eclipse-mosquitto:latest
    restart: unless-stopped
    ports:
      - "1883:1883/tcp"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./config_mosquitto/config:/mosquitto/config
      - ./config_mosquitto/data:/mosquitto/data
      - ./config_mosquitto/log:/mosquitto/log
    depends_on:
      - zigbee2mqtt
    network_mode: host
    stdin_open: true
    tty: true

  zigbee2mqtt:
    container_name: zigbee2mqtt
    image: ghcr.io/koenkk/zigbee2mqtt
    restart: unless-stopped
    ports:
      - "8099:8099/tcp"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./config_zigbee2mqtt/zigbee2mqtt/data:/app/data
      - /run/udev:/run/udev:ro
      - /etc/localtime:/etc/localtime:ro
    devices:
      - /dev/serial/by-id/usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_baf0b5bdd7e7ed11b34cd6770b2af5ab-if00-port0:/dev/ttyACM0
    network_mode: host

Секцию devices подменяем на свои значения. Запускаем docker-compose.

После запуска контейнеров видим ошибки невозможности открыть файл конфигурации /mosquitto/config/:

$ docker-compose logs mosquitto
mosquitto  | 1749989865: Error: Unable to open config file /mosquitto/config/mosquitto.conf.

Создаем пользователя (запоминаем username и passsword):

docker exec -it mosquitto mosquitto_passwd -c /mosquitto/config/mqttuser <your_user>

Перезапускаем контейнер: docker-compose restart mosquitto. Идем в UI Homeassistant и добавляем интеграцию MQTT:

Прописываем пользователя, которого создали для mosquitto. Интеграция должна создаться успешно. Редактируем nano  config_zigbee2mqtt/zigbee2mqtt/data/configuration.yaml

frontend:
  enabled: true
  port: 8099
  url: http://<IP>:8099
mqtt:
  base_topic: zigbee2mqtt
  server: mqtt://<IP>
  user: <your_user>
  password: <your_password>
  client_id: zigbee
  keepalive: 60
  reject_unauthorized: true
  version: 4
serial:
  port: /dev/ttyACM0
  adapter: zstack
devices: devices.yaml
groups: groups.yaml
device_options: {}
version: 4

Перезагружаем контейнер: docker-compose logs zigbee2mqtt. Переходим по адресу http://<IP>:8099. Должны увидеть: При необходимости добавляем ссылку на http://<IP>:8099 в UI Homeassistant.

Пока тут нет устройств, но мы теперь можем их подключить :)

Итог

Теперь у нас есть мощные инструменты добавления IoT устройств и создания автоматизаций с ними, но об этом в следующих статьях.

Ссылки:

  1. Как установить Docker?

  2. Как запустить сервис по управлению умным домом?

  3. Как установить Proxmox?