IRremoteESP8266
ir_Coolix.h
Go to the documentation of this file.
1 // Copyright 2018 David Conran
9 
10 // Supports:
11 // Brand: Beko, Model: RG57K7(B)/BGEF Remote
12 // Brand: Beko, Model: BINR 070/071 split-type A/C
13 // Brand: Midea, Model: RG52D/BGE Remote
14 // Brand: Midea, Model: MS12FU-10HRDN1-QRD0GW(B) A/C
15 // Brand: Midea, Model: MSABAU-07HRFN1-QRD0GW A/C (circa 2016)
16 // Brand: Tokio, Model: AATOEMF17-12CHR1SW split-type RG51|50/BGE Remote
17 // Brand: Airwell, Model: RC08B remote
18 // Brand: Kastron, Model: RG57A7/BGEF Inverter remote
19 // Brand: Kaysun, Model: Casual CF A/C
20 // Brand: Toshiba, Model: RAS-M10YKV-E A/C
21 // Brand: Toshiba, Model: RAS-M13YKV-E A/C
22 // Brand: Toshiba, Model: RAS-4M27YAV-E A/C
23 // Brand: Toshiba, Model: WH-E1YE remote
24 
25 #ifndef IR_COOLIX_H_
26 #define IR_COOLIX_H_
27 
28 #define __STDC_LIMIT_MACROS
29 #include <stdint.h>
30 #ifndef UNIT_TEST
31 #include <Arduino.h>
32 #endif
33 #include "IRremoteESP8266.h"
34 #include "IRsend.h"
35 #ifdef UNIT_TEST
36 #include "IRsend_test.h"
37 #endif
38 
39 // Constants
40 // Modes
41 const uint8_t kCoolixCool = 0b000;
42 const uint8_t kCoolixDry = 0b001;
43 const uint8_t kCoolixAuto = 0b010;
44 const uint8_t kCoolixHeat = 0b011;
45 const uint8_t kCoolixFan = 0b100; // Synthetic.
46 // const uint32_t kCoolixModeMask = 0b000000000000000000001100; // 0xC
47 // const uint32_t kCoolixZoneFollowMask = 0b000010000000000000000010 0x80002
48 // Fan Control
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 uint8_t kCoolixTempMap[kCoolixTempRange] = {
62  0b0000, // 17C
63  0b0001, // 18c
64  0b0011, // 19C
65  0b0010, // 20C
66  0b0110, // 21C
67  0b0111, // 22C
68  0b0101, // 23C
69  0b0100, // 24C
70  0b1100, // 25C
71  0b1101, // 26C
72  0b1001, // 27C
73  0b1000, // 28C
74  0b1010, // 29C
75  0b1011 // 30C
76 };
77 const uint8_t kCoolixSensorTempMax = 30; // Celsius
78 const uint8_t kCoolixSensorTempIgnoreCode = 0b11111; // 0x1F / 31 (DEC)
79 // kCoolixSensorTempMask = 0b000000000000111100000000; // 0xF00
80 // Fixed states/messages.
81 const uint32_t kCoolixOff = 0b101100100111101111100000; // 0xB27BE0
82 const uint32_t kCoolixSwing = 0b101100100110101111100000; // 0xB26BE0
83 const uint32_t kCoolixSwingH = 0b101100101111010110100010; // 0xB5F5A2
84 const uint32_t kCoolixSwingV = 0b101100100000111111100000; // 0xB20FE0
85 const uint32_t kCoolixSleep = 0b101100101110000000000011; // 0xB2E003
86 const uint32_t kCoolixTurbo = 0b101101011111010110100010; // 0xB5F5A2
87 const uint32_t kCoolixLed = 0b101101011111010110100101; // 0xB5F5A5
88 const uint32_t kCoolixClean = 0b101101011111010110101010; // 0xB5F5AA
89 const uint32_t kCoolixCmdFan = 0b101100101011111111100100; // 0xB2BFE4
90 // On, 25C, Mode: Auto, Fan: Auto, Zone Follow: Off, Sensor Temp: Ignore.
91 const uint32_t kCoolixDefaultState = 0b101100100001111111001000; // 0xB21FC8
92 
95  uint32_t raw;
96  struct { // Only 24 bits are used.
97  // Byte
98  uint32_t :1; // Unknown
99  uint32_t ZoneFollow1:1;
100  uint32_t Mode :2;
101  uint32_t Temp :4;
102  // Byte
103  uint32_t SensorTemp :5;
104  uint32_t Fan :3;
105  // Byte
106  uint32_t :3; // Unknown
107  uint32_t ZoneFollow2:1;
108  uint32_t :4;
109  };
110 };
111 
112 // Classes
113 
116 class IRCoolixAC {
117  public:
118  explicit IRCoolixAC(const uint16_t pin, const bool inverted = false,
119  const bool use_modulation = true);
120  void stateReset(void);
121 #if SEND_COOLIX
122  void send(const uint16_t repeat = kCoolixDefaultRepeat);
127  int8_t calibrate(void) { return _irsend.calibrate(); }
128 #endif // SEND_COOLIX
129  void begin(void);
130  void on(void);
131  void off(void);
132  void setPower(const bool on);
133  bool getPower(void) const;
134  void setTemp(const uint8_t temp);
135  uint8_t getTemp(void) const;
136  void setSensorTemp(const uint8_t temp);
137  uint8_t getSensorTemp(void) const;
138  void clearSensorTemp(void);
139  void setFan(const uint8_t speed, const bool modecheck = true);
140  uint8_t getFan(void) const;
141  void setMode(const uint8_t mode);
142  uint8_t getMode(void) const;
143  void setSwing(void);
144  bool getSwing(void) const;
145  void setSwingVStep(void);
146  bool getSwingVStep(void) const;
147  void setSleep(void);
148  bool getSleep(void) const;
149  void setTurbo(void);
150  bool getTurbo(void) const;
151  void setLed(void);
152  bool getLed(void) const;
153  void setClean(void);
154  bool getClean(void) const;
155  bool getZoneFollow(void) const;
156  uint32_t getRaw(void) const;
157  void setRaw(const uint32_t new_code);
158  static uint8_t convertMode(const stdAc::opmode_t mode);
159  static uint8_t convertFan(const stdAc::fanspeed_t speed);
160  static stdAc::opmode_t toCommonMode(const uint8_t mode);
161  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
162  stdAc::state_t toCommon(const stdAc::state_t *prev = NULL) const;
163  String toString(void) const;
164 #ifndef UNIT_TEST
165 
166  private:
168 #else
169  IRsendTest _irsend;
171 #endif
175 
176  // Internal State settings
177  bool powerFlag;
178  bool turboFlag;
179  bool ledFlag;
180  bool cleanFlag;
181  bool sleepFlag;
182  bool swingFlag;
183  uint8_t savedFan;
184 
185  void setTempRaw(const uint8_t code);
186  uint8_t getTempRaw(void) const;
187  void setSensorTempRaw(const uint8_t code);
188  void setZoneFollow(const bool on);
189  bool isSpecialState(void) const;
190  bool handleSpecialState(const uint32_t data);
191  void updateAndSaveState(const uint32_t raw_state);
192  void recoverSavedState(void);
193  uint32_t getNormalState(void);
194 };
195 
196 #endif // IR_COOLIX_H_
IRCoolixAC::getSwing
bool getSwing(void) const
Get the Swing setting of the A/C.
Definition: ir_Coolix.cpp:280
kCoolixFanZoneFollow
const uint8_t kCoolixFanZoneFollow
Definition: ir_Coolix.h:54
IRCoolixAC::getClean
bool getClean(void) const
Get the Clean setting of the A/C.
Definition: ir_Coolix.cpp:332
IRCoolixAC::getNormalState
uint32_t getNormalState(void)
IRCoolixAC::savedFan
uint8_t savedFan
Definition: ir_Coolix.h:183
IRCoolixAC::setTempRaw
void setTempRaw(const uint8_t code)
Set the raw (native) temperature value.
Definition: ir_Coolix.cpp:213
IRCoolixAC::getFan
uint8_t getFan(void) const
Get the current fan speed setting.
Definition: ir_Coolix.cpp:400
IRCoolixAC::setSensorTempRaw
void setSensorTempRaw(const uint8_t code)
Set the raw (native) sensor temperature value.
Definition: ir_Coolix.cpp:240
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:127
IRCoolixAC::setZoneFollow
void setZoneFollow(const bool on)
Change the Zone Follow setting.
Definition: ir_Coolix.cpp:349
IRCoolixAC::setMode
void setMode(const uint8_t mode)
Set the operating mode of the A/C.
Definition: ir_Coolix.cpp:363
kCoolixSwingH
const uint32_t kCoolixSwingH
Definition: ir_Coolix.h:83
IRCoolixAC::getRaw
uint32_t getRaw(void) const
Get a copy of the internal state as a valid code for this protocol.
Definition: ir_Coolix.cpp:124
IRCoolixAC::send
void send(const uint16_t repeat=kCoolixDefaultRepeat)
Send the current internal state as an IR message.
Definition: ir_Coolix.cpp:109
IRCoolixAC::clearSensorTemp
void clearSensorTemp(void)
Clear the Sensor Temperature setting..
Definition: ir_Coolix.cpp:356
IRCoolixAC::on
void on(void)
Change the power setting to On.
Definition: ir_Coolix.cpp:273
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:42
IRCoolixAC::getLed
bool getLed(void) const
Get the Led (light) setting of the A/C.
Definition: ir_Coolix.cpp:321
IRCoolixAC::getTurbo
bool getTurbo(void) const
Get the Turbo setting of the A/C.
Definition: ir_Coolix.cpp:310
kCoolixFanMed
const uint8_t kCoolixFanMed
Definition: ir_Coolix.h:50
IRCoolixAC::_irsend
IRsend _irsend
Instance of the IR send class.
Definition: ir_Coolix.h:167
IRCoolixAC::turboFlag
bool turboFlag
Definition: ir_Coolix.h:178
IRsend.h
IRCoolixAC::ledFlag
bool ledFlag
Definition: ir_Coolix.h:179
kCoolixSwing
const uint32_t kCoolixSwing
Definition: ir_Coolix.h:82
IRCoolixAC::setLed
void setLed(void)
Toggle the Led (light) mode of the A/C.
Definition: ir_Coolix.cpp:324
kCoolixCool
const uint8_t kCoolixCool
Definition: ir_Coolix.h:41
kCoolixAuto
const uint8_t kCoolixAuto
Definition: ir_Coolix.h:43
IRsend
Class for sending all basic IR protocols.
Definition: IRsend.h:190
IRCoolixAC::cleanFlag
bool cleanFlag
Definition: ir_Coolix.h:180
IRCoolixAC::toCommonFanSpeed
static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
Convert a native fan speed into its stdAc equivalent.
Definition: ir_Coolix.cpp:485
CoolixProtocol
Native representation of a Coolix A/C message.
Definition: ir_Coolix.h:94
IRsend::calibrate
int8_t calibrate(uint16_t hz=38000U)
Calculate & set any offsets to account for execution times during sending.
Definition: IRsend.cpp:207
kCoolixHeat
const uint8_t kCoolixHeat
Definition: ir_Coolix.h:44
IRCoolixAC::convertMode
static uint8_t convertMode(const stdAc::opmode_t mode)
Convert a standard A/C mode into its native mode.
Definition: ir_Coolix.cpp:445
kCoolixOff
const uint32_t kCoolixOff
Definition: ir_Coolix.h:81
String
std::string String
Definition: IRremoteESP8266.h:1279
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:202
kCoolixFanTempCode
const uint8_t kCoolixFanTempCode
Definition: ir_Coolix.h:60
IRCoolixAC::setSensorTemp
void setSensorTemp(const uint8_t temp)
Set the sensor temperature.
Definition: ir_Coolix.cpp:246
IRCoolixAC::setTurbo
void setTurbo(void)
Toggle the Turbo mode of the A/C.
Definition: ir_Coolix.cpp:313
IRCoolixAC::getTemp
uint8_t getTemp(void) const
Get the current temperature setting.
Definition: ir_Coolix.cpp:230
IRCoolixAC::off
void off(void)
Change the power setting to Off.
Definition: ir_Coolix.cpp:276
IRremoteESP8266.h
CoolixProtocol::Fan
uint32_t Fan
Fan speed.
Definition: ir_Coolix.h:104
kCoolixTempMap
const uint8_t kCoolixTempMap[kCoolixTempRange]
Definition: ir_Coolix.h:61
kCoolixClean
const uint32_t kCoolixClean
Definition: ir_Coolix.h:88
IRCoolixAC::_
CoolixProtocol _
The state of the IR remote in IR code form.
Definition: ir_Coolix.h:173
kCoolixFanFixed
const uint8_t kCoolixFanFixed
Definition: ir_Coolix.h:55
IRCoolixAC::stateReset
void stateReset(void)
Reset the internal state to a fixed known good state.
Definition: ir_Coolix.cpp:91
IRCoolixAC::getSleep
bool getSleep(void) const
Get the Sleep setting of the A/C.
Definition: ir_Coolix.cpp:300
kCoolixDefaultState
const uint32_t kCoolixDefaultState
Definition: ir_Coolix.h:91
CoolixProtocol::SensorTemp
uint32_t SensorTemp
The temperature sensor in the IR remote.
Definition: ir_Coolix.h:103
kCoolixDefaultRepeat
const uint16_t kCoolixDefaultRepeat
Definition: IRremoteESP8266.h:974
IRCoolixAC::convertFan
static uint8_t convertFan(const stdAc::fanspeed_t speed)
Convert a stdAc::fanspeed_t enum into it's native speed.
Definition: ir_Coolix.cpp:458
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:472
IRCoolixAC::setTemp
void setTemp(const uint8_t temp)
Set the temperature.
Definition: ir_Coolix.cpp:221
IRCoolixAC::setSwingVStep
void setSwingVStep(void)
Set the Vertical Swing Step setting of the A/C.
Definition: ir_Coolix.cpp:294
IRCoolixAC::getSensorTemp
uint8_t getSensorTemp(void) const
Get the sensor temperature setting.
Definition: ir_Coolix.cpp:253
IRCoolixAC
Class for handling detailed Coolix A/C messages.
Definition: ir_Coolix.h:116
IRCoolixAC::getTempRaw
uint8_t getTempRaw(void) const
Get the raw (native) temperature value.
Definition: ir_Coolix.cpp:217
IRCoolixAC::getZoneFollow
bool getZoneFollow(void) const
Get the Zone Follow setting of the A/C.
Definition: ir_Coolix.cpp:342
IRCoolixAC::_saved
CoolixProtocol _saved
Copy of the state if we required a special mode.
Definition: ir_Coolix.h:174
IRCoolixAC::setClean
void setClean(void)
Toggle the Clean mode of the A/C.
Definition: ir_Coolix.cpp:335
kCoolixLed
const uint32_t kCoolixLed
Definition: ir_Coolix.h:87
IRCoolixAC::setSwing
void setSwing(void)
Toggle the Swing mode of the A/C.
Definition: ir_Coolix.cpp:283
IRCoolixAC::setRaw
void setRaw(const uint32_t new_code)
Set the internal state from a valid code for this protocol.
Definition: ir_Coolix.cpp:128
CoolixProtocol::Mode
uint32_t Mode
Operation mode.
Definition: ir_Coolix.h:100
kCoolixCmdFan
const uint32_t kCoolixCmdFan
Definition: ir_Coolix.h:89
CoolixProtocol::raw
uint32_t raw
The state in IR code form.
Definition: ir_Coolix.h:95
kCoolixTempMax
const uint8_t kCoolixTempMax
Definition: ir_Coolix.h:58
IRCoolixAC::swingFlag
bool swingFlag
Definition: ir_Coolix.h:182
kCoolixFan
const uint8_t kCoolixFan
Definition: ir_Coolix.h:45
IRCoolixAC::begin
void begin(void)
Set up hardware to be able to send a message.
Definition: ir_Coolix.cpp:104
kCoolixSwingV
const uint32_t kCoolixSwingV
Definition: ir_Coolix.h:84
IRCoolixAC::updateAndSaveState
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:195
IRCoolixAC::getMode
uint8_t getMode(void) const
Get the operating mode setting of the A/C.
Definition: ir_Coolix.cpp:391
IRCoolixAC::sleepFlag
bool sleepFlag
Definition: ir_Coolix.h:181
kCoolixSleep
const uint32_t kCoolixSleep
Definition: ir_Coolix.h:85
CoolixProtocol::ZoneFollow2
uint32_t ZoneFollow2
Additional control bit for Zone Follow mode.
Definition: ir_Coolix.h:107
IRCoolixAC::IRCoolixAC
IRCoolixAC(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
Class constructor.
Definition: ir_Coolix.cpp:86
IRCoolixAC::isSpecialState
bool isSpecialState(void) const
Is the current state is a special state?
Definition: ir_Coolix.cpp:144
kCoolixTempRange
const uint8_t kCoolixTempRange
Definition: ir_Coolix.h:59
kCoolixTempMin
const uint8_t kCoolixTempMin
Definition: ir_Coolix.h:57
IRCoolixAC::setSleep
void setSleep(void)
Toggle the Sleep mode of the A/C.
Definition: ir_Coolix.cpp:303
kCoolixSensorTempMax
const uint8_t kCoolixSensorTempMax
Definition: ir_Coolix.h:77
IRCoolixAC::toCommon
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:497
kCoolixFanMax
const uint8_t kCoolixFanMax
Definition: ir_Coolix.h:51
IRCoolixAC::getPower
bool getPower(void) const
Get the value of the current power setting.
Definition: ir_Coolix.cpp:258
kCoolixFanAuto
const uint8_t kCoolixFanAuto
Definition: ir_Coolix.h:52
IRCoolixAC::powerFlag
bool powerFlag
Definition: ir_Coolix.h:177
CoolixProtocol::Temp
uint32_t Temp
Desired temperature (Celsius)
Definition: ir_Coolix.h:101
IRCoolixAC::toString
String toString(void) const
Convert the internal state into a human readable string.
Definition: ir_Coolix.cpp:556
CoolixProtocol::ZoneFollow1
uint32_t ZoneFollow1
Control bit for Zone Follow mode.
Definition: ir_Coolix.h:99
IRCoolixAC::getSwingVStep
bool getSwingVStep(void) const
Get the Vertical Swing Step setting of the A/C.
Definition: ir_Coolix.cpp:291
IRCoolixAC::setFan
void setFan(const uint8_t speed, const bool modecheck=true)
Set the speed of the fan.
Definition: ir_Coolix.cpp:405
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:164
stdAc::state_t
Structure to hold a common A/C state.
Definition: IRsend.h:97
kCoolixSensorTempIgnoreCode
const uint8_t kCoolixSensorTempIgnoreCode
Definition: ir_Coolix.h:78
IRCoolixAC::setPower
void setPower(const bool on)
Change the power setting.
Definition: ir_Coolix.cpp:262
kCoolixTurbo
const uint32_t kCoolixTurbo
Definition: ir_Coolix.h:86
stdAc::opmode_t
opmode_t
Common A/C settings for A/C operating modes.
Definition: IRsend.h:46