# IRremoteESP8266: src/ir_Midea.h Source File

ir_Midea.h
Go to the documentation of this file.
// Copyright 2017 David Conran
// Supports:
// Brand: Pioneer System, Model: RYBO12GMFILCAD A/C (12K BTU) (MIDEA)
// Brand: Pioneer System, Model: RUBO18GMFILCAD A/C (18K BTU) (MIDEA)
// Brand: Comfee, Model: MPD1-12CRN7 A/C (MIDEA)
// Brand: Kaysun, Model: Casual CF A/C (MIDEA)
// Brand: Keystone, Model: RG57H4(B)BGEF remote (MIDEA)
// Brand: MrCool, Model: RG57A6/BGEFU1 remote (MIDEA)
// Brand: Midea, Model: FS40-7AR Stand Fan (MIDEA24)
// Brand: Danby, Model: DAC080BGUWDB (MIDEA)
// Brand: Danby, Model: DAC100BGUWDB (MIDEA)
// Brand: Danby, Model: DAC120BGUWDB (MIDEA)
// Brand: Danby, Model: R09C/BCGE remote (MIDEA)
#ifndef IR_MIDEA_H_
#define IR_MIDEA_H_
#define __STDC_LIMIT_MACROS
#include <stdint.h>
#ifdef ARDUINO
#include <Arduino.h>
#endif
#include "IRremoteESP8266.h"
#include "IRsend.h"
#ifdef UNIT_TEST
#include "IRsend_test.h"
#endif
// Compile-time model specific overrides.
// Uncomment one of these if you have such a devices to better match your A/C.
// It changes some of the special commands/settings.
//
// #define DANBY_DAC true
// #define KAYSUN_AC true
union MideaProtocol{
uint64_t remote_state;
// only use 48bits
struct {
// Byte 0
uint8_t Sum;
// Byte 1 (value=0xFF when not in use.)
// This byte gets dual usage as Sensor Temp and On Timer
// Depending on "Type" below.
// When in "OnTimer", the nr of half hours is stored with mask 0b01111110
// i.e.
// uint8_t :1;
// uint8_t OnTimerHalfHours:6;
// uint8_t :1;
uint8_t SensorTemp:7;
uint8_t disableSensor:1;
// Byte 2 (value=0xFF when not in use.)
uint8_t :1; // 0b1
uint8_t OffTimer:6;
uint8_t BeepDisable:1;
// Byte 3
uint8_t Temp:5;
uint8_t useFahrenheit:1;
uint8_t :0;
// Byte 4
uint8_t Mode:3;
uint8_t Fan:2;
uint8_t :1;
uint8_t Sleep:1;
uint8_t Power:1;
// Byte 5
uint8_t Type:3;
uint8_t Header:5;
};
};
// Constants
const uint8_t kMideaACMinTempF = 62;
const uint8_t kMideaACMaxTempF = 86;
const uint8_t kMideaACMinTempC = 17;
const uint8_t kMideaACMaxTempC = 30;
const uint8_t kMideaACMinSensorTempC = 0;
const uint8_t kMideaACMaxSensorTempC = 37;
const uint8_t kMideaACMinSensorTempF = 32;
const uint8_t kMideaACMaxSensorTempF = 99;
const uint8_t kMideaACSensorTempOnTimerOff = 0b1111111;
const uint8_t kMideaACTimerOff = 0b111111;
const uint8_t kMideaACCool = 0; // 0b000
const uint8_t kMideaACDry = 1; // 0b001
const uint8_t kMideaACAuto = 2; // 0b010
const uint8_t kMideaACHeat = 3; // 0b011
const uint8_t kMideaACFan = 4; // 0b100
const uint8_t kMideaACFanAuto = 0; // 0b00
const uint8_t kMideaACFanLow = 1; // 0b01
const uint8_t kMideaACFanMed = 2; // 0b10
const uint8_t kMideaACFanHigh = 3; // 0b11
#if KAYSUN_AC
// For Kaysun AC units, Toggle SwingV is 0xA202FFFFFF7E
const uint64_t kMideaACToggleSwingV = 0xA202FFFFFF7E;
const uint64_t kMideaACSwingVStep = 0xA201FFFFFF7C;
#else // KAYSUN_AC
const uint64_t kMideaACToggleSwingV = 0xA201FFFFFF7C;
#endif // KAYSUN_AC
#if DANBY_DAC
// For Danby DAC unit, the Ionizer toggle is the same as ToggleSwingV
// const uint64_t kMideaACToggleIonizer = 0xA201FFFFFF7C;
kSwingVToggleStr = kIonStr;
#endif // DANBY_DAC
const uint64_t kMideaACToggleEcono = 0xA202FFFFFF7E;
const uint64_t kMideaACToggleLight = 0xA208FFFFFF75;
const uint64_t kMideaACToggleTurbo = 0xA209FFFFFF74;
const uint8_t kMideaACTypeCommand = 0b001;
const uint8_t kMideaACTypeSpecial = 0b010;
const uint8_t kMideaACTypeFollow = 0b100;
// Legacy defines. (Deprecated)
#define MIDEA_AC_COOL kMideaACCool
#define MIDEA_AC_DRY kMideaACDry
#define MIDEA_AC_AUTO kMideaACAuto
#define MIDEA_AC_HEAT kMideaACHeat
#define MIDEA_AC_FAN kMideaACFan
#define MIDEA_AC_FAN_AUTO kMideaACFanAuto
#define MIDEA_AC_FAN_LOW kMideaACFanLow
#define MIDEA_AC_FAN_MED kMideaACFanMed
#define MIDEA_AC_FAN_HI kMideaACFanHigh
#define MIDEA_AC_POWER kMideaACPower
#define MIDEA_AC_SLEEP kMideaACSleep
#define MIDEA_AC_MIN_TEMP_F kMideaACMinTempF
#define MIDEA_AC_MAX_TEMP_F kMideaACMaxTempF
#define MIDEA_AC_MIN_TEMP_C kMideaACMinTempC
#define MIDEA_AC_MAX_TEMP_C kMideaACMaxTempC
// Classes
class IRMideaAC {
public:
explicit IRMideaAC(const uint16_t pin, const bool inverted = false,
const bool use_modulation = true);
void stateReset(void);
#if SEND_MIDEA
void send(const uint16_t repeat = kMideaMinRepeat);
int8_t calibrate(void) { return _irsend.calibrate(); }
#endif // SEND_MIDEA
void begin(void);
void on(void);
void off(void);
void setPower(const bool on);
bool getPower(void) const;
bool getUseCelsius(void) const;
void setUseCelsius(const bool celsius);
void setTemp(const uint8_t temp, const bool useCelsius = false);
uint8_t getTemp(const bool useCelsius = false) const;
void setSensorTemp(const uint8_t temp, const bool useCelsius = false);
uint8_t getSensorTemp(const bool useCelsius = false) const;
void setEnableSensorTemp(const bool on);
bool getEnableSensorTemp(void) const;
void setFan(const uint8_t fan);
uint8_t getFan(void) const;
void setMode(const uint8_t mode);
uint8_t getMode(void) const;
void setRaw(const uint64_t newState);
uint64_t getRaw(void);
static bool validChecksum(const uint64_t state);
void setSleep(const bool on);
bool getSleep(void) const;
bool isSwingVToggle(void) const;
void setSwingVToggle(const bool on);
bool getSwingVToggle(void);
#if KAYSUN_AC
bool isSwingVStep(void) const;
void setSwingVStep(const bool on);
bool getSwingVStep(void);
#endif // KAYSUN_AC
bool isEconoToggle(void) const;
void setEconoToggle(const bool on);
bool getEconoToggle(void);
bool isTurboToggle(void) const;
void setTurboToggle(const bool on);
bool getTurboToggle(void);
bool isLightToggle(void) const;
void setLightToggle(const bool on);
bool getLightToggle(void);
uint8_t getType(void) const;
bool isOnTimerEnabled(void) const;
uint16_t getOnTimer(void) const;
void setOnTimer(const uint16_t mins);
bool isOffTimerEnabled(void) const;
uint16_t getOffTimer(void) const;
void setOffTimer(const uint16_t mins);
static uint8_t convertMode(const stdAc::opmode_t mode);
static uint8_t convertFan(const stdAc::fanspeed_t speed);
static stdAc::opmode_t toCommonMode(const uint8_t mode);
static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
stdAc::state_t toCommon(const stdAc::state_t *prev = NULL);
String toString(void);
#ifndef UNIT_TEST
private:
IRsend _irsend;
#else // UNIT_TEST
IRsendTest _irsend;
#endif // UNIT_TEST
MideaProtocol _;
bool _SwingVToggle;
#if KAYSUN_AC
bool _SwingVStep;
#endif // KAYSUN_AC
bool _EconoToggle;
bool _TurboToggle;
bool _LightToggle;
void checksum(void);
static uint8_t calcChecksum(const uint64_t state);
void setType(const uint8_t type);
};
#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