Если инфорация оказалась интересна и/или полезна, не побрезгуйте, оставьте комментарий ;)

вторник, 15 марта 2022 г.

Установка Zigbee2MQTT, интеграция с Mosquitto и с Home Assistant

Возвращаюсь к проекту с самопальным умным домом. Предыдущие серии

  1. Прошивка Zigbee-сниффера
  2. Установка Ubuntu Server 20.04 на Banana PI M5
  3. Установка Mosquitto MQTT Broker

Теперь ставим то, что свяжет наши датчики с шиной MQTT. Процесс установки и настройки оказался самым безпроблемным на данный момент. Просто надо всё сделать по инструкции с сайта. Поэтому тут краткий перевод с моим конфигом.

Что мне не нравится в Zigbee2MQTT, так это необходимость ставить NodeJS. Ресурсы одноплатников ограничены, а тут и дисковое пространство от души отъедается, и дополнительная нагрузка на процессор из-за прослойки фреймворка. Но, это некий стандарт де-факто, поэтому я не стал изобратать велосипед.

Ставим nodejs:
pi@ubuntu:~$ sudo apt-get install -y nodejs npm git make g++ gcc

Надо проверить, что node имеет одну из версий v10.X, v12.X, v14.X, v15.X or V16.X:
pi@ubuntu:~$node --version # Should output

Версия npm должна быть одна 6.X или 7.X:
pi@ubuntu:~$npm --version # Should output 6.X or 7.X

Если версии старые, нужно их удалить, а поставить свежие из другого репозитория: pi@ubuntu:~$ sudo apt-get purge nodejs
pi@ubuntu:~$ curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
pi@ubuntu:~$ sudo apt-get install -y nodejs npm
pi@ubuntu:~$ nodejs -v
pi@ubuntu:~$ npm --version

Если npm не последней версии, обновить его можно так:
pi@ubuntu:~$ npm install -g npm@latest

Клонируем репозиторий и перекладываем скаченное в /opt/zigbee2mqtt
pi@ubuntu:~$ git clone https://github.com/Koenkk/zigbee2mqtt.git
pi@ubuntu:~$ sudo mv zigbee2mqtt /opt/zigbee2mqtt

Устанавливаем зависимости из под пользователя pi (без sudo):
pi@ubuntu:~$ cd /opt/zigbee2mqtt
pi@ubuntu:~$ npm ci

Вывод будет следующим:
node-pre-gyp info ok
added 826 packages in 34.378s


Надо отредактировать файл настроек. Тут самое главное следить за отступами. YAML-файлы жутко капризные. Но вначале находим файл устройства нашего донгла Zigbee. Обычно, это ttyACM0
pi@ubuntu:~$ ls /dev/ |grep ttyACM

Открываем файл настроек /opt/zigbee2mqtt/data/configuration.yaml в любимом редакторе vim:
pi@ubuntu:~$ sudo vim /opt/zigbee2mqtt/data/configuration.yaml

Мой файл выглядит так:

homeassistant: true 
permit_join: true
mqtt:
    base_topic: zigbee2mqtt
    server: mqtt://localhost:1883
    keepalive: 60
    reject_unauthorized: false 
    version: 4
serial:
    port: /dev/ttyACM0
frontend:
    port: 8080
    host: 0.0.0.0
advanced:
    network_key: GENERATE
Параметр network_key: GENERATE позволит сгенерировать сетевой ключ для общения с датчиками. После запуска службы вместо GENERATE будет вектор ключа.

После этого проверяем, что приложение работает:

