9static const char *
const TAG =
"xiaomi_miscale";
12 ESP_LOGCONFIG(TAG,
"Xiaomi Miscale");
13 LOG_SENSOR(
" ",
"Weight", this->
weight_);
14 LOG_SENSOR(
" ",
"Impedance", this->
impedance_);
19 ESP_LOGVV(TAG,
"parse_device(): unknown MAC address.");
22 char addr_buf[MAC_ADDRESS_PRETTY_BUFFER_SIZE];
24 ESP_LOGVV(TAG,
"parse_device(): MAC address %s found.", addr_str);
38 if (res->weight.has_value() && this->weight_ !=
nullptr)
42 if (res->version == 1) {
43 ESP_LOGW(TAG,
"Impedance is only supported on version 2. Your scale was identified as version 1.");
45 if (res->impedance.has_value()) {
61 if (service_data.
uuid == esp32_ble_tracker::ESPBTUUID::from_uint16(0x181D) && service_data.
data.size() == 10) {
63 }
else if (service_data.
uuid == esp32_ble_tracker::ESPBTUUID::from_uint16(0x181B) && service_data.
data.size() == 13) {
66 char uuid_buf[esp32_ble::UUID_STR_LEN];
68 "parse_header(): Couldn't identify scale version or data size was not correct. UUID: %s, data_size: %d",
94 const uint8_t *data =
message.data();
97 const int16_t weight = uint16_t(data[1]) | (uint16_t(data[2]) << 8);
98 if (data[0] == 0x22 || data[0] == 0xa2) {
99 result.
weight = weight * 0.01f / 2.0f;
100 }
else if (data[0] == 0x12 || data[0] == 0xb2) {
101 result.
weight = weight * 0.01f * 0.6f;
102 }
else if (data[0] == 0x03 || data[0] == 0xb3) {
103 result.
weight = weight * 0.01f * 0.453592f;
120 const uint8_t *data =
message.data();
122 bool has_impedance = ((data[1] & (1 << 1)) != 0);
123 bool is_stabilized = ((data[1] & (1 << 5)) != 0);
124 bool load_removed = ((data[1] & (1 << 7)) != 0);
126 if (!is_stabilized || load_removed) {
131 const int16_t weight = uint16_t(data[11]) | (uint16_t(data[12]) << 8);
132 if (data[0] == 0x02) {
133 result.
weight = weight * 0.01f / 2.0f;
134 }
else if (data[0] == 0x03) {
135 result.
weight = weight * 0.01f * 0.453592f;
140 const int16_t impedance = uint16_t(data[9]) | (uint16_t(data[10]) << 8);
143 if (impedance == 0 || impedance >= 3000) {
152 if (!result.has_value()) {
153 ESP_LOGVV(TAG,
"report_results(): no results available.");
157 ESP_LOGD(TAG,
"Got Xiaomi Miscale v%d (%s):", result->version,
address);
159 if (result->weight.has_value()) {
160 ESP_LOGD(TAG,
" Weight: %.2fkg", *result->weight);
162 if (result->impedance.has_value()) {
163 ESP_LOGD(TAG,
" Impedance: %.0fohm", *result->impedance);
ESPDEPRECATED("Use to_str() instead. Removed in 2026.8.0", "2026.2.0") std const char * to_str(std::span< char, UUID_STR_LEN > output) const
uint64_t address_uint64() const
const char * address_str_to(std::span< char, MAC_ADDRESS_PRETTY_BUFFER_SIZE > buf) const
Format MAC address into provided buffer, returns pointer to buffer for convenience.
const std::vector< ServiceData > & get_service_datas() const
void publish_state(float state)
Publish a new state to the front-end.
bool parse_message_v1_(const std::vector< uint8_t > &message, ParseResult &result)
bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override
bool parse_message_(const std::vector< uint8_t > &message, ParseResult &result)
sensor::Sensor * impedance_
void dump_config() override
optional< ParseResult > parse_header_(const esp32_ble_tracker::ServiceData &service_data)
bool report_results_(const optional< ParseResult > &result, const char *address)
bool parse_message_v2_(const std::vector< uint8_t > &message, ParseResult &result)
const LogString * message
optional< float > impedance