IRremoteIDF
Infrared send & receive for ESP-IDF
Loading...
Searching...
No Matches
ir_Coolix.h
Go to the documentation of this file.
1// Copyright 2018 David Conran
11
12// Supports:
13// Brand: Beko, Model: RG57K7(B)/BGEF Remote
14// Brand: Beko, Model: BINR 070/071 split-type A/C
15// Brand: Midea, Model: RG52D/BGE Remote
16// Brand: Midea, Model: MS12FU-10HRDN1-QRD0GW(B) A/C
17// Brand: Midea, Model: MSABAU-07HRFN1-QRD0GW A/C (circa 2016)
18// Brand: Comfee (Midea), Model: Breezy Cool Pro 2.6
19// Brand: Tokio, Model: AATOEMF17-12CHR1SW split-type RG51|50/BGE Remote
20// Brand: Airwell, Model: RC08B remote
21// Brand: Kastron, Model: RG57A7/BGEF Inverter remote
22// Brand: Kaysun, Model: Casual CF A/C
23// Brand: Toshiba, Model: RAS-M10YKV-E A/C
24// Brand: Toshiba, Model: RAS-M13YKV-E A/C
25// Brand: Toshiba, Model: RAS-4M27YAV-E A/C
26// Brand: Toshiba, Model: WH-E1YE remote
27// Brand: Bosch, Model: RG36B4/BGE remote
28// Brand: Bosch, Model: B1ZAI2441W/B1ZAO2441W A/C
29// Brand: Fisher, Model: R51L1/BGE remote
30
31#ifndef IR_COOLIX_H_
32#define IR_COOLIX_H_
33
34#define __STDC_LIMIT_MACROS
35#include <stdint.h>
36#include "IRplatform.h"
37#include "IRremoteESP8266.h"
38#include "IRsend.h"
39#ifdef UNIT_TEST
40#include "IRsend_test.h"
41#endif
42
43// Constants
44// Modes
45const uint8_t kCoolixCool = 0b000;
46const uint8_t kCoolixDry = 0b001;
47const uint8_t kCoolixAuto = 0b010;
48const uint8_t kCoolixHeat = 0b011;
49const uint8_t kCoolixFan = 0b100; // Synthetic.
50// const uint32_t kCoolixModeMask = 0b000000000000000000001100; // 0xC
51// const uint32_t kCoolixZoneFollowMask = 0b000010000000000000000010 0x80002
52// Fan Control
53const uint8_t kCoolixFanMin = 0b100;
54const uint8_t kCoolixFanMed = 0b010;
55const uint8_t kCoolixFanMax = 0b001;
56const uint8_t kCoolixFanAuto = 0b101;
57const uint8_t kCoolixFanAuto0 = 0b000;
58const uint8_t kCoolixFanZoneFollow = 0b110;
59const uint8_t kCoolixFanFixed = 0b111;
60// Temperature
61const uint8_t kCoolixTempMin = 17; // Celsius
62const uint8_t kCoolixTempMax = 30; // Celsius
64const uint8_t kCoolixFanTempCode = 0b1110; // Part of Fan Mode.
66 0b0000, // 17C
67 0b0001, // 18c
68 0b0011, // 19C
69 0b0010, // 20C
70 0b0110, // 21C
71 0b0111, // 22C
72 0b0101, // 23C
73 0b0100, // 24C
74 0b1100, // 25C
75 0b1101, // 26C
76 0b1001, // 27C
77 0b1000, // 28C
78 0b1010, // 29C
79 0b1011 // 30C
80};
81const uint8_t kCoolixTempLowFMin = 63;
82const uint8_t kCoolixTempLowFMax = 75;
83const uint8_t kCoolixTempLowFRange =
86const uint8_t kCoolixTempHighFMax = 86;
87const uint8_t kCoolixTempHighFRange =
90 0b1100, // 63F
91 0b0010, // 64F
92 0b1010, // 65F
93 0b0110, // 66F
94 0b1110, // 67F
95 0b0001, // 68F
96 0b1001, // 69F
97 0b0101, // 70F
98 0b1101, // 71F
99 0b0011, // 72F
100 0b1011, // 73F
101 0b0111, // 74F
102 0b1111 // 75F
103};
105 0b0000, // 76F
106 0b1000, // 77F
107 0b0100, // 78F
108 0b1100, // 79F
109 0b0010, // 80F
110 0b1010, // 81F
111 0b0110, // 82F
112 0b1110, // 83F
113 0b0001, // 84F
114 0b1001, // 85F
115 0b0101 // 86F
116};
117const uint8_t kCoolixSensorTempMax = 30; // Celsius
118const uint8_t kCoolixSensorTempIgnoreCode = 0b11111; // 0x1F / 31 (DEC)
119// kCoolixSensorTempMask = 0b000000000000111100000000; // 0xF00
120// Fixed states/messages.
121const uint32_t kCoolixOff = 0b101100100111101111100000; // 0xB27BE0
122const uint32_t kCoolixSwing = 0b101100100110101111100000; // 0xB26BE0
123const uint32_t kCoolixSwingH = 0b101100101111010110100010; // 0xB5F5A2
124const uint32_t kCoolixSwingV = 0b101100100000111111100000; // 0xB20FE0
125const uint32_t kCoolixSleep = 0b101100101110000000000011; // 0xB2E003
126const uint32_t kCoolixTurbo = 0b101101011111010110100010; // 0xB5F5A2
127const uint32_t kCoolixLed = 0b101101011111010110100101; // 0xB5F5A5
128const uint32_t kCoolixClean = 0b101101011111010110101010; // 0xB5F5AA
129const uint32_t kCoolixCmdFan = 0b101100101011111111100100; // 0xB2BFE4
130// On, 25C, Mode: Auto, Fan: Auto, Zone Follow: Off, Sensor Temp: Ignore.
131const uint32_t kCoolixDefaultState = 0b101100100001111111001000; // 0xB21FC8
132
135 uint32_t raw;
136 struct { // Only 24 bits are used.
137 // Byte
138 uint32_t :1; // Unknown
139 uint32_t ZoneFollow1:1;
140 uint32_t Mode :2;
141 uint32_t Temp :4;
142 // Byte
143 uint32_t SensorTemp :5;
144 uint32_t Fan :3;
145 // Byte
146 uint32_t :3; // Unknown
147 uint32_t ZoneFollow2:1;
148 uint32_t :4;
149 };
150};
151
152// Classes
153
157 public:
158 explicit IRCoolixAC(const uint16_t pin, const bool inverted = false,
159 const bool use_modulation = true);
160 void stateReset(void);
161#if SEND_COOLIX
162 void send(const uint16_t repeat = kCoolixDefaultRepeat);
167 int8_t calibrate(void) { return _irsend.calibrate(); }
168#endif // SEND_COOLIX
169 void begin(void);
170 void on(void);
171 void off(void);
172 void setPower(const bool on);
173 bool getPower(void) const;
174 void setTempFRange(const bool high = false);
175 void clearTempFRange();
176 void setTemp(const uint8_t temp);
177 uint8_t getTemp(void) const;
178 void setSensorTemp(const uint8_t temp);
179 uint8_t getSensorTemp(void) const;
180 void clearSensorTemp(void);
181 void setFan(const uint8_t speed, const bool modecheck = true);
182 uint8_t getFan(void) const;
183 void setMode(const uint8_t mode);
184 uint8_t getMode(void) const;
185 void setSwing(void);
186 bool getSwing(void) const;
187 void setSwingVStep(void);
188 bool getSwingVStep(void) const;
189 void setSleep(void);
190 bool getSleep(void) const;
191 void setTurbo(void);
192 bool getTurbo(void) const;
193 void setLed(void);
194 bool getLed(void) const;
195 void setClean(void);
196 bool getClean(void) const;
197 bool getZoneFollow(void) const;
198 uint32_t getRaw(void) const;
199 void setRaw(const uint32_t new_code);
200 // Convert from Coolix48 with Fahrenheit handling.
201 void setRawFromCoolix48(const uint64_t new_code);
202 static uint8_t convertMode(const stdAc::opmode_t mode);
203 static uint8_t convertFan(const stdAc::fanspeed_t speed);
204 static stdAc::opmode_t toCommonMode(const uint8_t mode);
205 static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
206 stdAc::state_t toCommon(const stdAc::state_t *prev = NULL) const;
207 String toString(void) const;
208 void setZoneFollow(const bool on);
209#ifndef UNIT_TEST
210
211 private:
213#else
215 IRsendTest _irsend;
217#endif
220
221 // Internal State settings
228 bool tempLowF; // Indicates low-range F temperatures.
229 bool tempHighF; // Indicates high-range F temperatures.
230 uint8_t savedFan;
231
232 void setTempRaw(const uint8_t code);
233 uint8_t getTempRaw(void) const;
234 void setSensorTempRaw(const uint8_t code);
235 bool isSpecialState(void) const;
236 bool handleSpecialState(const uint32_t data);
237 void updateAndSaveState(const uint32_t raw_state);
238 void recoverSavedState(void);
239 uint32_t getNormalState(void);
240};
241
242#endif // IR_COOLIX_H_
std::string String
The protocol code builds human readable output with String. On ESP-IDF that is just std::string.
Definition IRplatform.h:21
const uint16_t kCoolixDefaultRepeat
Definition IRremoteESP8266.h:1200
Class for handling detailed Coolix A/C messages.
Definition ir_Coolix.h:156
void stateReset(void)
Reset the internal state to a fixed known good state.
Definition ir_Coolix.cpp:92
bool ledFlag
Definition ir_Coolix.h:224
void begin(void)
Set up hardware to be able to send a message.
Definition ir_Coolix.cpp:107
void setZoneFollow(const bool on)
Change the Zone Follow setting.
Definition ir_Coolix.cpp:433
void recoverSavedState(void)
Restore the current internal state from backup as long as it isn't a special state.
Definition ir_Coolix.cpp:252
void on(void)
Change the power setting to On.
Definition ir_Coolix.cpp:357
void clearSensorTemp(void)
Clear the Sensor Temperature setting..
Definition ir_Coolix.cpp:440
void setTemp(const uint8_t temp)
Set the temperature.
Definition ir_Coolix.cpp:284
CoolixProtocol _saved
Copy of the state if we required a special mode.
Definition ir_Coolix.h:219
bool sleepFlag
Definition ir_Coolix.h:226
void updateAndSaveState(const uint32_t raw_state)
Backup the current internal state as long as it isn't a special state and set the new state.
Definition ir_Coolix.cpp:245
uint8_t getFan(void) const
Get the current fan speed setting.
Definition ir_Coolix.cpp:484
bool getTurbo(void) const
Get the Turbo setting of the A/C.
Definition ir_Coolix.cpp:394
CoolixProtocol _
The state of the IR remote in IR code form.
Definition ir_Coolix.h:218
bool getSleep(void) const
Get the Sleep setting of the A/C.
Definition ir_Coolix.cpp:384
void setSensorTempRaw(const uint8_t code)
Set the raw (native) sensor temperature value.
Definition ir_Coolix.cpp:324
uint32_t getNormalState(void)
void setClean(void)
Toggle the Clean mode of the A/C.
Definition ir_Coolix.cpp:419
stdAc::state_t toCommon(const stdAc::state_t *prev=NULL) const
Convert the A/C state to it's common stdAc::state_t equivalent.
Definition ir_Coolix.cpp:581
uint8_t savedFan
Definition ir_Coolix.h:230
uint8_t getTemp(void) const
Get the current temperature setting.
Definition ir_Coolix.cpp:306
bool powerFlag
Definition ir_Coolix.h:222
bool getSwing(void) const
Get the Swing setting of the A/C.
Definition ir_Coolix.cpp:364
void setMode(const uint8_t mode)
Set the operating mode of the A/C.
Definition ir_Coolix.cpp:447
bool getLed(void) const
Get the Led (light) setting of the A/C.
Definition ir_Coolix.cpp:405
bool turboFlag
Definition ir_Coolix.h:223
static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
Convert a native fan speed into its stdAc equivalent.
Definition ir_Coolix.cpp:569
IRsend _irsend
Instance of the IR send class.
Definition ir_Coolix.h:212
bool swingFlag
Definition ir_Coolix.h:227
bool getPower(void) const
Get the value of the current power setting.
Definition ir_Coolix.cpp:342
static stdAc::opmode_t toCommonMode(const uint8_t mode)
Convert a native mode to it's common stdAc::opmode_t equivalent.
Definition ir_Coolix.cpp:556
void setTempFRange(const bool high=false)
Set the fahrenheit temperature range.
Definition ir_Coolix.cpp:271
void off(void)
Change the power setting to Off.
Definition ir_Coolix.cpp:360
void clearTempFRange()
Definition ir_Coolix.cpp:277
bool getClean(void) const
Get the Clean setting of the A/C.
Definition ir_Coolix.cpp:416
static uint8_t convertFan(const stdAc::fanspeed_t speed)
Convert a stdAc::fanspeed_t enum into it's native speed.
Definition ir_Coolix.cpp:542
uint8_t getTempRaw(void) const
Get the raw (native) temperature value.
Definition ir_Coolix.cpp:267
void setTurbo(void)
Toggle the Turbo mode of the A/C.
Definition ir_Coolix.cpp:397
void setSwing(void)
Toggle the Swing mode of the A/C.
Definition ir_Coolix.cpp:367
uint8_t getMode(void) const
Get the operating mode setting of the A/C.
Definition ir_Coolix.cpp:475
bool cleanFlag
Definition ir_Coolix.h:225
void setPower(const bool on)
Change the power setting.
Definition ir_Coolix.cpp:346
void setSensorTemp(const uint8_t temp)
Set the sensor temperature.
Definition ir_Coolix.cpp:330
int8_t calibrate(void)
Run the calibration to calculate uSec timing offsets for this platform.
Definition ir_Coolix.h:167
bool isSpecialState(void) const
Is the current state is a special state?
Definition ir_Coolix.cpp:194
void send(const uint16_t repeat=kCoolixDefaultRepeat)
Send the current internal state as an IR message.
Definition ir_Coolix.cpp:112
uint8_t getSensorTemp(void) const
Get the sensor temperature setting.
Definition ir_Coolix.cpp:337
bool tempLowF
Definition ir_Coolix.h:228
bool getZoneFollow(void) const
Get the Zone Follow setting of the A/C.
Definition ir_Coolix.cpp:426
static uint8_t convertMode(const stdAc::opmode_t mode)
Convert a standard A/C mode into its native mode.
Definition ir_Coolix.cpp:529
void setRawFromCoolix48(const uint64_t new_code)
Definition ir_Coolix.cpp:172
uint32_t getRaw(void) const
Get a copy of the internal state as a valid code for this protocol.
Definition ir_Coolix.cpp:153
void setTempRaw(const uint8_t code)
Set the raw (native) temperature value.
Definition ir_Coolix.cpp:263
void setRaw(const uint32_t new_code)
Set the internal state from a valid code for this protocol.
Definition ir_Coolix.cpp:157
void setLed(void)
Toggle the Led (light) mode of the A/C.
Definition ir_Coolix.cpp:408
void setSleep(void)
Toggle the Sleep mode of the A/C.
Definition ir_Coolix.cpp:387
void setSwingVStep(void)
Set the Vertical Swing Step setting of the A/C.
Definition ir_Coolix.cpp:378
bool getSwingVStep(void) const
Get the Vertical Swing Step setting of the A/C.
Definition ir_Coolix.cpp:375
String toString(void) const
Convert the internal state into a human readable string.
Definition ir_Coolix.cpp:645
bool handleSpecialState(const uint32_t data)
Adjust any internal settings based on the type of special state we are supplied. Does nothing if it i...
Definition ir_Coolix.cpp:214
bool tempHighF
Definition ir_Coolix.h:229
void setFan(const uint8_t speed, const bool modecheck=true)
Set the speed of the fan.
Definition ir_Coolix.cpp:489
Class for sending all basic IR protocols.
Definition IRsend.h:256
int8_t calibrate(uint16_t hz=38000U)
Calculate & set any offsets to account for execution times during sending.
Definition IRsend.cpp:286
const uint8_t kCoolixTempHighFMax
Definition ir_Coolix.h:86
const uint8_t kCoolixTempMapLowF[kCoolixTempLowFRange]
Definition ir_Coolix.h:89
const uint8_t kCoolixTempHighFMin
Definition ir_Coolix.h:85
const uint8_t kCoolixHeat
Definition ir_Coolix.h:48
const uint8_t kCoolixFanMed
Definition ir_Coolix.h:54
const uint8_t kCoolixFan
Definition ir_Coolix.h:49
const uint8_t kCoolixFanFixed
Definition ir_Coolix.h:59
const uint8_t kCoolixFanAuto0
Definition ir_Coolix.h:57
const uint8_t kCoolixTempLowFRange
Definition ir_Coolix.h:83
const uint8_t kCoolixFanZoneFollow
Definition ir_Coolix.h:58
const uint32_t kCoolixClean
Definition ir_Coolix.h:128
const uint32_t kCoolixLed
Definition ir_Coolix.h:127
const uint8_t kCoolixFanMin
Definition ir_Coolix.h:53
const uint8_t kCoolixFanTempCode
Definition ir_Coolix.h:64
const uint8_t kCoolixSensorTempMax
Definition ir_Coolix.h:117
const uint8_t kCoolixAuto
Definition ir_Coolix.h:47
const uint8_t kCoolixTempRange
Definition ir_Coolix.h:63
const uint32_t kCoolixSwing
Definition ir_Coolix.h:122
const uint32_t kCoolixCmdFan
Definition ir_Coolix.h:129
const uint32_t kCoolixSwingH
Definition ir_Coolix.h:123
const uint8_t kCoolixTempHighFRange
Definition ir_Coolix.h:87
const uint8_t kCoolixDry
Definition ir_Coolix.h:46
const uint8_t kCoolixTempMap[kCoolixTempRange]
Definition ir_Coolix.h:65
const uint8_t kCoolixTempLowFMin
Definition ir_Coolix.h:81
const uint32_t kCoolixSleep
Definition ir_Coolix.h:125
const uint8_t kCoolixFanMax
Definition ir_Coolix.h:55
const uint32_t kCoolixSwingV
Definition ir_Coolix.h:124
const uint8_t kCoolixFanAuto
Definition ir_Coolix.h:56
const uint8_t kCoolixTempMapHighF[kCoolixTempHighFRange]
Definition ir_Coolix.h:104
const uint8_t kCoolixTempLowFMax
Definition ir_Coolix.h:82
const uint8_t kCoolixTempMin
Definition ir_Coolix.h:61
const uint32_t kCoolixDefaultState
Definition ir_Coolix.h:131
const uint32_t kCoolixTurbo
Definition ir_Coolix.h:126
const uint8_t kCoolixCool
Definition ir_Coolix.h:45
const uint8_t kCoolixSensorTempIgnoreCode
Definition ir_Coolix.h:118
const uint32_t kCoolixOff
Definition ir_Coolix.h:121
const uint8_t kCoolixTempMax
Definition ir_Coolix.h:62
fanspeed_t
Common A/C settings for Fan Speeds.
Definition IRsend.h:67
opmode_t
Common A/C settings for A/C operating modes.
Definition IRsend.h:55
Structure to hold a common A/C state.
Definition IRsend.h:120
Native representation of a Coolix A/C message.
Definition ir_Coolix.h:134
uint32_t SensorTemp
The temperature sensor in the IR remote.
Definition ir_Coolix.h:143
uint32_t Temp
Desired temperature (Celsius)
Definition ir_Coolix.h:141
uint32_t raw
The state in IR code form.
Definition ir_Coolix.h:135
uint32_t ZoneFollow1
Control bit for Zone Follow mode.
Definition ir_Coolix.h:139
uint32_t Mode
Operation mode.
Definition ir_Coolix.h:140
uint32_t Fan
Fan speed.
Definition ir_Coolix.h:144
uint32_t ZoneFollow2
Additional control bit for Zone Follow mode.
Definition ir_Coolix.h:147