Hitachi heatpump support

This commit is contained in:
ToniA 2017-02-21 19:07:59 +02:00
parent f18571c511
commit f4c495662b
4 changed files with 197 additions and 1 deletions

146
HitachiHeatpumpIR.cpp Normal file
View File

@ -0,0 +1,146 @@
#include <HitachiHeatpumpIR.h>
HitachiHeatpumpIR::HitachiHeatpumpIR() : HeatpumpIR()
{
static const char PROGMEM model[] PROGMEM = "hitachi";
static const char PROGMEM info[] PROGMEM = "{\"mdl\":\"hitachi\",\"dn\":\"Hitachi\",\"mT\":16,\"xT\":32,\"fs\":4}";
_model = model;
_info = info;
}
void HitachiHeatpumpIR::send(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingModeCmd, uint8_t fanSpeedCmd, uint8_t temperatureCmd, uint8_t swingVcmd, uint8_t swingHcmd)
{
// Sensible defaults for the heat pump mode
uint8_t operatingMode = HITACHI_AIRCON1_MODE_HEAT;
uint8_t fanSpeed = HITACHI_AIRCON1_FAN_AUTO;
uint8_t temperature = 23;
uint8_t powerMode;
uint8_t swingV = HITACHI_AIRCON1_VDIR_AUTO;
uint8_t swingH = HITACHI_AIRCON1_HDIR_AUTO;
if (powerModeCmd == POWER_OFF)
{
powerMode = HITACHI_AIRCON1_POWER_OFF;
}
else
{
powerMode = HITACHI_AIRCON1_POWER_ON;
}
switch (operatingModeCmd)
{
case MODE_AUTO:
operatingMode = HITACHI_AIRCON1_MODE_AUTO;
break;
case MODE_HEAT:
operatingMode = HITACHI_AIRCON1_MODE_HEAT;
break;
case MODE_COOL:
operatingMode = HITACHI_AIRCON1_MODE_COOL;
break;
case MODE_DRY:
operatingMode = HITACHI_AIRCON1_MODE_DRY;
fanSpeedCmd = FAN_2; //Only speed 1 & 2 in dry mode
break;
case MODE_FAN:
operatingMode = HITACHI_AIRCON1_MODE_FAN;
temperatureCmd = 64; //Temperature = 64 in fan mode
if (fanSpeedCmd == FAN_AUTO)
{
fanSpeedCmd = FAN_2; //No auto fan in fan mode
}
break;
}
switch (fanSpeedCmd)
{
case FAN_AUTO:
fanSpeed = HITACHI_AIRCON1_FAN_AUTO;
break;
case FAN_1:
fanSpeed = HITACHI_AIRCON1_FAN1;
break;
case FAN_2:
fanSpeed = HITACHI_AIRCON1_FAN2;
break;
case FAN_3:
fanSpeed = HITACHI_AIRCON1_FAN3;
break;
case FAN_4:
fanSpeed = HITACHI_AIRCON1_FAN4;
break;
case FAN_5:
fanSpeed = HITACHI_AIRCON1_FAN4;
break;
}
if ((temperatureCmd > 15 && temperatureCmd < 33) || temperatureCmd == 64)
{
temperature = temperatureCmd;
}
switch (swingV)
{
case HDIR_AUTO:
swingV = HITACHI_AIRCON1_VDIR_AUTO;
break;
case HDIR_SWING:
swingV = HITACHI_AIRCON1_VDIR_SWING;
break;
}
switch (swingH)
{
case HDIR_AUTO:
swingH = HITACHI_AIRCON1_HDIR_AUTO;
break;
case HDIR_SWING:
swingH = HITACHI_AIRCON1_HDIR_SWING;
break;
}
sendHitachi(IR, powerMode, operatingMode, fanSpeed, temperature, swingV, swingH);
}
// Send the Hitachi code
void HitachiHeatpumpIR::sendHitachi(IRSender& IR, uint8_t powerMode, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingV, uint8_t swingH)
{
uint8_t hitachiTemplate[28] = {
0x01, 0x10, 0x30, 0x40, 0xBF, 0x01, 0xFE, 0x11, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00 };
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
if(temperature == 16){
hitachiTemplate[9] = 0x09;
}
hitachiTemplate[10] = operatingMode;
hitachiTemplate[11] = temperature;
hitachiTemplate[11] = (hitachiTemplate[11] << 1);
hitachiTemplate[13] = fanSpeed;
hitachiTemplate[14] |= swingV;
hitachiTemplate[15] |= swingH;
hitachiTemplate[17] = powerMode;
//hitachiTemplate[25] = ecoMode;
//Checksum calculation
int checksum = 1086;
for (byte i = 0; i < 27; i++) {
checksum -= hitachiTemplate[i];
}
hitachiTemplate[27] = checksum;
// 38 kHz PWM frequency
IR.setFrequency(38);
// Header
IR.mark(HITACHI_AIRCON1_HDR_MARK);
IR.space(HITACHI_AIRCON1_HDR_SPACE);
// Data
for (int i=0; i<28; i++) {
IR.sendIRbyte(hitachiTemplate[i], HITACHI_AIRCON1_BIT_MARK, HITACHI_AIRCON1_ZERO_SPACE, HITACHI_AIRCON1_ONE_SPACE);
}
IR.mark(HITACHI_AIRCON1_BIT_MARK);
IR.space(0);
}

