Добавляем ZigBee устройства в Homebridge используя CC2531

от автора

На Хабре уже встречались статьи о том, как подружить ZigBee устройства различных производителей с системами управления умным домом, без использования фирменных хабов, вроде Xiaomi Gateway. Однако, инструкции для homebridge, я не нашел не только на Хабре, но и на других просторах интернета. Поэтому хочу поделиться опытом добавления ZigBee устройств в homebridge. Огромную благодарность надо выразить создателю ресурса zigbee2mqtt.io, там уже расписаны способы прошивки модема CC2531 и подключения к таким системам управления умным домом как Home Assistant, Domoticz и Majordomo. Статья рассчитана на пользователей, у которых уже установлен и настроен homebridge.


Все действия в статье будут проводиться со следующим набором оборудования:

  • Raspberry Pi 3 B+ (OS Raspbian)
  • CC2531 Dongle (Прошитый)
  • Устройства Xiaomi (wireless switch, temperature & humidity sensor…)
  • MacBook Pro (OSX 10.14)

Инструкции по прошивке CC2531 на русском языке есть тут (через Pi) и тут (через CCDebuger).

Схематично всю цепочку работы можно изобразить так:

Теперь по порядку.

После прошивки модема необходимо установить MQTT брокер (если еще не установлен).

Я использую Mosquitto, устанавливается так:

sudo apt install -y mosquitto mosquitto-clients #устанавка sudo services mosquitto start # запуск sudo systemctl enable mosquitto.service #автозапуск

Более подробную инструкцию по настройке можно посмотреть тут.

Теперь необходимо установить сервис zigbee2mqtt, который взаимодействует с модемом CC2531 и передает данные в Mosquitto:

sudo git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt sudo chown -R pi:pi /opt/zigbee2mqtt cd /opt/zigbee2mqtt npm install

Для того чтобы запускать zigbee2mqtt как сервис, необходимо создать файл:
/etc/systemd/system/zigbee2mqtt.service

со следующим содержимым:

[Unit] Description=zigbee2mqtt After=network.target  [Service] ExecStart=/usr/bin/npm start WorkingDirectory=/opt/zigbee2mqtt StandardOutput=inherit StandardError=inherit Restart=always User=pi  [Install] WantedBy=multi-user.target

Если у вас уже был установлен MQTT брокер то прописать правильные параметры подключения к нему нужно в файле:

/opt/zigbee2mqtt/data/configuration.yaml

Запускаем сервис и добавляем его в автозапуск:

sudo systemctl start zigbee2mqtt sudo systemctl enable zigbee2mqtt.service

Смотрим лог:

sudo journalctl -u zigbee2mqtt.service -f

Если все настроено правильно должны увидеть такие строки:

`permit_join` set to  `true` in configuration.yaml. Allowing new devices to join. Set `permit_join` to `false` once you joined all devices. Zigbee: allowing new devices to join. Connecting to MQTT server at mqtt://localhost zigbee-shepherd ready Connected to MQTT server

Можно приступать к интеграции с homebridge. На ресурсе zigbee2mqtt.io есть список поддерживаемых устройств и инструкции по созданию пары. Для примера рассмотрим добавление Xiaomi Wireless Switch.

Для просмотра событий в Mosquitto воспользуемся программой MQTT Explorer. Запускаем, вводим адрес MQTT сервера, в моем случае он расположен по адресу 192.168.1.104. Если все установлено правильно, то в дереве увидим ветку zigbee2mqtt. Переходим в нее. Теперь на Xiaomi Wireless Switch зажимаем кнопку Reset до появления мигания диода (около 5 секунд). Примерно через 10 секунд в ветке zigbee2mqtt мы увидим наше устройство и данные которое оно передает.

Если этого не происходит, то после появления мигания диода, попробуйте однократно нажимать Reset с периодичностью в секунду. Должно получиться так:

Разберем данные:

{   "linkquality":110,   "battery":100,   "voltage":3052,   "click":"single" }

Поле Click содержит тип нажатия, их может быть пять:
Click, double click, triple click, long, long_release

Данные получать научились, теперь добавим Xiaomi Wireless Switch в homebrdige. Для взаимодействия с MQTT воспользуемся модулем homebridge-mqttthing. Устанавливается так же, как и другие:

(sudo) npm install -g homebridge-mqttthing

Модуль поддерживает большое количество классов устройств начиная с выключателей и заканчивая термостатами. Для Xiaomi Wireless Switch больше всего подходит класс StatelessProgramableSwitch. Для добавления нужно знать Topic (0x00158d00022c85ea) и названия команд. Получается вот такой конфиг:

{        "accessory": "mqttthing",        "type": "statelessProgrammableSwitch",         "name": "Xiaomi Single Button",         "topics": {             "getSwitch": {                "topic": "zigbee2mqtt/0x00158d00022c85ea",                 "apply": "return JSON.parse(message).click;"             }         },         "switchValues": [             "single",             "double",              "long_release"         ] }

По аналогии я добавил:

датчик температуры и влажности, датчик касания, датчик присутствия и выключатель.

"accessories":  [     {         "accessory": "mqttthing",         "type": "occupancySensor",         "name": "Xiaomi Occupancy Sencor",         "topics": {             "getOccupancyDetected": {                 "topic": "zigbee2mqtt/0x00158d000236b492",                 "apply": "return JSON.parse(message).occupancy;"             }         },         "integerValue": true     },     {         "accessory": "mqttthing",         "type": "contactSensor",         "name": "Xiaomi Contatc Sencor",         "topics": {             "getContactSensorState": {                 "topic": "zigbee2mqtt/0x00158d000278db8c",                 "apply": "return !JSON.parse(message).contact;"             }         },         "integerValue": true     },     {         "accessory": "mqttthing",         "type": "statelessProgrammableSwitch",         "name": "Xiaomi Single Button",         "topics": {             "getSwitch": {                 "topic": "zigbee2mqtt/0x00158d00022c85ea",                 "apply": "return JSON.parse(message).click;"             }         },         "switchValues": [             "single",             "double",            "long_release"         ]     },     {         "accessory": "mqttthing",         "type": "temperatureSensor",         "name": "Xiaomi Temperature Sencor",         "topics": {             "getCurrentTemperature": {                 "topic": "zigbee2mqtt/0x00158d000201842c",                 "apply": "return parseFloat(JSON.parse(message).temperature);"             }         },         "history": true     },     {         "accessory": "mqttthing",         "type": "humiditySensor",         "name": "Xiaomi Humidity Sencor",         "topics": {             "getCurrentRelativeHumidity": {                 "topic": "zigbee2mqtt/0x00158d000201842c",                 "apply": "return parseFloat(JSON.parse(message).humidity);"             }         },         "history": true     } ]

Проверяем:

Раньше я использовал модуль homebridge-mi-aqara, который добавляет ZigBee устройства, взаимодействуя с Xiaomi Gateway. При отказе от Gateway уменьшилось время отклика устройств, вдобавок я избавился от устройства которое сидит на моем WiFi и постоянно лезет в интернет.


ссылка на оригинал статьи https://habr.com/ru/post/462459/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *