From cd5e26d4ee9c21fcb4071467be85c933a8604d57 Mon Sep 17 00:00:00 2001 From: ElVit Date: Fri, 6 Feb 2026 20:35:12 +0100 Subject: [PATCH] readd climate entity 'tank' --- .../panasonic_heatpump/climate/__init__.py | 5 ++++ .../climate/panasonic_heatpump_climate.cpp | 26 +++++++++++++++++++ .../climate/panasonic_heatpump_climate.h | 1 + .../water_heater/__init__.py | 6 ++--- .../panasonic_heatpump_water_heater.cpp | 8 +++--- .../panasonic_heatpump_water_heater.h | 2 +- .../test_panasonic_heatpump_unit.py | 6 ++--- 7 files changed, 43 insertions(+), 11 deletions(-) diff --git a/components/panasonic_heatpump/climate/__init__.py b/components/panasonic_heatpump/climate/__init__.py index b4d13b8..774bebf 100644 --- a/components/panasonic_heatpump/climate/__init__.py +++ b/components/panasonic_heatpump/climate/__init__.py @@ -13,10 +13,12 @@ from .. import ( ) CONF_COOL_MODE = "cool_mode" +CONF_CLIMATE_TANK = "tank" CONF_CLIMATE_ZONE1 = "zone1" CONF_CLIMATE_ZONE2 = "zone2" TYPES = [ + CONF_CLIMATE_TANK, CONF_CLIMATE_ZONE1, CONF_CLIMATE_ZONE2, ] @@ -43,6 +45,9 @@ CONFIG_SCHEMA = cv.Schema( PanasonicHeatpumpComponent ), cv.Optional(CONF_COOL_MODE, default=False): cv.boolean, + cv.Optional(CONF_CLIMATE_TANK): climate.climate_schema( + PanasonicHeatpumpClimate + ).extend(climate_options(20.0, 65.0, 0.5)), cv.Optional(CONF_CLIMATE_ZONE1): climate.climate_schema( PanasonicHeatpumpClimate ).extend(climate_options(-5.0, 5.0, 0.5)), diff --git a/components/panasonic_heatpump/climate/panasonic_heatpump_climate.cpp b/components/panasonic_heatpump/climate/panasonic_heatpump_climate.cpp index b313413..963e56c 100644 --- a/components/panasonic_heatpump/climate/panasonic_heatpump_climate.cpp +++ b/components/panasonic_heatpump/climate/panasonic_heatpump_climate.cpp @@ -42,6 +42,9 @@ void PanasonicHeatpumpClimate::control(const climate::ClimateCall& call) { if (call.get_target_temperature().has_value()) { float new_temp = *call.get_target_temperature(); switch (this->id_) { + case ClimateIds::CONF_CLIMATE_TANK: + this->parent_->set_command_byte(PanasonicCommand::setPlus128(new_temp), 42); // set11 + break; case ClimateIds::CONF_CLIMATE_ZONE1: this->parent_->set_command_byte(PanasonicCommand::setPlus128(new_temp), 38); // set5 break; @@ -94,6 +97,10 @@ void PanasonicHeatpumpClimate::publish_new_state(const std::vector& dat new_mode = this->getClimateMode(data[6]); // set9 switch (this->id_) { + case ClimateIds::CONF_CLIMATE_TANK: + new_target_temp_heat = PanasonicDecode::getByteMinus128(data[42]); // set11 + new_current_temp = PanasonicDecode::getByteMinus128(data[141]); // top10 + break; case ClimateIds::CONF_CLIMATE_ZONE1: new_target_temp_heat = PanasonicDecode::getByteMinus128(data[38]); // set5 new_target_temp_cool = PanasonicDecode::getByteMinus128(data[39]); // set6 @@ -131,6 +138,15 @@ void PanasonicHeatpumpClimate::publish_new_state(const std::vector& dat uint8_t PanasonicHeatpumpClimate::getClimateMode(const uint8_t input) { switch (this->id_) { + case ClimateIds::CONF_CLIMATE_TANK: + switch ((uint8_t)(input & 0b110000)) { + case 0b010000: + return climate::CLIMATE_MODE_OFF; + case 0b100000: + return climate::CLIMATE_MODE_HEAT; + default: + return 255; + }; case ClimateIds::CONF_CLIMATE_ZONE1: case ClimateIds::CONF_CLIMATE_ZONE2: switch ((uint8_t)(input & 0b1111)) { @@ -157,6 +173,16 @@ uint8_t PanasonicHeatpumpClimate::getClimateMode(const uint8_t input) { uint8_t PanasonicHeatpumpClimate::setClimateMode(const climate::ClimateMode mode, uint8_t byte) { uint8_t newByte = byte; switch (this->id_) { + case ClimateIds::CONF_CLIMATE_TANK: + newByte = newByte & 0b11001111; + switch (mode) { + case climate::CLIMATE_MODE_OFF: + return newByte + 0b010000; + case climate::CLIMATE_MODE_HEAT: + return newByte + 0b100000; + default: + return 0; + }; case ClimateIds::CONF_CLIMATE_ZONE1: case ClimateIds::CONF_CLIMATE_ZONE2: newByte = newByte & 0b11110000; diff --git a/components/panasonic_heatpump/climate/panasonic_heatpump_climate.h b/components/panasonic_heatpump/climate/panasonic_heatpump_climate.h index eed84c8..5c505e3 100644 --- a/components/panasonic_heatpump/climate/panasonic_heatpump_climate.h +++ b/components/panasonic_heatpump/climate/panasonic_heatpump_climate.h @@ -9,6 +9,7 @@ namespace esphome { namespace panasonic_heatpump { enum ClimateIds : uint8_t { + CONF_CLIMATE_TANK, CONF_CLIMATE_ZONE1, CONF_CLIMATE_ZONE2, }; diff --git a/components/panasonic_heatpump/water_heater/__init__.py b/components/panasonic_heatpump/water_heater/__init__.py index 5d893c0..d9eb74d 100644 --- a/components/panasonic_heatpump/water_heater/__init__.py +++ b/components/panasonic_heatpump/water_heater/__init__.py @@ -13,10 +13,10 @@ from .. import ( CONF_TARGET_TEMPERATURE_STEP = "target_temperature_step" -CONF_TANK = "tank" +CONF_HEATER_TANK = "tank" TYPES = [ - CONF_TANK, + CONF_HEATER_TANK, ] @@ -40,7 +40,7 @@ CONFIG_SCHEMA = cv.Schema( cv.GenerateID(CONF_PANASONIC_HEATPUMP_ID): cv.use_id( PanasonicHeatpumpComponent ), - cv.Optional(CONF_TANK): water_heater.water_heater_schema( + cv.Optional(CONF_HEATER_TANK): water_heater.water_heater_schema( PanasonicHeatpumpWaterHeater ).extend(water_heater_options(20.0, 65.0, 0.5)), } diff --git a/components/panasonic_heatpump/water_heater/panasonic_heatpump_water_heater.cpp b/components/panasonic_heatpump/water_heater/panasonic_heatpump_water_heater.cpp index c0b8585..7073d0d 100644 --- a/components/panasonic_heatpump/water_heater/panasonic_heatpump_water_heater.cpp +++ b/components/panasonic_heatpump/water_heater/panasonic_heatpump_water_heater.cpp @@ -33,7 +33,7 @@ void PanasonicHeatpumpWaterHeater::control(const water_heater::WaterHeaterCall& float new_temp = call.get_target_temperature(); switch (this->id_) { - case WaterHeaterIds::CONF_TANK: + case WaterHeaterIds::CONF_HEATER_TANK: this->parent_->set_command_byte(PanasonicCommand::setPlus128(new_temp), 42); // set11 break; }; @@ -56,7 +56,7 @@ void PanasonicHeatpumpWaterHeater::publish_new_state(const std::vector& new_mode = this->getWaterHeaterMode(data[6]); // set9 switch (this->id_) { - case WaterHeaterIds::CONF_TANK: + case WaterHeaterIds::CONF_HEATER_TANK: new_target_temp_heat = PanasonicDecode::getByteMinus128(data[42]); // set11 new_current_temp = PanasonicDecode::getByteMinus128(data[141]); // top10 break; @@ -77,7 +77,7 @@ void PanasonicHeatpumpWaterHeater::publish_new_state(const std::vector& uint8_t PanasonicHeatpumpWaterHeater::getWaterHeaterMode(const uint8_t input) { switch (this->id_) { - case WaterHeaterIds::CONF_TANK: + case WaterHeaterIds::CONF_HEATER_TANK: switch ((uint8_t)(input & 0b110000)) { case 0b010000: return water_heater::WATER_HEATER_MODE_OFF; @@ -94,7 +94,7 @@ uint8_t PanasonicHeatpumpWaterHeater::getWaterHeaterMode(const uint8_t input) { uint8_t PanasonicHeatpumpWaterHeater::setWaterHeaterMode(const water_heater::WaterHeaterMode mode, const uint8_t byte) { uint8_t newByte = byte; switch (this->id_) { - case WaterHeaterIds::CONF_TANK: + case WaterHeaterIds::CONF_HEATER_TANK: newByte = newByte & 0b11001111; switch (mode) { case water_heater::WATER_HEATER_MODE_OFF: diff --git a/components/panasonic_heatpump/water_heater/panasonic_heatpump_water_heater.h b/components/panasonic_heatpump/water_heater/panasonic_heatpump_water_heater.h index 5167291..2a3e6d8 100644 --- a/components/panasonic_heatpump/water_heater/panasonic_heatpump_water_heater.h +++ b/components/panasonic_heatpump/water_heater/panasonic_heatpump_water_heater.h @@ -9,7 +9,7 @@ namespace esphome { namespace panasonic_heatpump { enum WaterHeaterIds : uint8_t { - CONF_TANK, + CONF_HEATER_TANK, }; class PanasonicHeatpumpWaterHeater : public water_heater::WaterHeater, diff --git a/tests/panasonic_heatpump/test_panasonic_heatpump_unit.py b/tests/panasonic_heatpump/test_panasonic_heatpump_unit.py index a584887..aac7d07 100644 --- a/tests/panasonic_heatpump/test_panasonic_heatpump_unit.py +++ b/tests/panasonic_heatpump/test_panasonic_heatpump_unit.py @@ -355,13 +355,13 @@ class TestPanasonicHeatpumpPlatforms: from panasonic_heatpump.water_heater import ( CONFIG_SCHEMA, - CONF_TANK, + CONF_HEATER_TANK, TYPES, ) assert CONFIG_SCHEMA is not None - assert CONF_TANK == "tank" - assert CONF_TANK in TYPES + assert CONF_HEATER_TANK == "tank" + assert CONF_HEATER_TANK in TYPES except ImportError: pytest.skip("Water heater platform not accessible in test environment")