Merge pull request #33 from ElVit/heishamon_sync

Sync with Heishamon v4.1.2
This commit is contained in:
ElVit 2026-04-17 11:12:29 +02:00 committed by ElVit
parent d1717adcbc
commit 41e3440b84
15 changed files with 206 additions and 105 deletions

View File

@ -473,6 +473,8 @@ text_sensor:
name: "SmartDHW" name: "SmartDHW"
top141: top141:
name: "Quiet Mode Priority" name: "Quiet Mode Priority"
top143:
name: "DHW Sensor Selection"
``` ```
### Numbers ### Numbers
@ -551,6 +553,8 @@ number:
name: "Set Bivalent AP Start Temp" name: "Set Bivalent AP Start Temp"
set38: set38:
name: "Set Bivalent AP Stop Temp" name: "Set Bivalent AP Stop Temp"
set46:
name: "Set Heater On Outdoor Temp"
``` ```
### Switches ### Switches
@ -624,6 +628,12 @@ select:
name: "Set Quiet Mode Priority" name: "Set Quiet Mode Priority"
set42: set42:
name: "Set Pump Flow Rate Mode" name: "Set Pump Flow Rate Mode"
set43:
name: "Set DHW Sensor Selection"
set44:
name: "Set DHW Heater State"
set45:
name: "Set Room Heater State"
``` ```
### Climates ### Climates
@ -713,8 +723,12 @@ When the ESP controller is connected initially to the heatpump (and the heatpump
the heatpump may not respond to any request messages. the heatpump may not respond to any request messages.
If the CZ-TAW1 is also connected to the ESP controller you will probably see some requests like 0x31 05 10 01 ... If the CZ-TAW1 is also connected to the ESP controller you will probably see some requests like 0x31 05 10 01 ...
These are initial request messages. These are initial request messages.
If the heatpump is not responding, it may help to turn off and on the power of the heatpump (switching the heatpump off is not enough). To solve this problem you can try one of the follwing:
After a power on the heatpump should respond to the requests.
* enable the switch `error_reset`
* turn off and on the power of the heatpump (switching the heatpump off is not enough)
The heatpump will restart and should respond to the requests.
## Sources ## Sources

View File

@ -85,16 +85,15 @@ constexpr const uint8_t KnownModels[NUMBER_OF_MODELS][10] = {
{0x12, 0xD7, 0x0D, 0x98, 0x11, 0x33, 0x94, 0x0C, 0x83, 0x10}, // 55 {0x12, 0xD7, 0x0D, 0x98, 0x11, 0x33, 0x94, 0x0C, 0x83, 0x10}, // 55
{0xE2, 0xD5, 0x0B, 0x08, 0x95, 0x02, 0xD6, 0x0F, 0x67, 0x95}, // 56 {0xE2, 0xD5, 0x0B, 0x08, 0x95, 0x02, 0xD6, 0x0F, 0x67, 0x95}, // 56
{0xE2, 0xD5, 0x0D, 0x36, 0x99, 0x02, 0xD6, 0x10, 0x66, 0x95}, // 57 {0xE2, 0xD5, 0x0D, 0x36, 0x99, 0x02, 0xD6, 0x10, 0x66, 0x95}, // 57
{0xE2, 0xCF, 0x0B, 0x84, 0x05, 0x12, 0xD0, 0x0B, 0x93, 0x05}, // 58 {0xE2, 0xD5, 0x0F, 0x99, 0x94, 0x02, 0xD6, 0x10, 0x68, 0x95}, // 58
{0xE2, 0xD5, 0x0C, 0x67, 0x00, 0x83, 0x92, 0x0C, 0x28, 0x98}, // 59 {0xE2, 0xD5, 0x0C, 0x67, 0x00, 0x83, 0x92, 0x0C, 0x28, 0x98}, // 59
{0xE2, 0xD5, 0x0C, 0x67, 0x00, 0x83, 0x92, 0x0D, 0x29, 0x98}, // 60 {0xE2, 0xCF, 0x0D, 0x86, 0x05, 0x12, 0xD0, 0x0E, 0x95, 0x05}, // 60
{0xE2, 0xD5, 0x0D, 0x08, 0x95, 0x02, 0xD6, 0x10, 0x67, 0x95}, // 61 {0x12, 0xD7, 0x0C, 0x98, 0x14, 0x35, 0x94, 0x0D, 0x83, 0x10}, // 61
{0xE2, 0xD5, 0x0C, 0x08, 0x95, 0x02, 0xD6, 0x0D, 0x67, 0x95}, // 62 {0xE2, 0xD5, 0x0C, 0x08, 0x95, 0x02, 0xD6, 0x10, 0x67, 0x95}, // 62
{0xE2, 0xD5, 0x0C, 0x08, 0x95, 0x02, 0xD6, 0x10, 0x67, 0x95}, // 63 {0xC2, 0xD3, 0x0D, 0x35, 0x65, 0xB2, 0xD3, 0x0B, 0x96, 0x65}, // 63
{0xE2, 0xD5, 0x0C, 0x08, 0x95, 0x02, 0xD6, 0x10, 0x66, 0x95}, // 64 {0xE2, 0xD5, 0x0C, 0x29, 0x99, 0x83, 0x92, 0x0C, 0x29, 0x98}, // 64
{0xE2, 0xD5, 0x0B, 0x08, 0x95, 0x02, 0xD6, 0x0E, 0x68, 0x95}, // 65 {0x62, 0xD2, 0x0B, 0x45, 0x54, 0x42, 0xD2, 0x0B, 0x72, 0x66}, // 65
{0xE2, 0xCF, 0x0C, 0x88, 0x05, 0x12, 0xD0, 0x0C, 0x97, 0x05}, // 66 {0xE2, 0xCF, 0x0B, 0x82, 0x09, 0x12, 0xD0, 0x0B, 0x10, 0x11}, // 66
{0x12, 0xD7, 0x0D, 0x85, 0x11, 0x37, 0x94, 0x0E, 0x84, 0x10}, // 67
}; };
int PanasonicDecode::getBit1(uint8_t input) { int PanasonicDecode::getBit1(uint8_t input) {

View File

@ -7,7 +7,7 @@
#define RESPONSE_MSG_SIZE 203 #define RESPONSE_MSG_SIZE 203
#endif #endif
#ifndef NUMBER_OF_MODELS #ifndef NUMBER_OF_MODELS
#define NUMBER_OF_MODELS 68 #define NUMBER_OF_MODELS 67
#endif #endif
namespace esphome { namespace esphome {
@ -70,8 +70,9 @@ class PanasonicDecode {
static const constexpr char* const HeatingControl[] = {"2", "Comfort", "Efficiency"}; static const constexpr char* const HeatingControl[] = {"2", "Comfort", "Efficiency"};
static const constexpr char* const SmartDHW[] = {"2", "Variable", "Standard"}; static const constexpr char* const SmartDHW[] = {"2", "Variable", "Standard"};
static const constexpr char* const QuietModePriority[] = {"2", "Sound", "Capacity"}; static const constexpr char* const QuietModePriority[] = {"2", "Sound", "Capacity"};
static const constexpr char* const DHWSensorSelection[] = {"2", "Top", "Center"};
static const constexpr char* const ModelNames[] = { static const constexpr char* const ModelNames[] = {
"58", // string representation of number of known models (last model number + 1) "67", // string representation of number of known models (last model number + 1)
"WH-MDC05H3E5", // 0 "WH-MDC05H3E5", // 0
"WH-MDC07H3E5", // 1 "WH-MDC07H3E5", // 1
"IDU:WH-SXC09H3E5, ODU:WH-UX09HE5", // 2 "IDU:WH-SXC09H3E5, ODU:WH-UX09HE5", // 2
@ -130,16 +131,15 @@ class PanasonicDecode {
"IDU:WH-ADC0316M9E8AN2, ODU:WH-WXG09ME8", // 55 "IDU:WH-ADC0316M9E8AN2, ODU:WH-WXG09ME8", // 55
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 56 "IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 56
"IDU:WH-ADC0309K3E5AN, ODU:WH-UDZ05KE5", // 57 "IDU:WH-ADC0309K3E5AN, ODU:WH-UDZ05KE5", // 57
"IDU:WH-SQC16H9E8, ODU:WH-UQ16HE8", // 58 "IDU:WH-ADC0309K3E5, ODU:WH-UDZ09KE5", // 58
"IDU:WH-ADC0509L3E5AN, ODU:WH-WDG07LE5", // 59 "IDU:WH-ADC0509L3E5AN, ODU:WH-WDG07LE5", // 59
"IDU:WH-ADC0509L3E5AN, ODU:WH-WDG09LE5", // 60 "IDU:WH-SXC12H9E8, ODU:WH-UX12HE8", // 60
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 61 "IDU:WH-SDC0316M9E8, ODU:WH-WXG09ME8", // 61
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 62 "IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 62
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 63 "WH-MDC09J3E5-1", // 63
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ05KE5", // 64 "IDU:WH-ADC0509L3E5, ODU:WH-WDG09LE5", // 64
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ09KE5", // 65 "IDU:WH-ADC0309J3E5, ODU:WH-UD09JE5-1", // 65
"IDU:WH-SDC09H3E8, ODU:WH-UD09HE8", // 66 "IDU:WH-SDC12H6E5, ODU:WH-UD12HE5", // 66
"WH-WXG12ME8", // 67
}; };
}; };

View File

@ -9,6 +9,7 @@ from esphome.const import (
CONF_MIN_VALUE, CONF_MIN_VALUE,
CONF_MAX_VALUE, CONF_MAX_VALUE,
CONF_STEP, CONF_STEP,
CONF_MODE,
) )
from .. import ( from .. import (
CONF_PANASONIC_HEATPUMP_ID, CONF_PANASONIC_HEATPUMP_ID,
@ -49,6 +50,7 @@ CONF_SET29 = "set29" # Set Heating Off Outdoor Temp
CONF_SET36 = "set36" # Set Bivalent Start Temp CONF_SET36 = "set36" # Set Bivalent Start Temp
CONF_SET37 = "set37" # Set Bivalent AP Start Temp CONF_SET37 = "set37" # Set Bivalent AP Start Temp
CONF_SET38 = "set38" # Set Bivalent AP Stop Temp CONF_SET38 = "set38" # Set Bivalent AP Stop Temp
CONF_SET46 = "set46" # Set Heater On Outdoor Temp
TYPES = [ TYPES = [
CONF_SET5, CONF_SET5,
@ -84,6 +86,7 @@ TYPES = [
CONF_SET36, CONF_SET36,
CONF_SET37, CONF_SET37,
CONF_SET38, CONF_SET38,
CONF_SET46,
] ]
@ -93,6 +96,9 @@ def number_options(min_val, max_val, step) -> cv.Schema:
cv.Optional(CONF_MIN_VALUE, default=min_val): cv.float_, cv.Optional(CONF_MIN_VALUE, default=min_val): cv.float_,
cv.Optional(CONF_MAX_VALUE, default=max_val): cv.float_, cv.Optional(CONF_MAX_VALUE, default=max_val): cv.float_,
cv.Optional(CONF_STEP, default=step): cv.float_range(min=1.0, max=10.0), cv.Optional(CONF_STEP, default=step): cv.float_range(min=1.0, max=10.0),
cv.Optional(CONF_MODE, default="BOX"): cv.enum(
number.NUMBER_MODES, upper=True
),
} }
) )
return schema return schema
@ -254,6 +260,10 @@ CONFIG_SCHEMA = cv.Schema(
PanasonicHeatpumpNumber, PanasonicHeatpumpNumber,
unit_of_measurement=UNIT_CELSIUS, unit_of_measurement=UNIT_CELSIUS,
).extend(number_options(-10.0, 0.0, 1.0)), ).extend(number_options(-10.0, 0.0, 1.0)),
cv.Optional(CONF_SET46): number.number_schema(
PanasonicHeatpumpNumber,
unit_of_measurement=UNIT_CELSIUS,
).extend(number_options(-15.0, 20.0, 1.0)),
} }
).extend(cv.COMPONENT_SCHEMA) ).extend(cv.COMPONENT_SCHEMA)

