Заметка о том, как я ночник Yeelight к openHAB подключил

Давненько я не писал статьи на техническую тематику. К счастью, сейчас у меня для этого есть повод. Дело в том, что нигде в интернете я не нашел расписанного решения подключения ночника 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.