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

вторник, 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

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

воскресенье, 6 февраля 2022 г.

Установка Mosquitto MQTT Broker

Продолжаем эксперименты с самопальным умным домом, до которого еще оччччень далеко. В этой статье был прошит Zigbee-сниффер. А в этой установлена Ubuntu Server 20.04 на Banana PI M5.

Теперь на очереди настройка брокера MQTT - Mosquitto MQTT Broker. Что такое Message Queuing Telemetry Transport (MQTT) можно почитать тут. Брокер собирает с сервера-издателя, в нашем случае это будет Zigbee2MQTT, данные с датчиков, точнее Zigbee2MQTT сам посылает их в заданный канал брокера. А программы-клиенты, в нашем случае это будет Home Assistant считывает из канала показания датчиков(и не только).

В настройке я шел по советам Стива, поэтому данный текст можно назвать переводом выжимки из его статьи. В оригинале рассматривается установка под разные ОС, изменение лимита открытых файлов (наверное, актуально для больших инсталляций, возможно, придется к этому вернуться), запуск нескольких экземпляров брокера.

Начнем. Нужно добавить репозиторий, из которого будет ставиться брокер:

pi@ubuntu:~$ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
pi@ubuntu:~$ sudo apt-get update
pi@ubuntu:~$ sudo apt-get install mosquitto mosquitto-clients

Mosquitto ставится как демон. Попробуем запустить его в интерактивном режиме. Останавливаем демон:
pi@ubuntu:~$ sudo systemctl stop mosquitto.service Запускаем Mosquitto из командной строки:

pi@ubuntu:~$ mosquitto -v
1644094311: mosquitto version 2.0.14 starting
1644094311: Using default config.
1644094311: Starting in local only mode. Connections will only be possible from clients running on this machine.
1644094311: Create a configuration file which defines a listener to allow remote access.
1644094311: For more details see https://mosquitto.org/documentation/authentication-methods/
1644094311: Opening ipv4 listen socket on port 1883.
1644094311: Opening ipv6 listen socket on port 1883.
1644094311: mosquitto version 2.0.14 running
1644094311: New connection from 127.0.0.1:48812 on port 1883.
1644094311: New client connected from 127.0.0.1:48812 as mqttjs_69852d1b (p2, c1, k60).
Видим, что он успешно занял порт 1883 для ipv4 и ipv6. Можно проверить
pi@ubuntu:~$ sudo netstat -tunlp |grep 1883
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      17896/mosquitto     
tcp6       0      0 :::1883                 :::*                    LISTEN      17896/mosquitto
Тут статья, как посмотреть открытые сетевые порты в Linux.

Останавливаем интерактивный экземпляр Mosquitto и запускаем обратно демон: pi@ubuntu:~$ sudo systemctl start mosquitto.service Проверяем, что демон запустился.

pi@ubuntu:~$ sudo systemctl status mosquitto.service 
● mosquitto.service - Mosquitto MQTT Broker
        Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
        Active: active (running) since Sat 2022-02-05 20:55:20 UTC; 25min ago
        Docs: man:mosquitto.conf(5)
                man:mosquitto(8)
    Process: 17885 ExecStartPre=/bin/mkdir -m 740 -p /var/log/mosquitto (code=exited, status=0/SUCCESS)
    Process: 17891 ExecStartPre=/bin/chown mosquitto /var/log/mosquitto (code=exited, status=0/SUCCESS)
    Process: 17894 ExecStartPre=/bin/mkdir -m 740 -p /run/mosquitto (code=exited, status=0/SUCCESS)
    Process: 17895 ExecStartPre=/bin/chown mosquitto /run/mosquitto (code=exited, status=0/SUCCESS)
    Main PID: 17896 (mosquitto)
        Tasks: 1 (limit: 3839)
        Memory: 1.0M
        CGroup: /system.slice/mosquitto.service
                └─17896 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Feb 05 20:55:20 ubuntu systemd[1]: Starting Mosquitto MQTT Broker...
Feb 05 20:55:20 ubuntu systemd[1]: Started Mosquitto MQTT Broker.
Отлично.

Теперь протестируем, что сообщения передаются от издеталя клиенту. Инструкции взяты тут. Потребуется 3 SSH-сессии. Одна будет издателем и две будут подписчиками. Итак, сессия №1. Подписываемся на канал testTopic:

pi@ubuntu:~$ mosquitto_sub -d -t testTopic
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending SUBSCRIBE (Mid: 1, Topic: testTopic, QoS: 0, Options: 0x00)
Client null received SUBACK
Subscribed (mid: 1): 0

Из второй сессии отправляем сообщение в канал testTopic

pi@ubuntu:~$ mosquitto_pub -d -t testTopic -m "Привет, Москва!"
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending PUBLISH (d0, q0, r0, m1, 'testTopic', ... (27 bytes))
Client null sending DISCONNECT

В первой сессии мы увидим наше сообщение:

Client null sending PINGREQ
Client null received PINGRESP
Client null received PUBLISH (d0, q0, r0, m0, 'testTopic', ... (27 bytes))
Привет, Москва!

В сессии №3 тоже подписываемся на канал testTopic:

pi@ubuntu:~$ mosquitto_sub -d -t testTopic
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending SUBSCRIBE (Mid: 1, Topic: testTopic, QoS: 0, Options: 0x00)
Client null received SUBACK
Subscribed (mid: 1): 0

Из второй сессии отправляем сообщение в канал testTopic

pi@ubuntu:~$ mosquitto_pub -d -t testTopic -m "И вам не хворать, коль не шутите"
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending PUBLISH (d0, q0, r0, m1, 'testTopic', ... (27 bytes))
Client null sending DISCONNECT

В первой и третьей сессиях должно появится ваше сообщение:

Client null received SUBACK
Subscribed (mid: 1): 0
Client null received PUBLISH (d0, q0, r0, m0, 'testTopic', ... (57 bytes))
И вам не хворать, коль не шутите

В файл конфигурации /etc/mosquitto/mosquitto.conf я добавил следующие строки:
pi@ubuntu:~$ sudo vim /etc/mosquitto/mosquitto.conf
listener 1883
allow_anonymous true

Следующая на очереди статья - настройка Zigbee2MQTT