IRremoteESP8266
Loading...
Searching...
No Matches
ir_Midea.h
Go to the documentation of this file.
1// Copyright 2017 David Conran
2
9
10// Supports:
11// Brand: Pioneer System, Model: RYBO12GMFILCAD A/C (12K BTU) (MIDEA)
12// Brand: Pioneer System, Model: RUBO18GMFILCAD A/C (18K BTU) (MIDEA)
13// Brand: Pioneer System, Model: WS012GMFI22HLD A/C (12K BTU) (MIDEA)
14// Brand: Pioneer System, Model: WS018GMFI22HLD A/C (12K BTU) (MIDEA)
15// Brand: Pioneer System, Model: UB018GMFILCFHD A/C (12K BTU) (MIDEA)
16// Brand: Pioneer System, Model: RG66B6(B)/BGEFU1 remote (MIDEA)
17// Brand: Comfee, Model: MPD1-12CRN7 A/C (MIDEA)
18// Brand: Kaysun, Model: Casual CF A/C (MIDEA)
19// Brand: Keystone, Model: RG57H4(B)BGEF remote (MIDEA)
20// Brand: MrCool, Model: RG57A6/BGEFU1 remote (MIDEA)
21// Brand: Midea, Model: FS40-7AR Stand Fan (MIDEA24)
22// Brand: Danby, Model: DAC080BGUWDB (MIDEA)
23// Brand: Danby, Model: DAC100BGUWDB (MIDEA)
24// Brand: Danby, Model: DAC120BGUWDB (MIDEA)
25// Brand: Danby, Model: R09C/BCGE remote (MIDEA)
26// Brand: Trotec, Model: TROTEC PAC 2100 X (MIDEA)
27// Brand: Trotec, Model: TROTEC PAC 3900 X (MIDEA)
28// Brand: Trotec, Model: RG57H(B)/BGE remote (MIDEA)
29// Brand: Trotec, Model: RG57H3(B)/BGCEF-M remote (MIDEA)
30// Brand: Lennox, Model: RG57A6/BGEFU1 remote (MIDEA)
31// Brand: Lennox, Model: MWMA009S4-3P A/C (MIDEA)
32// Brand: Lennox, Model: MWMA012S4-3P A/C (MIDEA)
33// Brand: Lennox, Model: MCFA indoor split A/C (MIDEA)
34// Brand: Lennox, Model: MCFB indoor split A/C (MIDEA)
35// Brand: Lennox, Model: MMDA indoor split A/C (MIDEA)
36// Brand: Lennox, Model: MMDB indoor split A/C (MIDEA)
37// Brand: Lennox, Model: MWMA indoor split A/C (MIDEA)
38// Brand: Lennox, Model: MWMB indoor split A/C (MIDEA)
39// Brand: Lennox, Model: M22A indoor split A/C (MIDEA)
40// Brand: Lennox, Model: M33A indoor split A/C (MIDEA)
41// Brand: Lennox, Model: M33B indoor split A/C (MIDEA)
42
43#ifndef IR_MIDEA_H_
44#define IR_MIDEA_H_
45
46#define __STDC_LIMIT_MACROS
47#include <stdint.h>
48#ifdef ARDUINO
49#include <Arduino.h>
50#endif
51#include "IRremoteESP8266.h"
52#include "IRsend.h"
53#ifdef UNIT_TEST
54#include "IRsend_test.h"
55#endif
56
61//
62// #define DANBY_DAC true
63// #define KAYSUN_AC true
64
69
72 uint64_t remote_state;
73 // only use 48bits
74 struct {
75 // Byte 0
76 uint8_t Sum;
77 // Byte 1 (value=0xFF when not in use.)
78 // This byte gets dual usage as Sensor Temp and On Timer
79 // Depending on "Type" below.
80 // When in "OnTimer", the nr of half hours is stored with mask 0b01111110
81 // i.e.
82 // uint8_t :1;
83 // uint8_t OnTimerHalfHours:6;
84 // uint8_t :1;
85 uint8_t SensorTemp:7;
86 uint8_t disableSensor:1;
87 // Byte 2 (value=0xFF when not in use.)
88 uint8_t :1; // 0b1
89 uint8_t OffTimer:6;
90 uint8_t BeepDisable:1;
91 // Byte 3
92 uint8_t Temp:5;
93 uint8_t useFahrenheit:1;
94 uint8_t :0;
95 // Byte 4
96 uint8_t Mode:3;
97 uint8_t Fan:2;
100 uint8_t :1;
101 uint8_t Sleep:1;
102 uint8_t Power:1;
103 // Byte 5
104 uint8_t Type:3;
105 uint8_t Header:5;
106 };
107};
108
109// Constants
110const uint8_t kMideaACMinTempF = 62;
111const uint8_t kMideaACMaxTempF = 86;
112const uint8_t kMideaACMinTempC = 17;
113const uint8_t kMideaACMaxTempC = 30;
114const uint8_t kMideaACMinSensorTempC = 0;
115const uint8_t kMideaACMaxSensorTempC = 37;
116const uint8_t kMideaACMinSensorTempF = 32;
117const uint8_t kMideaACMaxSensorTempF = 99;
118const uint8_t kMideaACSensorTempOnTimerOff = 0b1111111;
119const uint8_t kMideaACTimerOff = 0b111111;
120const uint8_t kMideaACCool = 0; // 0b000
121const uint8_t kMideaACDry = 1; // 0b001
122const uint8_t kMideaACAuto = 2; // 0b010
123const uint8_t kMideaACHeat = 3; // 0b011
124const uint8_t kMideaACFan = 4; // 0b100
125const uint8_t kMideaACFanAuto = 0; // 0b00
126const uint8_t kMideaACFanLow = 1; // 0b01
127const uint8_t kMideaACFanMed = 2; // 0b10
128const uint8_t kMideaACFanHigh = 3; // 0b11
129#if KAYSUN_AC
130 // For Kaysun AC units, Toggle SwingV is 0xA202FFFFFF7E
131 const uint64_t kMideaACToggleSwingV = 0xA202FFFFFF7E;
132 const uint64_t kMideaACSwingVStep = 0xA201FFFFFF7C;
133#else // KAYSUN_AC
134 const uint64_t kMideaACToggleSwingV = 0xA201FFFFFF7C;
135#endif // KAYSUN_AC
136#if DANBY_DAC
137 // For Danby DAC unit, the Ionizer toggle is the same as ToggleSwingV
138 // const uint64_t kMideaACToggleIonizer = 0xA201FFFFFF7C;
140#endif // DANBY_DAC
141const uint64_t kMideaACToggleEcono = 0xA202FFFFFF7E;
142const uint64_t kMideaACToggleLight = 0xA208FFFFFF75;
143const uint64_t kMideaACToggleTurbo = 0xA209FFFFFF74;
144// Mode must be Auto, Cool, or Dry
145const uint64_t kMideaACToggleSelfClean = 0xA20DFFFFFF70;
146// 8C Heat AKA Freeze Protection
147const uint64_t kMideaACToggle8CHeat = 0xA20FFFFFFF73; // Only in Heat
148const uint64_t kMideaACQuietOn = 0xA212FFFFFF6E;
149const uint64_t kMideaACQuietOff = 0xA213FFFFFF6F;
150
151const uint8_t kMideaACTypeCommand = 0b001;
152const uint8_t kMideaACTypeSpecial = 0b010;
153const uint8_t kMideaACTypeFollow = 0b100;
154
155// Legacy defines. (Deprecated)
156#define MIDEA_AC_COOL kMideaACCool
157#define MIDEA_AC_DRY kMideaACDry
158#define MIDEA_AC_AUTO kMideaACAuto
159#define MIDEA_AC_HEAT kMideaACHeat
160#define MIDEA_AC_FAN kMideaACFan
161#define MIDEA_AC_FAN_AUTO kMideaACFanAuto
162#define MIDEA_AC_FAN_LOW kMideaACFanLow
163#define MIDEA_AC_FAN_MED kMideaACFanMed
164#define MIDEA_AC_FAN_HI kMideaACFanHigh
165#define MIDEA_AC_POWER kMideaACPower
166#define MIDEA_AC_SLEEP kMideaACSleep
167#define MIDEA_AC_MIN_TEMP_F kMideaACMinTempF
168#define MIDEA_AC_MAX_TEMP_F kMideaACMaxTempF
169#define MIDEA_AC_MIN_TEMP_C kMideaACMinTempC
170#define MIDEA_AC_MAX_TEMP_C kMideaACMaxTempC
171
172// Classes
176 public:
177 explicit IRMideaAC(const uint16_t pin, const bool inverted = false,
178 const bool use_modulation = true);
179 void stateReset(void);
180#if SEND_MIDEA
181 void send(const uint16_t repeat = kMideaMinRepeat);
186 int8_t calibrate(void) { return _irsend.calibrate(); }
187#endif // SEND_MIDEA
188 void begin(void);
189 void on(void);
190 void off(void);
191 void setPower(const bool on);
192 bool getPower(void) const;
193 bool getUseCelsius(void) const;
194 void setUseCelsius(const bool celsius);
195 void setTemp(const uint8_t temp, const bool useCelsius = false);
196 uint8_t getTemp(const bool useCelsius = false) const;
197 void setSensorTemp(const uint8_t temp, const bool useCelsius = false);
198 uint8_t getSensorTemp(const bool useCelsius = false) const;
199 void setEnableSensorTemp(const bool on);
200 bool getEnableSensorTemp(void) const;
201 void setFan(const uint8_t fan);
202 uint8_t getFan(void) const;
203 void setMode(const uint8_t mode);
204 uint8_t getMode(void) const;
205 void setRaw(const uint64_t newState);
206 uint64_t getRaw(void);
207 static bool validChecksum(const uint64_t state);
208 void setSleep(const bool on);
209 bool getSleep(void) const;
210 bool isSwingVToggle(void) const;
211 void setSwingVToggle(const bool on);
212 bool getSwingVToggle(void);
213 #if KAYSUN_AC
214 bool isSwingVStep(void) const;
215 void setSwingVStep(const bool on);
216 bool getSwingVStep(void);
217 #endif // KAYSUN_AC
218 bool isEconoToggle(void) const;
219 void setEconoToggle(const bool on);
220 bool getEconoToggle(void);
221 bool isTurboToggle(void) const;
222 void setTurboToggle(const bool on);
223 bool getTurboToggle(void);
224 bool isLightToggle(void) const;
225 void setLightToggle(const bool on);
226 bool getLightToggle(void);
227 bool isCleanToggle(void) const;
228 void setCleanToggle(const bool on);
229 bool getCleanToggle(void);
230 bool is8CHeatToggle(void) const;
231 void set8CHeatToggle(const bool on);
232 bool get8CHeatToggle(void);
233 bool isQuiet(void) const;
234 void setQuiet(const bool on);
235 void setQuiet(const bool on, const bool prev);
236 bool getQuiet(void) const;
237 uint8_t getType(void) const;
238 bool isOnTimerEnabled(void) const;
239 uint16_t getOnTimer(void) const;
240 void setOnTimer(const uint16_t mins);
241 bool isOffTimerEnabled(void) const;
242 uint16_t getOffTimer(void) const;
243 void setOffTimer(const uint16_t mins);
244 static uint8_t convertMode(const stdAc::opmode_t mode);
245 static uint8_t convertFan(const stdAc::fanspeed_t speed);
246 static stdAc::opmode_t toCommonMode(const uint8_t mode);
247 static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
248 stdAc::state_t toCommon(const stdAc::state_t *prev = NULL);
249 String toString(void);
250#ifndef UNIT_TEST
251
252 private:
254#else // UNIT_TEST
256 IRsendTest _irsend;
258#endif // UNIT_TEST
264 bool _Quiet;
267 #if KAYSUN_AC
269 #endif // KAYSUN_AC
271 void checksum(void);
272 static uint8_t calcChecksum(const uint64_t state);
273 void setType(const uint8_t type);
274};
275
276#endif // IR_MIDEA_H_
const uint16_t kMideaMinRepeat
Definition IRremoteESP8266.h:1334
std::string String
Definition IRremoteESP8266.h:1564
Class for handling detailed Midea A/C messages.
Definition ir_Midea.h:175
void setTurboToggle(const bool on)
Set the A/C to toggle the Turbo mode for the next send.
Definition ir_Midea.cpp:398
static uint8_t convertFan(const stdAc::fanspeed_t speed)
Convert a stdAc::fanspeed_t enum into it's native speed.
Definition ir_Midea.cpp:615
static uint8_t convertMode(const stdAc::opmode_t mode)
Convert a stdAc::opmode_t enum into its native mode.
Definition ir_Midea.cpp:602
void setSwingVStep(const bool on)
Set the A/C to step the vertical swing for the next send.
Definition ir_Midea.cpp:363
bool isOffTimerEnabled(void) const
Is the OffTimer enabled?
Definition ir_Midea.cpp:578
uint8_t getType(void) const
Get the message type setting of the A/C message.
Definition ir_Midea.cpp:529
void setSleep(const bool on)
Set the Sleep setting of the A/C.
Definition ir_Midea.cpp:330
void setUseCelsius(const bool celsius)
Set the A/C unit to use Celsius natively.
Definition ir_Midea.cpp:195
void setOffTimer(const uint16_t mins)
Set the value of the Off Timer.
Definition ir_Midea.cpp:591
bool isEconoToggle(void) const
Is the current state an Econo (energy saver) toggle message?
Definition ir_Midea.cpp:385
uint16_t getOffTimer(void) const
Get the value of the OffTimer is currently set to.
Definition ir_Midea.cpp:584
bool _Quiet_prev
Definition ir_Midea.h:265
void off(void)
Set the requested power state of the A/C to off.
Definition ir_Midea.cpp:173
bool getSleep(void) const
Get the Sleep setting of the A/C.
Definition ir_Midea.cpp:336
bool _EconoToggle
Definition ir_Midea.h:261
bool getEnableSensorTemp(void) const
Is the remote temperature sensor enabled?
Definition ir_Midea.cpp:292
uint8_t getTemp(const bool useCelsius=false) const
Get the current temperature setting.
Definition ir_Midea.cpp:227
bool getQuiet(void) const
Definition ir_Midea.cpp:492
bool getTurboToggle(void)
Definition ir_Midea.cpp:408
bool isSwingVStep(void) const
Is the current state a step vertical swing message?
Definition ir_Midea.cpp:367
uint8_t getFan(void) const
Get the current fan speed setting.
Definition ir_Midea.cpp:302
void setMode(const uint8_t mode)
Set the operating mode of the A/C.
Definition ir_Midea.cpp:314
uint8_t getSensorTemp(const bool useCelsius=false) const
Get the current Sensor temperature setting.
Definition ir_Midea.cpp:265
int8_t calibrate(void)
Run the calibration to calculate uSec timing offsets for this platform.
Definition ir_Midea.h:186
bool get8CHeatToggle(void)
Definition ir_Midea.cpp:466
void checksum(void)
Calculate & set the checksum for the current internal state of the remote.
Definition ir_Midea.cpp:522
void setTemp(const uint8_t temp, const bool useCelsius=false)
Set the temperature.
Definition ir_Midea.cpp:206
MideaProtocol _
Definition ir_Midea.h:259
String toString(void)
Convert the current internal state into a human readable string.
Definition ir_Midea.cpp:692
uint16_t getOnTimer(void) const
Get the value of the OnTimer is currently set to.
Definition ir_Midea.cpp:556
bool getSwingVToggle(void)
Definition ir_Midea.cpp:355
bool isSwingVToggle(void) const
Is the current state a vertical swing toggle message?
Definition ir_Midea.cpp:348
void setFan(const uint8_t fan)
Set the speed of the fan.
Definition ir_Midea.cpp:296
bool is8CHeatToggle(void) const
Is the current state a 8C Heat (Freeze Protect) toggle message?
Definition ir_Midea.cpp:453
bool isOnTimerEnabled(void) const
Is the OnTimer enabled?
Definition ir_Midea.cpp:549
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:654
bool _CleanToggle
Definition ir_Midea.h:260
bool _Quiet
Definition ir_Midea.h:264
void setCleanToggle(const bool on)
Set the A/C to toggle the Self Clean mode for the next send.
Definition ir_Midea.cpp:439
bool getEconoToggle(void)
Definition ir_Midea.cpp:391
bool getLightToggle(void)
Definition ir_Midea.cpp:425
bool getUseCelsius(void) const
Is the device currently using Celsius or the Fahrenheit temp scale?
Definition ir_Midea.cpp:189
void setSwingVToggle(const bool on)
Set the A/C to toggle the vertical swing toggle for the next send.
Definition ir_Midea.cpp:343
void setLightToggle(const bool on)
Set the A/C to toggle the Light (LED) mode for the next send.
Definition ir_Midea.cpp:415
bool _TurboToggle
Definition ir_Midea.h:270
void setType(const uint8_t type)
Set the message type setting of the A/C message.
Definition ir_Midea.cpp:533
void setEnableSensorTemp(const bool on)
Enable the remote's Sensor temperature.
Definition ir_Midea.cpp:279
bool _SwingVStep
Definition ir_Midea.h:268
bool isCleanToggle(void) const
Is the current state a Self-Clean toggle message?
Definition ir_Midea.cpp:432
static bool validChecksum(const uint64_t state)
Verify the checksum is valid for a given state.
Definition ir_Midea.cpp:517
void setSensorTemp(const uint8_t temp, const bool useCelsius=false)
Set the Sensor temperature.
Definition ir_Midea.cpp:242
void setOnTimer(const uint16_t mins)
Set the value of the On Timer.
Definition ir_Midea.cpp:567
uint8_t getMode(void) const
Get the operating mode setting of the A/C.
Definition ir_Midea.cpp:308
bool getCleanToggle(void)
Definition ir_Midea.cpp:445
bool isQuiet(void) const
Is the current state a Quiet(Silent) message?
Definition ir_Midea.cpp:473
void setRaw(const uint64_t newState)
Set the internal state from a valid code for this protocol.
Definition ir_Midea.cpp:167
bool _LightToggle
Definition ir_Midea.h:263
void setPower(const bool on)
Change the power setting.
Definition ir_Midea.cpp:177
bool getSwingVStep(void)
Definition ir_Midea.cpp:373
bool isLightToggle(void) const
Is the current state a Light (LED) toggle message?
Definition ir_Midea.cpp:419
static stdAc::opmode_t toCommonMode(const uint8_t mode)
Convert a native mode into its stdAc equivalent.
Definition ir_Midea.cpp:629
void begin(void)
Set up hardware to be able to send a message.
Definition ir_Midea.cpp:117
static uint8_t calcChecksum(const uint64_t state)
Calculate the checksum for a given state.
Definition ir_Midea.cpp:502
void stateReset(void)
Reset the state of the remote to a known good state/sequence.
Definition ir_Midea.cpp:101
static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
Convert a native fan speed into its stdAc equivalent.
Definition ir_Midea.cpp:642
bool getPower(void) const
Get the value of the current power setting.
Definition ir_Midea.cpp:183
bool _SwingVToggle
Definition ir_Midea.h:266
uint64_t getRaw(void)
Get a copy of the internal state/code for this protocol.
Definition ir_Midea.cpp:160
IRsend _irsend
Instance of the IR send class.
Definition ir_Midea.h:253
bool isTurboToggle(void) const
Is the current state a Turbo toggle message?
Definition ir_Midea.cpp:402
void setQuiet(const bool on)
Set the Quiet (Silent) mode for the next send.
Definition ir_Midea.cpp:480
void setEconoToggle(const bool on)
Set the A/C to toggle the Econo (energy saver) mode for the next send.
Definition ir_Midea.cpp:381
void set8CHeatToggle(const bool on)
Set the A/C to toggle the 8C Heat (Freeze Protect) mode for the next send.
Definition ir_Midea.cpp:460
bool _8CHeatToggle
Definition ir_Midea.h:262
void send(const uint16_t repeat=kMideaMinRepeat)
Send the current internal state as an IR message.
Definition ir_Midea.cpp:122
void on(void)
Set the requested power state of the A/C to on.
Definition ir_Midea.cpp:170
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 kMideaACSensorTempOnTimerOff
Definition ir_Midea.h:118
const uint64_t kMideaACQuietOn
Definition ir_Midea.h:148
const uint64_t kMideaACSwingVStep
Definition ir_Midea.h:132
const uint8_t kMideaACTypeFollow
Message type.
Definition ir_Midea.h:153
const uint8_t kMideaACMinTempF
Fahrenheit.
Definition ir_Midea.h:110
const uint8_t kMideaACMaxTempC
Celsius.
Definition ir_Midea.h:113
const uint64_t kMideaACQuietOff
Definition ir_Midea.h:149
const uint8_t kMideaACFanAuto
Definition ir_Midea.h:125
const uint8_t kMideaACAuto
Definition ir_Midea.h:122
const uint64_t kMideaACToggleTurbo
Definition ir_Midea.h:143
const uint64_t kMideaACToggleSwingV
Definition ir_Midea.h:131
const uint8_t kMideaACTypeCommand
Message type.
Definition ir_Midea.h:151
const uint8_t kMideaACMaxSensorTempF
Fahrenheit (Guess only!)
Definition ir_Midea.h:117
const uint64_t kMideaACToggleLight
Definition ir_Midea.h:142
const uint8_t kMideaACMaxSensorTempC
Celsius.
Definition ir_Midea.h:115
const uint8_t kMideaACDry
Definition ir_Midea.h:121
const uint8_t kMideaACFanLow
Definition ir_Midea.h:126
const uint8_t kMideaACFanMed
Definition ir_Midea.h:127
const uint8_t kMideaACCool
Definition ir_Midea.h:120
const uint8_t kMideaACFanHigh
Definition ir_Midea.h:128
const uint8_t kMideaACHeat
Definition ir_Midea.h:123
const uint8_t kMideaACMinSensorTempF
Fahrenheit.
Definition ir_Midea.h:116
const uint64_t kMideaACToggleSelfClean
Definition ir_Midea.h:145
const uint8_t kMideaACMaxTempF
Fahrenheit.
Definition ir_Midea.h:111
const uint8_t kMideaACFan
Definition ir_Midea.h:124
kSwingVToggleStr
Definition ir_Midea.h:139
const uint64_t kMideaACToggle8CHeat
Definition ir_Midea.h:147
const uint8_t kMideaACMinTempC
Celsius.
Definition ir_Midea.h:112
const uint8_t kMideaACTimerOff
Definition ir_Midea.h:119
const uint8_t kMideaACTypeSpecial
Message type.
Definition ir_Midea.h:152
const uint8_t kMideaACMinSensorTempC
Celsius.
Definition ir_Midea.h:114
const uint64_t kMideaACToggleEcono
Definition ir_Midea.h:141
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 Midea A/C message.
Definition ir_Midea.h:71
uint8_t Fan
Definition ir_Midea.h:97
uint8_t useFahrenheit
Definition ir_Midea.h:93
uint8_t disableSensor
Definition ir_Midea.h:86
uint8_t BeepDisable
0 = no beep in follow me messages, 1 = beep.
Definition ir_Midea.h:90
uint8_t SensorTemp
Degrees or OnTimer.
Definition ir_Midea.h:85
uint8_t Sum
Definition ir_Midea.h:76
uint8_t Temp
Definition ir_Midea.h:92
uint8_t Power
Definition ir_Midea.h:102
uint8_t Header
Typically 0b10100.
Definition ir_Midea.h:105
uint64_t remote_state
The state in native IR code form.
Definition ir_Midea.h:72
uint8_t Mode
Definition ir_Midea.h:96
uint8_t Type
Normal, Special, or FollowMe message type.
Definition ir_Midea.h:104
uint8_t Sleep
Definition ir_Midea.h:101
uint8_t OffTimer
Nr of Half hours. Off is 0b111111.
Definition ir_Midea.h:89