(eu version — lumi.gateway.mieu01)
В этом посте я расскажу как можно собирать данные BLE и передавать через MQTT в системы умного дома, например в HomeAssistant.
![](https://habrastorage.org/getpro/habr/upload_files/a0c/14d/2f4/a0c14d2f433892a6785e5409dbfcffcb.png)
Как все начиналось?
Эта история началась в прошлом году: у меня появился несколько таких шлюзов. В то время было несколько статей по получению root доступа, интеграции miio в HA и по прошивке чистого openwrt на шлюз. Толчком к развитию стал сезон распродаж в разных магазинах, где стоимость шлюза стремилась к нулю, и многие энтузиасты получили интересную железку.
Первым большим делом для меня было заставить работать zigbee2mqtt с чипом и прошивкой находящимся в шлюзе. И пока я допиливал интеграцию в zigbee-herdsman, ребята в чатике @xiaomi_gw_hack занимались добавлением поддержки в openwrt периферии, которая была в шлюзе (светодиоды RGB, динамик, датчик света, wi-fi модуль).
Отдельное спасибо @lenz1986, @Alx2000y, @belokobylskiy!
Было обнаружено, что в wifi модуле rtl8723bs европейской версии шлюза есть встроенный bluetooth с поддержкой BLE.
![](https://habrastorage.org/webt/h_/eo/5c/h_eo5cotpym9onsai6re_oajtsq.png)
Но в стоковой системе на шлюзе нет никаких следов bluetooth. И лишних uart, по которому можно было бы с ним работать — тоже. @lenz1986 провел раскопки
![Несколько плат очень помогли разобраться в внутреннем мире шлюза Несколько плат очень помогли разобраться в внутреннем мире шлюза](https://habrastorage.org/getpro/habr/upload_files/870/6cb/dee/8706cbdee6a17a1a11db53b57be0dab0.png)
![Вот как плата выглядит без процессора ) Вот как плата выглядит без процессора )](https://habrastorage.org/getpro/habr/upload_files/9b9/fe2/f41/9b9fe2f4195b5ae69f709360fd47e1ab.png)
Он вызвонил контакты, и обнаружил что на плате разведены все 4 UART от процессора. Один из которых вел на uart от bluetooth части модуля wifi rtl8723bs. Потом он добавил поддержку этого uart в DTB, где описываются вся периферия устройства для openwrt и нашел подходящие драйвера. За что @lenz1986 огромное спасибо!
![](https://habrastorage.org/getpro/habr/upload_files/0b1/95e/d0b/0b195ed0b0285825b52b7fab7ac07895.png)
модуля
Внимание! Все действия я описываю и делаю на базе openwrt прошивки для шлюза. Установить ее можно по воздуху просто подключившись по uart к шлюзу. (спасибо @divanikus)
Подробнее описано на https://openlumi.github.io/
Bluetooth инициализируется через rtk_hciattach при запуске шлюза. После загрузки мы получаем такую картину hciconfig
![](https://habrastorage.org/getpro/habr/upload_files/3d5/f57/1fa/3d5f571faf4683f4b5718dfc950e7c9b.png)
Я знаю 2 пути, как можно включить bluetooth адаптер.
Руками
hciconfig hci0 up
изменив параметр
AutoEnable
конфиге/etc/bluetooth/main.conf
наtrue
Я выбираю второй. Интерфейс запущен. Для проверки можно запустить скан hcitool lescan
Работа с BLE
Мои знания по BLE были на нуле, и чтобы было проще разобраться я искал что-то готовое по типу zigbee2mqtt. Перепробовал несколько решений на Node.Js, в том числе пакеты для node-red. Остановился на проекте EspruinoHub. (хоть и код там не супер современен и технологичен, но зато работает)
После запуска с отсылкой данных в локальный mqtt сервер, в CLI и web интерфейсе уже показались распарсенные данные с части датчиков LYWSDCGQ (круглые гигротермографы) .
![Раньше я их слушал на esp32 через esphome. Небольшое сравнение получаемых данных с одного термометра. Раньше я их слушал на esp32 через esphome. Небольшое сравнение получаемых данных с одного термометра.](https://habrastorage.org/getpro/habr/upload_files/7d0/58e/b0b/7d058eb0b8d2b5fc3be35ca27225f1e9.png)
Это меня порадовало, но у меня было еще несколько устройств, данные от которых я увидел почти в raw виде. И я решил использовать эту программу и немного улучшить ее.
![пример cli интерфейса с статусом доступных устройств пример cli интерфейса с статусом доступных устройств](https://habrastorage.org/getpro/habr/upload_files/43a/0d4/9d8/43a0d49d8d8d741fb97bb2ed1ba6e91f.png)
Многие устройства Xiaomi с bluetooth шлет BLE Advertising Packet, в большинстве случаев в нем содержится полезная нагрузка в виде измерений, которые производит устройство. Часто данные отправляются открыто, но используется шифрование с ключом.
Например для браслета MiBand данные выглядят вот так. Если есть данные о пульсе то они добавляются в конец
![](https://habrastorage.org/getpro/habr/upload_files/c97/255/b6e/c97255b6e8ac6775c95ac1c22ad7bc24.png)
В устройствах xiaomi, часто используется BLE сервис fe95. В интернете есть небольшая документация по нему .На github есть множество проектов которые умеют парсить эти данные. На основе этих данных и существующей реализации espruino я немного улучшил парсинг открытых данных, но потом я нашел более красивое решение из hannseman/homebridge-mi-hygrothermograph. Мне особенно понравилась стандартизация разных событий и расшифровка исходя из данных заголовка.
Этот парсер закрыл вопрос с большинством устройств Xiaomi, отправляющих данные в fe95. Можно еще попробовать добавить некоторые типы событий (движение, дым, нажатие на кнопку), но у меня нет таких устройств под рукой.
Я добавил в EspruinoHub данный парсер, и реализовал возможность указать настройки для разных устройств. Это необходимо для устройств, которые шифруют с помощью bindKey свои пакеты. Получить bindKey можно из miHome.
MQTT Discovery - Home Assistant
![](https://habrastorage.org/getpro/habr/upload_files/89f/095/bf5/89f095bf541cba387fa5740d163a4f48.png)
Данных стало больше, но хотелось чтобы они автоматически появлялись в HomeAssistant. EspruinoHub отправляет данные которые и слышит в эфире, и не имеет на данный момент привязки к конкретным устройствам. Поэтому в момент появления данных, если они из списка поддерживаемых отправляется config устройства в топик homeassistant в mqtt и устройства появляются в системе умного дома
Добавленные и протестированные устройства.
В результате изучения разных решений и raw сообщений от устройств удалось добавить или улучшить интеграцию следующих устройств в пассивном режиме (только слушаем эфир не подключаемся к устройствам и не тратим батарейку).
![](https://habrastorage.org/getpro/habr/upload_files/039/09d/ee4/03909dee45e5e444ed09511db8790460.png)
LYWSDCGQ - работал "из коробки". Добавил только mqtt discovery в HA
![показания пере показания пере](https://habrastorage.org/getpro/habr/upload_files/148/0c3/654/1480c3654fdf0cece2b48a1190edbcec.png)
![](https://habrastorage.org/getpro/habr/upload_files/b84/30d/e28/b8430de280e30b10a4aeceb774316fed.png)
LYWSD02 - температура, влажность и батарейка
![](https://habrastorage.org/getpro/habr/upload_files/a77/632/7ee/a776327ee199bdfcdc20015838a29b39.png)
Самый бюджетный датчик температуры и влажности с экраном LYWSD03MMC - температура, влажность и батарейка (нужен bindKey). Существует 2 альтернативные прошивки, они очень крутые и продвинутые. Особенно от Виктора pvvx. Рекомендую использовать именно ее. Помимо лучшего потребления она шлет данные в одном пакете, а не в трёх и имеет множество настроек.
![](https://habrastorage.org/getpro/habr/upload_files/150/88f/e75/15088fe75c08a761bc9184a0b3e184f9.png)
![](https://habrastorage.org/getpro/habr/upload_files/8a4/4c6/f88/8a44c6f881eb532a6a0f14d7ab7f8a24.png)
![](https://habrastorage.org/getpro/habr/upload_files/cb2/929/8d6/cb29298d60961de9ec86ff0bb72dc595.png)
MI SCALE - 181d v1 По крупицам из разных источников допилена реализация в которой показываются данные о - стабилизации веса (весы моргают) - убрали вес (встали с весов) - дата и время измерения. 181b v2 Работает, но не тестировал лично. Возможно нужно что-то допилить
![](https://habrastorage.org/getpro/habr/upload_files/608/976/6e0/6089766e0093d4388b1321ac377d70de.png)
![](https://habrastorage.org/getpro/habr/upload_files/3cc/f20/059/3ccf20059efe679f5a7142de8d4b6685.png)
Mi band 3 fee0 Шаги и Пульс в режиме тренировки. Чтобы браслет отправлял данные необходимо включить обнаружение в MiFit.
![](https://habrastorage.org/getpro/habr/upload_files/10b/2df/c28/10b2dfc282c65ab7ee2610bf6c7776dc.png)
![](https://habrastorage.org/getpro/habr/upload_files/bad/9c1/7d9/bad9c17d9c660b685a674f43d0b01c92.png)
Как оказалось шлюз очень хорошо и далеко слышит, а эта функция включена у многих людей. Работает это и для других моделей и даже на некоторых часах например Amazfit GTS
![](https://habrastorage.org/getpro/habr/upload_files/348/55c/d0f/34855cd0f963e59decdf46044934085c.png)
HHCCJCY01 MiFlora, Huahuacaocao - temperature, moisture, illuminance, conductivity, battery_level
Другие устройства тоже можно попробовать подключить. Если они шлют в кодированном виде, то в mqtt об этом будет ошибка с просьбой указать bindKey в конфиг.
![](https://habrastorage.org/getpro/habr/upload_files/cdb/bdc/45a/cdbbdc45abed566d3426dff82f40d2bf.png)
YEERC - я обнаружил что прошивка для esp32 tasmota сообщает, что поддерживает данный пульт. Он идет в комплекте с многими люстрами YEELIGHT, но к сожалению у меня не получилось нигде найти как получить 32 символьный bindKey для него. Сообщения нажатий я вижу, но не могу расшифровать. (Значение event закодировано и зависит от counter который увеличивается с каждым нажатием) Возможно кто-то из читателей подскажет как добыть данный ключик. Пульт можно привязать к нескольким люстрам в разное время и они будут вместе расшифровывать и отрабатывать нажатия. Скорей всего ключ там не изменяется со временем или привязкой.
Как установить EspruinoHub на шлюз Xiaomi с OpenWrt ?
Можно установить и на другие устройства с помощью git / npm, инструкция на странице проекта EspruinoHub
Установка
Мои последние наработки собраны в пакет и ставятся с помощью opkg
Необходимо подключить фид по инструкции https://openlumi.github.io/openwrt-packages/
Дальше установить собранный пакет.
opkg update
opkg install node-espruinohub
Конфигурирование
По-умолчанию он будет пытаться подключиться к локальному mqtt без авторизации. Если вы хотите подключить к внешнему брокеру mqtt, то нужно изменить конфиг в /etc/espruinohub/config.json
Внимание! у некоторых настроек в начале стоят слеши чтобы они не применялись. (конфиг в этом проекте частично сделан как пример и я не стал ничего менять)
Пример конфига можно посмотреть тут. Если вы знаете мак адреса своих устройств то рекомендую их прописать и установить"only_known_devices": true
, чтобы не отправлялись данные с чужих устройств из эфира.
Для работы с HomeAssistant достаточно отправлять данные в json формате, а остальное можно выключить. По умолчанию будет отправлять в топики с группировкой по типу данных.
"mqtt_format_json": true,
"homeassistant": true,
"mqtt_cache_state": true
Планы
Отслеживание носимых устройств по rssi между комнатами. Для этого в конфиг я добавил возможность указать минимальный rssi в разрезе устройства и таймаут присутствия.
![данные с устройств летят достаточно часто если они в зоне прямой видимости. данные с устройств летят достаточно часто если они в зоне прямой видимости.](https://habrastorage.org/getpro/habr/upload_files/8a9/20c/d34/8a920cd348e8cace77f0f45ca3ed2102.png)
Активные подключения: хочу попробовать управлять некоторыми устройствами по BLE, но для одновременного подключения и сканирования Bluetooth модуль и ПО могут работать нестабильно. Поэтому я пока только изучаю этот вопрос.
Альтернативные opensource проекты работающие с BLE на шлюзе
devbis/ble2mqtt - своя реализация на python через bleak, умеет подключаться к чайникам, но сильно грузит процессор.
Beetle-II/lumi - тот же парсер из hannseman/homebridge-mi-hygrothermograph, но без возможности задать индивидуальный ключ bindKey для устройства. Нет raw данных и управление через mqtt. + Умеет работать не только с BLE.
Заключение
Спасибо, что дочитали до конца!
Если у Вас есть вопросы, то можете задавать их в комментариях.