Пролог
Данная статья рассказывает о том как пробросить шторы Xiaomi Aqara B1 - Intelligent Curtain Motor (ZNCLDJ12LM) в Home Assistant и Homekit. С управлением и самое главное - получением статуса в HA и Homekit. Данный вариант описывает действия если у Вас HASSIO в докере, и актуальна только на ближайшее время. В будущих обновлениях HASSIO будет реализована поддержка штор данной модели.
История
Я заказал данные моторы с Китая на весенней распродаже, вышло около 7к за мотор на тот момент. Сейчас их можно приобрести по цене около 7-9к, однако в Китае цена 4-6к. Моторы долго лежали в коробках.
А еще ранее я купил карнизы в одном из наших онлайн магазинов, вышло даже дешевле чем ждать с Китая. В один прекрасный день я проснулся и решил, что дальше так жить нельзя, необходимо вешать карнизы и радоваться автоматизации. От умного дома одно название: датчики, счетчики и управляется только робот пылесос. Остальное активное оборудование лежит в коробках либо на стенде.
Первым делом, я решил подружить данные моторы c Deconz, однако ничего не вышло. В GUI появляется, а в REST API не отдает. Сходил в чат, поспрашивал. Выяснилось что поддержки в данный момент нет, но есть issue в котором просят реализовать поддержку штор данной модели. Проверив всю информацию, и понял что поддержки в данный момент не будет. Так как разработчик не имеет данного мотора, и то что он с батареей есть сложности как его отдать в API, так как получается составное устройство "лампочка" и "сенсор".
Затем я сдул пыль с "спрутстика" поднял аддон zigbee2mqtt и попробовал подружить моторы с ним. Однако снова неудача. Почитав документацию о добавление новых устройств, я скопировал файл devices.js из репозитория и положил его в папку share в контейнере HA через аддон конфигуратора (это можно сделать с cli хостовой машины). Скопировал конфигурацию старой шторы, изменил атрибуты zigbeeModel и model. После перезагрузки аддон'а zigbee2mqtt, ничего не произошло. Перечитав инструкцию ничего дельного не нашел, однако после прочтения конфигурации Dockerfile аддона выяснилось - надо добавить в конфигурацию флаг "zigbee_shepherd_devices": true, чтобы аддон искал пользовательский файл devices.js, описывающий zigbee устройства.
Очередная перезагрузка, шторы определились аддон пишет в лог сообщения об открытии и закрытие, но в HA ничего не появилось. Методом проб и ошибок, чтения кода было выяснено что сменив атрибут model я лишился autodescovery данного устройство в HA, чтобы решить данную проблему надо править файл homeassistant.js в аддоне. Однако я это не сделал, так как замена devices.js штатная функция официально поддерживаемого аддона, а правка других мест подразумевает что после обновления аддона все сломается. Я снова открыл файл devices.js через аддон конфигуратор, вернул модель как у старой версии штор. И все взлетело после перезагрузки.
Моей радости не было предела, однако не буду углубляться в детали - оно работает неполноценно. Нельзя получить корректную обратную связь о текущей позиции штор, на предыдущей модели аналогичная проблема. Управление работает, открывает закрывает на верное количество процентов. Но статуса нет.
Я начал отчаиваться, что полноценной интеграции не будет. Владелец dresden-elektronik/deconz-rest-plugin сказал что ему нужны команды. А zigbee2mqtt - это полноценный opensorce, ждать можно долго, пока кто нибудь не поймает пакеты и не напишут конвертер. Я начал жалеть что подарил свой mi hub товарищу.
Я пошел купил еще один "спрутстик" и михаб. Михаб для временного управления шторами, и на всякий случай если история повторится, а я куплю какое нибудь устройство xiaomi и оно не взлетит на других решения. А второй "спрутстик" как снифер чтобы захватить команды управления моторами с михаб , и передать команде dresden-elektronik и zigbee2mqtt.
После быстрого поиска по GitHub я выяснил что в PyXiaomiGateway которая использует HA есть обработчик данной модели штор. Но в Hassio используется старая версия библиотеки, и в компоненте xiaomi_aqara поддержки нет. Однако в dev ветке HA есть изменения о поддержке данной модели. Однако у меня докер и HASSIO, быстро это не исправить. Резюмирую: надо сделать как представлено ниже) Я думаю в следующем обновление все заработает и так. Откуда я взял фиксы:
Add Aqara Smart Curtain Motor B1 (curtain.hagl04) support
Компонент xiaomi_aqara в dev ветке HA
Действие
Необходимо подключиться к контейнеру, найти файлы библиотеки и компонента HA, исправить их и перезагрузить контейнер через управление Home Assistant. Данный путь не совсем корректный, однако ждать я не хочу.
Заходим по ssh на хост машину, туда где крутится Docker с Вашим HASSIO. Необходимо найти ID контейнера. Для этого введите команду: sudo docker container ls -a
freenetwork@home:~$ sudo docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d26698411f9c homeassistant/amd64-hassio-supervisor "/bin/entry.sh pytho…" 2 days ago Up 2 days hassio_supervisor e96595c88529 hassioaddons/motioneye:0.5.3 "/init" 2 days ago Up 2 days addon_a0d7b954_motioneye f31e2a89f6f8 homeassistant/amd64-addon-configurator:3.4 "/run.sh" 2 days ago Up 2 days addon_core_configurator 0932da9d7854 homeassistant/intel-nuc-homeassistant:0.97.2 "/bin/entry.sh pytho…" 2 days ago Up 2 minutes homeassistant 55f82e6bc692 hassioaddons/aircast-amd64:2.1.0 "/init" 2 days ago Up 2 days addon_a0d7b954_aircast b03763b950a9 hassioaddons/adb-amd64:0.5.1 "/init" 2 days ago Up 2 days 0.0.0.0:5037->5037/tcp addon_a0d7b954_adb f155d9f37894 homeassistant/amd64-addon-duckdns:1.9 "/run.sh" 2 days ago Up 2 days addon_core_duckdns 5de2ebf527f0 sabeechen/hassio-google-drive-backup-amd64:0.98.2 "python3 -m backup" 2 days ago Up 2 days 0.0.0.0:1627->1627/tcp, 8099/tcp addon_cebe7a76_hassio_google_drive_backup 9d5bb24fe051 homeassistant/amd64-addon-mosquitto:5.0 "/run.sh" 2 days ago Up 2 days 0.0.0.0:1883-1884->1883-1884/tcp, 0.0.0.0:8883-8884->8883-8884/tcp addon_core_mosquitto b43d1f20a22c marthoc/hassio-addon-deconz-amd64:2.05.66 "/tini -s -- /run.sh" 2 days ago Up 2 days addon_69bb46cb_deconz 9687a7208a64 homeassistant/amd64-hassio-dns:1 "coredns -conf /conf…" 2 days ago Up 2 days hassio_dns 2219e9bf111c portainer/portainer "/portainer" 2 months ago Up 2 days 0.0.0.0:9000->9000/tcp inspiring_taussig
Мы узнали ID контейнера: 0932da9d7854. Необходимо к нему подключиться, для этого пишем команду: sudo docker exec -it 0932da9d7854 /bin/bash
freenetwork@home:~$ sudo docker exec -it 0932da9d7854 /bin/bash
Находясь в контейнере необходимо определить расположение библиотеки xiaomi_gateway и стандартного компонента xiaomi_aqara. Воспользуется командой find.
bash-5.0# find / -name xiaomi_aqara /usr/src/homeassistant/homeassistant/components/xiaomi_aqara bash-5.0# find / -name xiaomi_gateway /usr/local/lib/python3.7/site-packages/xiaomi_gateway bash-5.0#
Затем необходимо изменить данные файлы, воспользоваться редактором vi
В файле /usr/src/homeassistant/homeassistant/components/xiaomi_aqara/cover.py заменить
```
if model == "curtain":
```
на
```
if model in ["curtain", "curtain.aq2", "curtain.hagl04"]:
```
А в файле /usr/local/lib/python3.7/site-packages/xiaomi_gateway/__init__.py заменить
```
'cover': ['curtain'],
```
на
```
'cover': ['curtain', 'curtain.hagl04'],```
Или выполнить замену строк командой sed.
sed -i 's/if model == "curtain":/if model in \["curtain", "curtain.aq2", "curtain.hagl04"\]:/' /usr/src/homeassistant/homeassistant/components/xiaomi_aqara/cover.py sed -i "s/'cover': \['curtain'\],/'cover': ['curtain', 'curtain.hagl04'],/" /usr/local/lib/python3.7/site-packages/xiaomi_gateway/__init__.py
Все готово! Зайдите в UI Home Assistant, в настройки и перезапустите сервер.
Эпилог:
Шторы добавлены в Home Assistant, организовано управление ими и полноценная обратная связь. В HomeKit шторы корректно добавлены и имеется обратная связь. Я обязательно доделаю работу чтобы шторы появились в deconz и zigbee2mqtt, обязательно со статусом.
P.S. На фото из HomeKit находятся 2 шторы, к сожалению я не разобрался как с концами удалить устройства с HA. Штора в верхнем левом углу, остатки интеграции с zigbee2mqtt которое не взлетело. Разбираюсь =)
Отличная статья!!!
Спасибо, интересно.
Ад!
Компонент можно положить в custom_components, а не править наживую. Там же в зависимостях указать новую версию библиотеки. Кастомы имеют больший приоритет.
Да. Однако через пару мержей будет в проде. Сделан у меня и компонент. Писать уже не стал. Долго модерировалась статья