#pragma once #include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h" #include "esphome/core/component.h" #include #ifdef USE_ESP32 namespace esphome { namespace xiaomi_ble { struct XiaomiParseResult { enum { TYPE_HHCCJCY01, TYPE_GCLS002, TYPE_HHCCPOT002, TYPE_LYWSDCGQ, TYPE_LYWSD02, TYPE_LYWSD02MMC, TYPE_CGG1, TYPE_LYWSD03MMC, TYPE_XMWSDJ04MMC, TYPE_CGD1, TYPE_CGDK2, TYPE_JQJCY01YM, TYPE_MUE4094RT, TYPE_WX08ZM, TYPE_MJYD02YLA, TYPE_MHOC303, TYPE_MHOC401, TYPE_CGPR1, TYPE_RTCGQ02LM, } type; std::string name; optional temperature; optional humidity; optional moisture; optional conductivity; optional illuminance; optional formaldehyde; optional battery_level; optional tablet; optional idle_time; optional is_active; optional has_motion; optional is_light; optional button_press; bool has_data; // 0x40 bool has_capability; // 0x20 bool has_encryption; // 0x08 bool is_duplicate; int raw_offset; }; struct XiaomiAESVector { uint8_t key[16]; uint8_t plaintext[16]; uint8_t ciphertext[16]; uint8_t authdata[16]; uint8_t iv[16]; uint8_t tag[16]; size_t keysize; size_t authsize; size_t datasize; size_t tagsize; size_t ivsize; }; bool parse_xiaomi_value(uint16_t value_type, const uint8_t *data, uint8_t value_length, XiaomiParseResult &result); bool parse_xiaomi_message(const std::vector &message, XiaomiParseResult &result); optional parse_xiaomi_header(const esp32_ble_tracker::ServiceData &service_data); bool decrypt_xiaomi_payload(std::vector &raw, const uint8_t *bindkey, const uint64_t &address); bool report_xiaomi_results(const optional &result, const std::string &address); class XiaomiListener : public esp32_ble_tracker::ESPBTDeviceListener { public: bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override; }; } // namespace xiaomi_ble } // namespace esphome #endif