Продолжение эпопеи с голосовым управлением


В предыдущей части через Алису голосом управляли контроллерами MiLight. Но такие контроллеры стоят совсем не в каждом доме, что сильно ограничивает наши возможности. Поэтому я задался целью расширить голосовое управление на обычные лампы, светильники, люстры и так далее, но с минимальной переделкой стандартной системы освещения. Все что будет нужно для такой системы — это замена обычных выключателей на смарт-выключатели, работающие по протоколу ZigBee и установка USB ZigBee-координатора СС2531. Естественно, из предыдущей статьи у нас уже есть умная колонка Яндекса и настроенный распбери.

По затратам CC2531 обошелся рублей в 250, программатор для него CC-Debugger Texas Instrument — 500 руб. Дороже всего обошлись сенсорные смарт-выключатели Livolo VL-C701Z-11 — около 2000 руб за штуку, а чуть позже добавился кнопочный выключатель Aqara Wall Switch Zigbee тоже около 2000.

Изначально я планировал управлять выключателями через фирменный ZigBee шлюз-маршрутизатор Livolo C700ZW-12, подключить его к опенхабу и рулить с помощью Алисы через yandex2mqtt. Подключил железки к электричеству, настроил приложение от Livolo на телефоне. Шлюз выключатели увидел, соединился и с телефона все прекрасно работало. Но опенхаб с маршрутизатором срастить не удалось из-за отсутствия необходимого функционала в опенхабе.

Пришлось отказаться от шлюза и сращивать выключатели напрямую с донглом CC2531. И вот в этом помог проект zigbee2mqtt от товарища Koenkk. В результате удалось соединиться ZigBee-координатором со смарт-выключателями, проверить сначала их работу через запросы в mqtt-топик на распбери, а потом и настроить управление с помощью Алисы.

Итак, как происходила настройка:

1. Прошиваем сниффер CC2531 прошивкой координатора и втыкаем его в юсб-порт распбери. Для того, чтобы не было сообщений о нехватке питания, распбери лучше подключать к 5В источнику питания не меньше 2А. Проверяем, что стик в системе правильно определился: ls -l /dev/serial/by-id покажет что-то вроде usb-Texas_Instruments_TI_CC2531_USB_CDC___0X00124B0458ED3DDF-if00 -> ../../ttyACM0. Наличие последнего куска вывода "-> ../../ttyACM0" очень важно если что. Стик может определиться и без этой части и работать ничего не будет. Мне при такой проблеме помогла перепрошивка стика.

2. Устанавливаем Zigbee2mqtt, но не запускаем.

3. Здесь важно правильно настроить /opt/zigbee2mqtt/data/configuration.yaml. Дело в том, что смарт-выключатели Livolo работают на 26-м канале, поэтому этот канал нужно явно задать в файле. И еще важно обратить внимание на количество пробелов в начале строк файла. Для проверки синтаксиса конфигурационного файла можно использовать YAML-валидатор.

4. После того, как конфигурационный файл прописан правильно и донгл воткнут, запускаем zigbee2mqtt. Потом топаем к выключателям, запускаем сопряжение и смотрим на вывод консоли. Появятся строки обмена данными, взаимные расшаркивания между устройствами и наконец что-то вроде этого: MQTT publish: topic 'zigbee2mqtt/0x001*********a8c9', payload '{"state_left":"OFF","state_right":"OFF","linkquality":60}'. Это значит, что выключатель подключен и прислал свой статус. Если запустить еще пару консолей, то можно через mqtt-топик поуправлять светом: выключить - mosquitto_pub -d -h localhost -t zigbee2mqtt/0x001*********a8c9/left/set -m OFF -u a**** -P ***** и включить — mosquitto_pub -d -h localhost -t zigbee2mqtt/0x001*********a8c9/left/set -m ON -u a**** -P *****, а также можно проконтролировать команды в топике: mosquitto_sub -d -h localhost -t zigbee2mqtt/0x001*********a8c9/left/set -u a**** -P *****. Кстати, для Livolo и Aqara топики различаются не только идентификаторами 0x0..., но и структурой. Структуру топиков для поддерживаемых устройств можно посмотреть тут.

5. После того, как проверили, что мы можем управлять устройствами через mqtt, будем сопрягать все с Яндексом. Здесь появился некоторый нюанс. Команды для управления устройствами через zigbee2mqtt в топики приходили в виде ON/OFF, а yandex2mqtt как оказалось выдает 1/0. Решением этой неувязочки была правка в yandex2mqtt файла /mnt/data/root/yandex2mqtt/device.js. Нужно в switch в кейсе «on» заменить значения int = val? на 'on': 'off' вместо '1': '0'. Естественно, пришлось команды переключения также поправить в опенхабе в соответствующих топиках. Без этого свет на Milight перестал бы работать. И самое интересное выявилось тут же — так как yandex2mqtt и zigbee2mqtt публикуют все на локальный сервер mqtt, то для управления устройствами zigbee оказался вроде и не нужен опенхаб. Связка работает напрямую — yandex(Алиса)-yandex2mqtt-mqtt-zigbee2mqtt-устройство zigbee. Даже неожиданно как-то. Но продолжим. Топик управления устройством запиливаем в конфигурационный файл /mnt/data/root/yandex2mqtt/config.js в новое виртуальное устройство, обновляем список устройств в системе диалогов яндекса и можно пинать Алису, чтобы включила лампочку.

6. Также удалось подключить к системе пару датчиков Xiaomi, датчик протечки и датчик температуры/влажности/давления. Работают на батарейках 2032. Они естественно не управляются, а просто периодически в топики скидывают информацию типа #033[32mzigbee2mqtt:info #033[39m 2020-05-04 21:12:21: MQTT publish: topic 'zigbee2mqtt/0x0015************', payload '{"battery":91,"voltage":2985,"temperature":26.2,"humidity":28.65,"pressure":1006.9,"linkquality":52}' - это датчик #всегочтоестьнасвете или #033[32mzigbee2mqtt:info #033[39m 2020-05-04 21:21:07: MQTT publish: topic 'zigbee2mqtt/0x001************7', payload '{"battery":100,"voltage":3025,"linkquality":0,"water_leak":true}' — датчик протечки в стакане с водой. Пока никакой особой пользы нет, но если все это отпарсить и сделать что-то реагирующее типа отправки смс или циферок в какую-нибудь вебморду, то будет очень хорошо.

И немного видео: