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

Заказав китайскую гирлянду на 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, без необходимости использовать проприетарные приложения. Спасибо за внимание, пусть ваш дом светится яркими красками и тоже будет умным!

Комментарии (6)


  1. iscareal
    28.12.2023 22:09
    +2

    Спасибо! Когда то размышлял на тему того, что по сути с любыми ble устройствами можно работать и вот как раз годный тутор


    1. Kill_Voice Автор
      28.12.2023 22:09

      Единственное "но" в некоторых случаях производитель добавляет шифрование, в этом случае все работает примерно как по https


  1. aivs
    28.12.2023 22:09

    У меня китайская люстра, управляется по ble, надо добить её уже!


    1. Kill_Voice Автор
      28.12.2023 22:09

      Тут будет аналогичный алгоритм действий. Либо можно еще посмотреть https://www.home-assistant.io/integrations/led_ble/ тут интегрирована масса распространенных девайсов, но к к сожалению в природе их еще больше)


      1. aivs
        28.12.2023 22:09

        Было у меня пару подходов посмотреть траффик, но на айфоне, не разобрался я с отладкой. Возможно проще купить андроид телефон для этих дел.


        1. Kill_Voice Автор
          28.12.2023 22:09

          С айфоном у мне тоже ничего не получилось