IRremoteESP8266
ir_Coolix.h
Go to the documentation of this file.
1 // Coolix A/C
2 //
3 // Copyright 2018 David Conran
4 
5 // Supports:
6 // Brand: Beko, Model: RG57K7(B)/BGEF Remote
7 // Brand: Beko, Model: BINR 070/071 split-type A/C
8 // Brand: Midea, Model: RG52D/BGE Remote
9 // Brand: Midea, Model: MS12FU-10HRDN1-QRD0GW(B) A/C
10 // Brand: Midea, Model: MSABAU-07HRFN1-QRD0GW A/C (circa 2016)
11 // Brand: Tokio, Model: AATOEMF17-12CHR1SW split-type RG51|50/BGE Remote
12 // Brand: Airwell, Model: RC08B remote
13 // Brand: Kastron, Model: RG57A7/BGEF Inverter remote
14 // Brand: Kaysun, Model: Casual CF A/C
15 
16 #ifndef IR_COOLIX_H_
17 #define IR_COOLIX_H_
18 
19 #define __STDC_LIMIT_MACROS
20 #include <stdint.h>
21 #ifndef UNIT_TEST
22 #include <Arduino.h>
23 #endif
24 #include "IRremoteESP8266.h"
25 #include "IRsend.h"
26 #ifdef UNIT_TEST
27 #include "IRsend_test.h"
28 #endif
29 
30 // Ref:
31 // https://github.com/crankyoldgit/IRremoteESP8266/issues/484
32 // Kudos:
33 // Hamper: For the breakdown and mapping of the bit values.
34 
35 // Constants
36 // Modes
37 const uint8_t kCoolixCool = 0b000;
38 const uint8_t kCoolixDry = 0b001;
39 const uint8_t kCoolixAuto = 0b010;
40 const uint8_t kCoolixHeat = 0b011;
41 const uint8_t kCoolixFan = 0b100; // Synthetic.
42 // const uint32_t kCoolixModeMask = 0b000000000000000000001100; // 0xC
43 const uint8_t kCoolixModeOffset = 2;
44 const uint8_t kCoolixModeSize = 2;
45 // const uint32_t kCoolixZoneFollowMask = 0b000010000000000000000000 0x80000
46 const uint8_t kCoolixZoneFollowMaskOffset = 19;
47 // Fan Control
48 // const uint32_t kCoolixFanMask = 0b000000001110000000000000; // 0x00E000
49 const uint8_t kCoolixFanOffset = 13;
50 const uint8_t kCoolixFanSize = 3;
51 const uint8_t kCoolixFanMin = 0b100;
52 const uint8_t kCoolixFanMed = 0b010;
53 const uint8_t kCoolixFanMax = 0b001;
54 const uint8_t kCoolixFanAuto = 0b101;
55 const uint8_t kCoolixFanAuto0 = 0b000;
56 const uint8_t kCoolixFanZoneFollow = 0b110;
57 const uint8_t kCoolixFanFixed = 0b111;
58 // Temperature
59 const uint8_t kCoolixTempMin = 17; // Celsius
60 const uint8_t kCoolixTempMax = 30; // Celsius
62 const uint8_t kCoolixFanTempCode = 0b1110; // Part of Fan Mode.
63 // const uint32_t kCoolixTempMask = 0b11110000;
64 const uint8_t kCoolixTempOffset = 4;
65 const uint8_t kCoolixTempSize = 4;
66 const uint8_t kCoolixTempMap[kCoolixTempRange] = {
67  0b0000, // 17C
68  0b0001, // 18c
69  0b0011, // 19C
70  0b0010, // 20C
71  0b0110, // 21C
72  0b0111, // 22C
73  0b0101, // 23C
74  0b0100, // 24C
75  0b1100, // 25C
76  0b1101, // 26C
77  0b1001, // 27C
78  0b1000, // 28C
79  0b1010, // 29C
80  0b1011 // 30C
81 };
82 const uint8_t kCoolixSensorTempMin = 16; // Celsius
83 const uint8_t kCoolixSensorTempMax = 30; // Celsius
84 const uint8_t kCoolixSensorTempIgnoreCode = 0b1111;
85 // kCoolixSensorTempMask = 0b000000000000111100000000; // 0xF00
86 const uint8_t kCoolixSensorTempOffset = 8;
87 const uint8_t kCoolixSensorTempSize = 4;
88 // Fixed states/messages.
89 const uint8_t kCoolixPrefix = 0b1011; // 0xB
90 const uint8_t kCoolixUnknown = 0xFF;
91 const uint32_t kCoolixOff = 0b101100100111101111100000; // 0xB27BE0
92 const uint32_t kCoolixSwing = 0b101100100110101111100000; // 0xB26BE0
93 const uint32_t kCoolixSwingH = 0b101100101111010110100010; // 0xB5F5A2
94 const uint32_t kCoolixSwingV = 0b101100100000111111100000; // 0xB20FE0
95 const uint32_t kCoolixSleep = 0b101100101110000000000011; // 0xB2E003
96 const uint32_t kCoolixTurbo = 0b101101011111010110100010; // 0xB5F5A2
97 const uint32_t kCoolixLed = 0b101101011111010110100101; // 0xB5F5A5
98 const uint32_t kCoolixClean = 0b101101011111010110101010; // 0xB5F5AA
99 const uint32_t kCoolixCmdFan = 0b101100101011111111100100; // 0xB2BFE4
100 // On, 25C, Mode: Auto, Fan: Auto, Zone Follow: Off, Sensor Temp: Ignore.
101 const uint32_t kCoolixDefaultState = 0b101100100001111111001000; // 0xB21FC8
102 
103 // Classes
104 
107 class IRCoolixAC {
108  public:
109  explicit IRCoolixAC(const uint16_t pin, const bool inverted = false,
110  const bool use_modulation = true);
111  void stateReset();
112 #if SEND_COOLIX
113  void send(const uint16_t repeat = kCoolixDefaultRepeat);
118  int8_t calibrate(void) { return _irsend.calibrate(); }
119 #endif // SEND_COOLIX
120  void begin();
121  void on();
122  void off();
123  void setPower(const bool state);
124  bool getPower();
125  void setTemp(const uint8_t temp);
126  uint8_t getTemp();
127  void setSensorTemp(const uint8_t desired);
128  uint8_t getSensorTemp();
129  void clearSensorTemp();
130  void setFan(const uint8_t speed, const bool modecheck = true);
131  uint8_t getFan();
132  void setMode(const uint8_t mode);
133  uint8_t getMode();
134  void setSwing();
135  bool getSwing();
136  void setSleep();
137  bool getSleep();
138  void setTurbo();
139  bool getTurbo();
140  void setLed();
141  bool getLed();
142  void setClean();
143  bool getClean();
144  bool getZoneFollow();
145  uint32_t getRaw();
146  void setRaw(const uint32_t new_code);
147  uint8_t convertMode(const stdAc::opmode_t mode);
148  uint8_t convertFan(const stdAc::fanspeed_t speed);
149  static stdAc::opmode_t toCommonMode(const uint8_t mode);
150  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
151  stdAc::state_t toCommon(const stdAc::state_t *prev = NULL);
152  String toString();
153 #ifndef UNIT_TEST
154 
155  private:
157 #else
158  IRsendTest _irsend;
160 #endif
162  // internal state
163  bool powerFlag;
164  bool turboFlag;
165  bool ledFlag;
166  bool cleanFlag;
167  bool sleepFlag;
169  bool swingFlag;
172 
173  uint32_t remote_state;
174  uint32_t saved_state;
175  void setTempRaw(const uint8_t code);
176  uint8_t getTempRaw();
177  void setSensorTempRaw(const uint8_t code);
178  void setZoneFollow(const bool on);
179  bool isSpecialState(void);
180  bool handleSpecialState(const uint32_t data);
181  void updateSavedState(void);
182  void recoverSavedState(void);
183  uint32_t getNormalState(void);
184 };
185 
186 #endif // IR_COOLIX_H_
IRCoolixAC::setLed
void setLed()
Toggle the Led (light) mode of the A/C.
Definition: ir_Coolix.cpp:325
kCoolixFanSize
const uint8_t kCoolixFanSize
Definition: ir_Coolix.h:50
kCoolixZoneFollowMaskOffset
const uint8_t kCoolixZoneFollowMaskOffset
Definition: ir_Coolix.h:46
IRCoolixAC::zoneFollowFlag
bool zoneFollowFlag
Definition: ir_Coolix.h:168
kCoolixFanZoneFollow
const uint8_t kCoolixFanZoneFollow
Definition: ir_Coolix.h:56
IRCoolixAC::getNormalState
uint32_t getNormalState(void)
IRCoolixAC::setTempRaw
void setTempRaw(const uint8_t code)
Set the raw (native) temperature value.
Definition: ir_Coolix.cpp:206
IRCoolixAC::setSensorTempRaw
void setSensorTempRaw(const uint8_t code)
Set the raw (native) sensor temperature value.
Definition: ir_Coolix.cpp:237
IRCoolixAC::getTurbo
bool getTurbo()
Get the Turbo setting of the A/C.
Definition: ir_Coolix.cpp:310
kCoolixFanMin
const uint8_t kCoolixFanMin
Definition: ir_Coolix.h:51
IRCoolixAC::calibrate
int8_t calibrate(void)
Run the calibration to calculate uSec timing offsets for this platform.
Definition: ir_Coolix.h:118
IRCoolixAC::setZoneFollow
void setZoneFollow(const bool on)
Change the Zone Follow setting.
Definition: ir_Coolix.cpp:352
IRCoolixAC::setMode
void setMode(const uint8_t mode)
Set the operating mode of the A/C.
Definition: ir_Coolix.cpp:365
kCoolixSwingH
const uint32_t kCoolixSwingH
Definition: ir_Coolix.h:93
IRCoolixAC::remote_state
uint32_t remote_state
The state of the IR remote in IR code form.
Definition: ir_Coolix.h:173
IRCoolixAC::send
void send(const uint16_t repeat=kCoolixDefaultRepeat)
Send the current internal state as an IR message.
Definition: ir_Coolix.cpp:112
IRCoolixAC::getZoneFollow
bool getZoneFollow()
Get the Zone Follow setting of the A/C.
Definition: ir_Coolix.cpp:345
kCoolixFanAuto0
const uint8_t kCoolixFanAuto0
Definition: ir_Coolix.h:55
stdAc::fanspeed_t
fanspeed_t
Common A/C settings for Fan Speeds.
Definition: IRsend.h:58
kCoolixDry
const uint8_t kCoolixDry
Definition: ir_Coolix.h:38
IRCoolixAC::setClean
void setClean()
Toggle the Clean mode of the A/C.
Definition: ir_Coolix.cpp:337
IRCoolixAC::getTemp
uint8_t getTemp()
Get the current temperature setting.
Definition: ir_Coolix.cpp:227
kCoolixFanMed
const uint8_t kCoolixFanMed
Definition: ir_Coolix.h:52
IRCoolixAC::getSwing
bool getSwing()
Get the Swing setting of the A/C.
Definition: ir_Coolix.cpp:287
kCoolixTempSize
const uint8_t kCoolixTempSize
Definition: ir_Coolix.h:65
IRCoolixAC::getSensorTemp
uint8_t getSensorTemp()
Get the sensor temperature setting.
Definition: ir_Coolix.cpp:253
IRCoolixAC::_irsend
IRsend _irsend
Instance of the IR send class.
Definition: ir_Coolix.h:156
IRCoolixAC::turboFlag
bool turboFlag
Definition: ir_Coolix.h:164
kCoolixSensorTempMin
const uint8_t kCoolixSensorTempMin
Definition: ir_Coolix.h:82
IRsend.h
IRCoolixAC::ledFlag
bool ledFlag
Definition: ir_Coolix.h:165
kCoolixSwing
const uint32_t kCoolixSwing
Definition: ir_Coolix.h:92
kCoolixCool
const uint8_t kCoolixCool
Definition: ir_Coolix.h:37
kCoolixAuto
const uint8_t kCoolixAuto
Definition: ir_Coolix.h:39
IRsend
Class for sending all basic IR protocols.
Definition: IRsend.h:182
IRCoolixAC::cleanFlag
bool cleanFlag
Definition: ir_Coolix.h:166
IRCoolixAC::getRaw
uint32_t getRaw()
Get a copy of the internal state as a valid code for this protocol.
Definition: ir_Coolix.cpp:122
IRCoolixAC::toCommonFanSpeed
static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
Convert a native fan speed into its stdAc equivalent.
Definition: ir_Coolix.cpp:488
IRsend::calibrate
int8_t calibrate(uint16_t hz=38000U)
Calculate & set any offsets to account for execution times during sending.
Definition: IRsend.cpp:207
IRCoolixAC::updateSavedState
void updateSavedState(void)
Backup the current internal state as long as it isn't a special state.
Definition: ir_Coolix.cpp:189
kCoolixHeat
const uint8_t kCoolixHeat
Definition: ir_Coolix.h:40
IRCoolixAC::convertMode
uint8_t convertMode(const stdAc::opmode_t mode)
Convert a standard A/C mode into its native mode.
Definition: ir_Coolix.cpp:448
kCoolixOff
const uint32_t kCoolixOff
Definition: ir_Coolix.h:91
IRCoolixAC::toCommon
stdAc::state_t toCommon(const stdAc::state_t *prev=NULL)
Convert the A/C state to it's common stdAc::state_t equivalent.
Definition: ir_Coolix.cpp:500
String
std::string String
Definition: IRremoteESP8266.h:1178
IRCoolixAC::recoverSavedState
void recoverSavedState(void)
Restore the current internal state from backup as long as it isn't a special state.
Definition: ir_Coolix.cpp:195
IRCoolixAC::setTurbo
void setTurbo()
Toggle the Turbo mode of the A/C.
Definition: ir_Coolix.cpp:313
kCoolixSensorTempSize
const uint8_t kCoolixSensorTempSize
Definition: ir_Coolix.h:87
kCoolixFanTempCode
const uint8_t kCoolixFanTempCode
Definition: ir_Coolix.h:62
IRCoolixAC::swingVFlag
bool swingVFlag
Definition: ir_Coolix.h:171
IRCoolixAC::getClean
bool getClean()
Get the Clean setting of the A/C.
Definition: ir_Coolix.cpp:334
IRCoolixAC::on
void on()
Change the power setting to On.
Definition: ir_Coolix.cpp:280
IRremoteESP8266.h
kCoolixTempMap
const uint8_t kCoolixTempMap[kCoolixTempRange]
Definition: ir_Coolix.h:66
IRCoolixAC::clearSensorTemp
void clearSensorTemp()
Clear the Sensor Temperature setting..
Definition: ir_Coolix.cpp:358
kCoolixClean
const uint32_t kCoolixClean
Definition: ir_Coolix.h:98
kCoolixFanFixed
const uint8_t kCoolixFanFixed
Definition: ir_Coolix.h:57
kCoolixModeSize
const uint8_t kCoolixModeSize
Definition: ir_Coolix.h:44
IRCoolixAC::stateReset
void stateReset()
Reset the internal state to a fixed known good state.
Definition: ir_Coolix.cpp:93
kCoolixDefaultState
const uint32_t kCoolixDefaultState
Definition: ir_Coolix.h:101
kCoolixDefaultRepeat
const uint16_t kCoolixDefaultRepeat
Definition: IRremoteESP8266.h:890
IRCoolixAC::convertFan
uint8_t convertFan(const stdAc::fanspeed_t speed)
Convert a stdAc::fanspeed_t enum into it's native speed.
Definition: ir_Coolix.cpp:461
IRCoolixAC::setSleep
void setSleep()
Toggle the Sleep mode of the A/C.
Definition: ir_Coolix.cpp:302
IRCoolixAC::toCommonMode
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:475
IRCoolixAC::saved_state
uint32_t saved_state
Copy of the state if we required a special mode.
Definition: ir_Coolix.h:174
IRCoolixAC::isSpecialState
bool isSpecialState(void)
Is the current state is a special state?
Definition: ir_Coolix.cpp:142
IRCoolixAC::setTemp
void setTemp(const uint8_t temp)
Set the temperature.
Definition: ir_Coolix.cpp:218
kCoolixTempOffset
const uint8_t kCoolixTempOffset
Definition: ir_Coolix.h:64
IRCoolixAC
Class for handling detailed Coolix A/C messages.
Definition: ir_Coolix.h:107
IRCoolixAC::getMode
uint8_t getMode()
Get the operating mode setting of the A/C.
Definition: ir_Coolix.cpp:393
IRCoolixAC::getFan
uint8_t getFan()
Get the current fan speed setting.
Definition: ir_Coolix.cpp:403
kCoolixLed
const uint32_t kCoolixLed
Definition: ir_Coolix.h:97
kCoolixUnknown
const uint8_t kCoolixUnknown
Definition: ir_Coolix.h:90
IRCoolixAC::begin
void begin()
Set up hardware to be able to send a message.
Definition: ir_Coolix.cpp:107
IRCoolixAC::setRaw
void setRaw(const uint32_t new_code)
Set the internal state from a valid code for this protocol.
Definition: ir_Coolix.cpp:126
IRCoolixAC::getTempRaw
uint8_t getTempRaw()
Get the raw (native) temperature value.
Definition: ir_Coolix.cpp:212
kCoolixFanOffset
const uint8_t kCoolixFanOffset
Definition: ir_Coolix.h:49
kCoolixCmdFan
const uint32_t kCoolixCmdFan
Definition: ir_Coolix.h:99
kCoolixTempMax
const uint8_t kCoolixTempMax
Definition: ir_Coolix.h:60
IRCoolixAC::swingFlag
bool swingFlag
Definition: ir_Coolix.h:169
kCoolixFan
const uint8_t kCoolixFan
Definition: ir_Coolix.h:41
kCoolixSwingV
const uint32_t kCoolixSwingV
Definition: ir_Coolix.h:94
IRCoolixAC::swingHFlag
bool swingHFlag
Definition: ir_Coolix.h:170
IRCoolixAC::off
void off()
Change the power setting to Off.
Definition: ir_Coolix.cpp:283
IRCoolixAC::sleepFlag
bool sleepFlag
Definition: ir_Coolix.h:167
kCoolixSleep
const uint32_t kCoolixSleep
Definition: ir_Coolix.h:95
IRCoolixAC::setSensorTemp
void setSensorTemp(const uint8_t desired)
Set the sensor temperature.
Definition: ir_Coolix.cpp:243
IRCoolixAC::IRCoolixAC
IRCoolixAC(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
Class constructor.
Definition: ir_Coolix.cpp:88
kCoolixPrefix
const uint8_t kCoolixPrefix
Definition: ir_Coolix.h:89
kCoolixTempRange
const uint8_t kCoolixTempRange
Definition: ir_Coolix.h:61
kCoolixTempMin
const uint8_t kCoolixTempMin
Definition: ir_Coolix.h:59
kCoolixSensorTempMax
const uint8_t kCoolixSensorTempMax
Definition: ir_Coolix.h:83
kCoolixModeOffset
const uint8_t kCoolixModeOffset
Definition: ir_Coolix.h:43
kCoolixFanMax
const uint8_t kCoolixFanMax
Definition: ir_Coolix.h:53
kCoolixSensorTempOffset
const uint8_t kCoolixSensorTempOffset
Definition: ir_Coolix.h:86
kCoolixFanAuto
const uint8_t kCoolixFanAuto
Definition: ir_Coolix.h:54
IRCoolixAC::powerFlag
bool powerFlag
Definition: ir_Coolix.h:163
IRCoolixAC::toString
String toString()
Convert the internal state into a human readable string.
Definition: ir_Coolix.cpp:559
IRCoolixAC::getPower
bool getPower()
Get the value of the current power setting.
Definition: ir_Coolix.cpp:260
IRCoolixAC::setFan
void setFan(const uint8_t speed, const bool modecheck=true)
Set the speed of the fan.
Definition: ir_Coolix.cpp:410
IRCoolixAC::handleSpecialState
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:160
IRCoolixAC::getSleep
bool getSleep()
Get the Sleep setting of the A/C.
Definition: ir_Coolix.cpp:299
IRCoolixAC::setPower
void setPower(const bool state)
Change the power setting.
Definition: ir_Coolix.cpp:267
stdAc::state_t
Structure to hold a common A/C state.
Definition: IRsend.h:97
IRCoolixAC::setSwing
void setSwing()
Toggle the Swing mode of the A/C.
Definition: ir_Coolix.cpp:290
kCoolixSensorTempIgnoreCode
const uint8_t kCoolixSensorTempIgnoreCode
Definition: ir_Coolix.h:84
kCoolixTurbo
const uint32_t kCoolixTurbo
Definition: ir_Coolix.h:96
IRCoolixAC::getLed
bool getLed()
Get the Led (light) setting of the A/C.
Definition: ir_Coolix.cpp:322
stdAc::opmode_t
opmode_t
Common A/C settings for A/C operating modes.
Definition: IRsend.h:46