Stupid House

CC2531 + ZigBee2MQTT, отказываемся от шлюзов производителей


Для подключения ZigBee устройств и датчиков необходим шлюз, который обеспечит взаимодействие между ними. Зачастую каждый производитель выпускает шлюзы поддерживающие только устройства своей экосистемы. Не все шлюзы возможно подключить к альтернативным системам управления и не все, подключенные через шлюз устройства, могут поддерживаться, бывает, что у устройств ограничен функционал. Решить подобные проблемы и объединить наши устройства поможет USB координатор CC2531 стоимостью 5$. Заказать можно на одной известной торговой китайской торговой площадке, устройства предлагаются в двух вариантах, со встроенной и внешней подключаемой антенной, предпочтительнее второй вариант, т.к. при недостаточном уровне сигнала можно заменить антенну на более мощную.

Для подключения устройств необходимы:

  • USB координатор CC2531.
  • Компьютер для подключения координатора и установки необходимого программного обеспечения, для этих целей прекрасно подходит Raspberry Pi.
  • Программное обеспечение ZigBee2MQTT.
  • Программное обеспечение для работы протокола MQTT (так называемый MQTT брокер), например, Mosquitto.

Преимущества данного подключения устройств:

  • Датчики и устройства можно подключить к альтернативным системам, таким как Home Assistant, не имея шлюза производителя.
  • Обширный список устройств разных производителей. Полный список поддерживаемых устройств.
  • Можно использовать гибридную систему, часть устройств подключены к шлюзу производителя, часть напрямую к СС2531.
  • Некоторые устройства имеют функции, которых нет при подключении к шлюзу своей экосистемы.

Схема подключения будет выглядеть следующим образом:

zigbee cc2531 schema

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

 

Прошивка CC2531

Изначально устройство пустое, на ней не прошито никакого управляющего программного обеспечения, поэтому первым делом необходимо залить на устройство прошивку. Прошить устройство можно несколькими способами:

  • При помощи CC Debugger, покупается на той же площадке где и плата, стоит как два устройства CC2531. Можно поискать у знакомых, которые уже купили данное устройство. Минус, то что оно нужно всего на один-два раза, прошить/обновить плату и.... возможно прошить еще одну, которая будет выступать как роутер. Необходим Debug кабель, покупается там же вместе с CC Debugger'ом или отдельно.
  • Прошить с помощью Paspberry Pi. [Инструкция]

Ниже описан первый вариант для Windows. Оригинал был описан на сайте ZigBee2MQTT. UPD.: на 10.11.2020 страница перенесена, но в общем списке ссылка на нее отсутствует.

Скачиваем и устанавливаем программу SmartRF Flash Programmer, необходимо зарегистрироваться на сайте, после чего будет доступна ссылка на скачивание. Будьте внимательны! SmartRF Flash Programmer v2 не подходит!!! [Зеркало]

Скачиваем и устанавливаем драйвер для CC Debugger, подключите CC Debugger к USB порту, в диспетчере устройств убедитесь, что драйвер установился корректно и устройство определилось. При возникновении проблем установите драйвер вручную. Отключите CC Debugger. [Зеркало]

Подключить СС2531 к CC Debugger'у при помощи Debug кабеля. Подключить оба устройства (CC2531 и CC Debugger) к USB портам компьютера. Если индикатор на CC Debugger светит красным, то нажать кнопку Reset на CC Debugger, индикатор должен загореться зеленым цветом.

CC2531 прошивка CC Debugger connect

Скачиваем и распаковываем прошивку для CC2531. Прошивки есть для ZigBee версии 1.2 и 3. Для версии 1.2 есть два вида прошивок Default и Source Routing, автор комментирует так:

  • Если в ZigBee сети до 30 устройств, то рекомендуется версия Default.
  • Если в ZigBee сети более 30 устройств, то рекомендуется версия Source Routing. Данная прошивка поддерживает только 5 прямых подключений к координатору, остальные устройства подключаются через роутеры. Роутером в ZigBee сети обычно выступает любое устройство, подключенное к постоянному питанию, розетки, выключатели, светильники, но выключатели Xiaomi без нулевой линии не являются роутерами. Так же в качестве роутера можно использовать другое устройства CC2531 или CC2530, но прошитые специальной прошивкой.

Запускаем SmartRF Flash Programmer и выбираем:

  • What do you want to program: Program CCxxxx SoC or MSP430
  • Во вкладке Sisten-on-Chip выбираем CC2531
  • Interface: Fast
  • Flash Image File выбираем файл прошивки с расширением *.hex.
  • Location: Primary
  • Actions: Erace, program and verify

Нажимаем Perfom actions, ждем окончания прошивки модуля.

cc2531 flash programmer

Отключаем модуль от компьютера и CC Debugger'а.

 

Установка MQTT брокера Mosquitto

Дальнейшие инструкции описывают установку программного обеспечения на Ubuntu и другие системы на базе Debian, в том числе Raspberry Pi OS.

Выполняем:

$ sudo apt-get install mosquitto

В файле /etc/mosquitto/mosquitto.conf должно быть следующее:

pid_file /var/run/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log

include_dir /etc/mosquitto/conf.d

Создадим файл default.conf для внесения своих настроек:

$ sudo touch /etc/mosquitto/conf.d/default.conf

Для установки пароля в файл /etc/mosquitto/conf.d/default.conf внесем следующее:

allow_anonymous false
password_file /etc/mosquitto/passwd

Создаем нового пользователя usermosquitto с паролем passmosquitto для подключения к Mosquitto:

$ sudo mosquitto_passwd -c /etc/mosquitto/passwd usermosquitto

