11static constexpr uint16_t BIT_MARK = 511;
12static constexpr uint16_t HDR_SPACE = 3492;
13static constexpr uint16_t ONE_SPACE = 1540;
14static constexpr uint16_t ZERO_SPACE = 548;
15static constexpr uint32_t CARRIER_FREQUENCY = 38000;
16static constexpr uint8_t BITS = 52;
18static constexpr uint8_t POWER_ON = 0x3;
19static constexpr uint8_t POWER_OFF = 0x0;
20static constexpr uint8_t SWING_ON = 0x5;
21static constexpr uint8_t SWING_OFF = 0x7;
24static constexpr uint8_t MODE_FAN_AUTO = 0x80;
25static constexpr uint8_t MODE_FAN_LOW = 0xA2;
26static constexpr uint8_t MODE_FAN_MEDIUM = 0x91;
27static constexpr uint8_t MODE_FAN_HIGH = 0x88;
28static constexpr uint8_t MODE_DRY = 0xA4;
29static constexpr uint8_t MODE_FAN_ONLY = 0xA3;
36 return MODE_FAN_MEDIUM;
47static uint64_t build_frame(uint8_t power, uint8_t swing, uint8_t mode_fan, uint8_t temp) {
48 const uint8_t temp_nibble = (temp - 16) & 0xF;
49 const uint8_t sum = 0x8 + power + swing + (mode_fan >> 4) + (mode_fan & 0xF) + temp_nibble;
50 const uint8_t
checksum = (0xF - sum) & 0xF;
51 return (uint64_t{0x8} << 48) | (uint64_t{power} << 44) | (
uint32_t{swing} << 16) | (
uint32_t{mode_fan} << 8) |
55static void send_frame(remote_base::RemoteTransmitData *data, uint64_t code) {
56 data->set_carrier_frequency(CARRIER_FREQUENCY);
57 data->reserve(2 + BITS * 2 + 2);
58 data->item(BIT_MARK, HDR_SPACE);
59 for (
int i = BITS - 1; i >= 0; i--)
60 data->item(BIT_MARK, (code >> i) & 1 ? ONE_SPACE : ZERO_SPACE);
62 data->item(BIT_MARK, HDR_SPACE);
77 mode_fan = MODE_FAN_ONLY;
84 const uint64_t code = build_frame(power ? POWER_ON : POWER_OFF, swing ? SWING_ON : SWING_OFF, mode_fan, temp);
85 ESP_LOGV(TAG,
"Sending power=%s temp=%u swing=%s mode_fan=0x%02X code=0x%05" PRIX32
"%08" PRIX32, ONOFF(power), temp,
86 ONOFF(swing), mode_fan,
static_cast<uint32_t>(code >> 32),
static_cast<uint32_t>(code));
89 send_frame(transmit.get_data(), code);