diff --git a/homeassistant/components/vicare/climate.py b/homeassistant/components/vicare/climate.py index 20a14ee9a04..1b8c1edcb8c 100644 --- a/homeassistant/components/vicare/climate.py +++ b/homeassistant/components/vicare/climate.py @@ -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) diff --git a/homeassistant/components/vicare/number.py b/homeassistant/components/vicare/number.py index 25c74e890c4..70fefb6e8db 100644 --- a/homeassistant/components/vicare/number.py +++ b/homeassistant/components/vicare/number.py @@ -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 + ), ), ) diff --git a/homeassistant/components/vicare/strings.json b/homeassistant/components/vicare/strings.json index 96e43be6818..58471907af2 100644 --- a/homeassistant/components/vicare/strings.json +++ b/homeassistant/components/vicare/strings.json @@ -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": { diff --git a/homeassistant/components/vicare/types.py b/homeassistant/components/vicare/types.py index dcb6036d919..83b15a6bcf7 100644 --- a/homeassistant/components/vicare/types.py +++ b/homeassistant/components/vicare/types.py @@ -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."""