IRremoteESP8266
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#ifndef UNIT_TEST
37#include <Arduino.h>
38#endif
39#include "IRremoteESP8266.h"
40#include "IRsend.h"
41#ifdef UNIT_TEST
42#include "IRsend_test.h"
43#endif
44
45// Constants
46// Modes
47const uint8_t kCoolixCool = 0b000;
48const uint8_t kCoolixDry = 0b001;
49const uint8_t kCoolixAuto = 0b010;
50const uint8_t kCoolixHeat = 0b011;
51const uint8_t kCoolixFan = 0b100; // Synthetic.
52// const uint32_t kCoolixModeMask = 0b000000000000000000001100; // 0xC
53// const uint32_t kCoolixZoneFollowMask = 0b000010000000000000000010 0x80002
54// Fan Control
55const uint8_t kCoolixFanMin = 0b100;
56const uint8_t kCoolixFanMed = 0b010;
57const uint8_t kCoolixFanMax = 0b001;
58const uint8_t kCoolixFanAuto = 0b101;
59const uint8_t kCoolixFanAuto0 = 0b000;
60const uint8_t kCoolixFanZoneFollow = 0b110;
61const uint8_t kCoolixFanFixed = 0b111;
62// Temperature
63const uint8_t kCoolixTempMin = 17; // Celsius
64const uint8_t kCoolixTempMax = 30; // Celsius
66const uint8_t kCoolixFanTempCode = 0b1110; // Part of Fan Mode.
68 0b0000, // 17C
69 0b0001, // 18c
70 0b0011, // 19C
71 0b0010, // 20C
72 0b0110, // 21C
73 0b0111, // 22C
74 0b0101, // 23C
75 0b0100, // 24C
76 0b1100, // 25C
77 0b1101, // 26C
78 0b1001, // 27C
79 0b1000, // 28C
80 0b1010, // 29C
81 0b1011 // 30C
82};
83const uint8_t kCoolixTempLowFMin = 63;
84const uint8_t kCoolixTempLowFMax = 75;
85const uint8_t kCoolixTempLowFRange =
88const uint8_t kCoolixTempHighFMax = 86;
89const uint8_t kCoolixTempHighFRange =
92 0b1100, // 63F
93 0b0010, // 64F
94 0b1010, // 65F
95 0b0110, // 66F
96 0b1110, // 67F
97 0b0001, // 68F
98 0b1001, // 69F
99 0b0101, // 70F
100 0b1101, // 71F
101 0b0011, // 72F
102 0b1011, // 73F
103 0b0111, // 74F
104 0b1111 // 75F
105};
107 0b0000, // 76F
108 0b1000, // 77F
109 0b0100, // 78F
110 0b1100, // 79F
111 0b0010, // 80F
112 0b1010, // 81F
113 0b0110, // 82F
114 0b1110, // 83F
115 0b0001, // 84F
116 0b1001, // 85F
117 0b0101 // 86F
118};
119const uint8_t kCoolixSensorTempMax = 30; // Celsius
120const uint8_t kCoolixSensorTempIgnoreCode = 0b11111; // 0x1F / 31 (DEC)
121// kCoolixSensorTempMask = 0b000000000000111100000000; // 0xF00
122// Fixed states/messages.
123const uint32_t kCoolixOff = 0b101100100111101111100000; // 0xB27BE0
124const uint32_t kCoolixSwing = 0b101100100110101111100000; // 0xB26BE0
125const uint32_t kCoolixSwingH = 0b101100101111010110100010; // 0xB5F5A2
126const uint32_t kCoolixSwingV = 0b101100100000111111100000; // 0xB20FE0
127const uint32_t kCoolixSleep = 0b101100101110000000000011; // 0xB2E003
128const uint32_t kCoolixTurbo = 0b101101011111010110100010; // 0xB5F5A2
129const uint32_t kCoolixLed = 0b101101011111010110100101; // 0xB5F5A5
130const uint32_t kCoolixClean = 0b101101011111010110101010; // 0xB5F5AA
131const uint32_t kCoolixCmdFan = 0b101100101011111111100100; // 0xB2BFE4
132// On, 25C, Mode: Auto, Fan: Auto, Zone Follow: Off, Sensor Temp: Ignore.
133const uint32_t kCoolixDefaultState = 0b101100100001111111001000; // 0xB21FC8
134
137 uint32_t raw;
138 struct { // Only 24 bits are used.
139 // Byte
140 uint32_t :1; // Unknown
141 uint32_t ZoneFollow1:1;
142 uint32_t Mode :2;
143 uint32_t Temp :4;
144 // Byte
145 uint32_t SensorTemp :5;
146 uint32_t Fan :3;
147 // Byte
148 uint32_t :3; // Unknown
149 uint32_t ZoneFollow2:1;
150 uint32_t :4;
151 };
152};
153
154// Classes
155
159 public:
160 explicit IRCoolixAC(const uint16_t pin, const bool inverted = false,
161 const bool use_modulation = true);
162 void stateReset(void);
163#if SEND_COOLIX
164 void send(const uint16_t repeat = kCoolixDefaultRepeat);
169 int8_t calibrate(void) { return _irsend.calibrate(); }
170#endif // SEND_COOLIX
171 void begin(void);
172 void on(void);
173 void off(void);
174 void setPower(const bool on);
175 bool getPower(void) const;
176 void setTempFRange(const bool high = false);
177 void clearTempFRange();
178 void setTemp(const uint8_t temp);
179 uint8_t getTemp(void) const;
180 void setSensorTemp(const uint8_t temp);
181 uint8_t getSensorTemp(void) const;
182 void clearSensorTemp(void);
183 void setFan(const uint8_t speed, const bool modecheck = true);
184 uint8_t getFan(void) const;
185 void setMode(const uint8_t mode);
186 uint8_t getMode(void) const;
187 void setSwing(void);
188 bool getSwing(void) const;
189 void setSwingVStep(void);
190 bool getSwingVStep(void) const;
191 void setSleep(void);
192 bool getSleep(void) const;
193 void setTurbo(void);
194 bool getTurbo(void) const;
195 void setLed(void);
196 bool getLed(void) const;
197 void setClean(void);
198 bool getClean(void) const;
199 bool getZoneFollow(void) const;
200 uint32_t getRaw(void) const;
201 void setRaw(const uint32_t new_code);
202 // Convert from Coolix48 with Fahrenheit handling.
203 void setRawFromCoolix48(const uint64_t new_code);
204 static uint8_t convertMode(const stdAc::opmode_t mode);
205 static uint8_t convertFan(const stdAc::fanspeed_t speed);
206 static stdAc::opmode_t toCommonMode(const uint8_t mode);
207 static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
208 stdAc::state_t toCommon(const stdAc::state_t *prev = NULL) const;
209 String toString(void) const;
210 void setZoneFollow(const bool on);
211#ifndef UNIT_TEST
212
213 private:
215#else
217 IRsendTest _irsend;
219#endif
222
223 // Internal State settings
230 bool tempLowF; // Indicates low-range F temperatures.
231 bool tempHighF; // Indicates high-range F temperatures.
232 uint8_t savedFan;
233
234 void setTempRaw(const uint8_t code);
235 uint8_t getTempRaw(void) const;
236 void setSensorTempRaw(const uint8_t code);
237 bool isSpecialState(void) const;
238 bool handleSpecialState(const uint32_t data);
239 void updateAndSaveState(const uint32_t raw_state);
240 void recoverSavedState(void);
241 uint32_t getNormalState(void);
242};
243
244#endif // IR_COOLIX_H_
const uint16_t kCoolixDefaultRepeat
Definition IRremoteESP8266.h:1201
std::string String
Definition IRremoteESP8266.h:1564
Class for handling detailed Coolix A/C messages.
Definition ir_Coolix.h:158
void stateReset(void)
Reset the internal state to a fixed known good state.
Definition ir_Coolix.cpp:92
bool ledFlag
Definition ir_Coolix.h:226
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:221
bool sleepFlag
Definition ir_Coolix.h:228
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:220
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:232
uint8_t getTemp(void) const
Get the current temperature setting.
Definition ir_Coolix.cpp:306
bool powerFlag
Definition ir_Coolix.h:224
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:225
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:214
bool swingFlag
Definition ir_Coolix.h:229
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:227
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:169
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:230
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:231
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:249
int8_t calibrate(uint16_t hz=38000U)
Calculate & set any offsets to account for execution times during sending.
Definition IRsend.cpp:209
const uint8_t kCoolixTempHighFMax
Definition ir_Coolix.h:88
const uint8_t kCoolixTempMapLowF[kCoolixTempLowFRange]
Definition ir_Coolix.h:91
const uint8_t kCoolixTempHighFMin
Definition ir_Coolix.h:87
const uint8_t kCoolixHeat
Definition ir_Coolix.h:50
const uint8_t kCoolixFanMed
Definition ir_Coolix.h:56
const uint8_t kCoolixFan
Definition ir_Coolix.h:51
const uint8_t kCoolixFanFixed
Definition ir_Coolix.h:61
const uint8_t kCoolixFanAuto0
Definition ir_Coolix.h:59
const uint8_t kCoolixTempLowFRange
Definition ir_Coolix.h:85
const uint8_t kCoolixFanZoneFollow
Definition ir_Coolix.h:60
const uint32_t kCoolixClean
Definition ir_Coolix.h:130
const uint32_t kCoolixLed
Definition ir_Coolix.h:129
const uint8_t kCoolixFanMin
Definition ir_Coolix.h:55
const uint8_t kCoolixFanTempCode
Definition ir_Coolix.h:66
const uint8_t kCoolixSensorTempMax
Definition ir_Coolix.h:119
const uint8_t kCoolixAuto
Definition ir_Coolix.h:49
const uint8_t kCoolixTempRange
Definition ir_Coolix.h:65
const uint32_t kCoolixSwing
Definition ir_Coolix.h:124
const uint32_t kCoolixCmdFan
Definition ir_Coolix.h:131
const uint32_t kCoolixSwingH
Definition ir_Coolix.h:125
const uint8_t kCoolixTempHighFRange
Definition ir_Coolix.h:89
const uint8_t kCoolixDry
Definition ir_Coolix.h:48
const uint8_t kCoolixTempMap[kCoolixTempRange]
Definition ir_Coolix.h:67
const uint8_t kCoolixTempLowFMin
Definition ir_Coolix.h:83
const uint32_t kCoolixSleep
Definition ir_Coolix.h:127
const uint8_t kCoolixFanMax
Definition ir_Coolix.h:57
const uint32_t kCoolixSwingV
Definition ir_Coolix.h:126
const uint8_t kCoolixFanAuto
Definition ir_Coolix.h:58
const uint8_t kCoolixTempMapHighF[kCoolixTempHighFRange]
Definition ir_Coolix.h:106
const uint8_t kCoolixTempLowFMax
Definition ir_Coolix.h:84
const uint8_t kCoolixTempMin
Definition ir_Coolix.h:63
const uint32_t kCoolixDefaultState
Definition ir_Coolix.h:133
const uint32_t kCoolixTurbo
Definition ir_Coolix.h:128
const uint8_t kCoolixCool
Definition ir_Coolix.h:47
const uint8_t kCoolixSensorTempIgnoreCode
Definition ir_Coolix.h:120
const uint32_t kCoolixOff
Definition ir_Coolix.h:123
const uint8_t kCoolixTempMax
Definition ir_Coolix.h:64
fanspeed_t
Common A/C settings for Fan Speeds.
Definition IRsend.h:61
opmode_t
Common A/C settings for A/C operating modes.
Definition IRsend.h:49
Structure to hold a common A/C state.
Definition IRsend.h:114
Native representation of a Coolix A/C message.
Definition ir_Coolix.h:136
uint32_t SensorTemp
The temperature sensor in the IR remote.
Definition ir_Coolix.h:145
uint32_t Temp
Desired temperature (Celsius)
Definition ir_Coolix.h:143
uint32_t raw
The state in IR code form.
Definition ir_Coolix.h:137
uint32_t ZoneFollow1
Control bit for Zone Follow mode.
Definition ir_Coolix.h:141
uint32_t Mode
Operation mode.
Definition ir_Coolix.h:142
uint32_t Fan
Fan speed.
Definition ir_Coolix.h:146
uint32_t ZoneFollow2
Additional control bit for Zone Follow mode.
Definition ir_Coolix.h:149