mirror of
https://github.com/esphome/esphome.git
synced 2024-11-26 08:55:22 +01:00
removed references to xiaomi_ble
This commit is contained in:
parent
22e90fdfe2
commit
fc0ddc53b8
3 changed files with 95 additions and 12 deletions
|
@ -24,21 +24,14 @@ bool ATCMiThermometer::parse_device(const esp32_ble_tracker::ESPBTDevice &device
|
||||||
|
|
||||||
bool success = false;
|
bool success = false;
|
||||||
for (auto &service_data : device.get_service_datas()) {
|
for (auto &service_data : device.get_service_datas()) {
|
||||||
auto res = xiaomi_ble::parse_xiaomi_header(service_data);
|
auto res = parse_header(service_data);
|
||||||
if (!res.has_value()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (res->is_duplicate) {
|
if (res->is_duplicate) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (res->has_encryption) {
|
if (!(parse_message(service_data.data, *res))) {
|
||||||
ESP_LOGVV(TAG, "parse_device(): payload decryption is currently not supported on this device.");
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!(xiaomi_ble::parse_xiaomi_message(service_data.data, *res))) {
|
if (!(report_results(res, device.address_str()))) {
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!(xiaomi_ble::report_xiaomi_results(res, device.address_str()))) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (res->temperature.has_value() && this->temperature_ != nullptr)
|
if (res->temperature.has_value() && this->temperature_ != nullptr)
|
||||||
|
@ -57,6 +50,86 @@ bool ATCMiThermometer::parse_device(const esp32_ble_tracker::ESPBTDevice &device
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
optional<ParseResult> ATCMiThermometer::parse_header(const esp32_ble_tracker::ServiceData &service_data) {
|
||||||
|
ParseResult result;
|
||||||
|
if (!service_data.uuid.contains(0x18, 0x1A)) {
|
||||||
|
ESP_LOGVV(TAG, "parse_header(): no service data UUID magic bytes.");
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
auto raw = service_data.data;
|
||||||
|
|
||||||
|
static uint8_t last_frame_count = 0;
|
||||||
|
if (last_frame_count == raw[16]) {
|
||||||
|
ESP_LOGVV(TAG, "parse_xiaomi_header(): duplicate data packet received (%d).", static_cast<int>(last_frame_count));
|
||||||
|
result.is_duplicate = true;
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
last_frame_count = raw[16];
|
||||||
|
result.is_duplicate = false;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ATCMiThermometer::parse_message(const std::vector<uint8_t> &message, ParseResult &result) {
|
||||||
|
|
||||||
|
// Byte 5-10 mac in correct order
|
||||||
|
// Byte 11-12 Temperature in uint16
|
||||||
|
// Byte 13 Humidity in percent
|
||||||
|
// Byte 14 Battery in percent
|
||||||
|
// Byte 15-16 Battery in mV uint16_t
|
||||||
|
// Byte 17 frame packet counter
|
||||||
|
|
||||||
|
const uint8_t *raw = message.data();
|
||||||
|
const uint8_t *data = raw + 3;
|
||||||
|
|
||||||
|
if (message.size() != 17) {
|
||||||
|
ESP_LOGVV(TAG, "parse_message(): payload has wrong size (%d)!", data_length);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// temperature, 2 bytes, 16-bit signed integer (LE), 0.1 °C
|
||||||
|
else if (raw[0] == 0x04) {
|
||||||
|
const int16_t temperature = uint16_t(data[0]) | (uint16_t(data[1]) << 8);
|
||||||
|
result.temperature = temperature / 10.0f;
|
||||||
|
}
|
||||||
|
// humidity, 2 bytes, 16-bit signed integer (LE), 0.1 %
|
||||||
|
else if (raw[0] == 0x06) {
|
||||||
|
const int16_t humidity = uint16_t(data[0]) | (uint16_t(data[1]) << 8);
|
||||||
|
result.humidity = humidity / 10.0f;
|
||||||
|
}
|
||||||
|
// battery, 1 byte, 8-bit unsigned integer, 1 %
|
||||||
|
else if (raw[0] == 0x0A) {
|
||||||
|
result.battery_level = data[0];
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ATCMiThermometer::report_results(const optional<ParseResult> &result, const std::string &address) {
|
||||||
|
if (!result.has_value()) {
|
||||||
|
ESP_LOGVV(TAG, "report_results(): no results available.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "Got ATC MiThermometer (%s):", address.c_str());
|
||||||
|
|
||||||
|
if (result->temperature.has_value()) {
|
||||||
|
ESP_LOGD(TAG, " Temperature: %.1f°C", *result->temperature);
|
||||||
|
}
|
||||||
|
if (result->humidity.has_value()) {
|
||||||
|
ESP_LOGD(TAG, " Humidity: %.1f%%", *result->humidity);
|
||||||
|
}
|
||||||
|
if (result->battery_level.has_value()) {
|
||||||
|
ESP_LOGD(TAG, " Battery Level: %.0f%%", *result->battery_level);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace atc_mithermometer
|
} // namespace atc_mithermometer
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
||||||
|
|
|
@ -3,13 +3,20 @@
|
||||||
#include "esphome/core/component.h"
|
#include "esphome/core/component.h"
|
||||||
#include "esphome/components/sensor/sensor.h"
|
#include "esphome/components/sensor/sensor.h"
|
||||||
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
|
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
|
||||||
#include "esphome/components/xiaomi_ble/xiaomi_ble.h"
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace atc_mithermometer {
|
namespace atc_mithermometer {
|
||||||
|
|
||||||
|
struct ParseResult {
|
||||||
|
optional<float> temperature;
|
||||||
|
optional<float> humidity;
|
||||||
|
optional<float> battery_level;
|
||||||
|
bool is_duplicate;
|
||||||
|
int raw_offset;
|
||||||
|
};
|
||||||
|
|
||||||
class ATCMiThermometer : public Component, public esp32_ble_tracker::ESPBTDeviceListener {
|
class ATCMiThermometer : public Component, public esp32_ble_tracker::ESPBTDeviceListener {
|
||||||
public:
|
public:
|
||||||
void set_address(uint64_t address) { address_ = address; };
|
void set_address(uint64_t address) { address_ = address; };
|
||||||
|
@ -21,6 +28,10 @@ class ATCMiThermometer : public Component, public esp32_ble_tracker::ESPBTDevice
|
||||||
void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; }
|
void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; }
|
||||||
void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; }
|
void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; }
|
||||||
|
|
||||||
|
optional<ParseResult> parse_header(const esp32_ble_tracker::ServiceData &service_data);
|
||||||
|
bool parse_message(const std::vector<uint8_t> &message, ParseResult &result);
|
||||||
|
bool report_results(const optional<ParseResult> &result, const std::string &address);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint64_t address_;
|
uint64_t address_;
|
||||||
sensor::Sensor *temperature_{nullptr};
|
sensor::Sensor *temperature_{nullptr};
|
||||||
|
|
|
@ -5,7 +5,6 @@ from esphome.const import CONF_BATTERY_LEVEL, CONF_HUMIDITY, CONF_MAC_ADDRESS, C
|
||||||
UNIT_CELSIUS, ICON_THERMOMETER, UNIT_PERCENT, ICON_WATER_PERCENT, ICON_BATTERY, CONF_ID
|
UNIT_CELSIUS, ICON_THERMOMETER, UNIT_PERCENT, ICON_WATER_PERCENT, ICON_BATTERY, CONF_ID
|
||||||
|
|
||||||
DEPENDENCIES = ['esp32_ble_tracker']
|
DEPENDENCIES = ['esp32_ble_tracker']
|
||||||
AUTO_LOAD = ['xiaomi_ble']
|
|
||||||
|
|
||||||
atc_mithermometer_ns = cg.esphome_ns.namespace('atc_mithermometer')
|
atc_mithermometer_ns = cg.esphome_ns.namespace('atc_mithermometer')
|
||||||
ATCMiThermometer = atc_mithermometer_ns.class_('ATCMiThermometer',
|
ATCMiThermometer = atc_mithermometer_ns.class_('ATCMiThermometer',
|
||||||
|
|
Loading…
Reference in a new issue