Вводим пароль для нового пользователя и перезапускаем сервис Mosquitto:

$ sudo systemctl restart mosquitto

 

Установка ZigBee2MQTT

Подключаем CC2531 координатор к компьютеру, работающему 24/7, самый распространенный вариант это Raspberry Pi где крутится сервис автоматизации, но на самом деле это могут быть разные компьютеры, первый MQTT брокером, второй с сервисом ZigBee2MQTT, третий с сервисом автоматизации :) Но обычно это один компьютер.

Проверяем подключение устройства в системе:

$ ls -l /dev/serial/by-id
total 0
lrwxrwxrwx 1 root root 13 Jul 18 10:56 usb-Texas_Instruments_TI_CC2531_USB_CDC___0X00124B0014D47D15-if00 -> ../../ttyACM0

Как видно из ответа, наше устройство обнаружилось как ttyACM0, проверяем:

$ ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 Jul 22 22:43 /dev/ttyACM0

Устанавливаем репозиторий Node.js:

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

Устанавливаем Node.js:

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

Проверяем версии Node.js и npm:

$ node --version
v12.18.2

$ npm --version
6.14.5

Версия Node.js должна быть 10.x или 12.x, npm - 6.x

Делаем клон репозитория ZigBee2MQTT:

$ sudo git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt

Устанавливаем права:

$ sudo chown -R user:group /opt/zigbee2mqtt

где user - пользователь, под которым будет работать сервис, group - группа имеющая доступ к папке. Для Raspberry Pi это обычно pi:pi. Пользователь должен входить в группу dialout.

Установка зависимостей:

$ cd /opt/zigbee2mqtt
$ npm ci

При корректной установке в ответ будет выведено сообщение вида:

node-pre-gyp info ok
added 752 packages in 121.57s

Предупреждающие сообщения Warning игнорируем.

Редактируем файл настроек /opt/zigbee2mqtt/data/configuration.yaml:

homeassistant: true
permit_join: false
mqtt:
  base_topic: zigbee2mqtt
  server: 'mqtt://localhost'
  user: usermosquitto
  password: passmosquitto
serial:
  port: /dev/ttyACM0
advanced:
  network_key: GENERATE

homeassistant: true - если вы собираетесь используете интеграцию с Home Assistant.
permit_join: false - подключение новых устройств. Для подключения новых устройств необходимо выставить в true, рекомендуемое значение false во избежании подключения случайных устройств.
server: 'mqtt://localhost' - адрес сервера MQTT. Если это тоже самое устройство, то оставляем localhost.
user: usermosquitto - пользователь с доступом к MQTT серверу.
password: passmosquitto - Пароль пользователя MQTT сервера.
port: /dev/ttyACM0 - устройсво CC2531 в системе.
network_key: GENERATE - ключ безопасности сети ZigBee. GENERATE - при старте будет сгенерирован новый ключ, можно задать вручную: network_key: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5]

Первый запуск:

$ cd /opt/zigbee2mqtt
$ npm start

При правильной настройке будет сообщение вида:

zigbee2mqtt:info: Connecting to MQTT server at mqtt://localhost
zigbee2mqtt:info: Connected to MQTT server

Останавливаем программу Ctrl+C.

Создаем файл для запуска сервиса при старте системы.

$ sudo nano /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

User=pi - Пользователь, с правами которого запускается сервис. Для Raspberry Pi это обычно пользователь pi.

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

$ sudo systemctl enable zigbee2mqtt.service
$ sudo systemctl start zigbee2mqtt.service

 

Обновление ZigBee2MQTT

Останавливаем сервис:

$ sudo systemctl stop zigbee2mqtt.service

Делаем резервную копию данных:

$ cd /opt/zigbee2mqtt
$ cp -R data data-backup

Запуск обновления:

$ git checkout HEAD -- npm-shrinkwrap.json
$ git pull
$ npm ci

Восстановление данных и запуск сервиса:

$ cp -R data-backup/* data
$ rm -rf data-backup
$ sudo systemctl start zigbee2mqtt

 

Подключение устройств

Для подключения устройств в файле /opt/zigbee2mqtt/data/configuration.yaml надо установить permit_join: true и перезагрузить сервис.

Перед подключением необходимо проверить, что подключаемое устройство находится в списке поддерживаемых устройств. Для перевода подключаемого устройства в режим спаривания необходимо обратиться к инструкции производителя.

После подключения всех устройств для повышения безопасности и избежании случайного подключения других устройств в файле /opt/zigbee2mqtt/data/configuration.yaml необходимо установить permit_join: false после чего перезагрузить сервис.

 

Выявленные проблемы

На Ubuntu было лень создавать отдельного пользователя для работы сервиса и программа запускалась от пользователя homeassistant вместе с самим Home Assistant. После нескольких минут работы у Home Assistant отваливалась связь со шлюзами и светильниками Xiaomi. После создания в системе отдельного пользователя и настройки запуска от его имени проблема ушла.

Автор: muxa, 18.07.2020
Войдите или зарегистрируйтесь, чтобы иметь возможность оставлять комментарии

Комментарии


Доброго времени, спасибо за статью :) Похоже на то, что для работы c Home Assistant свисток достаточно только прошить, а вместо установок-сборок в командной строке можно просто добавить дополнение для HA "Mosquitto broker". Так ли это?

Не понимаю о каких сборках идет речь. Схема взаимодействия свистка и HA показана на схеме в самом начале статьи. Свисток взаимодействует с ZigBee устройствами, приложение ZigBee2MQTT взаимодействует со свистком и шлет данные с него в MQTT брокер, HA читает данные из MQTT брокера и в обратном порядке.