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 
14 #ifndef IR_COOLIX_H_
15 #define IR_COOLIX_H_
16 
17 #define __STDC_LIMIT_MACROS
18 #include <stdint.h>
19 #ifndef UNIT_TEST
20 #include <Arduino.h>
21 #endif
22 #include "IRremoteESP8266.h"
23 #include "IRsend.h"
24 #ifdef UNIT_TEST
25 #include "IRsend_test.h"
26 #endif
27 
28 // Ref:
29 // https://github.com/crankyoldgit/IRremoteESP8266/issues/484
30 // Kudos:
31 // Hamper: For the breakdown and mapping of the bit values.
32 
33 // Constants
34 // Modes
35 const uint8_t kCoolixCool = 0b000;
36 const uint8_t kCoolixDry = 0b001;
37 const uint8_t kCoolixAuto = 0b010;
38 const uint8_t kCoolixHeat = 0b011;
39 const uint8_t kCoolixFan = 0b100; // Synthetic.
40 // const uint32_t kCoolixModeMask = 0b000000000000000000001100; // 0xC
41 const uint8_t kCoolixModeOffset = 2;
42 const uint8_t kCoolixModeSize = 2;
43 // const uint32_t kCoolixZoneFollowMask = 0b000010000000000000000000 0x80000
44 const uint8_t kCoolixZoneFollowMaskOffset = 19;
45 // Fan Control
46 // const uint32_t kCoolixFanMask = 0b000000001110000000000000; // 0x00E000
47 const uint8_t kCoolixFanOffset = 13;
48 const uint8_t kCoolixFanSize = 3;
49 const uint8_t kCoolixFanMin = 0b100;
50 const uint8_t kCoolixFanMed = 0b010;
51 const uint8_t kCoolixFanMax = 0b001;
52 const uint8_t kCoolixFanAuto = 0b101;
53 const uint8_t kCoolixFanAuto0 = 0b000;
54 const uint8_t kCoolixFanZoneFollow = 0b110;
55 const uint8_t kCoolixFanFixed = 0b111;
56 // Temperature
57 const uint8_t kCoolixTempMin = 17; // Celsius
58 const uint8_t kCoolixTempMax = 30; // Celsius
60 const uint8_t kCoolixFanTempCode = 0b1110; // Part of Fan Mode.
61 // const uint32_t kCoolixTempMask = 0b11110000;
62 const uint8_t kCoolixTempOffset = 4;
63 const uint8_t kCoolixTempSize = 4;
64 const uint8_t kCoolixTempMap[kCoolixTempRange] = {
65  0b0000, // 17C
66  0b0001, // 18c
67  0b0011, // 19C
68  0b0010, // 20C
69  0b0110, // 21C
70  0b0111, // 22C
71  0b0101, // 23C
72  0b0100, // 24C
73  0b1100, // 25C
74  0b1101, // 26C
75  0b1001, // 27C
76  0b1000, // 28C
77  0b1010, // 29C
78  0b1011 // 30C
79 };
80 const uint8_t kCoolixSensorTempMin = 16; // Celsius
81 const uint8_t kCoolixSensorTempMax = 30; // Celsius
82 const uint8_t kCoolixSensorTempIgnoreCode = 0b1111;
83 // kCoolixSensorTempMask = 0b000000000000111100000000; // 0xF00
84 const uint8_t kCoolixSensorTempOffset = 8;
85 const uint8_t kCoolixSensorTempSize = 4;
86 // Fixed states/messages.
87 const uint8_t kCoolixPrefix = 0b1011; // 0xB
88 const uint8_t kCoolixUnknown = 0xFF;
89 const uint32_t kCoolixOff = 0b101100100111101111100000; // 0xB27BE0
90 const uint32_t kCoolixSwing = 0b101100100110101111100000; // 0xB26BE0
91 const uint32_t kCoolixSwingH = 0b101100101111010110100010; // 0xB5F5A2
92 const uint32_t kCoolixSwingV = 0b101100100000111111100000; // 0xB20FE0
93 const uint32_t kCoolixSleep = 0b101100101110000000000011; // 0xB2E003
94 const uint32_t kCoolixTurbo = 0b101101011111010110100010; // 0xB5F5A2
95 const uint32_t kCoolixLed = 0b101101011111010110100101; // 0xB5F5A5
96 const uint32_t kCoolixClean = 0b101101011111010110101010; // 0xB5F5AA
97 const uint32_t kCoolixCmdFan = 0b101100101011111111100100; // 0xB2BFE4
98 // On, 25C, Mode: Auto, Fan: Auto, Zone Follow: Off, Sensor Temp: Ignore.
99 const uint32_t kCoolixDefaultState = 0b101100100001111111001000; // 0xB21FC8
100 
101 // Classes
102 
105 class IRCoolixAC {
106  public:
107  explicit IRCoolixAC(const uint16_t pin, const bool inverted = false,
108  const bool use_modulation = true);
109  void stateReset();
110 #if SEND_COOLIX
111  void send(const uint16_t repeat = kCoolixDefaultRepeat);
116  int8_t calibrate(void) { return _irsend.calibrate(); }
117 #endif // SEND_COOLIX
118  void begin();
119  void on();
120  void off();
121  void setPower(const bool state);
122  bool getPower();
123  void setTemp(const uint8_t temp);
124  uint8_t getTemp();
125  void setSensorTemp(const uint8_t desired);
126  uint8_t getSensorTemp();
127  void clearSensorTemp();
128  void setFan(const uint8_t speed, const bool modecheck = true);
129  uint8_t getFan();
130  void setMode(const uint8_t mode);
131  uint8_t getMode();
132  void setSwing();
133  bool getSwing();
134  void setSleep();
135  bool getSleep();
136  void setTurbo();
137  bool getTurbo();
138  void setLed();
139  bool getLed();
140  void setClean();
141  bool getClean();
142  bool getZoneFollow();
143  uint32_t getRaw();
144  void setRaw(const uint32_t new_code);
145  uint8_t convertMode(const stdAc::opmode_t mode);
146  uint8_t convertFan(const stdAc::fanspeed_t speed);
147  static stdAc::opmode_t toCommonMode(const uint8_t mode);
148  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
149  stdAc::state_t toCommon(const stdAc::state_t *prev = NULL);
150  String toString();
151 #ifndef UNIT_TEST
152 
153  private:
155 #else
156  IRsendTest _irsend;
158 #endif
160  // internal state
161  bool powerFlag;
162  bool turboFlag;
163  bool ledFlag;
164  bool cleanFlag;
165  bool sleepFlag;
167  bool swingFlag;
170 
171  uint32_t remote_state;
172  uint32_t saved_state;
173  void setTempRaw(const uint8_t code);
174  uint8_t getTempRaw();
175  void setSensorTempRaw(const uint8_t code);
176  void setZoneFollow(const bool on);
177  bool isSpecialState(void);
178  bool handleSpecialState(const uint32_t data);
179  void updateSavedState(void);
180  void recoverSavedState(void);
181  uint32_t getNormalState(void);
182 };
183 
184 #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:48
kCoolixZoneFollowMaskOffset
const uint8_t kCoolixZoneFollowMaskOffset
Definition: ir_Coolix.h:44
IRCoolixAC::zoneFollowFlag
bool zoneFollowFlag
Definition: ir_Coolix.h:166
kCoolixFanZoneFollow
const uint8_t kCoolixFanZoneFollow
Definition: ir_Coolix.h:54
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:49
IRCoolixAC::calibrate
int8_t calibrate(void)
Run the calibration to calculate uSec timing offsets for this platform.
Definition: ir_Coolix.h:116
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:91
IRCoolixAC::remote_state
uint32_t remote_state
The state of the IR remote in IR code form.
Definition: ir_Coolix.h:171
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:53
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:36
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:50
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:63
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:154
IRCoolixAC::turboFlag
bool turboFlag
Definition: ir_Coolix.h:162
kCoolixSensorTempMin
const uint8_t kCoolixSensorTempMin
Definition: ir_Coolix.h:80
IRsend.h
IRCoolixAC::ledFlag
bool ledFlag
Definition: ir_Coolix.h:163
kCoolixSwing
const uint32_t kCoolixSwing
Definition: ir_Coolix.h:90
kCoolixCool
const uint8_t kCoolixCool
Definition: ir_Coolix.h:35
kCoolixAuto
const uint8_t kCoolixAuto
Definition: ir_Coolix.h:37
IRsend
Class for sending all basic IR protocols.
Definition: IRsend.h:176
IRCoolixAC::cleanFlag
bool cleanFlag
Definition: ir_Coolix.h:164
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 equivilant.
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:38
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:89
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:1128
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:85
kCoolixFanTempCode
const uint8_t kCoolixFanTempCode
Definition: ir_Coolix.h:60
IRCoolixAC::swingVFlag
bool swingVFlag
Definition: ir_Coolix.h:169
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:64
IRCoolixAC::clearSensorTemp
void clearSensorTemp()
Clear the Sensor Temperature setting..
Definition: ir_Coolix.cpp:358
kCoolixClean
const uint32_t kCoolixClean
Definition: ir_Coolix.h:96
kCoolixFanFixed
const uint8_t kCoolixFanFixed
Definition: ir_Coolix.h:55
kCoolixModeSize
const uint8_t kCoolixModeSize
Definition: ir_Coolix.h:42
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:99
kCoolixDefaultRepeat
const uint16_t kCoolixDefaultRepeat
Definition: IRremoteESP8266.h:850
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:172
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:62
IRCoolixAC
Class for handling detailed Coolix A/C messages.
Definition: ir_Coolix.h:105
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:95
kCoolixUnknown
const uint8_t kCoolixUnknown
Definition: ir_Coolix.h:88
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:47
kCoolixCmdFan
const uint32_t kCoolixCmdFan
Definition: ir_Coolix.h:97
kCoolixTempMax
const uint8_t kCoolixTempMax
Definition: ir_Coolix.h:58
IRCoolixAC::swingFlag
bool swingFlag
Definition: ir_Coolix.h:167
kCoolixFan
const uint8_t kCoolixFan
Definition: ir_Coolix.h:39
kCoolixSwingV
const uint32_t kCoolixSwingV
Definition: ir_Coolix.h:92
IRCoolixAC::swingHFlag
bool swingHFlag
Definition: ir_Coolix.h:168
IRCoolixAC::off
void off()
Change the power setting to Off.
Definition: ir_Coolix.cpp:283
IRCoolixAC::sleepFlag
bool sleepFlag
Definition: ir_Coolix.h:165
kCoolixSleep
const uint32_t kCoolixSleep
Definition: ir_Coolix.h:93
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:87
kCoolixTempRange
const uint8_t kCoolixTempRange
Definition: ir_Coolix.h:59
kCoolixTempMin
const uint8_t kCoolixTempMin
Definition: ir_Coolix.h:57
kCoolixSensorTempMax
const uint8_t kCoolixSensorTempMax
Definition: ir_Coolix.h:81
kCoolixModeOffset
const uint8_t kCoolixModeOffset
Definition: ir_Coolix.h:41
kCoolixFanMax
const uint8_t kCoolixFanMax
Definition: ir_Coolix.h:51
kCoolixSensorTempOffset
const uint8_t kCoolixSensorTempOffset
Definition: ir_Coolix.h:84
kCoolixFanAuto
const uint8_t kCoolixFanAuto
Definition: ir_Coolix.h:52
IRCoolixAC::powerFlag
bool powerFlag
Definition: ir_Coolix.h:161
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:82
kCoolixTurbo
const uint32_t kCoolixTurbo
Definition: ir_Coolix.h:94
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