Подключение Xiaomi Mijia Bluetooth Thermometer в Home Assistant с помощью ESP32
В экосистеме компании Xiaomi есть датчик температуры и влажности Mijia Hygrothermograph с дисплеем, подключаемый по Bluetooth. Подключить этот датчик в приложение Mi Home можно непосредственно с телефона, либо через BLE шлюз. В качестве BLE шлюзов выступают ночные светильники Mijia Bed Side Lamp первого поколения, камера видеонаблюдения Mijia Smart Home Camera, умная колонка Yeelight Voice Assistant и другие устройства, но проблема в том, что эти шлюзы не позволяют пробрасывать подключенные устройства в альтернативные системы автоматизации.
Подключить такое устройство в Home Assistant возможно через Bluetooth компьютера, на котором установлена система автоматизации (в случае Raspberry Pi), или сделать BLE шлюз на основе платы ESP32 стоимостью ~4$.
На всем известной китайской торговой площадке была заказана плата ESP32. Плата имеет Wi-Fi и Bluetooth интерфейсы, 4 мегабайта памяти, контроллер CP2102 и порт micro-ubs. Наличие контроллера CP2102 позволяет перепрашивать плату подключив ее к компьютеру кабелем micro-usb.
Прошивка платы ESP32
На плату будет залита прошивка, созданная в ESPHome, после чего она будет работать как полноценный BLE шлюз. Программная часть будет установлена на Raspberry Pi, а плата для первоначальной прошивки подключена к малинке кабелем micro-usb.
Для установки программной части подключаемся к Raspberry Pi по SSH. Устанавливаем Python3 т.к. поддержку Python2 обещают в скором времени вырезать.
$ sudo apt install python3-pip $ sudo pip3 install setuptools $ sudo pip3 install esphome $ sudo pip3 install tornado esptool
Т.к. Raspberry Pi оснащена bluetooth модулем, запустим сканер для определения MAC адресов необходимых нам устройств:
$ sudo hcitool lescan LE Scan ... 4C:65:A8:DA:02:B1 MJ_HT_V1
После нахождения всех необходимых устройств прерываем работу сканера комбинацией клавиш:
Ctrl+C
Запускаем программное обеспечение ESPHome:
$ esphome config/ dashboard
В браузере открываем страницу:
http://<strong>raspberry_ip_address</strong>:6052/
Создаем новый проект нажав + в правом нижнем углу. Последовательно заполняем необходимые поля:
- Node Name - Уникальное имя node. Имя вводится латиницей в нижнем регистре, допускаются цифры и символ подчеркивания
- Device Type - Тип устройства, для нашего проекта выбираем NodeMCU-32S
- WiFi & Updates - В соответствующие поля последовательно вводим
SSIDточки WiFi, с которой будет происходить подключение, пароль для подключения к ней и пароль дляOTAсервера обновлений. OTA в последствии позволит обновлять прошивки на устройстве, не подключая к компьютеру - Finish - Подтверждение создания нового проекта
Для первой прошивки подключаем устройство к малине micro-usb проводом, в выпадающем меню в правом верхнем углу выбираем наше устройство.
Нажимаем кнопку Edit. Первая часть конфигурационного файла будет заполнена информацией, которую мы ввели при создании проекта, далее мы включили BLE tracker для определения Bluetooth устройств, внесли данные о нашем датчике температуры Mijia Hygrothermograph, последние 3 сенсора это Uptime устройства, уровень сигнала Wi-Fi и кнопка перезапуска будущего BLE шлюза. Строчки с WEB сервером на устройстве закомментированы, т.к. он нужен только для отладки и показывает текущие показания сенсоров и Debug log, но для первоначальной настройки его желательно включить, убрав комментарий с двух соответствующих строчек.
Подробнее почитать о поддерживаемых Bluetooth устройствах компании Xiaomi можно на сайте проекта ESPHome.
esphome:
name: ble_esp32
platform: ESP32
board: nodemcu-32s
wifi:
ssid: "MySweetSmartHome"
password: "P@$$w.rd"
captive_portal:
# Enable logging
logger:
# Enable Home Assistant API
api:
password: "P@$$w.rd"
ota:
password: "P@$$w.rd"
#web_server:
# port: 80
esp32_ble_tracker:
sensor:
# Mijia bluetooth temperature & humidity sensor
- platform: xiaomi_lywsdcgq
mac_address: 4C:65:A8:DA:02:B1
temperature:
name: mijia_bt_temperature
humidity:
name: mijia_bt_humidity
battery_level:
name: mijia_bt_battery_level
# Uptime
- platform: uptime
name: ble_esp32_uptime
# Wi-fi signal strength
- platform: wifi_signal
name: ble_esp32_wifi
update_interval: 60s
# Restart button
switch:
- platform: restart
name: ble_esp32_RestartСохраняем Save и закрываем конфигурацию Close. Проверяем созданный проект Validate, запускаем сборку прошивки и отправку ее на устройство Upload. При прошивке через USB провод, возможно, устройство необходимо будет перевести в режим обслуживания зажав кнопку Boot и не отпуская ее нажать один раз кнопку Reset (En).
После окончания прошивки устройство подключится к Wi-Fi сети, если был включен Web сервер, то проверить его работу можно открыв в браузере страницу:
http://<strong>ble_esp32_ip_address</strong>
Узнать полученный адрес устройства в домашней сети можно на маршрутизаторе в разделе DHCP сервер.
Подключение BLE ESP32 шлюза в Home Assistant
В Home Assistant добавляем новую интеграцию Configure -> Integration -> +. В списке находим ESPHome, заполняем IP адрес нашего BLE шлюза, порт по умолчанию 6053, подтверждаем конфигурацию, в следующем окне вводим пароль, указанный в разделе api в конфигурационном файле устройства.
После подключения заходим в устройства Configuration -> Devices, находим подключенный BLE ESP32 шлюз.
Помимо сенсоров самой платы в списке отображаются сенсоры bluetooth термометра Mijia Hygrothermograph. Теперь их можно добавить на панель Lovelace.
Автоматизация
Следующая автоматизация будет управлять розеткой, к которой подключен увлажнитель воздуха. При падении влажности в помещении ниже 35% розетка будет включаться и при превышении 55% отключаться. В Configuration -> Automation или в automation.yaml добавляем:
- id: 'room_humidity_below_35_percent'
alias: Room humidity below 35 percent
trigger:
- platform: numeric_state
entity_id: sensor.mijia_bt_humidity
below: '35'
condition: []
action:
- service: switch.turn_on
entity_id: switch.xiaomi_socket_room_<span class="tlid-translation translation" lang="en"><span title="">humidifier</span></span>_switch
data: {}
mode: single
- id: 'room_humidity_above_55_percent'
alias: Room humidity above 55 percent
trigger:
- platform: numeric_state
entity_id: sensor.mijia_bt_humidity
above: '55'
condition: []
action:
- service: switch.turn_off
entity_id: switch.xiaomi_socket_room_<span class="tlid-translation translation" lang="en"><span title="">humidifier</span></span>_switch
data: {}
mode: single
Следующая автоматизация будет уведомлять о низком заряде батареи в устройстве.
- id: 'mijia_ble_term_low_batt'
alias: Mijia BLE termometr low <span class="tlid-translation translation" lang="en"><span title="">battery</span></span>
trigger:
- platform: numeric_state
entity_id: sensor.mijia_bt_battery_level
below: '15'
condition: []
action:
- service: notify.persistent_notification
data:
title: ⚠ - Battery low
message: Mijia BLE termometr <span class="tlid-translation translation" lang="en"><span title="">battery</span></span> below 15 percent
- service: telegram_bot.send_message
data:
message: Mijia BLE termometr <span class="tlid-translation translation" lang="en"><span title="">battery </span></span>below 15 percent
mode: single
Подробнее о создании и настройке бота для Telegram описано в статье: Подключение Telegram bot к Home Assistant для доставки уведомлений и управления умным домом
Итог
Используя плату NodeMCU-32S и программное обеспечение проекта ESPHome, мы получили полноценный BLE шлюз, подключили к нему градусник Mijia Hygrothermograph, прокинули его в Home Assistant и задействовали его в домашних автоматизациях.
К минусам данного решения можно отнести только то, что при подключении нового Bluetooth устройства необходимо добавлять его в конфигурационный файл и заново прошивать устройство.
К плюсам относится, что плата может работать автономно, достаточно только питания 5V через micro-usb провод, последующие прошивки можно производить, не подключая устройство к компьютеру.