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 GitHub
15 changed files with 204 additions and 106 deletions
+14 -3
View File
@@ -473,6 +473,8 @@ text_sensor:
name: "SmartDHW"
top141:
name: "Quiet Mode Priority"
top143:
name: "DHW Sensor Selection"
```
### Numbers
@@ -551,6 +553,8 @@ number:
name: "Set Bivalent AP Start Temp"
set38:
name: "Set Bivalent AP Stop Temp"
set46:
name: "Set Heater On Outdoor Temp"
```
### Switches
@@ -624,6 +628,12 @@ select:
name: "Set Quiet Mode Priority"
set42:
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
@@ -713,9 +723,10 @@ When the ESP controller is connected initially to the heatpump (and the heatpump
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 ...
These are initial request messages.
To fix this problem you can try:
- enable the switch `error_reset`
- 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:
* 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.
+8 -9
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
{0xE2, 0xD5, 0x0B, 0x08, 0x95, 0x02, 0xD6, 0x0F, 0x67, 0x95}, // 56
{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, 0x0D, 0x29, 0x98}, // 60
{0xE2, 0xD5, 0x0D, 0x08, 0x95, 0x02, 0xD6, 0x10, 0x67, 0x95}, // 61
{0xE2, 0xD5, 0x0C, 0x08, 0x95, 0x02, 0xD6, 0x0D, 0x67, 0x95}, // 62
{0xE2, 0xD5, 0x0C, 0x08, 0x95, 0x02, 0xD6, 0x10, 0x67, 0x95}, // 63
{0xE2, 0xD5, 0x0C, 0x08, 0x95, 0x02, 0xD6, 0x10, 0x66, 0x95}, // 64
{0xE2, 0xD5, 0x0B, 0x08, 0x95, 0x02, 0xD6, 0x0E, 0x68, 0x95}, // 65
{0xE2, 0xCF, 0x0C, 0x88, 0x05, 0x12, 0xD0, 0x0C, 0x97, 0x05}, // 66
{0x12, 0xD7, 0x0D, 0x85, 0x11, 0x37, 0x94, 0x0E, 0x84, 0x10}, // 67
{0xE2, 0xCF, 0x0D, 0x86, 0x05, 0x12, 0xD0, 0x0E, 0x95, 0x05}, // 60
{0x12, 0xD7, 0x0C, 0x98, 0x14, 0x35, 0x94, 0x0D, 0x83, 0x10}, // 61
{0xE2, 0xD5, 0x0C, 0x08, 0x95, 0x02, 0xD6, 0x10, 0x67, 0x95}, // 62
{0xC2, 0xD3, 0x0D, 0x35, 0x65, 0xB2, 0xD3, 0x0B, 0x96, 0x65}, // 63
{0xE2, 0xD5, 0x0C, 0x29, 0x99, 0x83, 0x92, 0x0C, 0x29, 0x98}, // 64
{0x62, 0xD2, 0x0B, 0x45, 0x54, 0x42, 0xD2, 0x0B, 0x72, 0x66}, // 65
{0xE2, 0xCF, 0x0B, 0x82, 0x09, 0x12, 0xD0, 0x0B, 0x10, 0x11}, // 66
};
int PanasonicDecode::getBit1(uint8_t input) {
+10 -10
View File
@@ -7,7 +7,7 @@
#define RESPONSE_MSG_SIZE 203
#endif
#ifndef NUMBER_OF_MODELS
#define NUMBER_OF_MODELS 68
#define NUMBER_OF_MODELS 67
#endif
namespace esphome {
@@ -70,8 +70,9 @@ class PanasonicDecode {
static const constexpr char* const HeatingControl[] = {"2", "Comfort", "Efficiency"};
static const constexpr char* const SmartDHW[] = {"2", "Variable", "Standard"};
static const constexpr char* const QuietModePriority[] = {"2", "Sound", "Capacity"};
static const constexpr char* const DHWSensorSelection[] = {"2", "Top", "Center"};
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-MDC07H3E5", // 1
"IDU:WH-SXC09H3E5, ODU:WH-UX09HE5", // 2
@@ -130,16 +131,15 @@ class PanasonicDecode {
"IDU:WH-ADC0316M9E8AN2, ODU:WH-WXG09ME8", // 55
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 56
"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-WDG09LE5", // 60
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 61
"IDU:WH-SXC12H9E8, ODU:WH-UX12HE8", // 60
"IDU:WH-SDC0316M9E8, ODU:WH-WXG09ME8", // 61
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 62
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 63
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ05KE5", // 64
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ09KE5", // 65
"IDU:WH-SDC09H3E8, ODU:WH-UD09HE8", // 66
"WH-WXG12ME8", // 67
"WH-MDC09J3E5-1", // 63
"IDU:WH-ADC0509L3E5, ODU:WH-WDG09LE5", // 64
"IDU:WH-ADC0309J3E5, ODU:WH-UD09JE5-1", // 65
"IDU:WH-SDC12H6E5, ODU:WH-UD12HE5", // 66
};
};
@@ -9,6 +9,7 @@ from esphome.const import (
CONF_MIN_VALUE,
CONF_MAX_VALUE,
CONF_STEP,
CONF_MODE,
)
from .. import (
CONF_PANASONIC_HEATPUMP_ID,
@@ -49,6 +50,7 @@ CONF_SET29 = "set29" # Set Heating Off Outdoor Temp
CONF_SET36 = "set36" # Set Bivalent Start Temp
CONF_SET37 = "set37" # Set Bivalent AP Start Temp
CONF_SET38 = "set38" # Set Bivalent AP Stop Temp
CONF_SET46 = "set46" # Set Heater On Outdoor Temp
TYPES = [
CONF_SET5,
@@ -84,6 +86,7 @@ TYPES = [
CONF_SET36,
CONF_SET37,
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_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_MODE, default="BOX"): cv.enum(
number.NUMBER_MODES, upper=True
),
}
)
return schema
@@ -254,6 +260,10 @@ CONFIG_SCHEMA = cv.Schema(
PanasonicHeatpumpNumber,
unit_of_measurement=UNIT_CELSIUS,
).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)
@@ -111,6 +111,9 @@ void PanasonicHeatpumpNumber::control(float value) {
case NumberIds::CONF_SET38:
this->parent_->set_command_byte(PanasonicCommand::setPlus128(value_int), 68);
break;
case NumberIds::CONF_SET46:
this->parent_->set_command_byte(PanasonicCommand::setPlus128(value_int), 85);
break;
default:
return;
};
@@ -129,26 +132,6 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
float new_state;
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:
new_state = PanasonicDecode::getByteMinus128(data[38]);
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)
return;
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:
new_state = PanasonicDecode::getByteMinus128(data[40]);
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)
return;
break;
case NumberIds::CONF_SET16_09:
new_state = PanasonicDecode::getByteMinus128(data[86]);
case NumberIds::CONF_SET11:
new_state = PanasonicDecode::getByteMinus128(data[42]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET16_10:
new_state = PanasonicDecode::getByteMinus128(data[87]);
case NumberIds::CONF_SET15:
new_state = PanasonicDecode::getByteMinus1(data[45]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET16_12:
new_state = PanasonicDecode::getByteMinus128(data[89]);
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_11:
new_state = PanasonicDecode::getByteMinus128(data[88]);
case NumberIds::CONF_SET16_02:
new_state = PanasonicDecode::getByteMinus128(data[76]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET29:
new_state = PanasonicDecode::getByteMinus128(data[83]);
case NumberIds::CONF_SET16_03:
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)
return;
break;
@@ -224,13 +192,33 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
if (this->has_state() && this->state == new_state)
return;
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:
new_state = PanasonicDecode::getByteMinus128(data[82]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET16_07:
new_state = PanasonicDecode::getByteMinus128(data[81]);
case NumberIds::CONF_SET16_09:
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)
return;
break;
@@ -244,18 +232,28 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
if (this->has_state() && this->state == new_state)
return;
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:
new_state = PanasonicDecode::getByteMinus128(data[92]);
if (this->has_state() && this->state == new_state)
return;
break;
case NumberIds::CONF_SET15:
new_state = PanasonicDecode::getByteMinus1(data[45]);
case NumberIds::CONF_SET16_16:
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)
return;
break;
@@ -279,6 +277,11 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
if (this->has_state() && this->state == new_state)
return;
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:
new_state = PanasonicDecode::getByteMinus128(data[65]);
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)
return;
break;
case NumberIds::CONF_SET46:
new_state = PanasonicDecode::getByteMinus128(data[85]);
if (this->has_state() && this->state == new_state)
return;
break;
default:
return;
};
@@ -41,6 +41,7 @@ enum NumberIds : uint8_t {
CONF_SET36,
CONF_SET37,
CONF_SET38,
CONF_SET46,
};
class PanasonicHeatpumpNumber : public number::Number,
@@ -12,7 +12,7 @@
#include "commands.h"
#ifndef PANASONIC_HEATPUMP_VERSION
#define PANASONIC_HEATPUMP_VERSION "0.0.8"
#define PANASONIC_HEATPUMP_VERSION "0.0.9-beta.1"
#endif
#ifndef KEEP_STATE
@@ -20,6 +20,9 @@ CONF_SET39 = "set39" # Set Heating Control
CONF_SET40 = "set40" # Set Smart DHW
CONF_SET41 = "set41" # Set Quiet Mode Priority
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 = [
CONF_SET2,
@@ -33,6 +36,9 @@ TYPES = [
CONF_SET40,
CONF_SET41,
CONF_SET42,
CONF_SET43,
CONF_SET44,
CONF_SET45,
]
CONF_SELECTS = [
@@ -81,6 +87,18 @@ CONF_SELECTS = [
"DeltaT",
"Max. Duty",
],
[
"Top",
"Center",
],
[
"Blocked",
"Free",
],
[
"Blocked",
"Free",
],
]
CONF_SELECT_COOL_MODE = [
@@ -136,6 +154,15 @@ CONFIG_SCHEMA = cv.Schema(
cv.Optional(CONF_SET42): select.select_schema(
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)
@@ -49,6 +49,15 @@ void PanasonicHeatpumpSelect::control(const std::string& value) {
case SelectIds::CONF_SET42:
this->parent_->set_command_byte(PanasonicCommand::setPlus1Multiply16(index), 29);
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:
return;
};
@@ -67,14 +76,8 @@ void PanasonicHeatpumpSelect::publish_new_state(const std::vector<uint8_t>& data
std::string new_state;
switch (this->id_) {
case SelectIds::CONF_SET9:
new_state =
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]));
case SelectIds::CONF_SET2:
new_state = PanasonicDecode::getTextState(PanasonicDecode::HolidayState, PanasonicDecode::getBit3and4(data[5]));
if (this->has_state() && this->current_option() == new_state)
return;
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)
return;
break;
case SelectIds::CONF_SET2:
new_state = PanasonicDecode::getTextState(PanasonicDecode::HolidayState, PanasonicDecode::getBit3and4(data[5]));
case SelectIds::CONF_SET4:
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)
return;
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)
return;
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:
return;
};
@@ -19,6 +19,9 @@ enum SelectIds : uint8_t {
CONF_SET40,
CONF_SET41,
CONF_SET42,
CONF_SET43,
CONF_SET44,
CONF_SET45,
};
class PanasonicHeatpumpSelect : public select::Select,
@@ -588,16 +588,16 @@ CONFIG_SCHEMA = cv.Schema(
cv.Optional(CONF_TOP62): sensor.sensor_schema(
PanasonicHeatpumpSensor,
accuracy_decimals=2,
icon=ICON_FAN,
state_class=STATE_CLASS_MEASUREMENT,
unit_of_measurement=UNIT_ROTATIONS_PER_MINUTE,
icon=ICON_FAN,
),
cv.Optional(CONF_TOP63): sensor.sensor_schema(
PanasonicHeatpumpSensor,
accuracy_decimals=2,
icon=ICON_FAN,
state_class=STATE_CLASS_MEASUREMENT,
unit_of_measurement=UNIT_ROTATIONS_PER_MINUTE,
icon=ICON_FAN,
),
cv.Optional(CONF_TOP64): sensor.sensor_schema(
PanasonicHeatpumpSensor,
@@ -924,9 +924,9 @@ CONFIG_SCHEMA = cv.Schema(
cv.Optional(CONF_TOP142): sensor.sensor_schema(
PanasonicHeatpumpSensor,
accuracy_decimals=0,
icon=ICON_VALVE,
state_class=STATE_CLASS_MEASUREMENT,
unit_of_measurement=UNIT_EMPTY,
icon=ICON_VALVE,
),
cv.Optional(CONF_XTOP0): sensor.sensor_schema(
PanasonicHeatpumpSensor,
@@ -83,11 +83,6 @@ void PanasonicHeatpumpSwitch::publish_new_state(const std::vector<uint8_t>& data
if (this->state == new_state)
return;
break;
case SwitchIds::CONF_SET24:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit1and2(data[5]));
if (this->state == new_state)
return;
break;
case SwitchIds::CONF_SET12:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[111]));
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)
return;
break;
case SwitchIds::CONF_SET28:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[24]));
case SwitchIds::CONF_SET24:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit1and2(data[5]));
if (this->state == new_state)
return;
break;
@@ -108,13 +103,13 @@ void PanasonicHeatpumpSwitch::publish_new_state(const std::vector<uint8_t>& data
if (this->state == new_state)
return;
break;
case SwitchIds::CONF_SET30:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit7and8(data[23]));
case SwitchIds::CONF_SET28:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[24]));
if (this->state == new_state)
return;
break;
case SwitchIds::CONF_SET33:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[23]));
case SwitchIds::CONF_SET30:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit7and8(data[23]));
if (this->state == new_state)
return;
break;
@@ -128,6 +123,11 @@ void PanasonicHeatpumpSwitch::publish_new_state(const std::vector<uint8_t>& data
if (this->state == new_state)
return;
break;
case SwitchIds::CONF_SET33:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[23]));
if (this->state == new_state)
return;
break;
case SwitchIds::CONF_SET34:
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit7and8(data[26]));
if (this->state == new_state)
@@ -26,6 +26,7 @@ ICON_THERMOMETER = "mdi:thermometer"
ICON_BIVALENT = "mdi:vector-combine"
ICON_HEATING_CONTROL = "mdi:thermostat-auto"
ICON_SMART_DHW = "mdi:water-boiler-auto"
ICON_DHW = "mdi:water-boiler"
CONF_TOP4 = "top4" # Operation Mode
# 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_TOP140 = "top140" # SmartDHW
CONF_TOP141 = "top141" # Quiet Mode Priority
CONF_TOP143 = "top143" # DHW Sensor Selection
TYPES = [
CONF_TOP4,
@@ -78,6 +80,7 @@ TYPES = [
CONF_TOP139,
CONF_TOP140,
CONF_TOP141,
CONF_TOP143,
]
PanasonicHeatpumpTextSensor = panasonic_heatpump_ns.class_(
@@ -185,6 +188,10 @@ CONFIG_SCHEMA = cv.Schema(
PanasonicHeatpumpTextSensor,
icon=ICON_QUIET_MODE,
),
cv.Optional(CONF_TOP143): text_sensor.text_sensor_schema(
PanasonicHeatpumpTextSensor,
icon=ICON_DHW,
),
}
).extend(cv.COMPONENT_SCHEMA)
@@ -143,6 +143,12 @@ void PanasonicHeatpumpTextSensor::publish_new_state(const std::vector<uint8_t>&
if (this->has_state() && this->get_state() == new_state)
return;
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:
return;
};
@@ -31,6 +31,7 @@ enum TextSensorIds : uint8_t {
CONF_TOP139,
CONF_TOP140,
CONF_TOP141,
CONF_TOP143,
};
class PanasonicHeatpumpTextSensor : public text_sensor::TextSensor,