ESPHome 2026.5.1
Loading...
Searching...
No Matches
midea_protocol.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <vector>
5
8#include "remote_base.h"
9
10namespace esphome::remote_base {
11
12class MideaData {
13 public:
14 // Make default
16 // Make from initializer_list
17 MideaData(std::initializer_list<uint8_t> data) {
18 std::copy_n(data.begin(), std::min(data.size(), this->data_.size()), this->data_.begin());
19 }
20 // Make from vector
21 MideaData(const std::vector<uint8_t> &data) {
22 std::copy_n(data.begin(), std::min(data.size(), this->data_.size()), this->data_.begin());
23 }
24
25 uint8_t *data() { return this->data_.data(); }
26 const uint8_t *data() const { return this->data_.data(); }
27 uint8_t size() const { return this->data_.size(); }
28 bool is_valid() const { return this->data_[OFFSET_CS] == this->calc_cs_(); }
29 void finalize() { this->data_[OFFSET_CS] = this->calc_cs_(); }
30 bool is_compliment(const MideaData &rhs) const;
32 ESPDEPRECATED("Allocates heap memory. Use to_str() instead. Removed in 2026.7.0.", "2026.1.0")
33 std::string to_string() const { return format_hex_pretty(this->data_.data(), this->data_.size()); } // NOLINT
35 static constexpr size_t TO_STR_BUFFER_SIZE = format_hex_pretty_size(6);
37 const char *to_str(char *buffer) const {
38 format_hex_pretty_to(buffer, TO_STR_BUFFER_SIZE, this->data_.data(), this->data_.size(), '.');
39 return buffer;
40 }
41 // compare only 40-bits
42 bool operator==(const MideaData &rhs) const {
43 return std::equal(this->data_.begin(), this->data_.begin() + OFFSET_CS, rhs.data_.begin());
44 }
50 MideaDataType type() const { return static_cast<MideaDataType>(this->data_[0]); }
51 template<typename T> T to() const { return T(*this); }
52 uint8_t &operator[](size_t idx) { return this->data_[idx]; }
53 const uint8_t &operator[](size_t idx) const { return this->data_[idx]; }
54
55 protected:
56 uint8_t get_value_(uint8_t idx, uint8_t mask = 255, uint8_t shift = 0) const {
57 return (this->data_[idx] >> shift) & mask;
58 }
59 void set_value_(uint8_t idx, uint8_t value, uint8_t mask = 255, uint8_t shift = 0) {
60 this->data_[idx] &= ~(mask << shift);
61 this->data_[idx] |= (value << shift);
62 }
63 void set_mask_(uint8_t idx, bool state, uint8_t mask = 255) { this->set_value_(idx, state ? mask : 0, mask); }
64 static constexpr uint8_t OFFSET_CS = 5;
65 // 48-bits data
66 std::array<uint8_t, 6> data_;
67 // Calculate checksum
68 uint8_t calc_cs_() const;
69};
70
71class MideaProtocol : public RemoteProtocol<MideaData> {
72 public:
73 void encode(RemoteTransmitData *dst, const MideaData &src) override;
74 optional<MideaData> decode(RemoteReceiveData src) override;
75 void dump(const MideaData &data) override;
76};
77
78DECLARE_REMOTE_PROTOCOL(Midea)
79
80template<typename... Ts> class MideaAction : public RemoteTransmitterActionBase<Ts...> {
81 TEMPLATABLE_VALUE(std::vector<uint8_t>, code)
82
83 void encode(RemoteTransmitData *dst, Ts... x) override {
84 MideaData data(this->code_.value(x...));
85 data.finalize();
86 MideaProtocol().encode(dst, data);
87 }
88};
89
90} // namespace esphome::remote_base
MideaData(const std::vector< uint8_t > &data)
std::array< uint8_t, 6 > data_
const uint8_t & operator[](size_t idx) const
static constexpr uint8_t OFFSET_CS
void set_value_(uint8_t idx, uint8_t value, uint8_t mask=255, uint8_t shift=0)
MideaData(std::initializer_list< uint8_t > data)
bool is_compliment(const MideaData &rhs) const
const uint8_t * data() const
uint8_t get_value_(uint8_t idx, uint8_t mask=255, uint8_t shift=0) const
uint8_t & operator[](size_t idx)
ESPDEPRECATED("Allocates heap memory. Use to_str() instead. Removed in 2026.7.0.", "2026.1.0") std const char * to_str(char *buffer) const
Format to buffer, returns pointer to buffer.
bool operator==(const MideaData &rhs) const
void set_mask_(uint8_t idx, bool state, uint8_t mask=255)
void dump(const MideaData &data) override
void encode(RemoteTransmitData *dst, const MideaData &src) override
optional< MideaData > decode(RemoteReceiveData src) override
bool state
Definition fan.h:2
char * format_hex_pretty_to(char *buffer, size_t buffer_size, const uint8_t *data, size_t length, char separator)
Format byte array as uppercase hex to buffer (base implementation).
Definition helpers.cpp:341
std::string format_hex_pretty(const uint8_t *data, size_t length, char separator, bool show_length)
Format a byte array in pretty-printed, human-readable hex format.
constexpr size_t format_hex_pretty_size(size_t byte_count)
Calculate buffer size needed for format_hex_pretty_to with separator: "XX:XX:...:XX\0".
Definition helpers.h:1386
struct ESPDEPRECATED("Use std::index_sequence instead. Removed in 2026.6.0", "2025.12.0") seq
Definition automation.h:26
uint16_t x
Definition tt21100.cpp:5