Wiren Board 6: Подключение устройств ZigBee

Материал из Wiren Board


Аппаратная часть

Лицевая сторона модуля WBE2R-R-ZIGBEE
Обратная сторона модуля WBE2R-R-ZIGBEE
USB стик СС2531

Для работы контроллера с ZigBee устройствами необходимо подключить специальный модуль. Есть несколько вариантовː

USB-Serial Adaper CC2530
3V3 VCC
GND GND
TXD P02
RXD P03

Прошивка

С завода модуль WBE2R-R-ZIGBEE уже прошит оптимизированной для WB и SprutHub прошивкой. Однако если это необходимо, его можно перепрошить.

Для прошивки WBE2R-R-ZIGBEE или USB стика потребуется CC Debugger и загрузочный кабель. (Можно приобрести на Aliexpress.com) Перед прошивкой установите драйвер.

Подключите CC Debugger к WBE2R-R-ZIGBEE или к USB стику через загрузочный кабель. Подключите USB кабель CC Debugger(a) к компьютеру. Скачайте и установите приложение FLASH-PROGRAMMER ( обычную версию, не v2) c сайта TI. Устройство должно определиться в таблице. Укажите путь к файлу прошивки. В области "Actions" выберите "Erase, program and verify" и нажмите кнопку "Perform actions". Полезную информацию по прошивке вы так же можете найти на сайте zigbee2mqtt.

zigbee2mqtt

zigbee2mqtt - Это мост, позволяющий управлять Zigbee устройствами через MQTT. Работает на Node.js, позволяет легко интегрировать Zigbee устройства в различные системы автоматизации такие как Home Assistant, Node Red и тд. Вы найдете всю необходимую информацию на сайте zigbee2mqtt.

Установка

Настраиваем репозиторий Node JS

curl -sL https://deb.nodesource.com/setup_12.x | bash -

Устанавливаем необходимые компоненты

apt-get install -y nodejs git make g++ gcc

Копируем файлы из репозитория zigbee2mqtt

git clone https://github.com/Koenkk/zigbee2mqtt.git /mnt/data/root/zigbee2mqtt

Настраиваем права

chown -R root:root /mnt/data/root/zigbee2mqtt

Заходим в директорию и запускаем установку

cd /mnt/data/root/zigbee2mqtt
npm ci

В процессе установки будет показано несколько предупреждений. Их можно игнорировать.

Оригинальная инструкция по установке zigbee2mqtt на официальном сайте zigbee2mqtt.io

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

Откройте файл и скопируйте в него следующий текстː

[Unit]
Description=zigbee2mqtt
After=network.target

[Service]
ExecStart=/usr/bin/npm start
WorkingDirectory=/mnt/data/root/zigbee2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
User=root

[Install]
WantedBy=multi-user.target

И сохраните файл. После этого для активации сервиса следует ввести в консоль команду

systemctl enable zigbee2mqtt.service

Полную инструкцию можно найти на сайте zigbee2mqtt.

Конфигурация

После установки нужно настроить контроллер.

Если Вы используете модуль расширения WBE2R-R-ZIGBEE,то убедитесь, что правильно выставили модуль в Configs => Hardware Modules Configuration.

Далее зайдите в папку /mnt/data/root/zigbee2mqtt/data и отредактируйте файл configuration.yaml ː

homeassistant: false
permit_join: true
mqtt:
  base_topic: zigbee2mqtt
  server: 'mqtt://localhost'
serial:
  port: /dev/ttyMOD3
advanced:
  rtscts: false
  last_seen: epoch

Полное описание настроек можно найти на сайте zigbee2mqtt.

После изменения настроек введите команду

service zigbee2mqtt restart

Запуск

Для запуска, остановки и перезапуска сервиса используйте команды

service zigbee2mqtt start
service zigbee2mqtt stop
service zigbee2mqtt restart

Добавление устройств

Что бы добавить Zigbee устройство убедитесь, что в настройках моста включен параметр "permit_join" :

permit_join: true

Далее следуйте инструкции к устройству. В основном требуется зажать кнопку "pair" на несколько секунд и дождаться "мигания" светодиода. После этого устройство должно передать информацию о себе на контроллер. Иногда требуется дополнительно нажимать на кнопку каждую секунду, что бы устройство не "уснуло". После успешного добавления устройство автоматически появится во вкладке Devices.

Более подробная информация на сайте zigbee2mqtt.


Написание правил

Zigbee2mqtt имеет свою структуру топиков, не подходящую под MQTT конвенцию Wiren Board. На данный момент идет разработка конвертера, который будет пересылать данные из топиков zigbee2mqtt в подходящие под конвенцию топики.

Пока разработка не закончена есть несколько способов взаимодействия с добавленными в zigbee2mqtt устройствамиː

  • Использовать для автоматизации Node-Red
  • Cделать небольшое изменение в коде zigbee2mqtt, что бы получать данные в топики вида /devices/zigbee2mqtt/controls/../on

Про третий пункт подробнееː

  1. В файле /mnt/data/root/zigbee2mqtt/data/configuration.yaml параметр base_topic измените на /devices/zigbee2mqtt/controls как это показано на скриншоте ниже. Сохраните файл.
    /mnt/data/root/zigbee2mqtt/data/configuration.yaml
  2. В файле /mnt/data/root/zigbee2mqtt/lib/controller.js (311 строка) к параметру “resolvedEntity.name” добавьте + “/on”, как это показано на скриншоте ниже. Сохраните файл. (Это поможет получать данные от zigbee устройств в топики "/on")
    /mnt/data/root/zigbee2mqtt/lib/controller.js
  3. Перезапустите zigbee2mqtt командой service zigbee2mqtt restart


После этих действий данные будут приходить в топики /devices/zigbee2mqtt/controls/../on, где вместо ".." будет имя zigbee устройства. На пример "/devices/zigbee2mqtt/controls/0x00158d0002729348/on"

Но в веб интерфейсе данных до сих пор не видно. Для этого необходимо зайти в вкладку rules и в правилах создать виртуальный девайс с именем Вашего zigbee устройстваː

defineVirtualDevice("zigbee2mqtt", { //Указываем топик, который мы указали в configuration.yamlː  /devices/../controls
    title: "Zigbee Devices",
    cells: {
        '0x00158d0002729348': { //Указываем имя первого zigbee устройства
            type: "text",
            value: ""
        },
        '0x00158d0002389b55': {//Указываем имя второго zigbee устройства итд.
            type: "text",
            value: ""
        },
    }
});

После сохранения правила все данные приходящие от устройств будут видны в веб интерфейсе. Данные приходят в формате JSON и с ними уже можно работать в движке правил. На пример напишем правило - по двойному нажатию на zigbee кнопку с именем 0x00158d0002729348 изменяем состояние баззера контроллера.

defineRule("button_control", {
    whenChanged: "zigbee2mqtt/0x00158d0002729348",
    then: function(newValue, devName, cellName) {
        JSON.parse(newValue, function(k, v) { // Парсим Json. Переменная "k" - ключ, переменная "v" - значение.  
            if (k == 'click') {
                if (v == 'double') { // если значение ключа "click" равно "double"
                    dev["buzzer"]["enabled"] = !dev["buzzer"]["enabled"]; // изменяем значение баззера на противоположное.
                }
            }
        })
    }
});