Я ни разу не параноик и никогда не переживал, что мой аккаунт в соцсети взломают злодеи и прочтут всю ту ахинею, которую я пишу друзьям. Но подключение «мозгов» умного дома к облаку, будь то китайское или американское, да хоть русское- это выше моего пофигизма. С другой стороны, сейчас на рынке много доступных предложений по автоматизации, которые достойны внимания, но работают через облака. К примеру, Xiaomi.
В этой статье я покажу, как организовать работу в локальной сети устройств Zigbee от разных производителей без подключения к непонятным облакам
Начинаем, как всегда, с постановки задачи: устройства Zigbee должны работать с Home Assistant локально без доступа к облаку производителя.
Изначально важно понимать, что все производители используют единый стандарт беспроводной передачи данных, поэтому устройство одного производителя может спокойно подключаться к сети Zigbee и обмениваться данными с другими устройствами разных производителей. Все ограничения, как правило, прописываются в шлюзах, приложениях и облаках — тут уж кто на что горазд. Поэтому задача сводится к созданию своего zigbee шлюза.
Для Zigbee-устройств используется в основном 3 вида чипов компании TI (есть и другие, но эти наиболее популярны):
cc2530 — дешевый и проверенный чип с 8Кб памяти
cc2531 — такой же дешевый и проверенный чип с 8Кб памяти, но имеющий контроллер USB на борту
cc2538 — с процессором Cortex-M3 и 32Кб памяти
В целом семейство чипов cc253x привлекательно своей низкой ценой. Поэтому большинство китайских устройств сделано именно на них.
Плавно мы подошли к тому, что можно сделать устройство с чипом cc253x и с помощью него слушать/ посылать в эфир команды по протоколу zigbee. И такие устройства, конечно, есть. Самый популярный вариант Zigbee-стика с подключением в USB порт реализован на чипе cc2531. Его преимущество в том что он продается в готовом для эксплуатации виде (нужно только прошить прошивку). Выглядит так:
Стоит такой стик порядка 350 рублей (без доставки) Ссылка на Aliexpress
Следующий шаг — объяснить чипу, что в этой жизни он будет шлюзом сети Zigbee, другими словами прошить устройство с помощью программатора CC Debugger. Выглядит он так:
Стоит такой порядка 370 рублей (без доставки) Ссылка на Aliexpress
Прошивка zigbee стика
Прошивать будем прошивку с популярного проекта zigbee2mqtt.io Суть заключается в том, что стик, являясь координатором сети Zigbee будет пересылать сообщения из zigbee сети в MQTT и обратно. Стик поддерживает работу одновременно до 25 конечных устройств. Для бОльшего количества потребуется устройство с ролью ретранслятор. Как правило, это устройство, включающееся в розетку.
На момент написания статьи поддерживается 785 устройств от 140 различных производителей! Ссылка на страницу с перечнем устройств
Процесс прошивки (на ОС Windows):
— Скачиваем с сайта TI программное обеспечение SmartRF Flash programmer (НЕ v2). Предварительно попросят зарегистрировать бесплатный аккаунт
— Устанавливаем CC debugger driver
— Соединяем CC debugger —> Downloader cable CC2531 —> CC2531 USB стик
— Вставляем CC2531 USB стик в порт компьютера
— Вставляем CC debugger в порт компьютера
— Если лампочка на CC debugger горит красным — нажмите кнопку reset. Лампочка должна гореть зеленым.
— Скачиваем прошивку CC2531_coordinator_firmware
— Запускаем SmartRF Flash Programmer, устанавливаем настройки, как на картинке и нажимаем «Perform actions». Проверьте, что файл выбран с расширением .hex!
Поздравляю, с железной частью мы закончили.
Настраиваем сервер MQTT.
Если он у вас настроен, то это шаг можно пропустить. Я использую аддон hassio, который называется Mosquitto broker. Для его установки переходим на вкладку Supervisor на закладку ADD-ON STORE и выбираем этот аддон из списка
Настройки брокера описаны на вкладке Documenation. В целом mqtt будет вполне корректно работать с дефолтовыми настройками. После настройки необходимо запустить аддон. Если в логах нет ошибок, то переходим в Настройки -> Люди -> Пользователи (Configuration -> Users) и создаем нового пользователя mqtt.
Переходим в Настройки -> Интеграции (Configuration -> Integrations), выбираем интеграцию MQTT и ставим галочку «Добавлять новые объекты». Это включит автоматическое добавление mqtt устройств в Home Assistant Подробнее тут
Устанавливаем и настраиваем Zigbee2mqtt
Для этого подключаем стик к серверу умного дома Home Assistant. Я использую версию Hassio на Raspberry PI3
Устанавливаем аддон zigbee2mqtt GitHub. Для этого переходим на вкладку Supervisor на закладку ADD-ON STORE и добавляем новый репозиторий github.com/danielwelch/hassio-zigbee2mqtt и устанавливаем аддон
Для корректной работы аддона необходимо определить путь к нашему свистку. Заходим в закладку System и нажимаем кнопку Hardware. У меня он находится по адресу /dev/ttyACM1. Предварительно настоятельно советую отключить остальные устройства из usb для чистоты эксперимента.
Теперь необходимо настроить аддон zigbee2mqtt. Для этого переходим на вкладку Configuration аддона. Я настраивал секции mqtt (подключение к серверу mqtt) и serial (путь к стику).
data_path: /share/zigbee2mqtt
devices: devices.yaml
groups: groups.yaml
homeassistant: true
permit_join: false
mqtt:
base_topic: zigbee2mqtt
server: 'mqtt://ip:1883'
user: mqtt_user
password: mqtt_pass
serial:
port: /dev/ttyACM1
advanced:
pan_id: 6754
channel: 11
network_key:
- 1
- 3
- 5
- 7
- 9
- 11
- 13
- 15
- 0
- 2
- 4
- 6
- 8
- 10
- 12
- 13
availability_blacklist: []
ban: []
whitelist: []
queue: {}
socat:
enabled: false
master: 'pty,raw,echo=0,link=/dev/ttyZ2M,mode=777'
slave: 'tcp-listen:8485,keepalive,nodelay,reuseaddr,keepidle=1,keepintvl=1,keepcnt=5'
restartdelay: 1
initialdelay: 1
options: '-d -d'
log: false
Запускаем аддон и переходим на вкладку Log. Проверяем, что аддон запускается без ошибок
Создаем объекты в Home assistant для подключения устройств Zigbee. В файле Configuration.yaml добавляем код
#--------------------------------------------------------Объекты
input_boolean:
zigbee_permit_join:
name: Allow devices to join
initial: off
icon: mdi:cellphone-wireless
timer:
zigbee_permit_join:
name: Time remaining
duration: 600 # Updated this to the number of seconds you wish
#-----------------------------------------------------Датчики
sensor:
#----------------------------------------------Состояние моста MQTT-ZigBee
- platform: mqtt
name: Bridge state
state_topic: "zigbee2mqtt/bridge/state"
icon: mdi:router-wireless
В файл automations.yaml добавляем код
#---------------------------------------------------Автоматизация
automation:
- id: enable_zigbee_join
alias: Enable Zigbee joining
hide_entity: true
trigger:
- platform: state
entity_id: input_boolean.zigbee_permit_join
to: 'on'
action:
- service: mqtt.publish
data:
topic: zigbee2mqtt/bridge/config/permit_join
payload: 'true'
- service: timer.start
data:
entity_id: timer.zigbee_permit_join
- id: disable_zigbee_join
alias: Disable Zigbee joining
trigger:
- entity_id: input_boolean.zigbee_permit_join
platform: state
to: 'off'
action:
- service: mqtt.publish
data:
payload: 'false'
topic: zigbee2mqtt/bridge/config/permit_join
- service: timer.cancel
data:
entity_id: timer.zigbee_permit_join
hide_entity: true
- id: disable_zigbee_join_timer
alias: Disable Zigbee joining by timer
hide_entity: true
trigger:
- platform: event
event_type: timer.finished
event_data:
entity_id: timer.zigbee_permit_join
action:
- service: mqtt.publish
data:
topic: zigbee2mqtt/bridge/config/permit_join
payload: 'false'
- service: input_boolean.turn_off
data:
entity_id: input_boolean.zigbee_permit_join
Добавляем на основной экран (Lovelace) объекты " Allow devices to join ", Time remaining, и Bridge state.
Теперь для запуска режима подключения нового устройства достаточно перевести переключатель Allow devices to join в положение «Включено»
Подключение устройств Zigbee к шлюзу cc2531
Сделаем подключение на примере Xiaomi Aqara Window Door Sensor
— Включаем Allow devices to join в Home Assistant. Шлюз включит режим сопряжения устройств на 10 минут
— Открываем лог аддона ZigBee2MQTT
— Нажимаем кнопку сопряжения на Aqara Window Door Sensor где-то на 3 сек. Синий огонек начнет мигать.
— Ждем появления записей об подключении в логе аддона ZigBee2MQTT
В итоге у вас появляется устройство binary_sensor.<номер>_contact
В интерфейсе у меня датчик контролирует открытие окна. Выглядит следующим образом:
Аналогично подключаются и другие устройства Zigbee, указанные в списке поддерживаемых устройств
В итоге, решение поддерживает локальное подключение zigbee устройств от порядка 140 производителей без подключения к интернету и не подконтрольным облакам.
В заключение нельзя не упомянуть об еще одной возможности интеграции Zigbee устройств в Home Assistant — ZHA. Это библиотека Python с открытым исходным кодом, реализующая стек Zigbee. На момент написания статьи библиотека поддерживает семейство стиков CC253х экспериментальном режиме. К достоинству этого решения можно отнести отсутствие моста zigbee-mqtt, но, судя по отзывам на форумам, решение еще относительно сырое. Планирую его попробовать на тестовом стенде.