View File

@ -111,6 +111,9 @@ void PanasonicHeatpumpNumber::control(float value) {
case NumberIds::CONF_SET38: case NumberIds::CONF_SET38:
this->parent_->set_command_byte(PanasonicCommand::setPlus128(value_int), 68); this->parent_->set_command_byte(PanasonicCommand::setPlus128(value_int), 68);
break; break;
case NumberIds::CONF_SET46:
this->parent_->set_command_byte(PanasonicCommand::setPlus128(value_int), 85);
break;
default: default:
return; return;
}; };
@ -129,26 +132,6 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
float new_state; float new_state;
switch (this->id_) { switch (this->id_) {
case NumberIds::CONF_SET11:
new_state = PanasonicDecode::getByteMinus128(data[42]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET20:
new_state = PanasonicDecode::getByteMinus128(data[99]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET18:
new_state = PanasonicDecode::getByteMinus128(data[84]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET19:
new_state = PanasonicDecode::getByteMinus128(data[94]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET5: case NumberIds::CONF_SET5:
new_state = PanasonicDecode::getByteMinus128(data[38]); new_state = PanasonicDecode::getByteMinus128(data[38]);
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
@ -159,26 +142,6 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
case NumberIds::CONF_SET16_01:
new_state = PanasonicDecode::getByteMinus128(data[75]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET16_02:
new_state = PanasonicDecode::getByteMinus128(data[76]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET16_04:
new_state = PanasonicDecode::getByteMinus128(data[78]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET16_03:
new_state = PanasonicDecode::getByteMinus128(data[77]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET7: case NumberIds::CONF_SET7:
new_state = PanasonicDecode::getByteMinus128(data[40]); new_state = PanasonicDecode::getByteMinus128(data[40]);
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
@ -189,28 +152,33 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
case NumberIds::CONF_SET16_09: case NumberIds::CONF_SET11:
new_state = PanasonicDecode::getByteMinus128(data[86]); new_state = PanasonicDecode::getByteMinus128(data[42]);
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
case NumberIds::CONF_SET16_10: case NumberIds::CONF_SET15:
new_state = PanasonicDecode::getByteMinus128(data[87]); new_state = PanasonicDecode::getByteMinus1(data[45]);
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
case NumberIds::CONF_SET16_12: case NumberIds::CONF_SET16_01:
new_state = PanasonicDecode::getByteMinus128(data[89]); new_state = PanasonicDecode::getByteMinus128(data[75]);
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
case NumberIds::CONF_SET16_11: case NumberIds::CONF_SET16_02:
new_state = PanasonicDecode::getByteMinus128(data[88]); new_state = PanasonicDecode::getByteMinus128(data[76]);
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
case NumberIds::CONF_SET29: case NumberIds::CONF_SET16_03:
new_state = PanasonicDecode::getByteMinus128(data[83]); new_state = PanasonicDecode::getByteMinus128(data[77]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET16_04:
new_state = PanasonicDecode::getByteMinus128(data[78]);
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
@ -224,13 +192,33 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
case NumberIds::CONF_SET16_07:
new_state = PanasonicDecode::getByteMinus128(data[81]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET16_08: case NumberIds::CONF_SET16_08:
new_state = PanasonicDecode::getByteMinus128(data[82]); new_state = PanasonicDecode::getByteMinus128(data[82]);
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
case NumberIds::CONF_SET16_07: case NumberIds::CONF_SET16_09:
new_state = PanasonicDecode::getByteMinus128(data[81]); new_state = PanasonicDecode::getByteMinus128(data[86]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET16_10:
new_state = PanasonicDecode::getByteMinus128(data[87]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET16_11:
new_state = PanasonicDecode::getByteMinus128(data[88]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET16_12:
new_state = PanasonicDecode::getByteMinus128(data[89]);
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
@ -244,18 +232,28 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
case NumberIds::CONF_SET16_16:
new_state = PanasonicDecode::getByteMinus128(data[93]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET16_15: case NumberIds::CONF_SET16_15:
new_state = PanasonicDecode::getByteMinus128(data[92]); new_state = PanasonicDecode::getByteMinus128(data[92]);
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
case NumberIds::CONF_SET15: case NumberIds::CONF_SET16_16:
new_state = PanasonicDecode::getByteMinus1(data[45]); new_state = PanasonicDecode::getByteMinus128(data[93]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET18:
new_state = PanasonicDecode::getByteMinus128(data[84]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET19:
new_state = PanasonicDecode::getByteMinus128(data[94]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET20:
new_state = PanasonicDecode::getByteMinus128(data[99]);
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
@ -279,6 +277,11 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
case NumberIds::CONF_SET29:
new_state = PanasonicDecode::getByteMinus128(data[83]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET36: case NumberIds::CONF_SET36:
new_state = PanasonicDecode::getByteMinus128(data[65]); new_state = PanasonicDecode::getByteMinus128(data[65]);
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
@ -294,6 +297,11 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;
case NumberIds::CONF_SET46:
new_state = PanasonicDecode::getByteMinus128(data[85]);
if (this->has_state() && this->state == new_state)
return;
break;
default: default:
return; return;
}; };

View File

@ -41,6 +41,7 @@ enum NumberIds : uint8_t {
CONF_SET36, CONF_SET36,
CONF_SET37, CONF_SET37,
CONF_SET38, CONF_SET38,
CONF_SET46,
}; };
class PanasonicHeatpumpNumber : public number::Number, class PanasonicHeatpumpNumber : public number::Number,

View File

@ -12,7 +12,7 @@
#include "commands.h" #include "commands.h"
#ifndef PANASONIC_HEATPUMP_VERSION #ifndef PANASONIC_HEATPUMP_VERSION
#define PANASONIC_HEATPUMP_VERSION "0.0.8-beta.3" #define PANASONIC_HEATPUMP_VERSION "0.0.9-beta.1"
#endif #endif
#ifndef KEEP_STATE #ifndef KEEP_STATE

View File

@ -20,6 +20,9 @@ CONF_SET39 = "set39" # Set Heating Control
CONF_SET40 = "set40" # Set Smart DHW CONF_SET40 = "set40" # Set Smart DHW
CONF_SET41 = "set41" # Set Quiet Mode Priority CONF_SET41 = "set41" # Set Quiet Mode Priority
CONF_SET42 = "set42" # Set Pump Flow Rate Mode CONF_SET42 = "set42" # Set Pump Flow Rate Mode
CONF_SET43 = "set43" # Set DHW Sensor Selection
CONF_SET44 = "set44" # Set DHW Heater State
CONF_SET45 = "set45" # Set Room Heater State
TYPES = [ TYPES = [
CONF_SET2, CONF_SET2,
@ -33,6 +36,9 @@ TYPES = [
CONF_SET40, CONF_SET40,
CONF_SET41, CONF_SET41,
CONF_SET42, CONF_SET42,
CONF_SET43,
CONF_SET44,
CONF_SET45,
] ]
CONF_SELECTS = [ CONF_SELECTS = [
@ -81,6 +87,18 @@ CONF_SELECTS = [
"DeltaT", "DeltaT",
"Max. Duty", "Max. Duty",
], ],
[
"Top",
"Center",
],
[
"Blocked",
"Free",
],
[
"Blocked",
"Free",
],
] ]
CONF_SELECT_COOL_MODE = [ CONF_SELECT_COOL_MODE = [
@ -136,6 +154,15 @@ CONFIG_SCHEMA = cv.Schema(
cv.Optional(CONF_SET42): select.select_schema( cv.Optional(CONF_SET42): select.select_schema(
PanasonicHeatpumpSelect, PanasonicHeatpumpSelect,
), ),
cv.Optional(CONF_SET43): select.select_schema(
PanasonicHeatpumpSelect,
),
cv.Optional(CONF_SET44): select.select_schema(
PanasonicHeatpumpSelect,
),
cv.Optional(CONF_SET45): select.select_schema(
PanasonicHeatpumpSelect,
),
} }
).extend(cv.COMPONENT_SCHEMA) ).extend(cv.COMPONENT_SCHEMA)

View File

@ -49,6 +49,15 @@ void PanasonicHeatpumpSelect::control(const std::string& value) {
case SelectIds::CONF_SET42: case SelectIds::CONF_SET42:
this->parent_->set_command_byte(PanasonicCommand::setPlus1Multiply16(index), 29); this->parent_->set_command_byte(PanasonicCommand::setPlus1Multiply16(index), 29);
break; break;
case SelectIds::CONF_SET43:
this->parent_->set_command_byte(PanasonicCommand::setPlus1(index), 11);
break;
case SelectIds::CONF_SET44:
this->parent_->set_command_byte(PanasonicCommand::setPlus1Multiply4(index), 9);
break;
case SelectIds::CONF_SET45:
this->parent_->set_command_byte(PanasonicCommand::setPlus1(index), 9);
break;
default: default:
return; return;
}; };
@ -67,14 +76,8 @@ void PanasonicHeatpumpSelect::publish_new_state(const std::vector<uint8_t>& data
std::string new_state; std::string new_state;
switch (this->id_) { switch (this->id_) {
case SelectIds::CONF_SET9: case SelectIds::CONF_SET2:
new_state = new_state = PanasonicDecode::getTextState(PanasonicDecode::HolidayState, PanasonicDecode::getBit3and4(data[5]));
PanasonicDecode::getTextState(PanasonicDecode::OperationMode, PanasonicDecode::getOperationMode(data[6]));
if (this->has_state() && this->current_option() == new_state)
return;
break;
case SelectIds::CONF_SET4:
new_state = PanasonicDecode::getTextState(PanasonicDecode::PowerfulMode, PanasonicDecode::getBit6and7and8(data[7]));
if (this->has_state() && this->current_option() == new_state) if (this->has_state() && this->current_option() == new_state)
return; return;
break; break;
@ -83,8 +86,14 @@ void PanasonicHeatpumpSelect::publish_new_state(const std::vector<uint8_t>& data
if (this->has_state() && this->current_option() == new_state) if (this->has_state() && this->current_option() == new_state)
return; return;
break; break;
case SelectIds::CONF_SET2: case SelectIds::CONF_SET4:
new_state = PanasonicDecode::getTextState(PanasonicDecode::HolidayState, PanasonicDecode::getBit3and4(data[5])); new_state = PanasonicDecode::getTextState(PanasonicDecode::PowerfulMode, PanasonicDecode::getBit6and7and8(data[7]));
if (this->has_state() && this->current_option() == new_state)
return;
break;
case SelectIds::CONF_SET9:
new_state =
PanasonicDecode::getTextState(PanasonicDecode::OperationMode, PanasonicDecode::getOperationMode(data[6]));
if (this->has_state() && this->current_option() == new_state) if (this->has_state() && this->current_option() == new_state)
return; return;
break; break;
@ -126,6 +135,22 @@ void PanasonicHeatpumpSelect::publish_new_state(const std::vector<uint8_t>& data
if (this->has_state() && this->current_option() == new_state) if (this->has_state() && this->current_option() == new_state)
return; return;
break; break;
case SelectIds::CONF_SET43:
new_state =
PanasonicDecode::getTextState(PanasonicDecode::DHWSensorSelection, PanasonicDecode::getBit7and8(data[11]));
if (this->has_state() && this->current_option() == new_state)
return;
break;
case SelectIds::CONF_SET44:
new_state = PanasonicDecode::getTextState(PanasonicDecode::BlockedFree, PanasonicDecode::getBit5and6(data[9]));
if (this->has_state() && this->current_option() == new_state)
return;
break;
case SelectIds::CONF_SET45:
new_state = PanasonicDecode::getTextState(PanasonicDecode::BlockedFree, PanasonicDecode::getBit7and8(data[9]));
if (this->has_state() && this->current_option() == new_state)
return;
break;
default: default:
return; return;
}; };

View File

@ -19,6 +19,9 @@ enum SelectIds : uint8_t {
CONF_SET40, CONF_SET40,
CONF_SET41, CONF_SET41,
CONF_SET42, CONF_SET42,
CONF_SET43,
CONF_SET44,
CONF_SET45,
}; };
class PanasonicHeatpumpSelect : public select::Select, class PanasonicHeatpumpSelect : public select::Select,

View File

@ -588,16 +588,16 @@ CONFIG_SCHEMA = cv.Schema(
cv.Optional(CONF_TOP62): sensor.sensor_schema( cv.Optional(CONF_TOP62): sensor.sensor_schema(
PanasonicHeatpumpSensor, PanasonicHeatpumpSensor,
accuracy_decimals=2, accuracy_decimals=2,
icon=ICON_FAN,
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
unit_of_measurement=UNIT_ROTATIONS_PER_MINUTE, unit_of_measurement=UNIT_ROTATIONS_PER_MINUTE,
icon=ICON_FAN,
), ),
cv.Optional(CONF_TOP63): sensor.sensor_schema( cv.Optional(CONF_TOP63): sensor.sensor_schema(
PanasonicHeatpumpSensor, PanasonicHeatpumpSensor,
accuracy_decimals=2, accuracy_decimals=2,
icon=ICON_FAN,
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
unit_of_measurement=UNIT_ROTATIONS_PER_MINUTE, unit_of_measurement=UNIT_ROTATIONS_PER_MINUTE,
icon=ICON_FAN,
), ),
cv.Optional(CONF_TOP64): sensor.sensor_schema( cv.Optional(CONF_TOP64): sensor.sensor_schema(
PanasonicHeatpumpSensor, PanasonicHeatpumpSensor,
@ -924,9 +924,9 @@ CONFIG_SCHEMA = cv.Schema(
cv.Optional(CONF_TOP142): sensor.sensor_schema( cv.Optional(CONF_TOP142): sensor.sensor_schema(
PanasonicHeatpumpSensor, PanasonicHeatpumpSensor,
accuracy_decimals=0, accuracy_decimals=0,
icon=ICON_VALVE,
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
unit_of_measurement=UNIT_EMPTY, unit_of_measurement=UNIT_EMPTY,
icon=ICON_VALVE,
), ),
cv.Optional(CONF_XTOP0): sensor.sensor_schema( cv.Optional(CONF_XTOP0): sensor.sensor_schema(
PanasonicHeatpumpSensor, PanasonicHeatpumpSensor,

View File

@ -83,11 +83,6 @@ void PanasonicHeatpumpSwitch::publish_new_state(const std::vector<uint8_t>& data
if (this->state == new_state) if (this->state == new_state)
return; return;
break; break;
case SwitchIds::CONF_SET24:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit1and2(data[5]));
if (this->state == new_state)
return;
break;
case SwitchIds::CONF_SET12: case SwitchIds::CONF_SET12:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[111])); new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[111]));
if (this->state == new_state) if (this->state == new_state)
@ -98,8 +93,8 @@ void PanasonicHeatpumpSwitch::publish_new_state(const std::vector<uint8_t>& data
if (this->state == new_state) if (this->state == new_state)
return; return;
break; break;
case SwitchIds::CONF_SET28: case SwitchIds::CONF_SET24:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[24])); new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit1and2(data[5]));
if (this->state == new_state) if (this->state == new_state)
return; return;
break; break;
@ -108,13 +103,13 @@ void PanasonicHeatpumpSwitch::publish_new_state(const std::vector<uint8_t>& data
if (this->state == new_state) if (this->state == new_state)
return; return;
break; break;
case SwitchIds::CONF_SET30: case SwitchIds::CONF_SET28:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit7and8(data[23])); new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[24]));
if (this->state == new_state) if (this->state == new_state)
return; return;
break; break;
case SwitchIds::CONF_SET33: case SwitchIds::CONF_SET30:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[23])); new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit7and8(data[23]));
if (this->state == new_state) if (this->state == new_state)
return; return;
break; break;
@ -128,6 +123,11 @@ void PanasonicHeatpumpSwitch::publish_new_state(const std::vector<uint8_t>& data
if (this->state == new_state) if (this->state == new_state)
return; return;
break; break;
case SwitchIds::CONF_SET33:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[23]));
if (this->state == new_state)
return;
break;
case SwitchIds::CONF_SET34: case SwitchIds::CONF_SET34:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit7and8(data[26])); new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit7and8(data[26]));
if (this->state == new_state) if (this->state == new_state)

View File

@ -26,6 +26,7 @@ ICON_THERMOMETER = "mdi:thermometer"
ICON_BIVALENT = "mdi:vector-combine" ICON_BIVALENT = "mdi:vector-combine"
ICON_HEATING_CONTROL = "mdi:thermostat-auto" ICON_HEATING_CONTROL = "mdi:thermostat-auto"
ICON_SMART_DHW = "mdi:water-boiler-auto" ICON_SMART_DHW = "mdi:water-boiler-auto"
ICON_DHW = "mdi:water-boiler"
CONF_TOP4 = "top4" # Operation Mode CONF_TOP4 = "top4" # Operation Mode
# TODO: Split up top4 into top4_1 (Heating Mode State) and top4_2 (DHW Mode State) # TODO: Split up top4 into top4_1 (Heating Mode State) and top4_2 (DHW Mode State)
@ -52,6 +53,7 @@ CONF_TOP130 = "top130" # Bivalent Mode
CONF_TOP139 = "top139" # HeatingControl CONF_TOP139 = "top139" # HeatingControl
CONF_TOP140 = "top140" # SmartDHW CONF_TOP140 = "top140" # SmartDHW
CONF_TOP141 = "top141" # Quiet Mode Priority CONF_TOP141 = "top141" # Quiet Mode Priority
CONF_TOP143 = "top143" # DHW Sensor Selection
TYPES = [ TYPES = [
CONF_TOP4, CONF_TOP4,
@ -78,6 +80,7 @@ TYPES = [
CONF_TOP139, CONF_TOP139,
CONF_TOP140, CONF_TOP140,
CONF_TOP141, CONF_TOP141,
CONF_TOP143,
] ]
PanasonicHeatpumpTextSensor = panasonic_heatpump_ns.class_( PanasonicHeatpumpTextSensor = panasonic_heatpump_ns.class_(
@ -185,6 +188,10 @@ CONFIG_SCHEMA = cv.Schema(
PanasonicHeatpumpTextSensor, PanasonicHeatpumpTextSensor,
icon=ICON_QUIET_MODE, icon=ICON_QUIET_MODE,
), ),
cv.Optional(CONF_TOP143): text_sensor.text_sensor_schema(
PanasonicHeatpumpTextSensor,
icon=ICON_DHW,
),
} }
).extend(cv.COMPONENT_SCHEMA) ).extend(cv.COMPONENT_SCHEMA)

View File

@ -143,6 +143,12 @@ void PanasonicHeatpumpTextSensor::publish_new_state(const std::vector<uint8_t>&
if (this->has_state() && this->get_state() == new_state) if (this->has_state() && this->get_state() == new_state)
return; return;
break; break;
case TextSensorIds::CONF_TOP143:
new_state =
PanasonicDecode::getTextState(PanasonicDecode::DHWSensorSelection, PanasonicDecode::getBit7and8(data[11]));
if (this->has_state() && this->get_state() == new_state)
return;
break;
default: default:
return; return;
}; };

View File

@ -31,6 +31,7 @@ enum TextSensorIds : uint8_t {
CONF_TOP139, CONF_TOP139,
CONF_TOP140, CONF_TOP140,
CONF_TOP141, CONF_TOP141,
CONF_TOP143,
}; };
class PanasonicHeatpumpTextSensor : public text_sensor::TextSensor, class PanasonicHeatpumpTextSensor : public text_sensor::TextSensor,