1 """Support for Somfy Smart Thermostat."""
3 from __future__
import annotations
5 from typing
import Any, cast
7 from pyoverkiz.enums
import OverkizCommand, OverkizCommandParam, OverkizState
19 from ..const
import DOMAIN
20 from ..coordinator
import OverkizDataUpdateCoordinator
21 from ..entity
import OverkizEntity
23 PRESET_FREEZE =
"freeze"
24 PRESET_NIGHT =
"night"
27 OVERKIZ_TO_HVAC_MODES: dict[str, HVACMode] = {
28 OverkizCommandParam.ACTIVE: HVACMode.HEAT,
29 OverkizCommandParam.INACTIVE: HVACMode.AUTO,
31 HVAC_MODES_TO_OVERKIZ = {v: k
for k, v
in OVERKIZ_TO_HVAC_MODES.items()}
33 OVERKIZ_TO_PRESET_MODES: dict[OverkizCommandParam, str] = {
34 OverkizCommandParam.AT_HOME_MODE: PRESET_HOME,
35 OverkizCommandParam.AWAY_MODE: PRESET_AWAY,
36 OverkizCommandParam.FREEZE_MODE: PRESET_FREEZE,
37 OverkizCommandParam.GEOFENCING_MODE: PRESET_NONE,
38 OverkizCommandParam.MANUAL_MODE: PRESET_NONE,
39 OverkizCommandParam.SLEEPING_MODE: PRESET_NIGHT,
40 OverkizCommandParam.SUDDEN_DROP_MODE: PRESET_NONE,
43 PRESET_MODES_TO_OVERKIZ = {v: k
for k, v
in OVERKIZ_TO_PRESET_MODES.items()}
44 TARGET_TEMP_TO_OVERKIZ = {
45 PRESET_HOME: OverkizState.SOMFY_THERMOSTAT_AT_HOME_TARGET_TEMPERATURE,
46 PRESET_AWAY: OverkizState.SOMFY_THERMOSTAT_AWAY_MODE_TARGET_TEMPERATURE,
47 PRESET_FREEZE: OverkizState.SOMFY_THERMOSTAT_FREEZE_MODE_TARGET_TEMPERATURE,
48 PRESET_NIGHT: OverkizState.SOMFY_THERMOSTAT_SLEEPING_MODE_TARGET_TEMPERATURE,
52 TEMPERATURE_SENSOR_DEVICE_INDEX = 2
56 """Representation of Somfy Smart Thermostat."""
58 _attr_temperature_unit = UnitOfTemperature.CELSIUS
59 _attr_supported_features = (
60 ClimateEntityFeature.PRESET_MODE
61 | ClimateEntityFeature.TARGET_TEMPERATURE
62 | ClimateEntityFeature.TURN_OFF
63 | ClimateEntityFeature.TURN_ON
65 _attr_hvac_modes = [*HVAC_MODES_TO_OVERKIZ]
66 _attr_preset_modes = [*PRESET_MODES_TO_OVERKIZ]
67 _attr_translation_key = DOMAIN
68 _enable_turn_on_off_backwards_compatibility =
False
75 self, device_url: str, coordinator: OverkizDataUpdateCoordinator
78 super().
__init__(device_url, coordinator)
80 TEMPERATURE_SENSOR_DEVICE_INDEX
85 """Return hvac operation ie. heat, cool mode."""
86 return OVERKIZ_TO_HVAC_MODES[
88 str, self.
executorexecutor.select_state(OverkizState.CORE_DEROGATION_ACTIVATION)
94 """Return the current preset mode, e.g., home, away, temp."""
96 state_key = OverkizState.SOMFY_THERMOSTAT_HEATING_MODE
98 state_key = OverkizState.SOMFY_THERMOSTAT_DEROGATION_HEATING_MODE
100 state = cast(str, self.
executorexecutor.select_state(state_key))
102 return OVERKIZ_TO_PRESET_MODES[OverkizCommandParam(state)]
106 """Return the current temperature."""
108 temperature := self.
temperature_devicetemperature_device.states[OverkizState.CORE_TEMPERATURE]
110 return cast(float, temperature.value)
115 """Return the temperature we try to reach."""
125 self.
executorexecutor.select_state(OverkizState.CORE_DEROGATED_TARGET_TEMPERATURE),
129 """Set new target temperature."""
130 temperature = kwargs[ATTR_TEMPERATURE]
132 await self.
executorexecutor.async_execute_command(
133 OverkizCommand.SET_DEROGATION,
135 OverkizCommandParam.FURTHER_NOTICE,
137 await self.
executorexecutor.async_execute_command(
138 OverkizCommand.SET_MODE_TEMPERATURE,
139 OverkizCommandParam.MANUAL_MODE,
142 await self.
executorexecutor.async_execute_command(OverkizCommand.REFRESH_STATE)
145 """Set new target hvac mode."""
146 if hvac_mode == HVACMode.AUTO:
147 await self.
executorexecutor.async_execute_command(OverkizCommand.EXIT_DEROGATION)
148 await self.
executorexecutor.async_execute_command(OverkizCommand.REFRESH_STATE)
153 """Set new preset mode."""
154 if preset_mode
in [PRESET_FREEZE, PRESET_NIGHT, PRESET_AWAY, PRESET_HOME]:
155 await self.
executorexecutor.async_execute_command(
156 OverkizCommand.SET_DEROGATION,
157 PRESET_MODES_TO_OVERKIZ[preset_mode],
158 OverkizCommandParam.FURTHER_NOTICE,
160 elif preset_mode == PRESET_NONE:
161 await self.
executorexecutor.async_execute_command(
162 OverkizCommand.SET_DEROGATION,
164 OverkizCommandParam.FURTHER_NOTICE,
166 await self.
executorexecutor.async_execute_command(
167 OverkizCommand.SET_MODE_TEMPERATURE,
168 OverkizCommandParam.MANUAL_MODE,
171 await self.
executorexecutor.async_execute_command(OverkizCommand.REFRESH_STATE)
None async_set_preset_mode(self, str preset_mode)
float|None target_temperature(self)
HVACMode|None hvac_mode(self)
str|None preset_mode(self)
None __init__(self, str device_url, OverkizDataUpdateCoordinator coordinator)
None async_set_temperature(self, **Any kwargs)
float|None current_temperature(self)
float|None target_temperature(self)
None async_set_preset_mode(self, str preset_mode)
None async_set_hvac_mode(self, HVACMode hvac_mode)