Add number entities to change heat pump program temperatures in ViCare integration (#109315)

* add HeatingProgram type

* use HeatingProgram type

* add heatpump number sensors

* use HeatingProgram type

* Update strings.json

* rename HeatingProgram to Program

* remove commented code

* rename heating program type

* simplify

* Apply suggestions from code review

* Update strings.json

* Update const.py

* fix

* add heating program type

* correct imports

* Revert "fix"

This reverts commit 857dda59da188cdcf2d8d47073910ec042b4b523.

* Apply suggestions from code review

* Update strings.json
This commit is contained in:
Christopher Fenner 2024-02-22 18:58:38 +01:00 committed by GitHub
parent c1b4a21821
commit 88e9870f1c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 144 additions and 42 deletions

View File

@ -42,7 +42,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DEVICE_LIST, DOMAIN
from .entity import ViCareEntity
from .types import ViCareDevice
from .types import HeatingProgram, ViCareDevice
from .utils import get_burners, get_circuits, get_compressors
_LOGGER = logging.getLogger(__name__)
@ -58,15 +58,6 @@ VICARE_MODE_FORCEDREDUCED = "forcedReduced"
VICARE_MODE_FORCEDNORMAL = "forcedNormal"
VICARE_MODE_OFF = "standby"
VICARE_PROGRAM_ACTIVE = "active"
VICARE_PROGRAM_COMFORT = "comfort"
VICARE_PROGRAM_ECO = "eco"
VICARE_PROGRAM_EXTERNAL = "external"
VICARE_PROGRAM_HOLIDAY = "holiday"
VICARE_PROGRAM_NORMAL = "normal"
VICARE_PROGRAM_REDUCED = "reduced"
VICARE_PROGRAM_STANDBY = "standby"
VICARE_HOLD_MODE_AWAY = "away"
VICARE_HOLD_MODE_HOME = "home"
VICARE_HOLD_MODE_OFF = "off"
@ -85,18 +76,13 @@ VICARE_TO_HA_HVAC_HEATING: dict[str, HVACMode] = {
}
VICARE_TO_HA_PRESET_HEATING = {
VICARE_PROGRAM_COMFORT: PRESET_COMFORT,
VICARE_PROGRAM_ECO: PRESET_ECO,
VICARE_PROGRAM_NORMAL: PRESET_HOME,
VICARE_PROGRAM_REDUCED: PRESET_SLEEP,
HeatingProgram.COMFORT: PRESET_COMFORT,
HeatingProgram.ECO: PRESET_ECO,
HeatingProgram.NORMAL: PRESET_HOME,
HeatingProgram.REDUCED: PRESET_SLEEP,
}
HA_TO_VICARE_PRESET_HEATING = {
PRESET_COMFORT: VICARE_PROGRAM_COMFORT,
PRESET_ECO: VICARE_PROGRAM_ECO,
PRESET_HOME: VICARE_PROGRAM_NORMAL,
PRESET_SLEEP: VICARE_PROGRAM_REDUCED,
}
HA_TO_VICARE_PRESET_HEATING = {v: k for k, v in VICARE_TO_HA_PRESET_HEATING.items()}
def _build_entities(
@ -319,9 +305,9 @@ class ViCareClimate(ViCareEntity, ClimateEntity):
_LOGGER.debug("Current preset %s", self._current_program)
if self._current_program and self._current_program not in [
VICARE_PROGRAM_NORMAL,
VICARE_PROGRAM_REDUCED,
VICARE_PROGRAM_STANDBY,
HeatingProgram.NORMAL,
HeatingProgram.REDUCED,
HeatingProgram.STANDBY,
]:
# We can't deactivate "normal", "reduced" or "standby"
_LOGGER.debug("deactivating %s", self._current_program)
@ -338,9 +324,9 @@ class ViCareClimate(ViCareEntity, ClimateEntity):
_LOGGER.debug("Setting preset to %s / %s", preset_mode, target_program)
if target_program not in [
VICARE_PROGRAM_NORMAL,
VICARE_PROGRAM_REDUCED,
VICARE_PROGRAM_STANDBY,
HeatingProgram.NORMAL,
HeatingProgram.REDUCED,
HeatingProgram.STANDBY,
]:
# And we can't explicitly activate "normal", "reduced" or "standby", either
_LOGGER.debug("activating %s", target_program)

View File

@ -31,7 +31,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DEVICE_LIST, DOMAIN
from .entity import ViCareEntity
from .types import ViCareDevice, ViCareRequiredKeysMixin
from .types import HeatingProgram, ViCareDevice, ViCareRequiredKeysMixin
from .utils import get_circuits, is_supported
_LOGGER = logging.getLogger(__name__)
@ -89,11 +89,19 @@ CIRCUIT_ENTITY_DESCRIPTIONS: tuple[ViCareNumberEntityDescription, ...] = (
entity_category=EntityCategory.CONFIG,
device_class=NumberDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
value_getter=lambda api: api.getDesiredTemperatureForProgram("normal"),
value_setter=lambda api, value: api.setProgramTemperature("normal", value),
min_value_getter=lambda api: api.getProgramMinTemperature("normal"),
max_value_getter=lambda api: api.getProgramMaxTemperature("normal"),
stepping_getter=lambda api: api.getProgramStepping("normal"),
value_getter=lambda api: api.getDesiredTemperatureForProgram(
HeatingProgram.NORMAL
),
value_setter=lambda api, value: api.setProgramTemperature(
HeatingProgram.NORMAL, value
),
min_value_getter=lambda api: api.getProgramMinTemperature(
HeatingProgram.NORMAL
),
max_value_getter=lambda api: api.getProgramMaxTemperature(
HeatingProgram.NORMAL
),
stepping_getter=lambda api: api.getProgramStepping(HeatingProgram.NORMAL),
),
ViCareNumberEntityDescription(
key="reduced_temperature",
@ -101,11 +109,19 @@ CIRCUIT_ENTITY_DESCRIPTIONS: tuple[ViCareNumberEntityDescription, ...] = (
entity_category=EntityCategory.CONFIG,
device_class=NumberDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
value_getter=lambda api: api.getDesiredTemperatureForProgram("reduced"),
value_setter=lambda api, value: api.setProgramTemperature("reduced", value),
min_value_getter=lambda api: api.getProgramMinTemperature("reduced"),
max_value_getter=lambda api: api.getProgramMaxTemperature("reduced"),
stepping_getter=lambda api: api.getProgramStepping("reduced"),
value_getter=lambda api: api.getDesiredTemperatureForProgram(
HeatingProgram.REDUCED
),
value_setter=lambda api, value: api.setProgramTemperature(
HeatingProgram.REDUCED, value
),
min_value_getter=lambda api: api.getProgramMinTemperature(
HeatingProgram.REDUCED
),
max_value_getter=lambda api: api.getProgramMaxTemperature(
HeatingProgram.REDUCED
),
stepping_getter=lambda api: api.getProgramStepping(HeatingProgram.REDUCED),
),
ViCareNumberEntityDescription(
key="comfort_temperature",
@ -113,11 +129,85 @@ CIRCUIT_ENTITY_DESCRIPTIONS: tuple[ViCareNumberEntityDescription, ...] = (
entity_category=EntityCategory.CONFIG,
device_class=NumberDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
value_getter=lambda api: api.getDesiredTemperatureForProgram("comfort"),
value_setter=lambda api, value: api.setProgramTemperature("comfort", value),
min_value_getter=lambda api: api.getProgramMinTemperature("comfort"),
max_value_getter=lambda api: api.getProgramMaxTemperature("comfort"),
stepping_getter=lambda api: api.getProgramStepping("comfort"),
value_getter=lambda api: api.getDesiredTemperatureForProgram(
HeatingProgram.COMFORT
),
value_setter=lambda api, value: api.setProgramTemperature(
HeatingProgram.COMFORT, value
),
min_value_getter=lambda api: api.getProgramMinTemperature(
HeatingProgram.COMFORT
),
max_value_getter=lambda api: api.getProgramMaxTemperature(
HeatingProgram.COMFORT
),
stepping_getter=lambda api: api.getProgramStepping(HeatingProgram.COMFORT),
),
ViCareNumberEntityDescription(
key="normal_heating_temperature",
translation_key="normal_heating_temperature",
entity_category=EntityCategory.CONFIG,
device_class=NumberDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
value_getter=lambda api: api.getDesiredTemperatureForProgram(
HeatingProgram.NORMAL_HEATING
),
value_setter=lambda api, value: api.setProgramTemperature(
HeatingProgram.NORMAL_HEATING, value
),
min_value_getter=lambda api: api.getProgramMinTemperature(
HeatingProgram.NORMAL_HEATING
),
max_value_getter=lambda api: api.getProgramMaxTemperature(
HeatingProgram.NORMAL_HEATING
),
stepping_getter=lambda api: api.getProgramStepping(
HeatingProgram.NORMAL_HEATING
),
),
ViCareNumberEntityDescription(
key="reduced_heating_temperature",
translation_key="reduced_heating_temperature",
entity_category=EntityCategory.CONFIG,
device_class=NumberDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
value_getter=lambda api: api.getDesiredTemperatureForProgram(
HeatingProgram.REDUCED_HEATING
),
value_setter=lambda api, value: api.setProgramTemperature(
HeatingProgram.REDUCED_HEATING, value
),
min_value_getter=lambda api: api.getProgramMinTemperature(
HeatingProgram.REDUCED_HEATING
),
max_value_getter=lambda api: api.getProgramMaxTemperature(
HeatingProgram.REDUCED_HEATING
),
stepping_getter=lambda api: api.getProgramStepping(
HeatingProgram.REDUCED_HEATING
),
),
ViCareNumberEntityDescription(
key="comfort_heating_temperature",
translation_key="comfort_heating_temperature",
entity_category=EntityCategory.CONFIG,
device_class=NumberDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
value_getter=lambda api: api.getDesiredTemperatureForProgram(
HeatingProgram.COMFORT_HEATING
),
value_setter=lambda api, value: api.setProgramTemperature(
HeatingProgram.COMFORT_HEATING, value
),
min_value_getter=lambda api: api.getProgramMinTemperature(
HeatingProgram.COMFORT_HEATING
),
max_value_getter=lambda api: api.getProgramMaxTemperature(
HeatingProgram.COMFORT_HEATING
),
stepping_getter=lambda api: api.getProgramStepping(
HeatingProgram.COMFORT_HEATING
),
),
)

View File

@ -80,6 +80,15 @@
},
"comfort_temperature": {
"name": "Comfort temperature"
},
"normal_heating_temperature": {
"name": "[%key:component::vicare::entity::number::normal_temperature::name%]"
},
"reduced_heating_temperature": {
"name": "[%key:component::vicare::entity::number::reduced_temperature::name%]"
},
"comfort_heating_temperature": {
"name": "[%key:component::vicare::entity::number::comfort_temperature::name%]"
}
},
"sensor": {

View File

@ -1,12 +1,29 @@
"""Types for the ViCare integration."""
from collections.abc import Callable
from dataclasses import dataclass
import enum
from typing import Any
from PyViCare.PyViCareDevice import Device as PyViCareDevice
from PyViCare.PyViCareDeviceConfig import PyViCareDeviceConfig
class HeatingProgram(enum.StrEnum):
"""ViCare preset heating programs.
As listed in https://github.com/somm15/PyViCare/blob/63f9f7fea505fdf9a26c77c6cd0bff889abcdb05/PyViCare/PyViCareHeatingDevice.py#L606
"""
COMFORT = "comfort"
COMFORT_HEATING = "comfortHeating"
ECO = "eco"
NORMAL = "normal"
NORMAL_HEATING = "normalHeating"
REDUCED = "reduced"
REDUCED_HEATING = "reducedHeating"
STANDBY = "standby"
@dataclass(frozen=True)
class ViCareDevice:
"""Dataclass holding the device api and config."""