48
HitachiHeatpumpIR.h Normal file
View File

@ -0,0 +1,48 @@
/*
Hitachi RAR-5E1 remote
*/
#ifndef HitachiHeatpumpIR_h
#define HitachiHeatpumpIR_h
#include <HeatpumpIR.h>
// Hitachi remote timing constants
#define HITACHI_AIRCON1_HDR_MARK 3436
#define HITACHI_AIRCON1_HDR_SPACE 1640
#define HITACHI_AIRCON1_BIT_MARK 420
#define HITACHI_AIRCON1_ONE_SPACE 1250
#define HITACHI_AIRCON1_ZERO_SPACE 500
// Hitachi codes
#define HITACHI_AIRCON1_MODE_AUTO 0x02 // Operating mode
#define HITACHI_AIRCON1_MODE_HEAT 0x03
#define HITACHI_AIRCON1_MODE_COOL 0x04
#define HITACHI_AIRCON1_MODE_DRY 0x05
#define HITACHI_AIRCON1_MODE_FAN 0x0C
#define HITACHI_AIRCON1_POWER_OFF 0x00 // Power OFF
#define HITACHI_AIRCON1_POWER_ON 0x80
#define HITACHI_AIRCON1_FAN_AUTO 0x01 // Fan speed
#define HITACHI_AIRCON1_FAN1 0x02
#define HITACHI_AIRCON1_FAN2 0x03
#define HITACHI_AIRCON1_FAN3 0x04
#define HITACHI_AIRCON1_FAN4 0x05
#define HITACHI_AIRCON1_VDIR_AUTO 0x00
#define HITACHI_AIRCON1_VDIR_SWING 0x01
#define HITACHI_AIRCON1_HDIR_AUTO 0x00
#define HITACHI_AIRCON1_HDIR_SWING 0x01
class HitachiHeatpumpIR : public HeatpumpIR
{
public:
HitachiHeatpumpIR();
void send(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingModeCmd, uint8_t fanSpeedCmd, uint8_t temperatureCmd, uint8_t swingVcmd, uint8_t swingHcmd);
private:
void sendHitachi(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingV, uint8_t swingH);
};
#endif

View File

@ -17,6 +17,7 @@
#include <ToshibaHeatpumpIR.h> #include <ToshibaHeatpumpIR.h>
#include <ToshibaDaiseikaiHeatpumpIR.h> #include <ToshibaDaiseikaiHeatpumpIR.h>
#include <IVTHeatpumpIR.h> #include <IVTHeatpumpIR.h>
#include <HitachiHeatpumpIR.h>
#ifndef ESP8266 #ifndef ESP8266
@ -38,7 +39,7 @@ HeatpumpIR *heatpumpIR[] = {new PanasonicCKPHeatpumpIR(), new PanasonicDKEHeatpu
new HyundaiHeatpumpIR(), new HisenseHeatpumpIR(), new HyundaiHeatpumpIR(), new HisenseHeatpumpIR(),
new GreeGenericHeatpumpIR(), new GreeYANHeatpumpIR(), new GreeGenericHeatpumpIR(), new GreeYANHeatpumpIR(),
new FuegoHeatpumpIR(), new ToshibaHeatpumpIR(), new ToshibaDaiseikaiHeatpumpIR(), new FuegoHeatpumpIR(), new ToshibaHeatpumpIR(), new ToshibaDaiseikaiHeatpumpIR(),
new IVTHeatpumpIR(), new IVTHeatpumpIR(), new HitachiHeatpumpIR(),
NULL}; NULL};
void setup() void setup()

View File

@ -29,6 +29,7 @@ GreeYANHeatpumpIR KEYWORD1
FuegoHeatpumpIR KEYWORD1 FuegoHeatpumpIR KEYWORD1
ToshibaHeatpumpIR KEYWORD1 ToshibaHeatpumpIR KEYWORD1
IVTHeatpumpIR KEYWORD1 IVTHeatpumpIR KEYWORD1
HitachiHeatpumpIR KEYWORD1
IRSender KEYWORD1 IRSender KEYWORD1
IRSenderPWM KEYWORD1 IRSenderPWM KEYWORD1