Привет Siri, включи елочку

f0fa93cb67938135c3aa18f6d24e5b08.jpg

В доме, где каждое устройство — от стиральной машины до лампочки — обладает умными функциями, новогодняя гирлянда, казалось бы, не могла остаться в стороне.

Заказав китайскую гирлянду на AliExpress, я ожидал получить устройство, совместимое с Tuya и работающее по Wi-Fi которое без проблем можно завести в Home Assistant, люблю управлять всем из одного приложения и не люблю умные устройства в облаках. Однако, я ошибся, и получил устройство с название Hello Fairy и управляемое своим приложением по протоколу Bluetooth Low Energy (BLE)

cac55d56a3a4753eacf946399a826045.jpg

Приложение позволяет управлять цветом, режимом и скоростью переключения цветов гирлянды, все хорошо, но к сожаление 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»:

a9a2a0f4f9a47d3e4f848e147edc614d.jpg

Переключаемся в приложение трафик которого будем перехватывать и нажимаем на все интересующие кнопки. Каждый запрос Android записывает в лог файл, для того чтобы его прочитать нам понадобиться скачать его с девайса на компьютер через ADB, так как файл находиться в недоступной для пользователя области памяти. Подключаем Android девайс по USB и выполняем команду в консоле

adb devices

После чего разрешаем отладку по USB на экране девайса и выполняем еще одну команду

adb bugreport bugreport.zip

Формирование архива может занять 2–3 минуты. После распаковываем полученный архив и находим файл …\bugreport\FS\data\log\bt\btsnoop_hci.log открываем его с помощью wireshark.

978ddc677edd013ba44a40eab73d248d.png

Из дампа нас интересует 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'

Получаем программный выключатель, который можно использовать в автоматизациях и даже интегрировать с голосовыми ассистентами:

b12695c45489b978f9965b48197b18b1.png

Вот и всё! Теперь гирлянда вполне управляема из Home Assistant, без необходимости использовать проприетарные приложения. Спасибо за внимание, пусть ваш дом светится яркими красками и тоже будет умным дом!

© Habrahabr.ru