[ble_device_base] Migrate BLE sensor platforms to the neutral layer (batch 12: xiaomi_miscale, xiaomi_mjyd02yla, xiaomi_mue4094rt) (#18180)

This commit is contained in:
Edvard Filistovič
2026-08-08 01:34:08 -05:00
committed by GitHub
parent 98f4854ecd
commit 252bb3333e
21 changed files with 140 additions and 60 deletions
+7 -6
View File
@@ -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_CLEAR_IMPEDANCE,
@@ -15,14 +15,15 @@ from esphome.const import (
UNIT_OHM,
)
DEPENDENCIES = ["esp32_ble_tracker"]
AUTO_LOAD = ["ble_device_base"]
xiaomi_miscale_ns = cg.esphome_ns.namespace("xiaomi_miscale")
XiaomiMiscale = xiaomi_miscale_ns.class_(
"XiaomiMiscale", esp32_ble_tracker.ESPBTDeviceListener, cg.Component
"XiaomiMiscale", ble_device_base.ESPBTDeviceListener, cg.Component
)
CONFIG_SCHEMA = (
CONFIG_SCHEMA = cv.All(
ble_device_base.rename_legacy_hub_id("xiaomi_miscale"),
cv.Schema(
{
cv.GenerateID(): cv.declare_id(XiaomiMiscale),
@@ -43,15 +44,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_clear_impedance(config[CONF_CLEAR_IMPEDANCE]))
@@ -1,9 +1,7 @@
#include "xiaomi_miscale.h"
#include "esphome/components/esp32_ble/ble_uuid.h"
#include "esphome/components/ble_device_base/ble_device.h"
#include "esphome/core/log.h"
#ifdef USE_ESP32
namespace esphome::xiaomi_miscale {
static const char *const TAG = "xiaomi_miscale";
@@ -14,7 +12,7 @@ void XiaomiMiscale::dump_config() {
LOG_SENSOR(" ", "Impedance", this->impedance_);
}
bool XiaomiMiscale::parse_device(const esp32_ble_tracker::ESPBTDevice &device) {
bool XiaomiMiscale::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,14 +54,14 @@ bool XiaomiMiscale::parse_device(const esp32_ble_tracker::ESPBTDevice &device) {
return success;
}
optional<ParseResult> XiaomiMiscale::parse_header_(const esp32_ble_tracker::ServiceData &service_data) {
optional<ParseResult> XiaomiMiscale::parse_header_(const ble_device_base::ServiceData &service_data) {
ParseResult result;
if (service_data.uuid == esp32_ble_tracker::ESPBTUUID::from_uint16(0x181D) && service_data.data.size() == 10) {
if (service_data.uuid == ble_device_base::ESPBTUUID::from_uint16(0x181D) && service_data.data.size() == 10) {
result.version = 1;
} else if (service_data.uuid == esp32_ble_tracker::ESPBTUUID::from_uint16(0x181B) && service_data.data.size() == 13) {
} else if (service_data.uuid == ble_device_base::ESPBTUUID::from_uint16(0x181B) && service_data.data.size() == 13) {
result.version = 2;
} else {
char uuid_buf[esp32_ble::UUID_STR_LEN];
char uuid_buf[ble_device_base::UUID_STR_LEN];
ESP_LOGVV(TAG,
"parse_header(): Couldn't identify scale version or data size was not correct. UUID: %s, data_size: %d",
service_data.uuid.to_str(uuid_buf), service_data.data.size());
@@ -167,5 +165,3 @@ bool XiaomiMiscale::report_results_(const optional<ParseResult> &result, const c
}
} // namespace esphome::xiaomi_miscale
#endif
@@ -2,12 +2,10 @@
#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 <vector>
#ifdef USE_ESP32
namespace esphome::xiaomi_miscale {
struct ParseResult {
@@ -16,11 +14,11 @@ struct ParseResult {
optional<float> impedance;
};
class XiaomiMiscale final : public Component, public esp32_ble_tracker::ESPBTDeviceListener {
class XiaomiMiscale final : public Component, 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_weight(sensor::Sensor *weight) { weight_ = weight; }
void set_impedance(sensor::Sensor *impedance) { impedance_ = impedance; }
@@ -32,7 +30,7 @@ class XiaomiMiscale final : public Component, public esp32_ble_tracker::ESPBTDev
sensor::Sensor *impedance_{nullptr};
bool clear_impedance_{false};
optional<ParseResult> parse_header_(const esp32_ble_tracker::ServiceData &service_data);
optional<ParseResult> parse_header_(const ble_device_base::ServiceData &service_data);
bool parse_message_(const std::vector<uint8_t> &message, ParseResult &result);
bool parse_message_v1_(const std::vector<uint8_t> &message, ParseResult &result);
bool parse_message_v2_(const std::vector<uint8_t> &message, ParseResult &result);
@@ -40,5 +38,3 @@ class XiaomiMiscale final : public Component, public esp32_ble_tracker::ESPBTDev
};
} // namespace esphome::xiaomi_miscale
#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,
@@ -20,18 +20,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_mjyd02yla_ns = cg.esphome_ns.namespace("xiaomi_mjyd02yla")
XiaomiMJYD02YLA = xiaomi_mjyd02yla_ns.class_(
"XiaomiMJYD02YLA",
binary_sensor.BinarySensor,
cg.Component,
esp32_ble_tracker.ESPBTDeviceListener,
ble_device_base.ESPBTDeviceListener,
)
CONFIG_SCHEMA = cv.All(
ble_device_base.rename_legacy_hub_id("xiaomi_mjyd02yla"),
binary_sensor.binary_sensor_schema(
XiaomiMJYD02YLA, device_class=DEVICE_CLASS_MOTION
)
@@ -63,15 +63,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))
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_mjyd02yla {
static const char *const TAG = "xiaomi_mjyd02yla";
@@ -17,7 +15,7 @@ void XiaomiMJYD02YLA::dump_config() {
LOG_SENSOR(" ", "Illuminance", this->illuminance_);
}
bool XiaomiMJYD02YLA::parse_device(const esp32_ble_tracker::ESPBTDevice &device) {
bool XiaomiMJYD02YLA::parse_device(const ble_device_base::ESPBTDevice &device) {
if (device.address_uint64() != this->address_) {
ESP_LOGVV(TAG, "parse_device(): unknown MAC address.");
return false;
@@ -65,5 +63,3 @@ bool XiaomiMJYD02YLA::parse_device(const esp32_ble_tracker::ESPBTDevice &device)
void XiaomiMJYD02YLA::set_bindkey(const char *bindkey) { parse_hex(bindkey, this->bindkey_, sizeof(this->bindkey_)); }
} // namespace esphome::xiaomi_mjyd02yla
#endif
@@ -3,21 +3,19 @@
#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_mjyd02yla {
class XiaomiMJYD02YLA 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; }
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_idle_time(sensor::Sensor *idle_time) { idle_time_ = idle_time; }
@@ -35,5 +33,3 @@ class XiaomiMJYD02YLA final : public Component,
};
} // namespace esphome::xiaomi_mjyd02yla
#endif
@@ -1,21 +1,21 @@
from esphome import core
import esphome.codegen as cg
from esphome.components import binary_sensor, esp32_ble_tracker
from esphome.components import binary_sensor, ble_device_base
import esphome.config_validation as cv
from esphome.const import CONF_MAC_ADDRESS, CONF_TIMEOUT, DEVICE_CLASS_MOTION
DEPENDENCIES = ["esp32_ble_tracker"]
AUTO_LOAD = ["xiaomi_ble"]
AUTO_LOAD = ["ble_device_base", "xiaomi_ble"]
xiaomi_mue4094rt_ns = cg.esphome_ns.namespace("xiaomi_mue4094rt")
XiaomiMUE4094RT = xiaomi_mue4094rt_ns.class_(
"XiaomiMUE4094RT",
binary_sensor.BinarySensor,
cg.Component,
esp32_ble_tracker.ESPBTDeviceListener,
ble_device_base.ESPBTDeviceListener,
)
CONFIG_SCHEMA = cv.All(
ble_device_base.rename_legacy_hub_id("xiaomi_mue4094rt"),
binary_sensor.binary_sensor_schema(
XiaomiMUE4094RT, device_class=DEVICE_CLASS_MOTION
)
@@ -28,15 +28,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))
cg.add(var.set_time(config[CONF_TIMEOUT]))
@@ -1,8 +1,6 @@
#include "xiaomi_mue4094rt.h"
#include "esphome/core/log.h"
#ifdef USE_ESP32
namespace esphome::xiaomi_mue4094rt {
static const char *const TAG = "xiaomi_mue4094rt";
@@ -12,7 +10,7 @@ void XiaomiMUE4094RT::dump_config() {
LOG_BINARY_SENSOR(" ", "Motion", this);
}
bool XiaomiMUE4094RT::parse_device(const esp32_ble_tracker::ESPBTDevice &device) {
bool XiaomiMUE4094RT::parse_device(const ble_device_base::ESPBTDevice &device) {
if (device.address_uint64() != this->address_) {
ESP_LOGVV(TAG, "parse_device(): unknown MAC address.");
return false;
@@ -51,5 +49,3 @@ bool XiaomiMUE4094RT::parse_device(const esp32_ble_tracker::ESPBTDevice &device)
}
} // namespace esphome::xiaomi_mue4094rt
#endif
@@ -2,20 +2,18 @@
#include "esphome/core/component.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_mue4094rt {
class XiaomiMUE4094RT 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_time(uint16_t timeout) { timeout_ = timeout; }
@@ -26,5 +24,3 @@ class XiaomiMUE4094RT final : public Component,
};
} // namespace esphome::xiaomi_mue4094rt
#endif
@@ -0,0 +1,7 @@
sensor:
- platform: xiaomi_miscale
mac_address: '5C:CA:D3:70:D4:A2'
weight:
name: "Xiaomi Mi Scale Weight"
impedance:
name: "Xiaomi Mi Scale Impedance"
@@ -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_miscale
ble_hub_id: ble_tracker_hub
mac_address: '5C:CA:D3:70:D4:A2'
weight:
name: "Xiaomi Mi Scale Weight"
@@ -0,0 +1,3 @@
packages:
ln882h_ble_tracker: !include ../ln882h_ble_tracker/common.yaml
xiaomi_miscale: !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
sensor:
# Explicit ble_hub_id: pins the neutral binding as a declared key.
- platform: xiaomi_miscale
ble_hub_id: ble_tracker_hub
mac_address: '5C:CA:D3:70:D4:A2'
weight:
name: "Xiaomi Mi Scale Weight"
impedance:
name: "Xiaomi Mi Scale Impedance"
# No ble_hub_id: exercises the generated binding real configs use.
- platform: xiaomi_miscale
mac_address: '5C:CA:D3:70:D4:A3'
weight:
name: "BK Xiaomi Mi Scale Implicit Weight"
@@ -0,0 +1,11 @@
binary_sensor:
- platform: xiaomi_mjyd02yla
name: MJYD02YL-A Motion
mac_address: 50:EC:50:CD:32:02
bindkey: 48403ebe2d385db8d0c187f81e62cb64
idle_time:
name: MJYD02YL-A Idle Time
light:
name: MJYD02YL-A Light Status
battery_level:
name: MJYD02YL-A 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_mjyd02yla
ble_hub_id: ble_tracker_hub
name: MJYD02YL-A Motion
mac_address: 50:EC:50:CD:32:02
bindkey: 48403ebe2d385db8d0c187f81e62cb64
@@ -0,0 +1,3 @@
packages:
ln882h_ble_tracker: !include ../ln882h_ble_tracker/common.yaml
xiaomi_mjyd02yla: !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
binary_sensor:
# Explicit ble_hub_id: pins the neutral binding as a declared key.
- platform: xiaomi_mjyd02yla
ble_hub_id: ble_tracker_hub
name: MJYD02YL-A Motion
mac_address: 50:EC:50:CD:32:02
bindkey: 48403ebe2d385db8d0c187f81e62cb64
idle_time:
name: MJYD02YL-A Idle Time
light:
name: MJYD02YL-A Light Status
battery_level:
name: MJYD02YL-A Battery Level
# No ble_hub_id: exercises the generated binding real configs use.
- platform: xiaomi_mjyd02yla
name: BK MJYD02YL-A Implicit Motion
mac_address: 50:EC:50:CD:32:03
bindkey: 48403ebe2d385db8d0c187f81e62cb64
@@ -0,0 +1,5 @@
binary_sensor:
- platform: xiaomi_mue4094rt
name: MUE4094RT Motion
mac_address: 7A:80:8E:19:36:BA
timeout: 5s
@@ -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_mue4094rt
ble_hub_id: ble_tracker_hub
name: MUE4094RT Motion
mac_address: 7A:80:8E:19:36:BA
timeout: 5s
@@ -0,0 +1,3 @@
packages:
ln882h_ble_tracker: !include ../ln882h_ble_tracker/common.yaml
xiaomi_mue4094rt: !include common-ln.yaml
@@ -0,0 +1,18 @@
# 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_mue4094rt
ble_hub_id: ble_tracker_hub
name: MUE4094RT Motion
mac_address: 7A:80:8E:19:36:BA
timeout: 5s
# No ble_hub_id: exercises the generated binding real configs use.
- platform: xiaomi_mue4094rt
name: BK MUE4094RT Implicit Motion
mac_address: 7A:80:8E:19:36:BB
timeout: 5s