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 топиков , не подходящую под 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 и в правилах создать виртуальный девайс с именем топика в который мы получаем данные (в нашем случае zigbee2mqtt) и с контролами для каждого zigbee устройства, что у Вас добавлено в zigbee2mqttː

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

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

// Правило: При двойном нажатии на zigbee кнопку переключаем левую кнопку zigbee выключателя
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" 
                    publish("/devices/zigbee2mqtt/controls/0x00158d0001f3fc34/set", JSON.stringify({ state_left: "TOGGLE" }), 2, false); // переключаем левую кнопку zigbee выключателя.
                }
            }
        })
    }
});

// Правило: Если влажность выше 50% - включаем правую кнопку zigbee выключателя (канальный вентилятор). Если ниже - выключаем. 
defineRule("temp_control", {
    whenChanged: "zigbee2mqtt/0x00158d0002389b55",
    then: function(newValue, devName, cellName) {
        JSON.parse(newValue, function(k, v) {
            if (k == 'humidity') {
                if (parseFloat(v) >= 50.0) {
                    publish("/devices/zigbee2mqtt/controls/0x00158d0001f3fc34/set", JSON.stringify({ state_right: "ON" }), 2, false);
                } else {
                    publish("/devices/zigbee2mqtt/controls/0x00158d0001f3fc34/set", JSON.stringify({ state_right: "OFF" }), 2, false);
                }
            }
        })
    }
});