pi@ubuntu:~$ cd /opt/zigbee2mqtt
pi@ubuntu:~$ npm start
Zigbee2MQTT:info  2019-11-09T13:04:01: Logging to directory: '/opt/zigbee2mqtt/data/log/2019-11-09.14-04-01'
Zigbee2MQTT:info  2019-11-09T13:04:01: Starting Zigbee2MQTT version 1.6.0 (commit #720e393)
Zigbee2MQTT:info  2019-11-09T13:04:01: Starting zigbee-herdsman...
Zigbee2MQTT:info  2019-11-09T13:04:03: zigbee-herdsman started
Zigbee2MQTT:info  2019-11-09T13:04:03: Coordinator firmware version: '{"type":"zStack30x","meta":{"transportrev":2,"product":2,"majorrel":2,"minorrel":7,"maintrel":2,"revision":20190425}}'
Zigbee2MQTT:info  2019-11-09T13:04:03: Currently 0 devices are joined:
Zigbee2MQTT:warn  2019-11-09T13:04:03: `permit_join` set to  `true` in configuration.yaml.
Zigbee2MQTT:warn  2019-11-09T13:04:03: Allowing new devices to join.
Zigbee2MQTT:warn  2019-11-09T13:04:03: Set `permit_join` to `false` once you joined all devices.
Zigbee2MQTT:info  2019-11-09T13:04:03: Zigbee: allowing new devices to join.
Zigbee2MQTT:info  2019-11-09T13:04:03: Connecting to MQTT server at mqtt://localhost
Zigbee2MQTT:info  2019-11-09T13:04:03: Connected to MQTT server

Останавливаем с помощью CTRL+C

Если появляются ошибки доступа к Zigbee-устройству, то надо проверить, состоит ли ваш пользователь в группе dialout
pi@ubuntu:~$ id -Gn
pi adm cdrom sudo dip plugdev lpadmin sambashare

Если в списке такой группы нет, то надо пользователя в эту группу добавить pi@ubuntu:~$ sudo adduser pi dialout

Следующий шаг - настроить запуск в качестве демона. Для этого создаем и редактируем /etc/systemd/system/zigbee2mqtt.service pi@ubuntu:~$ sudo vim /etc/systemd/system/zigbee2mqtt.service

Содержание файла:

[Unit]
Description=zigbee2mqtt
After=network.target

[Service]
ExecStart=/usr/bin/npm start
WorkingDirectory=/opt/zigbee2mqtt
StandardOutput=null
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

Запускаем демон и проверяем его статус (выход из статуса - клавиша Q):

pi@ubuntu:~$ sudo systemctl start zigbee2mqtt
sudo systemctl enable zigbee2mqtt.service
pi@ubuntu:~$ sudo systemctl status zigbee2mqtt
● zigbee2mqtt.service - zigbee2mqtt
     Loaded: loaded (/etc/systemd/system/zigbee2mqtt.service; enabled; vendor p>
     Active: active (running) since Sat 2022-02-05 01:25:41 UTC; 1 months 7 day>
   Main PID: 16653 (npm)
      Tasks: 23 (limit: 3839)
     Memory: 101.7M
     CGroup: /system.slice/zigbee2mqtt.service
             ├─16653 npm
             ├─16664 sh -c node index.js
             └─16665 node index.js

Feb 05 01:25:41 ubuntu systemd[1]: Started zigbee2mqtt.
lines 1-12/12 (END)

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

pi@ubuntu:~$ cd /opt/zigbee2mqtt/
pi@ubuntu:/opt/zigbee2mqtt$ sudo systemctl stop zigbee2mqtt
pi@ubuntu:/opt/zigbee2mqtt$ cp -R data data-backup
pi@ubuntu:/opt/zigbee2mqtt$ git checkout HEAD -- npm-shrinkwrap.json
pi@ubuntu:/opt/zigbee2mqtt$ git pull 
remote: Enumerating objects: 348, done.
remote: Counting objects: 100% (304/304), done.
remote: Compressing objects: 100% (105/105), done.
remote: Total 348 (delta 256), reused 211 (delta 199), pack-reused 44
Receiving objects: 100% (348/348), 2.75 MiB | 6.70 MiB/s, done.
Resolving deltas: 100% (256/256), completed with 32 local objects.
From https://github.com/Koenkk/zigbee2mqtt
    6ea61bae..7a2ddf24  master     -> origin/master
    8357da27..83f82503  dev        -> origin/dev
    * [new tag]           1.24.0     -> 1.24.0
Updating 6ea61bae..7a2ddf24
Fast-forward
    lib/controller.ts                      |    1 +
    lib/eventBus.ts                        |    7 +
    lib/extension/availability.ts          |    9 +-
    lib/extension/bridge.ts                |    4 +-
    lib/extension/homeassistant.ts         |   26 +-
    lib/model/device.ts                    |    6 +-
    lib/model/group.ts                     |    2 +-
    lib/mqtt.ts                            |   13 +-
    lib/types/types.d.ts                   |    3 +
    lib/util/settings.schema.json          |    7 +
    lib/util/settings.ts                   |    3 +-
    lib/util/utils.ts                      |    6 +-
    npm-shrinkwrap.json                    | 4269 +++++++++++++++++---------------
    package.json                           |   41 +-
    scripts/generateNewSupportedDevices.js |    1 +
    test/availability.test.js              |   21 +
    test/bridge.test.js                    |   22 +-
    test/homeassistant.test.js             |   94 +-
    test/receive.test.js                   |   36 -
    test/stub/data.js                      |    3 +-
    20 files changed, 2433 insertions(+), 2141 deletions(-)

Запускаем установщик:
pi@ubuntu:~$ npm ci

В конце длинного вывода видим что-то вроде:
added 978 packages in 102.92s

Возвращаем файлы настройки обратно и удаляем каталог с копией
pi@ubuntu:~$ cp -R data-backup/* data
pi@ubuntu:~$ rm -rf data-backup

Запускаем демон

pi@ubuntu:/opt/zigbee2mqtt$ sudo systemctl start zigbee2mqtt
pi@ubuntu:/opt/zigbee2mqtt$ sudo systemctl status zigbee2mqtt
● zigbee2mqtt.service - zigbee2mqtt
        Loaded: loaded (/etc/systemd/system/zigbee2mqtt.service; enabled; vendor p>
        Active: active (running) since Mon 2022-03-14 22:22:27 UTC; 45s ago
    Main PID: 72582 (npm)
        Tasks: 39 (limit: 3839)
        Memory: 287.5M
        CGroup: /system.slice/zigbee2mqtt.service
                ├─72582 npm
                ├─72599 sh -c node index.js
                ├─72600 node index.js
                ├─72611 /bin/sh -c npm run build
                ├─72612 npm
                ├─72623 sh -c tsc && node index.js writehash
                └─72624 node /opt/zigbee2mqtt/node_modules/.bin/tsc

Mar 14 22:22:27 ubuntu systemd[1]: Started zigbee2mqtt.

На этом с Zigbee2MQTT всё. Осталось поставить и настроить Home Assistant.

Дополнение:

Если вы проводите опыты на виртуальной машине, то нужно наше Zigbee-устройство прокинуть в эту виртуальную машину. Для этого надо выяснить адрес устройства (на хосте). Например, на моей машине (не Banana PI):

evgeniy@micro-gen10plus:~$ lsusb
Bus 001 Device 002: ID 03f0:2927 HP, Inc Virtual NIC
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 005: ID 0424:2660 Microchip Technology, Inc. (formerly SMSC) Hub
Bus 002 Device 004: ID 258a:002a SINO WEALTH Gaming KB
Bus 002 Device 003: ID 0bda:b812 Realtek Semiconductor Corp. RTL88x2bu [AC1200 Techkey]
Bus 002 Device 002: ID 0451:16a8 Texas Instruments, Inc. CC2531 ZigBee
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Нужная нам строка "Bus 002 Device 002: ID 0451:16a8 Texas Instruments, Inc. CC2531 ZigBee". Идентификаторы можно представить еще в таком виде:

evgeniy@micro-gen10plus:~$ lsusb -s 2:2 -v | grep "id"
Couldn't open device, some information will be missing
  idVendor           0x0451 Texas Instruments, Inc.
  idProduct          0x16a8 CC2531 ZigBee
где 2:2 - номер шины (Bus) и устройства (Device) в выводе предыдущей команды

Создаем XML-файл, например, в пользовательской директории.
evim ~/zigbee.xml

с таким содержимым:

<hostdev mode='subsystem' type='usb' managed='yes'> <source> <vendor id='0x0451'/> <product id='0x16a8'/> </source> </hostdev>

После этого командой добавляем подготовленный XML-код в файл настройки виртуальной машины. Имя машины в моем примере -
virsh attach-device U1804-HA-vm1 ~/zigbee.xml --persistent

Это решение нашел тут.

Комментариев нет: