Привет Siri, включи елочку
В доме, где каждое устройство — от стиральной машины до лампочки — обладает умными функциями, новогодняя гирлянда, казалось бы, не могла остаться в стороне.
Заказав китайскую гирлянду на AliExpress, я ожидал получить устройство, совместимое с Tuya и работающее по Wi-Fi которое без проблем можно завести в Home Assistant, люблю управлять всем из одного приложения и не люблю умные устройства в облаках. Однако, я ошибся, и получил устройство с название Hello Fairy и управляемое своим приложением по протоколу Bluetooth Low Energy (BLE)
Приложение позволяет управлять цветом, режимом и скоростью переключения цветов гирлянды, все хорошо, но к сожаление c Home Assistant никак не совместимо и существующих интеграций найти не получилось.
Не отчаиваемся! Давайте рассмотрим способ приручения этого устройства и управления им напрямую без привязки к проприетарным приложениям.
Для начала нам понадобиться устройство для перехвата BLE трафика, дабы разобрать что на самом деле происходит между приложением и гирляндой для этого существует несколько способов.
Аппаратный способ
Приобрести отладочную BLE плату с USB, почти все производители делают такие, к примеру Nordic Semiconductor nRF51822 или cc2541 от TI, но кроме того скорее всего будет нужен аппаратный дебаггер, чтобы прошить чип для работы в режиме сниффера. Выглядит немного дорого, к примеру только донгл от Nordic стоит порядка 100$, поэтому перейдем к следующему способу.
Перехват BLE трафика в Android
Инструменты разработки в Android позволяют перехватывать весь входящий и исходящий bluetooth трафик, собственно девайс на дроиде оказывается под рукой чаще чем отладочный донгл, поэтому и будем использовать этот способ.
Для начала необходимо включить режим разработчика в Android для кликаем на номер билда в информации об устройстве, после чего будет доступно новое меню разработчика. Кроме того на компьютер устанавливаем ADB (Android Debug Bridge) это можно сделать по инструкции для вашей OS. А так же для просмотра трафика устанавливаем wireshark.
После того как все ПО установлено идем в меню разработчика и активируем пункт «Включить журнал HCI»:
Переключаемся в приложение трафик которого будем перехватывать и нажимаем на все интересующие кнопки. Каждый запрос Android записывает в лог файл, для того чтобы его прочитать нам понадобиться скачать его с девайса на компьютер через ADB, так как файл находиться в недоступной для пользователя области памяти. Подключаем Android девайс по USB и выполняем команду в консоле
adb devices
После чего разрешаем отладку по USB на экране девайса и выполняем еще одну команду
adb bugreport bugreport.zip
Формирование архива может занять 2–3 минуты. После распаковываем полученный архив и находим файл …\bugreport\FS\data\log\bt\btsnoop_hci.log открываем его с помощью wireshark.
Из дампа нас интересует UUID характеристики куда отправляются команды и собственно само содержание пакетов, на скриншоте выше выделено маркером.
Тестируем полученные команды без приложения
Пробуем повторить команды средствами linux через gatttool для этого понадобиться выполнить команду в форме:
gatttool -b MAC-адрес гилядны --char-write-req -a UUID характеристики -n команда
Итого опытным путем получаем следующие:
gatttool -b 48:53:52:01:55:2C --char-write-req -a 0x0021 -n aa020101ae # включить
gatttool -b 48:53:52:01:55:2C --char-write-req -a 0x0021 -n aa020100ad # выключить
gatttool -b 48:53:52:01:55:2C --char-write-req -a 0x0021 -n aa0304020103ca81 # режим переливания цветом
gatttool -b 48:53:52:01:55:2C --char-write-req -a 0x0021 -n aa03070100e3036a03e8f0 # синий цвет
gatttool -b 48:53:52:01:55:2C --char-write-req -a 0x0021 -n aa03070100e3036a03e8f0 # красный цвет
Интеграция в Home Assistant
И так далее для всех интересующих нас действий. Видим, что гирлянда отзывается, а следовательно из этого можно уже либо разработать свою собственную интеграцию для Home Assistant либо создать сommand line switch, если не хочется заморачиваться с программирование, я выбрал как раз второй способ.
Открываем configuration.yaml в Home Assistant и добавляем секцию:
command_line:
- switch: name: "ble_holiday_lights"
command_on: 'gatttool -b 48:53:52:01:55:2C --char-write-req -a 0x0021 -n aa020101ae'
command_off: 'gatttool -b 48:53:52:01:55:2C --char-write-req -a 0x0021 -n aa020100ad'
Получаем программный выключатель, который можно использовать в автоматизациях и даже интегрировать с голосовыми ассистентами:
Вот и всё! Теперь гирлянда вполне управляема из Home Assistant, без необходимости использовать проприетарные приложения. Спасибо за внимание, пусть ваш дом светится яркими красками и тоже будет умным дом!