Panasonic LKE support

This commit is contained in:
ToniA 2016-11-28 18:41:24 +02:00
parent c813482261
commit 3d90bfb2bd
4 changed files with 50 additions and 22 deletions

View File

@ -40,6 +40,17 @@ PanasonicNKEHeatpumpIR::PanasonicNKEHeatpumpIR() : PanasonicHeatpumpIR()
_panasonicModel = PANASONIC_NKE; _panasonicModel = PANASONIC_NKE;
} }
PanasonicLKEHeatpumpIR::PanasonicLKEHeatpumpIR() : PanasonicHeatpumpIR()
{
static const char PROGMEM model[] PROGMEM = "panasonic_lke";
static const char PROGMEM info[] PROGMEM = "{\"mdl\":\"panasonic_lke\",\"dn\":\"Panasonic LKE\",\"mT\":16,\"xT\":30,\"fs\":6,\"maint\":[8,10]}";
_model = model;
_info = info;
_panasonicModel = PANASONIC_LKE;
}
// Panasonic DKE/NKE/JKE numeric values to command bytes // Panasonic DKE/NKE/JKE numeric values to command bytes
void PanasonicHeatpumpIR::send(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingModeCmd, uint8_t fanSpeedCmd, uint8_t temperatureCmd, uint8_t swingVCmd, uint8_t swingHCmd) void PanasonicHeatpumpIR::send(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingModeCmd, uint8_t fanSpeedCmd, uint8_t temperatureCmd, uint8_t swingVCmd, uint8_t swingHCmd)
@ -165,7 +176,7 @@ void PanasonicHeatpumpIR::send(IRSender& IR, uint8_t powerModeCmd, uint8_t opera
} }
// Quiet & powerful, both cannot be set at the same time // Quiet & powerful, both cannot be set at the same time
if ( quietCmd == true ) if ( quietCmd == true )
{ {
profile = PANASONIC_AIRCON2_QUIET; profile = PANASONIC_AIRCON2_QUIET;
@ -173,7 +184,7 @@ void PanasonicHeatpumpIR::send(IRSender& IR, uint8_t powerModeCmd, uint8_t opera
{ {
profile = PANASONIC_AIRCON2_POWERFUL; profile = PANASONIC_AIRCON2_POWERFUL;
} }
// NKE has +8 / + 10 maintenance heating, which also means MAX fanspeed // NKE has +8 / + 10 maintenance heating, which also means MAX fanspeed
if ( _panasonicModel == PANASONIC_NKE ) if ( _panasonicModel == PANASONIC_NKE )
{ {
@ -187,34 +198,42 @@ void PanasonicHeatpumpIR::send(IRSender& IR, uint8_t powerModeCmd, uint8_t opera
sendPanasonic(IR, operatingMode, fanSpeed, temperature, swingV, swingH, profile); sendPanasonic(IR, operatingMode, fanSpeed, temperature, swingV, swingH, profile);
} }
// Send the Panasonic DKE/JKE/NKE code // Send the Panasonic DKE/JKE/NKE/LKE code
void PanasonicHeatpumpIR::sendPanasonic(IRSender& IR, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingV, uint8_t swingH, uint8_t profile) void PanasonicHeatpumpIR::sendPanasonic(IRSender& IR, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingV, uint8_t swingH, uint8_t profile)
{ {
// Only bytes 13, 14, 16, 17 and 26 are modified, DKE and JKE seem to share the same template? // Only bytes 13, 14, 16, 17 and 26 are modified
static const uint8_t panasonicProgmemTemplate[][27] PROGMEM = { static const uint8_t panasonicProgmemTemplate[27] PROGMEM = {
// DKE, model 0 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00
{ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x01, 0x00, 0x06, 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
// JKE, model 1
{ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00 },
// NKE, model 2
{ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x06, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x81, 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
}; };
// Save some SRAM by only having one copy of the template on the SRAM // Save some SRAM by having the template in flash
uint8_t panasonicTemplate[27]; uint8_t panasonicTemplate[27];
memcpy_P(panasonicTemplate, panasonicProgmemTemplate[_panasonicModel], sizeof(panasonicTemplate)); memcpy_P(panasonicTemplate, panasonicProgmemTemplate, sizeof(panasonicTemplate));
panasonicTemplate[13] = operatingMode; switch(_panasonicModel)
{
case PANASONIC_DKE:
panasonicTemplate[17] = swingH; // Only the DKE model has a setting for the horizontal air flow
panasonicTemplate[23] = 0x01;
panasonicTemplate[25] = 0x06;
break;
case PANASONIC_JKE:
break;
case PANASONIC_NKE:
panasonicTemplate[17] = 0x06;
break;
case PANASONIC_LKE:
panasonicTemplate[17] = 0x06;
panasonicTemplate[13] = 0x02;
break;
}
panasonicTemplate[13] |= operatingMode;
panasonicTemplate[14] = temperature << 1; panasonicTemplate[14] = temperature << 1;
panasonicTemplate[16] = fanSpeed | swingV; panasonicTemplate[16] = fanSpeed | swingV;
panasonicTemplate[21] = profile; panasonicTemplate[21] = profile;
// Only the DKE model has a setting for the horizontal air flow
if ( _panasonicModel == PANASONIC_DKE) {
panasonicTemplate[17] = swingH;
}
// Checksum calculation // Checksum calculation
uint8_t checksum = 0xF4; uint8_t checksum = 0xF4;
@ -224,7 +243,7 @@ void PanasonicHeatpumpIR::sendPanasonic(IRSender& IR, uint8_t operatingMode, uin
panasonicTemplate[26] = checksum; panasonicTemplate[26] = checksum;
// 40 kHz PWM frequency // 38 kHz PWM frequency
IR.setFrequency(38); IR.setFrequency(38);
// Header // Header

View File

@ -49,6 +49,7 @@
#define PANASONIC_DKE 0 #define PANASONIC_DKE 0
#define PANASONIC_JKE 1 #define PANASONIC_JKE 1
#define PANASONIC_NKE 2 #define PANASONIC_NKE 2
#define PANASONIC_LKE 3
class PanasonicHeatpumpIR : public HeatpumpIR class PanasonicHeatpumpIR : public HeatpumpIR
@ -83,4 +84,10 @@ class PanasonicNKEHeatpumpIR : public PanasonicHeatpumpIR
PanasonicNKEHeatpumpIR(); PanasonicNKEHeatpumpIR();
}; };
class PanasonicLKEHeatpumpIR : public PanasonicHeatpumpIR
{
public:
PanasonicLKEHeatpumpIR();
};
#endif #endif

View File

@ -27,7 +27,8 @@ IRSenderBitBang irSender(1); // IR led on ESP8266 GPIO pin 1
// Array with all supported heatpumps // Array with all supported heatpumps
HeatpumpIR *heatpumpIR[] = {new PanasonicCKPHeatpumpIR(), new PanasonicDKEHeatpumpIR(), new PanasonicJKEHeatpumpIR(), HeatpumpIR *heatpumpIR[] = {new PanasonicCKPHeatpumpIR(), new PanasonicDKEHeatpumpIR(), new PanasonicJKEHeatpumpIR(),
new PanasonicNKEHeatpumpIR(), new CarrierNQVHeatpumpIR(), new CarrierMCAHeatpumpIR(), new PanasonicNKEHeatpumpIR(), new PanasonicLKEHeatpumpIR(),
new CarrierNQVHeatpumpIR(), new CarrierMCAHeatpumpIR(),
new MideaHeatpumpIR(), new FujitsuHeatpumpIR(), new MideaHeatpumpIR(), new FujitsuHeatpumpIR(),
new MitsubishiFDHeatpumpIR(), new MitsubishiFEHeatpumpIR(), new MitsubishiMSYHeatpumpIR(), new MitsubishiFDHeatpumpIR(), new MitsubishiFEHeatpumpIR(), new MitsubishiMSYHeatpumpIR(),
new SamsungHeatpumpIR(), new SharpHeatpumpIR(), new DaikinHeatpumpIR(), new SamsungHeatpumpIR(), new SharpHeatpumpIR(), new DaikinHeatpumpIR(),

View File

@ -4,6 +4,7 @@ PanasonicCKPHeatpumpIR KEYWORD1
PanasonicDKEHeatpumpIR KEYWORD1 PanasonicDKEHeatpumpIR KEYWORD1
PanasonicJKEHeatpumpIR KEYWORD1 PanasonicJKEHeatpumpIR KEYWORD1
PanasonicNKEHeatpumpIR KEYWORD1 PanasonicNKEHeatpumpIR KEYWORD1
PanasonicLKEHeatpumpIR KEYWORD1
CarrierHeatpumpIR KEYWORD1 CarrierHeatpumpIR KEYWORD1
CarrierNQVHeatpumpIR KEYWORD1 CarrierNQVHeatpumpIR KEYWORD1
CarrierMCAHeatpumpIR KEYWORD1 CarrierMCAHeatpumpIR KEYWORD1