IRremoteESP8266
ir_Midea.h
Go to the documentation of this file.
1 // Copyright 2017 David Conran
2 
7 
8 // Supports:
9 // Brand: Pioneer System, Model: RYBO12GMFILCAD A/C (12K BTU) (MIDEA)
10 // Brand: Pioneer System, Model: RUBO18GMFILCAD A/C (18K BTU) (MIDEA)
11 // Brand: Comfee, Model: MPD1-12CRN7 A/C (MIDEA)
12 // Brand: Kaysun, Model: Casual CF A/C (MIDEA)
13 // Brand: Keystone, Model: RG57H4(B)BGEF remote (MIDEA)
14 // Brand: MrCool, Model: RG57A6/BGEFU1 remote (MIDEA)
15 // Brand: Midea, Model: FS40-7AR Stand Fan (MIDEA24)
16 // Brand: Danby, Model: DAC080BGUWDB (MIDEA)
17 // Brand: Danby, Model: DAC100BGUWDB (MIDEA)
18 // Brand: Danby, Model: DAC120BGUWDB (MIDEA)
19 // Brand: Danby, Model: R09C/BCGE remote (MIDEA)
20 
21 #ifndef IR_MIDEA_H_
22 #define IR_MIDEA_H_
23 
24 #define __STDC_LIMIT_MACROS
25 #include <stdint.h>
26 #ifdef ARDUINO
27 #include <Arduino.h>
28 #endif
29 #include "IRremoteESP8266.h"
30 #include "IRsend.h"
31 #ifdef UNIT_TEST
32 #include "IRsend_test.h"
33 #endif
34 
35 // Compile-time model specific overrides.
36 // Uncomment one of these if you have such a devices to better match your A/C.
37 // It changes some of the special commands/settings.
38 //
39 // #define DANBY_DAC true
40 // #define KAYSUN_AC true
41 
44  uint64_t remote_state;
45  // only use 48bits
46  struct {
47  // Byte 0
48  uint8_t Sum;
49  // Byte 1 (value=0xFF when not in use.)
50  // This byte gets dual usage as Sensor Temp and On Timer
51  // Depending on "Type" below.
52  // When in "OnTimer", the nr of half hours is stored with mask 0b01111110
53  // i.e.
54  // uint8_t :1;
55  // uint8_t OnTimerHalfHours:6;
56  // uint8_t :1;
57  uint8_t SensorTemp:7;
58  uint8_t disableSensor:1;
59  // Byte 2 (value=0xFF when not in use.)
60  uint8_t :1; // 0b1
61  uint8_t OffTimer:6;
62  uint8_t BeepDisable:1;
63  // Byte 3
64  uint8_t Temp:5;
65  uint8_t useFahrenheit:1;
66  uint8_t :0;
67  // Byte 4
68  uint8_t Mode:3;
69  uint8_t Fan:2;
70  uint8_t :1;
71  uint8_t Sleep:1;
72  uint8_t Power:1;
73  // Byte 5
74  uint8_t Type:3;
75  uint8_t Header:5;
76  };
77 };
78 
79 // Constants
80 const uint8_t kMideaACMinTempF = 62;
81 const uint8_t kMideaACMaxTempF = 86;
82 const uint8_t kMideaACMinTempC = 17;
83 const uint8_t kMideaACMaxTempC = 30;
84 const uint8_t kMideaACMinSensorTempC = 0;
85 const uint8_t kMideaACMaxSensorTempC = 37;
86 const uint8_t kMideaACMinSensorTempF = 32;
87 const uint8_t kMideaACMaxSensorTempF = 99;
88 const uint8_t kMideaACSensorTempOnTimerOff = 0b1111111;
89 const uint8_t kMideaACTimerOff = 0b111111;
90 const uint8_t kMideaACCool = 0; // 0b000
91 const uint8_t kMideaACDry = 1; // 0b001
92 const uint8_t kMideaACAuto = 2; // 0b010
93 const uint8_t kMideaACHeat = 3; // 0b011
94 const uint8_t kMideaACFan = 4; // 0b100
95 const uint8_t kMideaACFanAuto = 0; // 0b00
96 const uint8_t kMideaACFanLow = 1; // 0b01
97 const uint8_t kMideaACFanMed = 2; // 0b10
98 const uint8_t kMideaACFanHigh = 3; // 0b11
99 #if KAYSUN_AC
100  // For Kaysun AC units, Toggle SwingV is 0xA202FFFFFF7E
101  const uint64_t kMideaACToggleSwingV = 0xA202FFFFFF7E;
102  const uint64_t kMideaACSwingVStep = 0xA201FFFFFF7C;
103 #else // KAYSUN_AC
104  const uint64_t kMideaACToggleSwingV = 0xA201FFFFFF7C;
105 #endif // KAYSUN_AC
106 #if DANBY_DAC
107  // For Danby DAC unit, the Ionizer toggle is the same as ToggleSwingV
108  // const uint64_t kMideaACToggleIonizer = 0xA201FFFFFF7C;
110 #endif // DANBY_DAC
111 const uint64_t kMideaACToggleEcono = 0xA202FFFFFF7E;
112 const uint64_t kMideaACToggleLight = 0xA208FFFFFF75;
113 const uint64_t kMideaACToggleTurbo = 0xA209FFFFFF74;
114 const uint8_t kMideaACTypeCommand = 0b001;
115 const uint8_t kMideaACTypeSpecial = 0b010;
116 const uint8_t kMideaACTypeFollow = 0b100;
117 
118 // Legacy defines. (Deprecated)
119 #define MIDEA_AC_COOL kMideaACCool
120 #define MIDEA_AC_DRY kMideaACDry
121 #define MIDEA_AC_AUTO kMideaACAuto
122 #define MIDEA_AC_HEAT kMideaACHeat
123 #define MIDEA_AC_FAN kMideaACFan
124 #define MIDEA_AC_FAN_AUTO kMideaACFanAuto
125 #define MIDEA_AC_FAN_LOW kMideaACFanLow
126 #define MIDEA_AC_FAN_MED kMideaACFanMed
127 #define MIDEA_AC_FAN_HI kMideaACFanHigh
128 #define MIDEA_AC_POWER kMideaACPower
129 #define MIDEA_AC_SLEEP kMideaACSleep
130 #define MIDEA_AC_MIN_TEMP_F kMideaACMinTempF
131 #define MIDEA_AC_MAX_TEMP_F kMideaACMaxTempF
132 #define MIDEA_AC_MIN_TEMP_C kMideaACMinTempC
133 #define MIDEA_AC_MAX_TEMP_C kMideaACMaxTempC
134 
135 // Classes
138 class IRMideaAC {
139  public:
140  explicit IRMideaAC(const uint16_t pin, const bool inverted = false,
141  const bool use_modulation = true);
142  void stateReset(void);
143 #if SEND_MIDEA
144  void send(const uint16_t repeat = kMideaMinRepeat);
149  int8_t calibrate(void) { return _irsend.calibrate(); }
150 #endif // SEND_MIDEA
151  void begin(void);
152  void on(void);
153  void off(void);
154  void setPower(const bool on);
155  bool getPower(void) const;
156  bool getUseCelsius(void) const;
157  void setUseCelsius(const bool celsius);
158  void setTemp(const uint8_t temp, const bool useCelsius = false);
159  uint8_t getTemp(const bool useCelsius = false) const;
160  void setSensorTemp(const uint8_t temp, const bool useCelsius = false);
161  uint8_t getSensorTemp(const bool useCelsius = false) const;
162  void setEnableSensorTemp(const bool on);
163  bool getEnableSensorTemp(void) const;
164  void setFan(const uint8_t fan);
165  uint8_t getFan(void) const;
166  void setMode(const uint8_t mode);
167  uint8_t getMode(void) const;
168  void setRaw(const uint64_t newState);
169  uint64_t getRaw(void);
170  static bool validChecksum(const uint64_t state);
171  void setSleep(const bool on);
172  bool getSleep(void) const;
173  bool isSwingVToggle(void) const;
174  void setSwingVToggle(const bool on);
175  bool getSwingVToggle(void);
176  #if KAYSUN_AC
177  bool isSwingVStep(void) const;
178  void setSwingVStep(const bool on);
179  bool getSwingVStep(void);
180  #endif // KAYSUN_AC
181  bool isEconoToggle(void) const;
182  void setEconoToggle(const bool on);
183  bool getEconoToggle(void);
184  bool isTurboToggle(void) const;
185  void setTurboToggle(const bool on);
186  bool getTurboToggle(void);
187  bool isLightToggle(void) const;
188  void setLightToggle(const bool on);
189  bool getLightToggle(void);
190  uint8_t getType(void) const;
191  bool isOnTimerEnabled(void) const;
192  uint16_t getOnTimer(void) const;
193  void setOnTimer(const uint16_t mins);
194  bool isOffTimerEnabled(void) const;
195  uint16_t getOffTimer(void) const;
196  void setOffTimer(const uint16_t mins);
197  static uint8_t convertMode(const stdAc::opmode_t mode);
198  static uint8_t convertFan(const stdAc::fanspeed_t speed);
199  static stdAc::opmode_t toCommonMode(const uint8_t mode);
200  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
201  stdAc::state_t toCommon(const stdAc::state_t *prev = NULL);
202  String toString(void);
203 #ifndef UNIT_TEST
204 
205  private:
207 #else // UNIT_TEST
208  IRsendTest _irsend;
210 #endif // UNIT_TEST
214  #if KAYSUN_AC
216  #endif // KAYSUN_AC
220  void checksum(void);
221  static uint8_t calcChecksum(const uint64_t state);
222  void setType(const uint8_t type);
223 };
224 
225 #endif // IR_MIDEA_H_
IRMideaAC::setOnTimer
void setOnTimer(const uint16_t mins)
Set the value of the On Timer.
Definition: ir_Midea.cpp:481
IRMideaAC::getType
uint8_t getType(void) const
Get the message type setting of the A/C message.
Definition: ir_Midea.cpp:443
MideaProtocol::Sum
uint8_t Sum
Definition: ir_Midea.h:48
kMideaACMinTempF
const uint8_t kMideaACMinTempF
Fahrenheit.
Definition: ir_Midea.h:80
IRMideaAC::begin
void begin(void)
Set up hardware to be able to send a message.
Definition: ir_Midea.cpp:113
IRMideaAC::toCommonFanSpeed
static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
Convert a native fan speed into its stdAc equivalent.
Definition: ir_Midea.cpp:556
IRMideaAC::setSleep
void setSleep(const bool on)
Set the Sleep setting of the A/C.
Definition: ir_Midea.cpp:313
IRMideaAC::on
void on(void)
Set the requested power state of the A/C to on.
Definition: ir_Midea.cpp:153
IRMideaAC::setUseCelsius
void setUseCelsius(const bool celsius)
Set the A/C unit to use Celsius natively.
Definition: ir_Midea.cpp:178
kMideaMinRepeat
const uint16_t kMideaMinRepeat
Definition: IRremoteESP8266.h:994
IRMideaAC::_EconoToggle
bool _EconoToggle
Definition: ir_Midea.h:217
IRMideaAC::_
MideaProtocol _
Definition: ir_Midea.h:212
IRMideaAC::setTemp
void setTemp(const uint8_t temp, const bool useCelsius=false)
Set the temperature.
Definition: ir_Midea.cpp:189
IRMideaAC::getPower
bool getPower(void) const
Get the value of the current power setting.
Definition: ir_Midea.cpp:166
IRMideaAC::calibrate
int8_t calibrate(void)
Run the calibration to calculate uSec timing offsets for this platform.
Definition: ir_Midea.h:149
IRMideaAC::isOffTimerEnabled
bool isOffTimerEnabled(void) const
Is the OffTimer enabled?
Definition: ir_Midea.cpp:492
IRMideaAC::_TurboToggle
bool _TurboToggle
Definition: ir_Midea.h:218
MideaProtocol::Type
uint8_t Type
Normal, Special, or FollowMe message type.
Definition: ir_Midea.h:74
kMideaACMaxSensorTempF
const uint8_t kMideaACMaxSensorTempF
Fahrenheit (Guess only!)
Definition: ir_Midea.h:87
kMideaACTypeFollow
const uint8_t kMideaACTypeFollow
Message type.
Definition: ir_Midea.h:116
IRMideaAC::setEconoToggle
void setEconoToggle(const bool on)
Set the A/C to toggle the Econo (energy saver) mode for the next send.
Definition: ir_Midea.cpp:364
stdAc::fanspeed_t
fanspeed_t
Common A/C settings for Fan Speeds.
Definition: IRsend.h:58
MideaProtocol::Header
uint8_t Header
Typically 0b10100.
Definition: ir_Midea.h:75
IRMideaAC::_SwingVToggle
bool _SwingVToggle
Definition: ir_Midea.h:213
kMideaACAuto
const uint8_t kMideaACAuto
Definition: ir_Midea.h:92
IRMideaAC::checksum
void checksum(void)
Calculate & set the checksum for the current internal state of the remote.
Definition: ir_Midea.cpp:436
IRMideaAC::IRMideaAC
IRMideaAC(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
Class constructor.
Definition: ir_Midea.cpp:95
kMideaACFan
const uint8_t kMideaACFan
Definition: ir_Midea.h:94
IRMideaAC::isOnTimerEnabled
bool isOnTimerEnabled(void) const
Is the OnTimer enabled?
Definition: ir_Midea.cpp:463
IRMideaAC::send
void send(const uint16_t repeat=kMideaMinRepeat)
Send the current internal state as an IR message.
Definition: ir_Midea.cpp:118
MideaProtocol::useFahrenheit
uint8_t useFahrenheit
Definition: ir_Midea.h:65
kMideaACTypeSpecial
const uint8_t kMideaACTypeSpecial
Message type.
Definition: ir_Midea.h:115
IRsend.h
IRMideaAC::setType
void setType(const uint8_t type)
Set the message type setting of the A/C message.
Definition: ir_Midea.cpp:447
IRMideaAC::setTurboToggle
void setTurboToggle(const bool on)
Set the A/C to toggle the Turbo mode for the next send.
Definition: ir_Midea.cpp:381
kMideaACMaxTempF
const uint8_t kMideaACMaxTempF
Fahrenheit.
Definition: ir_Midea.h:81
IRMideaAC::getLightToggle
bool getLightToggle(void)
Definition: ir_Midea.cpp:408
IRMideaAC::getOffTimer
uint16_t getOffTimer(void) const
Get the value of the OffTimer is currently set to.
Definition: ir_Midea.cpp:498
IRsend
Class for sending all basic IR protocols.
Definition: IRsend.h:182
MideaProtocol::Power
uint8_t Power
Definition: ir_Midea.h:72
kMideaACTimerOff
const uint8_t kMideaACTimerOff
Definition: ir_Midea.h:89
IRsend::calibrate
int8_t calibrate(uint16_t hz=38000U)
Calculate & set any offsets to account for execution times during sending.
Definition: IRsend.cpp:207
MideaProtocol::SensorTemp
uint8_t SensorTemp
Degrees or OnTimer.
Definition: ir_Midea.h:57
IRMideaAC::setSwingVToggle
void setSwingVToggle(const bool on)
Set the A/C to toggle the vertical swing toggle for the next send.
Definition: ir_Midea.cpp:326
IRMideaAC::isSwingVToggle
bool isSwingVToggle(void) const
Is the current state a vertical swing toggle message?
Definition: ir_Midea.cpp:331
IRMideaAC::isLightToggle
bool isLightToggle(void) const
Is the current state a Light (LED) toggle message?
Definition: ir_Midea.cpp:402
IRMideaAC::getEnableSensorTemp
bool getEnableSensorTemp(void) const
Is the remote temperature sensor enabled?
Definition: ir_Midea.cpp:275
kMideaACMaxSensorTempC
const uint8_t kMideaACMaxSensorTempC
Celsius.
Definition: ir_Midea.h:85
String
std::string String
Definition: IRremoteESP8266.h:1178
kSwingVToggleStr
kSwingVToggleStr
Definition: ir_Midea.h:109
IRMideaAC::getSwingVToggle
bool getSwingVToggle(void)
Definition: ir_Midea.cpp:338
MideaProtocol::Fan
uint8_t Fan
Definition: ir_Midea.h:69
MideaProtocol::Mode
uint8_t Mode
Definition: ir_Midea.h:68
IRMideaAC::getFan
uint8_t getFan(void) const
Get the current fan speed setting.
Definition: ir_Midea.cpp:285
kMideaACToggleTurbo
const uint64_t kMideaACToggleTurbo
Definition: ir_Midea.h:113
IRMideaAC::off
void off(void)
Set the requested power state of the A/C to off.
Definition: ir_Midea.cpp:156
IRMideaAC::getTurboToggle
bool getTurboToggle(void)
Definition: ir_Midea.cpp:391
IRremoteESP8266.h
IRMideaAC::setOffTimer
void setOffTimer(const uint16_t mins)
Set the value of the Off Timer.
Definition: ir_Midea.cpp:505
kMideaACHeat
const uint8_t kMideaACHeat
Definition: ir_Midea.h:93
MideaProtocol::OffTimer
uint8_t OffTimer
Nr of Half hours. Off is 0b111111.
Definition: ir_Midea.h:61
kMideaACSwingVStep
const uint64_t kMideaACSwingVStep
Definition: ir_Midea.h:102
IRMideaAC::isSwingVStep
bool isSwingVStep(void) const
Is the current state a step vertical swing message?
Definition: ir_Midea.cpp:350
IRMideaAC::setLightToggle
void setLightToggle(const bool on)
Set the A/C to toggle the Light (LED) mode for the next send.
Definition: ir_Midea.cpp:398
IRMideaAC::getUseCelsius
bool getUseCelsius(void) const
Is the device currently using Celsius or the Fahrenheit temp scale?
Definition: ir_Midea.cpp:172
IRMideaAC::getOnTimer
uint16_t getOnTimer(void) const
Get the value of the OnTimer is currently set to.
Definition: ir_Midea.cpp:470
IRMideaAC::toCommonMode
static stdAc::opmode_t toCommonMode(const uint8_t mode)
Convert a native mode into its stdAc equivalent.
Definition: ir_Midea.cpp:543
kMideaACFanAuto
const uint8_t kMideaACFanAuto
Definition: ir_Midea.h:95
kMideaACToggleSwingV
const uint64_t kMideaACToggleSwingV
Definition: ir_Midea.h:101
IRMideaAC::_irsend
IRsend _irsend
Instance of the IR send class.
Definition: ir_Midea.h:206
MideaProtocol::remote_state
uint64_t remote_state
The state in native IR code form.
Definition: ir_Midea.h:44
IRMideaAC
Class for handling detailed Midea A/C messages.
Definition: ir_Midea.h:138
kMideaACMinSensorTempC
const uint8_t kMideaACMinSensorTempC
Celsius.
Definition: ir_Midea.h:84
IRMideaAC::setRaw
void setRaw(const uint64_t newState)
Set the internal state from a valid code for this protocol.
Definition: ir_Midea.cpp:150
IRMideaAC::getSensorTemp
uint8_t getSensorTemp(const bool useCelsius=false) const
Get the current Sensor temperature setting.
Definition: ir_Midea.cpp:248
IRMideaAC::setMode
void setMode(const uint8_t mode)
Set the operating mode of the A/C.
Definition: ir_Midea.cpp:297
IRMideaAC::calcChecksum
static uint8_t calcChecksum(const uint64_t state)
Calculate the checksum for a given state.
Definition: ir_Midea.cpp:416
kIonStr
const PROGMEM char * kIonStr
"Ion"
Definition: IRtext.cpp:55
IRMideaAC::getSleep
bool getSleep(void) const
Get the Sleep setting of the A/C.
Definition: ir_Midea.cpp:319
kMideaACSensorTempOnTimerOff
const uint8_t kMideaACSensorTempOnTimerOff
Definition: ir_Midea.h:88
IRMideaAC::getMode
uint8_t getMode(void) const
Get the operating mode setting of the A/C.
Definition: ir_Midea.cpp:291
kMideaACToggleEcono
const uint64_t kMideaACToggleEcono
Definition: ir_Midea.h:111
IRMideaAC::convertFan
static uint8_t convertFan(const stdAc::fanspeed_t speed)
Convert a stdAc::fanspeed_t enum into it's native speed.
Definition: ir_Midea.cpp:529
MideaProtocol::Sleep
uint8_t Sleep
Definition: ir_Midea.h:71
kMideaACFanMed
const uint8_t kMideaACFanMed
Definition: ir_Midea.h:97
MideaProtocol::disableSensor
uint8_t disableSensor
Definition: ir_Midea.h:58
IRMideaAC::getRaw
uint64_t getRaw(void)
Get a copy of the internal state/code for this protocol.
Definition: ir_Midea.cpp:143
kMideaACMinTempC
const uint8_t kMideaACMinTempC
Celsius.
Definition: ir_Midea.h:82
IRMideaAC::setSwingVStep
void setSwingVStep(const bool on)
Set the A/C to step the vertical swing for the next send.
Definition: ir_Midea.cpp:346
IRMideaAC::getSwingVStep
bool getSwingVStep(void)
Definition: ir_Midea.cpp:356
IRMideaAC::convertMode
static uint8_t convertMode(const stdAc::opmode_t mode)
Convert a stdAc::opmode_t enum into its native mode.
Definition: ir_Midea.cpp:516
kMideaACToggleLight
const uint64_t kMideaACToggleLight
Definition: ir_Midea.h:112
kMideaACFanHigh
const uint8_t kMideaACFanHigh
Definition: ir_Midea.h:98
IRMideaAC::getEconoToggle
bool getEconoToggle(void)
Definition: ir_Midea.cpp:374
kMideaACMaxTempC
const uint8_t kMideaACMaxTempC
Celsius.
Definition: ir_Midea.h:83
IRMideaAC::setEnableSensorTemp
void setEnableSensorTemp(const bool on)
Enable the remote's Sensor temperature.
Definition: ir_Midea.cpp:262
IRMideaAC::toCommon
stdAc::state_t toCommon(const stdAc::state_t *prev=NULL)
Convert the current internal state into its stdAc::state_t equivalent.
Definition: ir_Midea.cpp:568
IRMideaAC::setSensorTemp
void setSensorTemp(const uint8_t temp, const bool useCelsius=false)
Set the Sensor temperature.
Definition: ir_Midea.cpp:225
kMideaACDry
const uint8_t kMideaACDry
Definition: ir_Midea.h:91
IRMideaAC::isTurboToggle
bool isTurboToggle(void) const
Is the current state a Turbo toggle message?
Definition: ir_Midea.cpp:385
IRMideaAC::toString
String toString(void)
Convert the current internal state into a human readable string.
Definition: ir_Midea.cpp:605
IRMideaAC::validChecksum
static bool validChecksum(const uint64_t state)
Verify the checksum is valid for a given state.
Definition: ir_Midea.cpp:431
kMideaACMinSensorTempF
const uint8_t kMideaACMinSensorTempF
Fahrenheit.
Definition: ir_Midea.h:86
IRMideaAC::_LightToggle
bool _LightToggle
Definition: ir_Midea.h:219
kMideaACCool
const uint8_t kMideaACCool
Definition: ir_Midea.h:90
MideaProtocol
Native representation of a Midea A/C message.
Definition: ir_Midea.h:43
IRMideaAC::setPower
void setPower(const bool on)
Change the power setting.
Definition: ir_Midea.cpp:160
MideaProtocol::BeepDisable
uint8_t BeepDisable
0 = no beep in follow me messages, 1 = beep.
Definition: ir_Midea.h:62
IRMideaAC::stateReset
void stateReset(void)
Reset the state of the remote to a known good state/sequence.
Definition: ir_Midea.cpp:100
stdAc::state_t
Structure to hold a common A/C state.
Definition: IRsend.h:97
kMideaACFanLow
const uint8_t kMideaACFanLow
Definition: ir_Midea.h:96
IRMideaAC::_SwingVStep
bool _SwingVStep
Definition: ir_Midea.h:215
IRMideaAC::getTemp
uint8_t getTemp(const bool useCelsius=false) const
Get the current temperature setting.
Definition: ir_Midea.cpp:210
MideaProtocol::Temp
uint8_t Temp
Definition: ir_Midea.h:64
IRMideaAC::setFan
void setFan(const uint8_t fan)
Set the speed of the fan.
Definition: ir_Midea.cpp:279
kMideaACTypeCommand
const uint8_t kMideaACTypeCommand
Message type.
Definition: ir_Midea.h:114
IRMideaAC::isEconoToggle
bool isEconoToggle(void) const
Is the current state an Econo (energy saver) toggle message?
Definition: ir_Midea.cpp:368
stdAc::opmode_t
opmode_t
Common A/C settings for A/C operating modes.
Definition: IRsend.h:46