Давненько я не писал статьи на техническую тематику. К счастью, сейчас у меня для этого есть повод. Дело в том, что нигде в интернете я не нашел расписанного решения подключения ночника Yeelight к любой из распространенной из OpenSource систем умного дома общего назначения. К счастью я нашел способ и, при желании его можно адаптировать и к другим системам умного дома.
Проблема
Обычно системы умного дома не заточены под работу с определенным протоколом. Вместо этого они имеют максимально абстрагированную от физического мира модель, специализирующуюся на представлении виртуальных устройств, способе их взаимодействия посредством событий и возможности написании кода, который реагирует на данные события и взаимодействует с виртуальными устройствами. Детали реализации протокола взаимодействия виртуального устройства с его реальным прототипом находятся в подключаемых модулях. openHAB относится к таким системам. В openHAB дополнения (Addons), которые представляют устройства (которые называются Things) называются привязками (Bindings).
В openHAB имеется привязка, которая позволяет взаимодействовать с устройствами умного дома Mi Home. К сожалению, все устройства, которые поддерживаются данной привязкой общаются по протоколу ZigBee через их фирменный шлюз. Примером таких устройств могут служить беспроводные термометры, которые от батарейки CR2032 могут работать годами. Я могу ошибаться, но поскольку мне известно, ни одно устройство из семейства Yeelight к таким не относится.
В семействе Yeelight имеются устройства, которыми можно дистанционно управлять посредством Bluetooth LE и/или WiFi сети. Управляющиеся по WiFi светильники/люстры/лампы могут принимать HTTP запросы с измененными заголовками. Управлять ими было бы возможно посредством HTTP Binding’а, однако имеющийся у меня ночник к таковым не относится. Также для меня было сюрпризом то, что у цокольных ламп и данного ночника судя по-всему различается протокол взаимодействия и найденные мною скрипты для управления лампами Yeelight не подошли для управления ночником. К счастью нашлась Python библиотека для работы именно с данным ночником. Она решает почти все проблемы, кроме организации обратной связи, поскольку без нее реверс инжениринг данного протокола с моей стороны затянулся. Так что моя благодарность автору данной библиотеки.
Дано
В моем распоряжении имеется следующее оборудование:
- Raspberry Pi 3. На нем установлен дистрибутив openhabian с системой openHAB 2. Интегрированный модуль Bluetooth позволит связаться с данным ночником
- Ночник Yeelight. У меня имеется версия без WiFi.
- Черепная коробка с серым веществом. Оно не самое производительное, но обойдемся тем, что есть.
Решение
Раскрываю карты. Я использовал скрипт python-yeelightbt
из хостинга GitHub. В процессе установки данного скрипта у меня возникли некоторые проблемы. Сейчас я вспоминаю две из них.
- Для установки скрипта могут понадобиться дополнительные пакет, без которых ничего не скомпилируется. В моем случае заработало после установки пакета
libglib2.0-dev
. - Может выпадать ошибка в модуле Construct. Это ад зависимостей в действии. Мне удалось найти нужную версию, устанавливается она так
sudo pip3 install construct==2.8.21
. - Все это путем экспериментов завелось на Python 3, как будет работать на 2.7 не знаю.
Далее необходимо найти светильник. В скрипте есть забавный баг — для того, чтобы выполнить любую операцию, включая scan, необходимо указать MAC адрес. Но для того, чтобы узнать MAC адрес, надо выполнить операцию scan. Выполняем sudo hcitool lescan
, для того, чтобы завершить данную операцию, нажмите Ctrl+C. У светильника должно быть имя XMCTD_
MAC адрес указывается через переменную окружения YEELIGHTBT_MAC
или параметр --mac
. Скрипт поддерживает включение, выключение, управление яркостью, цветовой температурой и выбор произвольного цвета. Для запуска скрипта в OH2 нужно установить binding Exec. Данный binding позволяет запускать произвольные программы с произвольными аргументами командной строки. Вы можете написать любую программу на C++, Python, Perl, Shell скрипт и прочее и они могут быть выполнены при помощи данного Binding’а. Получившуюся у меня конфигурацию я выложил на GitHub.
В результате получилась вот такая красота:
Все крутилки регулируются с той лишь проблемой, что система не получает обратную связь от ночника.
При заимствовании конфигурации, обязательно замените MAC адрес в файле bedside_lamp.things.