Added TOP143, SET43, SET44, SET45, SET46

This commit is contained in:
ElVit 2026-04-13 12:20:11 +02:00
parent 652fb1b31f
commit ef0cbc6447
11 changed files with 63 additions and 49 deletions

View File

@ -344,8 +344,6 @@ 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"
@ -475,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
@ -554,7 +554,7 @@ number:
set38: set38:
name: "Set Bivalent AP Stop Temp" name: "Set Bivalent AP Stop Temp"
set46: set46:
name: ""Set Heater On Outdoor Temp" name: "Set Heater On Outdoor Temp"
``` ```
### Switches ### Switches
@ -629,11 +629,11 @@ select:
set42: set42:
name: "Set Pump Flow Rate Mode" name: "Set Pump Flow Rate Mode"
set43: set43:
name: ""Set DHW Sensor Selection" name: "Set DHW Sensor Selection"
set44: set44:
name: ""Set DHW Heater State" name: "Set DHW Heater State"
set45: set45:
name: ""Set Room Heater State" name: "Set Room Heater State"
``` ```
### Climates ### Climates

View File

@ -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

@ -297,8 +297,8 @@ 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: case NumberIds::CONF_SET46:
new_state = PanasonicDecode::getBit7and8(data[11]); new_state = PanasonicDecode::getByteMinus128(data[85]);
if (this->has_state() && this->state == new_state) if (this->has_state() && this->state == new_state)
return; return;
break; break;

View File

@ -50,13 +50,13 @@ void PanasonicHeatpumpSelect::control(const std::string& value) {
this->parent_->set_command_byte(PanasonicCommand::setPlus1Multiply16(index), 29); this->parent_->set_command_byte(PanasonicCommand::setPlus1Multiply16(index), 29);
break; break;
case SelectIds::CONF_SET43: case SelectIds::CONF_SET43:
this->parent_->set_command_byte(PanasonicCommand::setPlus1(value), 11); this->parent_->set_command_byte(PanasonicCommand::setPlus1(index), 11);
break; break;
case SelectIds::CONF_SET44: case SelectIds::CONF_SET44:
this->parent_->set_command_byte(PanasonicCommand::setPlus1Multiply4(value), 9); this->parent_->set_command_byte(PanasonicCommand::setPlus1Multiply4(index), 9);
break; break;
case SelectIds::CONF_SET45: case SelectIds::CONF_SET45:
this->parent_->set_command_byte(PanasonicCommand::setPlus1(value), 9); this->parent_->set_command_byte(PanasonicCommand::setPlus1(index), 9);
break; break;
default: default:
return; return;
@ -135,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

@ -134,7 +134,6 @@ 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
@ -239,7 +238,6 @@ 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,
@ -590,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,
@ -926,16 +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_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,

View File

@ -495,11 +495,6 @@ 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,7 +103,6 @@ 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,

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,11 @@ 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,