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