ESPHome 2026.8.0-dev
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 static constexpr size_t TO_STR_BUFFER_SIZE = format_hex_pretty_size(6);
34 const char *to_str(char *buffer) const {
35 format_hex_pretty_to(buffer, TO_STR_BUFFER_SIZE, this->data_.data(), this->data_.size(), '.');
36 return buffer;
37 }
38 // compare only 40-bits
39 bool operator==(const MideaData &rhs) const {
40 return std::equal(this->data_.begin(), this->data_.begin() + OFFSET_CS, rhs.data_.begin());
41 }
47 MideaDataType type() const { return static_cast<MideaDataType>(this->data_[0]); }
48 template<typename T> T to() const { return T(*this); }
49 uint8_t &operator[](size_t idx) { return this->data_[idx]; }
50 const uint8_t &operator[](size_t idx) const { return this->data_[idx]; }
51
52 protected:
53 uint8_t get_value_(uint8_t idx, uint8_t mask = 255, uint8_t shift = 0) const {
54 return (this->data_[idx] >> shift) & mask;
55 }
56 void set_value_(uint8_t idx, uint8_t value, uint8_t mask = 255, uint8_t shift = 0) {
57 this->data_[idx] &= ~(mask << shift);
58 this->data_[idx] |= (value << shift);
59 }
60 void set_mask_(uint8_t idx, bool state, uint8_t mask = 255) { this->set_value_(idx, state ? mask : 0, mask); }
61 static constexpr uint8_t OFFSET_CS = 5;
62 // 48-bits data
63 std::array<uint8_t, 6> data_;
64 // Calculate checksum
65 uint8_t calc_cs_() const;
66};
67
68class MideaProtocol : public RemoteProtocol<MideaData> {
69 public:
70 void encode(RemoteTransmitData *dst, const MideaData &src) override;
71 optional<MideaData> decode(RemoteReceiveData src) override;
72 void dump(const MideaData &data) override;
73};
74
75DECLARE_REMOTE_PROTOCOL(Midea)
76
77template<typename... Ts> class MideaAction : public RemoteTransmitterActionBase<Ts...> {
78 TEMPLATABLE_VALUE(std::vector<uint8_t>, code)
79
80 void encode(RemoteTransmitData *dst, Ts... x) override {
81 MideaData data(this->code_.value(x...));
82 data.finalize();
83 MideaProtocol().encode(dst, data);
84 }
85};
86
87} // namespace esphome::remote_base
MideaData(const std::vector< uint8_t > &data)
const char * to_str(char *buffer) const
Format to buffer, returns pointer to buffer.
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)
bool operator==(const MideaData &rhs) const
void set_mask_(uint8_t idx, bool state, uint8_t mask=255)
static constexpr size_t TO_STR_BUFFER_SIZE
Buffer size for to_str(): 6 bytes = "AA.BB.CC.DD.EE.FF\0".
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:340
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:1400
const void * src
Definition hal.h:64
uint16_t x
Definition tt21100.cpp:5