readd climate entity 'tank'

This commit is contained in:
ElVit 2026-02-06 20:35:12 +01:00
parent 77c9e3e947
commit cd5e26d4ee
7 changed files with 43 additions and 11 deletions

View File

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

View File

@ -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<uint8_t>& 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<uint8_t>& 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;

View File

@ -9,6 +9,7 @@
namespace esphome {
namespace panasonic_heatpump {
enum ClimateIds : uint8_t {
CONF_CLIMATE_TANK,
CONF_CLIMATE_ZONE1,
CONF_CLIMATE_ZONE2,
};

View File

@ -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)),
}

View File

@ -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<uint8_t>&
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>&
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:

View File

@ -9,7 +9,7 @@
namespace esphome {
namespace panasonic_heatpump {
enum WaterHeaterIds : uint8_t {
CONF_TANK,
CONF_HEATER_TANK,
};
class PanasonicHeatpumpWaterHeater : public water_heater::WaterHeater,

View File

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