Skip to content

Commit

Permalink
Add number entities to change heat pump program temperatures in ViCar…
Browse files Browse the repository at this point in the history
…e 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 857dda5.

* Apply suggestions from code review

* Update strings.json
  • Loading branch information
CFenner committed Feb 22, 2024
1 parent c1b4a21 commit 88e9870
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 42 deletions.
38 changes: 12 additions & 26 deletions homeassistant/components/vicare/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@

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__)
Expand All @@ -58,15 +58,6 @@
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"
Expand All @@ -85,18 +76,13 @@
}

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(
Expand Down Expand Up @@ -319,9 +305,9 @@ def set_preset_mode(self, preset_mode: str) -> None:

_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)
Expand All @@ -338,9 +324,9 @@ def set_preset_mode(self, preset_mode: str) -> None:

_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)
Expand Down
122 changes: 106 additions & 16 deletions homeassistant/components/vicare/number.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

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__)
Expand Down Expand Up @@ -89,35 +89,125 @@ class ViCareNumberEntityDescription(NumberEntityDescription, ViCareRequiredKeysM
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",
translation_key="reduced_temperature",
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",
translation_key="comfort_temperature",
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
),
),
)

Expand Down
9 changes: 9 additions & 0 deletions homeassistant/components/vicare/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down
17 changes: 17 additions & 0 deletions homeassistant/components/vicare/types.py
Original file line number Diff line number Diff line change
@@ -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."""
Expand Down

0 comments on commit 88e9870

Please sign in to comment.