Files
ESPEasy/lib/Hp_IR/KY26HeatpumpIR.cpp

103 lines
2.7 KiB
C++

#include "KY26HeatpumpIR.h"
KY26HeatpumpIR::KY26HeatpumpIR() : HeatpumpIR() {
static const char model[] PROGMEM = "KY-26";
static const char info[] PROGMEM =
"{\"mdl\":\"ky26\",\"dn\":\"KY-26\",\"mT\":15,\"xT\":31,\"fs\":3}";
_model = model;
_info = info;
}
void KY26HeatpumpIR::send(IRSender &IR, uint8_t powerModeCmd,
uint8_t operatingModeCmd, uint8_t fanSpeedCmd,
uint8_t temperatureCmd, uint8_t swingVCmd,
uint8_t swingHCmd, uint8_t timerHourCmd,
bool timerHalfHourCmd) {
uint8_t powerMode = KY26_POWER_OFF;
uint8_t operatingMode = KY26_MODE_AUTO;
uint8_t fanSpeed = KY26_FAN1;
uint8_t temperature = 24;
uint8_t timer = KY26_TIMER_OFF;
// Operating mode
switch (operatingModeCmd) {
case MODE_AUTO:
operatingMode = KY26_MODE_AUTO;
break;
case MODE_COOL:
operatingMode = KY26_MODE_COOL;
break;
case MODE_DRY:
operatingMode = KY26_MODE_DRY;
break;
case MODE_FAN:
operatingMode = KY26_MODE_FAN;
break;
}
// Fan speed
switch (fanSpeedCmd) {
case FAN_1:
fanSpeed = KY26_FAN1;
break;
case FAN_2:
fanSpeed = KY26_FAN2;
break;
case FAN_3:
fanSpeed = KY26_FAN3;
break;
}
// Temperature
if (temperatureCmd >= 15 && temperatureCmd <= 31) {
temperature = temperatureCmd == 15 ? 0 : temperatureCmd;
}
// Timer
if (timerHourCmd > 0 && timerHourCmd <= 12) {
timer = timerHourCmd | KY26_TIMER_ON;
if (timerHalfHourCmd) {
timer |= KY26_TIMER_HALF_HOUR;
}
}
// Power mode
// This heatpump does not have a power on command, but we can simulate it by
// sending a power off command followed by a power toggle command.
if (powerModeCmd == POWER_ON) {
sendKY26(IR, powerMode, operatingMode, fanSpeed, temperature, timer);
powerMode = KY26_POWER_ONOFF;
}
return sendKY26(IR, powerMode, operatingMode, fanSpeed, temperature, timer);
}
void KY26HeatpumpIR::sendKY26(IRSender &IR, uint8_t powerModeCmd,
uint8_t operatingModeCmd, uint8_t fanSpeedCmd,
uint8_t temperatureCmd, uint8_t timerCmd) {
uint8_t KY26Template[] = {0x00, 0x00, 0x00, 0x00};
KY26Template[0] |= powerModeCmd | operatingModeCmd | fanSpeedCmd;
KY26Template[1] |= timerCmd;
KY26Template[2] |= temperatureCmd;
KY26Template[3] = (KY26Template[0] + KY26Template[1] + KY26Template[2]) % 256;
IR.setFrequency(38);
// Header
IR.mark(KY26_HDR_MARK);
IR.space(KY26_HDR_SPACE);
for (unsigned int i = 0; i < sizeof(KY26Template); i++) {
IR.sendIRbyte(KY26Template[i], KY26_BIT_MARK, KY26_ZERO_SPACE,
KY26_ONE_SPACE);
}
// Footer
IR.mark(KY26_BIT_MARK);
IR.space(0);
}