ESPHome 2026.5.0b1
Loading...
Searching...
No Matches
haier_protocol.cpp
Go to the documentation of this file.
1#include "haier_protocol.h"
3#include "esphome/core/log.h"
4
5namespace esphome::remote_base {
6
7static const char *const TAG = "remote.haier";
8
9constexpr uint32_t HEADER_LOW_US = 3100;
10constexpr uint32_t HEADER_HIGH_US = 4400;
11constexpr uint32_t BIT_MARK_US = 540;
12constexpr uint32_t BIT_ONE_SPACE_US = 1650;
13constexpr uint32_t BIT_ZERO_SPACE_US = 580;
14constexpr unsigned int HAIER_IR_PACKET_BIT_SIZE = 112;
15// Max data bytes in packet (excluding checksum)
17
19 for (uint8_t mask = 1 << 7; mask != 0; mask >>= 1) {
20 if (item & mask) {
21 dst->space(BIT_ONE_SPACE_US);
22 } else {
23 dst->space(BIT_ZERO_SPACE_US);
24 }
25 dst->mark(BIT_MARK_US);
26 }
27}
28
30 dst->set_carrier_frequency(38000);
31 dst->reserve(5 + ((data.data.size() + 1) * 2));
32 dst->mark(HEADER_LOW_US);
33 dst->space(HEADER_LOW_US);
34 dst->mark(HEADER_LOW_US);
35 dst->space(HEADER_HIGH_US);
36 dst->mark(BIT_MARK_US);
37 uint8_t checksum = 0;
38 for (uint8_t item : data.data) {
39 this->encode_byte_(dst, item);
40 checksum += item;
41 }
42 this->encode_byte_(dst, checksum);
43}
44
45optional<HaierData> HaierProtocol::decode(RemoteReceiveData src) {
46 if (!src.expect_item(HEADER_LOW_US, HEADER_LOW_US) || !src.expect_item(HEADER_LOW_US, HEADER_HIGH_US)) {
47 return {};
48 }
49 if (!src.expect_mark(BIT_MARK_US)) {
50 return {};
51 }
52 size_t size = src.size() - src.get_index() - 1;
54 return {};
56 uint8_t checksum = 0;
57 HaierData out;
58 while (size > 0) {
59 uint8_t data = 0;
60 for (uint8_t mask = 0x80; mask != 0; mask >>= 1) {
61 if (src.expect_space(BIT_ONE_SPACE_US)) {
62 data |= mask;
63 } else if (!src.expect_space(BIT_ZERO_SPACE_US)) {
64 return {};
65 }
66 if (!src.expect_mark(BIT_MARK_US)) {
67 return {};
68 }
69 size -= 2;
70 }
71 if (size > 0) {
72 checksum += data;
73 out.data.push_back(data);
74 } else if (checksum != data) {
75 return {};
76 }
77 }
78 return out;
79}
80
81void HaierProtocol::dump(const HaierData &data) {
83 ESP_LOGI(TAG, "Received Haier: %s", format_hex_pretty_to(hex_buf, data.data.data(), data.data.size()));
84}
85
86} // namespace esphome::remote_base
uint8_t checksum
Definition bl0906.h:3
void encode_byte_(RemoteTransmitData *dst, uint8_t item)
void encode(RemoteTransmitData *dst, const HaierData &data) override
void dump(const HaierData &data) override
optional< HaierData > decode(RemoteReceiveData src) override
bool expect_item(uint32_t mark, uint32_t space)
void set_carrier_frequency(uint32_t carrier_frequency)
Definition remote_base.h:29
constexpr unsigned int HAIER_IR_PACKET_BIT_SIZE
constexpr size_t HAIER_MAX_DATA_BYTES
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
uint16_t size
Definition helpers.cpp:25
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
static void uint32_t
std::vector< uint8_t > data