Содержание
Несколько месяцев назад я опубликовал подробное руководство по сбор данных рекламы BLE с наружного термометра SwitchBot используя плату ESP32. Процесс включал сбор, декодирование и анализ данных на уровне байтов в ESPHome и преобразование их в функциональные датчики для Home Assistant.
Это подробная и довольно сложная процедура, во многом зависящая от наличия ключевой информации, необходимой для запуска процесса. Если вы хотите глубже погрузиться в технические особенности декодирования BLE, я настоятельно рекомендую прочитать эту статью. Он дает углубленный взгляд на мой мыслительный процесс и проблемы декодирования однобайтовых характеристик — общий подход, используемый SwitchBot и многими другими производителями.
В этой статье я не буду подробно рассматривать весь процесс. Вместо этого я выделю ключевые различия, с которыми я столкнулся при интеграции SwitchBot Meter Pro и SwitchBot Meter Pro (CO2) термометры.
Полный код см. пропустить до конца.
Зачем использовать ESP32 для сбора данных BLE?
В разделе комментариев к последней статье меня несколько раз спрашивали, зачем использовать плату ESP32 для анализа данных, а не просто использовать официальную интеграцию SwitchBot. Для справки: интеграция прекрасно работает, просто используя Bluetooth-модуль вашего сервера или даже ESP32 в качестве Bluetooth-прокси.
Я предпочитаю использовать ESP32 для всего, что связано с Bluetooth, поскольку они в той или иной форме есть повсюду в моем умном доме. Вот несколько ключевых отличий, которые я бы назвал преимуществами по сравнению с использованием встроенных радиомодулей Bluetooth:
- Расширенный диапазон и надежность: ESP32 можно стратегически разместить ближе к устройствам, обеспечивая более сильный прием сигнала BLE по сравнению с центральной системой со стационарным радиомодемом Bluetooth (например, RPi).
- Пользовательский анализ и контроль: ESPHome обеспечивает расширенную настройку и прямой анализ байтовых данных BLE, обеспечивая точную обработку неподдерживаемых или заблокированных функций устройства. Кроме того, вы можете настроить настраиваемые интервалы отчетов и окна сканирования Bluetooth, оптимизируя производительность и экономя время автономной работы.
- Активные и пассивные соединения: С ESP32 вы можете выбирать между активным и пассивным сканированием BLE, обеспечивая большую гибкость, позволяющую сбалансировать скорость реагирования в реальном времени с энергоэффективностью и уменьшать помехи другим устройствам Bluetooth.
- Централизованный BLE-концентратор: С помощью ESP32 вы можете управлять несколькими устройствами BLE из одного узла, консолидируя связь и уменьшая зависимость от интеграции Bluetooth Home Assistant для различных поставщиков. Например, я могу захватывать пакеты BLE с термометра SwitchBot, датчика температуры Xiaomi или HHCCJCY10 датчик установки на одном узле.
- Масштабируемость: Несколько устройств ESP32 могут быть развернуты по всему дому для покрытия больших площадей, обеспечивая стабильное покрытие BLE и уменьшая мертвые зоны сигнала. Я просто повторно использую другие устройства на базе ESP32, которые уже использую дома, для сбора данных со случайного устройства. Например, я использую AirGradient’s ONE датчик для сбора данных с датчика температуры в спальне.
Понимание байтов рекламы BLE для SwitchBot Meter Pro и Meter Pro (CO2)
При интеграции SwitchBot Meter Pro и Meter Pro (CO2) с ESPHome крайне важно понимать структуру их рекламных данных BLE. Каждая версия использует определенные байты в рекламном пакете для представления температуры, влажности, уровня заряда батареи и — в модели CO2 — уровня углекислого газа.
Байтовая структура SwitchBot Meter Pro
SwitchBot Meter Pro имеет следующую структуру байтов:
- Температура: Байты 8 и 9.
- Младшие 4 бита байта 8 (
0x0F
) представляют десятичную часть; - Старшие 7 бит 9-го байта (
0x7F
) представляют целую часть числа. - Старший бит 9-го байта (
0x80
) указывает знак (0 = положительный, 1 = отрицательный). - Пример: Байт 8 =
0x05
(0,5), Байт 9 =0x98
(24, положительный), Температура =24.5°C
.
- Младшие 4 бита байта 8 (
- Влажность: Байт 10.
- Младшие 7 бит (
0x7F
) представляют собой процент влажности. - Пример: Байт 10 =
0x64
Влажность =100%
.
- Младшие 7 бит (
- Батарея: Байт 2.
- Младшие 7 бит (
0x7F
) представляют процент заряда батареи. - Пример: Байт 2 =
0x50
Батарея =80%
.
- Младшие 7 бит (
- Идентификатор служебных данных: Байт 0 (первый байт служебных данных).
- Указывает тип устройства. Ценить:
0x34
(52).
- Указывает тип устройства. Ценить:
Байтовая структура SwitchBot Meter Pro (CO2)
SwitchBot Meter Pro (CO2) имеет следующую структуру байтов:
- Температура: Байты 8 и 9.
- Младшие 4 бита байта 8 (
0x0F
) представляют десятичную часть; - Старшие 7 бит 9-го байта (
0x7F
) представляют целую часть числа. - Старший бит 9-го байта (
0x80
) указывает знак (0 = положительный, 1 = отрицательный). - Пример: Байт 8 =
0x05
(0,5), Байт 9 =0x98
(24, положительный), Температура =24.5°C
.
- Младшие 4 бита байта 8 (
- Влажность: Байт 10.
- Младшие 7 бит (
0x7F
) представляют собой процент влажности. - Пример: Байт 10 =
0x64
Влажность =100%
.
- Младшие 7 бит (
- Батарея: Байт 2.
- Младшие 7 бит (
0x7F
) представляют процент заряда батареи. - Пример: Байт 2 =
0x50
Батарея =80%
.
- Младшие 7 бит (
- СО2: Байты 13 и 14.
- Комбинируется как 16-битное целое число с обратным порядком байтов. Байт 13 = старший байт, Байт 14 = младший байт.
- Пример: Байт 13 =
0x03
Байт 14 =0xE8
СО2 =(0x03 .
- Идентификатор служебных данных: Байт 0 (первый байт служебных данных).
- Указывает тип устройства. Ценить:
0x35
(53).
- Указывает тип устройства. Ценить:
Прошивка платы ESP32
Для сбора характеристик BLE от SwitchBot Meter Pro и Meter Pro (CO2) подойдет любой ESP32. Недавно я говорил о крошечная плата ESP, которую можно использовать в качестве прокси-сервера Bluetoothкоторый будет служить esp32_ble_tracker
для этой цели.
Мой базовый код для этой платы выглядит следующим образом:
esphome:
name: esp32-c3-super-mini
friendly_name: ESP32-C3 Super Mini
esp32:
board: esp32-c3-devkitm-1
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "XXXXX"
ota:
- platform: esphome
password: "XXXXX"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Esp32-C3-Super-Mini"
password: "XXXXX"
captive_portal:
Вы заметите, что я использую arduino
рамки вместо esp-idf
. Когда bluetooth_proxy
конфигурация включена, esp-idf
Framework рекомендуется, поскольку он использует меньше памяти и более стабилен. Для перехвата пакетов с пассивным esp32_ble_tracker
компонент, arduino
фреймворк работает лучше.
Полный код Meter Pro
Вот полный код для сбора данных SwitchBot Meter Pro BLE с помощью стандартной платы ESP32. Замените MAC-адрес и адаптируйте конфигурацию к вашей плате ESP32:
SwitchBot Meter Pro ESPHome (нажмите, чтобы развернуть)
esphome:
name: switchbot-meter-pro
friendly_name: SwitchBot Meter Pro
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "XXXXXXXX"
ota:
- platform: esphome
password: "XXXXXXXX"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Switchbot-Meter-Pro"
password: "XXXXXXXX"
captive_portal:
esp32_ble_tracker:
on_ble_advertise:
- mac_address: "XX:XX:XX:XX:XX:XX" # Meter Pro (Basic)
then:
- lambda: |-
for (auto data : x.get_manufacturer_datas()) {
if (data.data.size() >= 11) { // Ensure sufficient length for Basic version
// Parse temperature from Bytes 8-9
float temperature = (float(data.data(8) & 0x0F) * 0.1) + float(data.data(9) & 0x7F);
if (!(data.data(9) & 0x80)) {
temperature = -temperature;
}
id(meter_pro_temperature).publish_state(temperature);
// Parse humidity from Byte 10
uint8_t humidity = data.data(10) & 0x7F;
id(meter_pro_humidity).publish_state(humidity);
}
}
for (auto data : x.get_service_datas()) {
if (data.data.size() == 3) {
// Parse battery percentage from Byte 2
int8_t battery_pct = data.data(2) & 0x7F;
id(meter_pro_battery).publish_state(battery_pct);
}
}
sensor:
- platform: template
name: "Meter Pro Temperature"
id: meter_pro_temperature
unit_of_measurement: "°C"
accuracy_decimals: 1
icon: "mdi:thermometer"
- platform: template
name: "Meter Pro Humidity"
id: meter_pro_humidity
unit_of_measurement: "%"
accuracy_decimals: 0
icon: "mdi:water-percent"
- platform: template
name: "Meter Pro Battery"
id: meter_pro_battery
unit_of_measurement: "%"
accuracy_decimals: 0
icon: "mdi:battery"
Полный код Meter Pro (CO2)
Вот полный код для сбора данных SwitchBot Meter Pro (CO2) BLE с помощью стандартной платы ESP32. Замените MAC-адрес и адаптируйте конфигурацию к вашей плате ESP32.
SwitchBot Meter Pro (CO2) ESPHome (нажмите, чтобы развернуть)
esphome:
name: switchbot-meter-pro
friendly_name: SwitchBot Meter Pro (CO2)
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "XXXXXXXX"
ota:
- platform: esphome
password: "XXXXXXXX"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Switchbot-Meter-Pro"
password: "XXXXXXXX"
captive_portal:
esp32_ble_tracker:
on_ble_advertise:
- mac_address: "XX:XX:XX:XX:XX:XX" # Meter Pro (CO2)
then:
- lambda: |-
for (auto data : x.get_manufacturer_datas()) {
if (data.data.size() >= 15) { // Ensure sufficient length for CO2 version
// Parse temperature from Bytes 8-9
float temperature = (float(data.data(8) & 0x0F) * 0.1) + float(data.data(9) & 0x7F);
if (!(data.data(9) & 0x80)) {
temperature = -temperature;
}
id(meter_pro_co2_temperature).publish_state(temperature);
// Parse humidity from Byte 10
uint8_t humidity = data.data(10) & 0x7F;
id(meter_pro_co2_humidity).publish_state(humidity);
// Parse CO2 from Bytes 13-14
uint16_t co2 = (data.data(13)
Комбинированный код (оба устройства)
Вот полный код для сбора данных BLE обоих устройств с помощью стандартной платы ESP32. Замените MAC-адрес и адаптируйте конфигурацию к вашей плате ESP32.
SwitchBot Meter Pro и Meter Pro (CO2) ESPHome (нажмите, чтобы развернуть)
esphome:
name: switchbot-meter-pro
friendly_name: SwitchBot Meter Pro
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "XXXXXXXX"
ota:
- platform: esphome
password: "XXXXXXXX"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Switchbot-Meter-Pro"
password: "XXXXXXXX"
captive_portal:
esp32_ble_tracker:
on_ble_advertise:
- mac_address: "XX:XX:XX:XX:XX:XX" # Meter Pro (Basic)
then:
- lambda: |-
for (auto data : x.get_manufacturer_datas()) {
if (data.data.size() >= 11) { // Ensure sufficient length for Basic version
// Parse temperature from Bytes 8-9
float temperature = (float(data.data(8) & 0x0F) * 0.1) + float(data.data(9) & 0x7F);
if (!(data.data(9) & 0x80)) {
temperature = -temperature;
}
id(meter_pro_temperature).publish_state(temperature);
// Parse humidity from Byte 10
uint8_t humidity = data.data(10) & 0x7F;
id(meter_pro_humidity).publish_state(humidity);
}
}
for (auto data : x.get_service_datas()) {
if (data.data.size() == 3) {
// Parse battery percentage from Byte 2
int8_t battery_pct = data.data(2) & 0x7F;
id(meter_pro_battery).publish_state(battery_pct);
}
}
- mac_address: "XX:XX:XX:XX:XX:XX" # Meter Pro (CO2)
then:
- lambda: |-
for (auto data : x.get_manufacturer_datas()) {
if (data.data.size() >= 15) { // Ensure sufficient length for CO2 version
// Parse temperature from Bytes 8-9
float temperature = (float(data.data(8) & 0x0F) * 0.1) + float(data.data(9) & 0x7F);
if (!(data.data(9) & 0x80)) {
temperature = -temperature;
}
id(meter_pro_co2_temperature).publish_state(temperature);
// Parse humidity from Byte 10
uint8_t humidity = data.data(10) & 0x7F;
id(meter_pro_co2_humidity).publish_state(humidity);
// Parse CO2 from Bytes 13-14
uint16_t co2 = (data.data(13)
Доступность устройства
SwitchBot Meter Pro и Meter Pro (CO2) — отличные комнатные термометры и датчики качества воздуха. Вы можете приобрести их в официальном интернет-магазине SwitchBot или в различных магазинах Amazon по всему миру. Вот где они доступны: