ESPHome 2025.5.0
Loading...
Searching...
No Matches
coolix.cpp
Go to the documentation of this file.
1#include "coolix.h"
3#include "esphome/core/log.h"
4
5namespace esphome {
6namespace coolix {
7
8static const char *const TAG = "coolix.climate";
9
10static const uint32_t COOLIX_OFF = 0xB27BE0;
11static const uint32_t COOLIX_SWING = 0xB26BE0;
12static const uint32_t COOLIX_LED = 0xB5F5A5;
13static const uint32_t COOLIX_SILENCE_FP = 0xB5F5B6;
14
15// On, 25C, Mode: Auto, Fan: Auto, Zone Follow: Off, Sensor Temp: Ignore.
16static const uint8_t COOLIX_COOL = 0b0000;
17static const uint8_t COOLIX_DRY_FAN = 0b0100;
18static const uint8_t COOLIX_AUTO = 0b1000;
19static const uint8_t COOLIX_HEAT = 0b1100;
20static const uint32_t COOLIX_MODE_MASK = 0b1100;
21static const uint32_t COOLIX_FAN_MASK = 0xF000;
22static const uint32_t COOLIX_FAN_MODE_AUTO_DRY = 0x1000;
23static const uint32_t COOLIX_FAN_AUTO = 0xB000;
24static const uint32_t COOLIX_FAN_MIN = 0x9000;
25static const uint32_t COOLIX_FAN_MED = 0x5000;
26static const uint32_t COOLIX_FAN_MAX = 0x3000;
27
28// Temperature
29static const uint8_t COOLIX_TEMP_RANGE = COOLIX_TEMP_MAX - COOLIX_TEMP_MIN + 1;
30static const uint8_t COOLIX_FAN_TEMP_CODE = 0b11100000; // Part of Fan Mode.
31static const uint32_t COOLIX_TEMP_MASK = 0b11110000;
32static const uint8_t COOLIX_TEMP_MAP[COOLIX_TEMP_RANGE] = {
33 0b00000000, // 17C
34 0b00010000, // 18c
35 0b00110000, // 19C
36 0b00100000, // 20C
37 0b01100000, // 21C
38 0b01110000, // 22C
39 0b01010000, // 23C
40 0b01000000, // 24C
41 0b11000000, // 25C
42 0b11010000, // 26C
43 0b10010000, // 27C
44 0b10000000, // 28C
45 0b10100000, // 29C
46 0b10110000 // 30C
47};
48
50 uint32_t remote_state = 0xB20F00;
51
52 if (send_swing_cmd_) {
53 send_swing_cmd_ = false;
54 remote_state = COOLIX_SWING;
55 } else {
56 switch (this->mode) {
58 remote_state |= COOLIX_COOL;
59 break;
61 remote_state |= COOLIX_HEAT;
62 break;
64 remote_state |= COOLIX_AUTO;
65 break;
68 remote_state |= COOLIX_DRY_FAN;
69 break;
71 default:
72 remote_state = COOLIX_OFF;
73 break;
74 }
75 if (this->mode != climate::CLIMATE_MODE_OFF) {
77 auto temp = (uint8_t) roundf(clamp<float>(this->target_temperature, COOLIX_TEMP_MIN, COOLIX_TEMP_MAX));
78 remote_state |= COOLIX_TEMP_MAP[temp - COOLIX_TEMP_MIN];
79 } else {
80 remote_state |= COOLIX_FAN_TEMP_CODE;
81 }
84 remote_state |= COOLIX_FAN_MODE_AUTO_DRY;
85 } else {
86 switch (this->fan_mode.value()) {
88 remote_state |= COOLIX_FAN_MAX;
89 break;
91 remote_state |= COOLIX_FAN_MED;
92 break;
94 remote_state |= COOLIX_FAN_MIN;
95 break;
97 default:
98 remote_state |= COOLIX_FAN_AUTO;
99 break;
100 }
101 }
102 }
103 }
104 ESP_LOGV(TAG, "Sending coolix code: 0x%06" PRIX32, remote_state);
105 this->transmit_<remote_base::CoolixProtocol>(remote_state);
106}
107
109 auto decoded = remote_base::CoolixProtocol().decode(data);
110 if (!decoded.has_value())
111 return false;
112 // Decoded remote state y 3 bytes long code.
113 uint32_t remote_state = (*decoded).second;
114 ESP_LOGV(TAG, "Decoded 0x%06" PRIX32, remote_state);
115 if ((remote_state & 0xFF0000) != 0xB20000)
116 return false;
117
118 if (remote_state == COOLIX_OFF) {
120 } else if (remote_state == COOLIX_SWING) {
121 parent->swing_mode =
123 } else {
124 if ((remote_state & COOLIX_MODE_MASK) == COOLIX_HEAT) {
126 } else if ((remote_state & COOLIX_MODE_MASK) == COOLIX_AUTO) {
128 } else if ((remote_state & COOLIX_MODE_MASK) == COOLIX_DRY_FAN) {
129 if ((remote_state & COOLIX_FAN_MASK) == COOLIX_FAN_MODE_AUTO_DRY) {
131 } else {
133 }
134 } else {
136 }
137
138 // Fan Speed
139 if ((remote_state & COOLIX_FAN_AUTO) == COOLIX_FAN_AUTO || parent->mode == climate::CLIMATE_MODE_HEAT_COOL ||
140 parent->mode == climate::CLIMATE_MODE_DRY) {
142 } else if ((remote_state & COOLIX_FAN_MIN) == COOLIX_FAN_MIN) {
144 } else if ((remote_state & COOLIX_FAN_MED) == COOLIX_FAN_MED) {
146 } else if ((remote_state & COOLIX_FAN_MAX) == COOLIX_FAN_MAX) {
148 }
149
150 // Temperature
151 uint8_t temperature_code = remote_state & COOLIX_TEMP_MASK;
152 for (uint8_t i = 0; i < COOLIX_TEMP_RANGE; i++) {
153 if (COOLIX_TEMP_MAP[i] == temperature_code)
155 }
156 }
157 parent->publish_state();
158
159 return true;
160}
161
162} // namespace coolix
163} // namespace esphome
ClimateDevice - This is the base class for all climate integrations.
Definition climate.h:168
ClimateMode mode
The active mode of the climate device.
Definition climate.h:173
optional< ClimateFanMode > fan_mode
The active fan mode of the climate device.
Definition climate.h:199
float target_temperature
The target temperature of the climate device.
Definition climate.h:186
ClimateSwingMode swing_mode
The active swing mode of the climate device.
Definition climate.h:202
void publish_state()
Publish the state of the climate device, to be called from integrations.
Definition climate.cpp:395
void transmit_state() override
Transmit via IR the state of this climate controller.
Definition coolix.cpp:49
static bool on_coolix(climate::Climate *parent, remote_base::RemoteReceiveData data)
This static method can be used in other climate components that accept the Coolix protocol.
Definition coolix.cpp:108
value_type const & value() const
Definition optional.h:89
optional< CoolixData > decode(RemoteReceiveData data) override
void transmit_(const typename Protocol::ProtocolData &data, uint32_t send_times=1, uint32_t send_wait=0)
@ CLIMATE_SWING_OFF
The swing mode is set to Off.
@ CLIMATE_SWING_VERTICAL
The fan mode is set to Vertical.
@ CLIMATE_MODE_DRY
The climate device is set to dry/humidity mode.
@ CLIMATE_MODE_FAN_ONLY
The climate device only has the fan enabled, no heating or cooling is taking place.
@ CLIMATE_MODE_HEAT
The climate device is set to heat to reach the target temperature.
@ CLIMATE_MODE_COOL
The climate device is set to cool to reach the target temperature.
@ CLIMATE_MODE_HEAT_COOL
The climate device is set to heat/cool to reach the target temperature.
@ CLIMATE_MODE_OFF
The climate device is off.
@ CLIMATE_FAN_MEDIUM
The fan mode is set to Medium.
@ CLIMATE_FAN_AUTO
The fan mode is set to Auto.
@ CLIMATE_FAN_LOW
The fan mode is set to Low.
@ CLIMATE_FAN_HIGH
The fan mode is set to High.
const uint8_t COOLIX_TEMP_MAX
Definition coolix.h:12
const uint8_t COOLIX_TEMP_MIN
Definition coolix.h:11
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7