Added TOP143, SET43, SET44, SET45, SET46

This commit is contained in:
ElVit 2026-04-13 09:03:42 +02:00
parent fce772ff76
commit cc606ed195
11 changed files with 151 additions and 72 deletions

View File

@ -344,6 +344,8 @@ sensor:
name: "Bivalent Advanced DHW Delay" name: "Bivalent Advanced DHW Delay"
top142: top142:
name: "Expansion Valve" name: "Expansion Valve"
top143:
name: ""DHW Sensor Selection"
xtop0: xtop0:
name: "Heat Power Consumption Extra" name: "Heat Power Consumption Extra"
@ -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
@ -714,8 +724,8 @@ 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.
To fix this problem you can try: To fix this problem you can try:
- enable the switch `error_reset` * enable the switch `error_reset`
- turn off and on the power of the heatpump (switching the heatpump off is not enough) * 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. The heatpump will restart and should respond to the requests.

View File

@ -49,6 +49,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 +85,7 @@ TYPES = [
CONF_SET36, CONF_SET36,
CONF_SET37, CONF_SET37,
CONF_SET38, CONF_SET38,
CONF_SET46,
] ]
@ -254,6 +256,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_SET43:
new_state = PanasonicDecode::getBit7and8(data[11]);
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" #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(value), 11);
break;
case SelectIds::CONF_SET44:
this->parent_->set_command_byte(PanasonicCommand::setPlus1Multiply4(value), 9);
break;
case SelectIds::CONF_SET45:
this->parent_->set_command_byte(PanasonicCommand::setPlus1(value), 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;

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

@ -134,6 +134,7 @@ CONF_TOP136 = "top136" # Bivalent Advanced Start Delay
CONF_TOP137 = "top137" # Bivalent Advanced Stop Delay CONF_TOP137 = "top137" # Bivalent Advanced Stop Delay
CONF_TOP138 = "top138" # Bivalent Advanced DHW Delay CONF_TOP138 = "top138" # Bivalent Advanced DHW Delay
CONF_TOP142 = "top142" # Expansion Valve CONF_TOP142 = "top142" # Expansion Valve
CONF_TOP143 = "top143" # DHW Sensor Selection
CONF_XTOP0 = "xtop0" # Heat Power Consumption Extra CONF_XTOP0 = "xtop0" # Heat Power Consumption Extra
CONF_XTOP1 = "xtop1" # Cool Power Consumption Extra CONF_XTOP1 = "xtop1" # Cool Power Consumption Extra
CONF_XTOP2 = "xtop2" # DHW Power Consumption Extra CONF_XTOP2 = "xtop2" # DHW Power Consumption Extra
@ -238,6 +239,7 @@ TYPES = [
CONF_TOP137, CONF_TOP137,
CONF_TOP138, CONF_TOP138,
CONF_TOP142, CONF_TOP142,
CONF_TOP143,
CONF_XTOP0, CONF_XTOP0,
CONF_XTOP1, CONF_XTOP1,
CONF_XTOP2, CONF_XTOP2,
@ -928,6 +930,13 @@ CONFIG_SCHEMA = cv.Schema(
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
unit_of_measurement=UNIT_EMPTY, unit_of_measurement=UNIT_EMPTY,
), ),
cv.Optional(CONF_TOP143): sensor.sensor_schema(
PanasonicHeatpumpSensor,
accuracy_decimals=1,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
unit_of_measurement=UNIT_CELSIUS,
),
cv.Optional(CONF_XTOP0): sensor.sensor_schema( cv.Optional(CONF_XTOP0): sensor.sensor_schema(
PanasonicHeatpumpSensor, PanasonicHeatpumpSensor,
accuracy_decimals=0, accuracy_decimals=0,

View File

@ -495,6 +495,11 @@ void PanasonicHeatpumpSensor::publish_new_state(const std::vector<uint8_t>& data
if (this->has_state() && this->get_state() == new_state) if (this->has_state() && this->get_state() == new_state)
return; return;
break; break;
case SensorIds::CONF_TOP143:
new_state = PanasonicDecode::getBit7and8(data[11]);
if (this->has_state() && this->get_state() == new_state)
return;
break;
case SensorIds::CONF_XTOP0: case SensorIds::CONF_XTOP0:
new_state = PanasonicDecode::getWordMinus1(data, 14); new_state = PanasonicDecode::getWordMinus1(data, 14);

View File

@ -103,6 +103,7 @@ enum SensorIds : uint8_t {
CONF_TOP137, CONF_TOP137,
CONF_TOP138, CONF_TOP138,
CONF_TOP142, CONF_TOP142,
CONF_TOP143,
CONF_XTOP0, CONF_XTOP0,
CONF_XTOP1, CONF_XTOP1,