[ble_device_base] Migrate BLE sensor platforms to the neutral layer (batch 13: xiaomi_rtcgq02lm, xiaomi_wx08zm, xiaomi_xmwsdj04mmc) (#18183)

This commit is contained in:
Edvard Filistovič
2026-08-08 02:06:40 -05:00
committed by GitHub
parent 2730c10c2c
commit 68acc055bf
21 changed files with 164 additions and 56 deletions
@@ -1,19 +1,19 @@
import esphome.codegen as cg
from esphome.components import esp32_ble_tracker
from esphome.components import ble_device_base
import esphome.config_validation as cv
from esphome.const import CONF_BINDKEY, CONF_ID, CONF_MAC_ADDRESS
AUTO_LOAD = ["xiaomi_ble"]
AUTO_LOAD = ["ble_device_base", "xiaomi_ble"]
CODEOWNERS = ["@jesserockz"]
DEPENDENCIES = ["esp32_ble_tracker"]
MULTI_CONF = True
xiaomi_rtcgq02lm_ns = cg.esphome_ns.namespace("xiaomi_rtcgq02lm")
XiaomiRTCGQ02LM = xiaomi_rtcgq02lm_ns.class_(
"XiaomiRTCGQ02LM", esp32_ble_tracker.ESPBTDeviceListener, cg.Component
"XiaomiRTCGQ02LM", ble_device_base.ESPBTDeviceListener, cg.Component
)
CONFIG_SCHEMA = (
CONFIG_SCHEMA = cv.All(
ble_device_base.rename_legacy_hub_id("xiaomi_rtcgq02lm"),
cv.Schema(
{
cv.GenerateID(): cv.declare_id(XiaomiRTCGQ02LM),
@@ -21,15 +21,15 @@ CONFIG_SCHEMA = (
cv.Required(CONF_MAC_ADDRESS): cv.mac_address,
}
)
.extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA)
.extend(cv.COMPONENT_SCHEMA)
.extend(ble_device_base.BLE_DEVICE_SCHEMA),
)
async def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
await esp32_ble_tracker.register_ble_device(var, config)
await ble_device_base.register_ble_device(var, config)
cg.add(var.set_address(config[CONF_MAC_ADDRESS].as_hex))
cg.add(var.set_bindkey(config[CONF_BINDKEY]))
@@ -2,8 +2,6 @@
#include "esphome/core/helpers.h"
#include "esphome/core/log.h"
#ifdef USE_ESP32
namespace esphome::xiaomi_rtcgq02lm {
static const char *const TAG = "xiaomi_rtcgq02lm";
@@ -24,7 +22,7 @@ void XiaomiRTCGQ02LM::dump_config() {
#endif
}
bool XiaomiRTCGQ02LM::parse_device(const esp32_ble_tracker::ESPBTDevice &device) {
bool XiaomiRTCGQ02LM::parse_device(const ble_device_base::ESPBTDevice &device) {
if (device.address_uint64() != this->address_) {
ESP_LOGVV(TAG, "parse_device(): unknown MAC address.");
return false;
@@ -79,5 +77,3 @@ bool XiaomiRTCGQ02LM::parse_device(const esp32_ble_tracker::ESPBTDevice &device)
void XiaomiRTCGQ02LM::set_bindkey(const char *bindkey) { parse_hex(bindkey, this->bindkey_, sizeof(this->bindkey_)); }
} // namespace esphome::xiaomi_rtcgq02lm
#endif
@@ -1,6 +1,6 @@
#pragma once
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
#include "esphome/components/ble_device_base/ble_device.h"
#include "esphome/core/defines.h"
#ifdef USE_BINARY_SENSOR
#include "esphome/components/binary_sensor/binary_sensor.h"
@@ -11,16 +11,14 @@
#include "esphome/components/xiaomi_ble/xiaomi_ble.h"
#include "esphome/core/component.h"
#ifdef USE_ESP32
namespace esphome::xiaomi_rtcgq02lm {
class XiaomiRTCGQ02LM final : public Component, public esp32_ble_tracker::ESPBTDeviceListener {
class XiaomiRTCGQ02LM final : public Component, public ble_device_base::ESPBTDeviceListener {
public:
void set_address(uint64_t address) { address_ = address; };
void set_bindkey(const char *bindkey);
bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
bool parse_device(const ble_device_base::ESPBTDevice &device) override;
void dump_config() override;
#ifdef USE_BINARY_SENSOR
@@ -54,5 +52,3 @@ class XiaomiRTCGQ02LM final : public Component, public esp32_ble_tracker::ESPBTD
};
} // namespace esphome::xiaomi_rtcgq02lm
#endif
@@ -1,5 +1,5 @@
import esphome.codegen as cg
from esphome.components import binary_sensor, esp32_ble_tracker, sensor
from esphome.components import binary_sensor, ble_device_base, sensor
import esphome.config_validation as cv
from esphome.const import (
CONF_BATTERY_LEVEL,
@@ -12,18 +12,18 @@ from esphome.const import (
UNIT_PERCENT,
)
DEPENDENCIES = ["esp32_ble_tracker"]
AUTO_LOAD = ["xiaomi_ble", "sensor"]
AUTO_LOAD = ["ble_device_base", "xiaomi_ble", "sensor"]
xiaomi_wx08zm_ns = cg.esphome_ns.namespace("xiaomi_wx08zm")
XiaomiWX08ZM = xiaomi_wx08zm_ns.class_(
"XiaomiWX08ZM",
binary_sensor.BinarySensor,
esp32_ble_tracker.ESPBTDeviceListener,
ble_device_base.ESPBTDeviceListener,
cg.Component,
)
CONFIG_SCHEMA = cv.All(
ble_device_base.rename_legacy_hub_id("xiaomi_wx08zm"),
binary_sensor.binary_sensor_schema(XiaomiWX08ZM)
.extend(
{
@@ -43,15 +43,15 @@ CONFIG_SCHEMA = cv.All(
),
}
)
.extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA)
.extend(cv.COMPONENT_SCHEMA)
.extend(ble_device_base.BLE_DEVICE_SCHEMA),
)
async def to_code(config):
var = await binary_sensor.new_binary_sensor(config)
await cg.register_component(var, config)
await esp32_ble_tracker.register_ble_device(var, config)
await ble_device_base.register_ble_device(var, config)
cg.add(var.set_address(config[CONF_MAC_ADDRESS].as_hex))
@@ -1,8 +1,6 @@
#include "xiaomi_wx08zm.h"
#include "esphome/core/log.h"
#ifdef USE_ESP32
namespace esphome::xiaomi_wx08zm {
static const char *const TAG = "xiaomi_wx08zm";
@@ -14,7 +12,7 @@ void XiaomiWX08ZM::dump_config() {
LOG_SENSOR(" ", "Battery Level", this->battery_level_);
}
bool XiaomiWX08ZM::parse_device(const esp32_ble_tracker::ESPBTDevice &device) {
bool XiaomiWX08ZM::parse_device(const ble_device_base::ESPBTDevice &device) {
if (device.address_uint64() != this->address_) {
ESP_LOGVV(TAG, "parse_device(): unknown MAC address.");
return false;
@@ -56,5 +54,3 @@ bool XiaomiWX08ZM::parse_device(const esp32_ble_tracker::ESPBTDevice &device) {
}
} // namespace esphome::xiaomi_wx08zm
#endif
@@ -3,20 +3,18 @@
#include "esphome/core/component.h"
#include "esphome/components/sensor/sensor.h"
#include "esphome/components/binary_sensor/binary_sensor.h"
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
#include "esphome/components/ble_device_base/ble_device.h"
#include "esphome/components/xiaomi_ble/xiaomi_ble.h"
#ifdef USE_ESP32
namespace esphome::xiaomi_wx08zm {
class XiaomiWX08ZM final : public Component,
public binary_sensor::BinarySensorInitiallyOff,
public esp32_ble_tracker::ESPBTDeviceListener {
public ble_device_base::ESPBTDeviceListener {
public:
void set_address(uint64_t address) { address_ = address; }
bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
bool parse_device(const ble_device_base::ESPBTDevice &device) override;
void dump_config() override;
void set_tablet(sensor::Sensor *tablet) { tablet_ = tablet; }
@@ -29,5 +27,3 @@ class XiaomiWX08ZM final : public Component,
};
} // namespace esphome::xiaomi_wx08zm
#endif
@@ -1,5 +1,5 @@
import esphome.codegen as cg
from esphome.components import esp32_ble_tracker, sensor
from esphome.components import ble_device_base, sensor
import esphome.config_validation as cv
from esphome.const import (
CONF_BATTERY_LEVEL,
@@ -17,16 +17,16 @@ from esphome.const import (
UNIT_PERCENT,
)
AUTO_LOAD = ["xiaomi_ble"]
AUTO_LOAD = ["ble_device_base", "xiaomi_ble"]
CODEOWNERS = ["@medusalix"]
DEPENDENCIES = ["esp32_ble_tracker"]
xiaomi_xmwsdj04mmc_ns = cg.esphome_ns.namespace("xiaomi_xmwsdj04mmc")
XiaomiXMWSDJ04MMC = xiaomi_xmwsdj04mmc_ns.class_(
"XiaomiXMWSDJ04MMC", esp32_ble_tracker.ESPBTDeviceListener, cg.Component
"XiaomiXMWSDJ04MMC", ble_device_base.ESPBTDeviceListener, cg.Component
)
CONFIG_SCHEMA = (
CONFIG_SCHEMA = cv.All(
ble_device_base.rename_legacy_hub_id("xiaomi_xmwsdj04mmc"),
cv.Schema(
{
cv.GenerateID(): cv.declare_id(XiaomiXMWSDJ04MMC),
@@ -53,15 +53,15 @@ CONFIG_SCHEMA = (
),
}
)
.extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA)
.extend(cv.COMPONENT_SCHEMA)
.extend(ble_device_base.BLE_DEVICE_SCHEMA),
)
async def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
await esp32_ble_tracker.register_ble_device(var, config)
await ble_device_base.register_ble_device(var, config)
cg.add(var.set_address(config[CONF_MAC_ADDRESS].as_hex))
cg.add(var.set_bindkey(config[CONF_BINDKEY]))
@@ -2,8 +2,6 @@
#include "esphome/core/helpers.h"
#include "esphome/core/log.h"
#ifdef USE_ESP32
namespace esphome::xiaomi_xmwsdj04mmc {
static const char *const TAG = "xiaomi_xmwsdj04mmc";
@@ -21,7 +19,7 @@ void XiaomiXMWSDJ04MMC::dump_config() {
LOG_SENSOR(" ", "Battery Level", this->battery_level_);
}
bool XiaomiXMWSDJ04MMC::parse_device(const esp32_ble_tracker::ESPBTDevice &device) {
bool XiaomiXMWSDJ04MMC::parse_device(const ble_device_base::ESPBTDevice &device) {
if (device.address_uint64() != this->address_) {
ESP_LOGVV(TAG, "parse_device(): unknown MAC address.");
return false;
@@ -69,5 +67,3 @@ bool XiaomiXMWSDJ04MMC::parse_device(const esp32_ble_tracker::ESPBTDevice &devic
void XiaomiXMWSDJ04MMC::set_bindkey(const char *bindkey) { parse_hex(bindkey, this->bindkey_, sizeof(this->bindkey_)); }
} // namespace esphome::xiaomi_xmwsdj04mmc
#endif
@@ -2,19 +2,17 @@
#include "esphome/core/component.h"
#include "esphome/components/sensor/sensor.h"
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
#include "esphome/components/ble_device_base/ble_device.h"
#include "esphome/components/xiaomi_ble/xiaomi_ble.h"
#ifdef USE_ESP32
namespace esphome::xiaomi_xmwsdj04mmc {
class XiaomiXMWSDJ04MMC final : public Component, public esp32_ble_tracker::ESPBTDeviceListener {
class XiaomiXMWSDJ04MMC final : public Component, public ble_device_base::ESPBTDeviceListener {
public:
void set_address(uint64_t address) { this->address_ = address; }
void set_bindkey(const char *bindkey);
bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
bool parse_device(const ble_device_base::ESPBTDevice &device) override;
void dump_config() override;
void set_temperature(sensor::Sensor *temperature) { this->temperature_ = temperature; }
@@ -30,5 +28,3 @@ class XiaomiXMWSDJ04MMC final : public Component, public esp32_ble_tracker::ESPB
};
} // namespace esphome::xiaomi_xmwsdj04mmc
#endif
@@ -0,0 +1,20 @@
xiaomi_rtcgq02lm:
- id: motion_rtcgq02lm
mac_address: 01:02:03:04:05:06
bindkey: "48403ebe2d385db8d0c187f81e62cb64"
binary_sensor:
- platform: xiaomi_rtcgq02lm
id: motion_rtcgq02lm
motion:
name: Mi Motion Sensor 2
light:
name: Mi Motion Sensor 2 Light
button:
name: Mi Motion Sensor 2 Button
sensor:
- platform: xiaomi_rtcgq02lm
id: motion_rtcgq02lm
battery_level:
name: Mi Motion Sensor 2 Battery level
@@ -1,7 +1,10 @@
esp32_ble_tracker:
id: ble_tracker_hub
# Explicit ble_hub_id: pins the neutral binding as a declared key.
xiaomi_rtcgq02lm:
- id: motion_rtcgq02lm
ble_hub_id: ble_tracker_hub
mac_address: 01:02:03:04:05:06
bindkey: "48403ebe2d385db8d0c187f81e62cb64"
@@ -0,0 +1,3 @@
packages:
ln882h_ble_tracker: !include ../ln882h_ble_tracker/common.yaml
xiaomi_rtcgq02lm: !include common-ln.yaml
@@ -0,0 +1,32 @@
# Config-only: the CI base board (generic-bk7252, BLE 4.2) cannot compile the
# BLE 5.x tracker, so this fixture proves validation (schema + neutral binding)
# on a non-esp32 platform; codegen and compilation are not exercised here.
bk72xx_ble_tracker:
id: ble_tracker_hub
# Explicit ble_hub_id: pins the neutral binding as a declared key.
xiaomi_rtcgq02lm:
- id: motion_rtcgq02lm
ble_hub_id: ble_tracker_hub
mac_address: 01:02:03:04:05:06
bindkey: "48403ebe2d385db8d0c187f81e62cb64"
# No ble_hub_id: exercises the generated binding real configs use.
- id: motion_rtcgq02lm_implicit
mac_address: 01:02:03:04:05:07
bindkey: "48403ebe2d385db8d0c187f81e62cb64"
binary_sensor:
- platform: xiaomi_rtcgq02lm
id: motion_rtcgq02lm
motion:
name: Mi Motion Sensor 2
light:
name: Mi Motion Sensor 2 Light
button:
name: Mi Motion Sensor 2 Button
sensor:
- platform: xiaomi_rtcgq02lm
id: motion_rtcgq02lm
battery_level:
name: Mi Motion Sensor 2 Battery level
@@ -0,0 +1,8 @@
binary_sensor:
- platform: xiaomi_wx08zm
name: WX08ZM Activation State
mac_address: 74:a3:4a:b5:07:34
tablet:
name: WX08ZM Tablet Resource
battery_level:
name: WX08ZM Battery Level
@@ -1,7 +1,10 @@
esp32_ble_tracker:
id: ble_tracker_hub
binary_sensor:
# Explicit ble_hub_id: pins the neutral binding as a declared key.
- platform: xiaomi_wx08zm
ble_hub_id: ble_tracker_hub
name: WX08ZM Activation State
mac_address: 74:a3:4a:b5:07:34
tablet:
@@ -0,0 +1,3 @@
packages:
ln882h_ble_tracker: !include ../ln882h_ble_tracker/common.yaml
xiaomi_wx08zm: !include common-ln.yaml
@@ -0,0 +1,20 @@
# Config-only: the CI base board (generic-bk7252, BLE 4.2) cannot compile the
# BLE 5.x tracker, so this fixture proves validation (schema + neutral binding)
# on a non-esp32 platform; codegen and compilation are not exercised here.
bk72xx_ble_tracker:
id: ble_tracker_hub
binary_sensor:
# Explicit ble_hub_id: pins the neutral binding as a declared key.
- platform: xiaomi_wx08zm
ble_hub_id: ble_tracker_hub
name: WX08ZM Activation State
mac_address: 74:a3:4a:b5:07:34
tablet:
name: WX08ZM Tablet Resource
battery_level:
name: WX08ZM Battery Level
# No ble_hub_id: exercises the generated binding real configs use.
- platform: xiaomi_wx08zm
name: BK WX08ZM Implicit Activation State
mac_address: 74:a3:4a:b5:07:35
@@ -0,0 +1,10 @@
sensor:
- platform: xiaomi_xmwsdj04mmc
mac_address: 84:B4:DB:5D:A3:8F
bindkey: d8ca2ed09bb5541dc8f045ca360b00ea
temperature:
name: Xiaomi XMWSDJ04MMC Temperature
humidity:
name: Xiaomi XMWSDJ04MMC Humidity
battery_level:
name: Xiaomi XMWSDJ04MMC Battery Level
@@ -1,7 +1,10 @@
esp32_ble_tracker:
id: ble_tracker_hub
sensor:
# Explicit ble_hub_id: pins the neutral binding as a declared key.
- platform: xiaomi_xmwsdj04mmc
ble_hub_id: ble_tracker_hub
mac_address: 84:B4:DB:5D:A3:8F
bindkey: d8ca2ed09bb5541dc8f045ca360b00ea
temperature:
@@ -0,0 +1,3 @@
packages:
ln882h_ble_tracker: !include ../ln882h_ble_tracker/common.yaml
xiaomi_xmwsdj04mmc: !include common-ln.yaml
@@ -0,0 +1,24 @@
# Config-only: the CI base board (generic-bk7252, BLE 4.2) cannot compile the
# BLE 5.x tracker, so this fixture proves validation (schema + neutral binding)
# on a non-esp32 platform; codegen and compilation are not exercised here.
bk72xx_ble_tracker:
id: ble_tracker_hub
sensor:
# Explicit ble_hub_id: pins the neutral binding as a declared key.
- platform: xiaomi_xmwsdj04mmc
ble_hub_id: ble_tracker_hub
mac_address: 84:B4:DB:5D:A3:8F
bindkey: d8ca2ed09bb5541dc8f045ca360b00ea
temperature:
name: Xiaomi XMWSDJ04MMC Temperature
humidity:
name: Xiaomi XMWSDJ04MMC Humidity
battery_level:
name: Xiaomi XMWSDJ04MMC Battery Level
# No ble_hub_id: exercises the generated binding real configs use.
- platform: xiaomi_xmwsdj04mmc
mac_address: 84:B4:DB:5D:A3:90
bindkey: d8ca2ed09bb5541dc8f045ca360b00ea
temperature:
name: BK Xiaomi XMWSDJ04MMC Implicit Temperature