1 """Support for Overkiz (virtual) numbers."""
3 from __future__
import annotations
6 from collections.abc
import Awaitable, Callable
7 from dataclasses
import dataclass
8 from typing
import cast
10 from pyoverkiz.enums
import OverkizCommand, OverkizCommandParam, OverkizState
15 NumberEntityDescription,
22 from .
import HomeAssistantOverkizData
23 from .const
import DOMAIN, IGNORED_OVERKIZ_DEVICES
24 from .coordinator
import OverkizDataUpdateCoordinator
25 from .entity
import OverkizDescriptiveEntity
27 BOOST_MODE_DURATION_DELAY = 1
28 OPERATING_MODE_DELAY = 3
31 @dataclass(frozen=True, kw_only=True)
33 """Class to describe an Overkiz number."""
37 min_value_state_name: str |
None =
None
38 max_value_state_name: str |
None =
None
39 inverted: bool =
False
41 Callable[[float, Callable[..., Awaitable[
None]]], Awaitable[
None]] |
None
46 value: float, execute_command: Callable[..., Awaitable[
None]]
48 """Update the boost duration value."""
51 await execute_command(OverkizCommand.SET_BOOST_MODE_DURATION, value)
53 BOOST_MODE_DURATION_DELAY
55 await execute_command(
56 OverkizCommand.SET_CURRENT_OPERATING_MODE,
58 OverkizCommandParam.RELAUNCH: OverkizCommandParam.ON,
59 OverkizCommandParam.ABSENCE: OverkizCommandParam.OFF,
63 await execute_command(
64 OverkizCommand.SET_CURRENT_OPERATING_MODE,
66 OverkizCommandParam.RELAUNCH: OverkizCommandParam.OFF,
67 OverkizCommandParam.ABSENCE: OverkizCommandParam.OFF,
74 await execute_command(OverkizCommand.REFRESH_BOOST_MODE_DURATION)
77 NUMBER_DESCRIPTIONS: list[OverkizNumberDescription] = [
80 key=OverkizState.CORE_MEMORIZED_1_POSITION,
82 icon=
"mdi:content-save-cog",
83 command=OverkizCommand.SET_MEMORIZED_1_POSITION,
86 entity_category=EntityCategory.CONFIG,
90 key=OverkizState.CORE_EXPECTED_NUMBER_OF_SHOWER,
91 name=
"Expected number of shower",
92 icon=
"mdi:shower-head",
93 command=OverkizCommand.SET_EXPECTED_NUMBER_OF_SHOWER,
96 min_value_state_name=OverkizState.CORE_MINIMAL_SHOWER_MANUAL_MODE,
97 max_value_state_name=OverkizState.CORE_MAXIMAL_SHOWER_MANUAL_MODE,
98 entity_category=EntityCategory.CONFIG,
101 key=OverkizState.CORE_TARGET_DWH_TEMPERATURE,
102 name=
"Target temperature",
103 device_class=NumberDeviceClass.TEMPERATURE,
104 command=OverkizCommand.SET_TARGET_DHW_TEMPERATURE,
107 min_value_state_name=OverkizState.CORE_MINIMAL_TEMPERATURE_MANUAL_MODE,
108 max_value_state_name=OverkizState.CORE_MAXIMAL_TEMPERATURE_MANUAL_MODE,
109 entity_category=EntityCategory.CONFIG,
112 key=OverkizState.CORE_WATER_TARGET_TEMPERATURE,
113 name=
"Water target temperature",
114 device_class=NumberDeviceClass.TEMPERATURE,
115 command=OverkizCommand.SET_WATER_TARGET_TEMPERATURE,
118 min_value_state_name=OverkizState.CORE_MINIMAL_TEMPERATURE_MANUAL_MODE,
119 max_value_state_name=OverkizState.CORE_MAXIMAL_TEMPERATURE_MANUAL_MODE,
120 entity_category=EntityCategory.CONFIG,
124 key=OverkizState.CORE_ECO_ROOM_TEMPERATURE,
125 name=
"Eco room temperature",
126 icon=
"mdi:thermometer",
127 command=OverkizCommand.SET_ECO_TEMPERATURE,
128 device_class=NumberDeviceClass.TEMPERATURE,
131 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
132 entity_category=EntityCategory.CONFIG,
135 key=OverkizState.CORE_COMFORT_ROOM_TEMPERATURE,
136 name=
"Comfort room temperature",
137 icon=
"mdi:home-thermometer-outline",
138 command=OverkizCommand.SET_COMFORT_TEMPERATURE,
139 device_class=NumberDeviceClass.TEMPERATURE,
142 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
143 entity_category=EntityCategory.CONFIG,
146 key=OverkizState.CORE_SECURED_POSITION_TEMPERATURE,
147 name=
"Freeze protection temperature",
148 icon=
"mdi:sun-thermometer-outline",
149 command=OverkizCommand.SET_SECURED_POSITION_TEMPERATURE,
150 device_class=NumberDeviceClass.TEMPERATURE,
153 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
154 entity_category=EntityCategory.CONFIG,
159 key=OverkizState.CORE_LEVEL,
160 icon=
"mdi:patio-heater",
161 command=OverkizCommand.SET_LEVEL,
163 native_max_value=100,
168 key=OverkizState.CORE_BOOST_MODE_DURATION,
169 name=
"Boost mode duration",
170 icon=
"mdi:water-boiler",
171 command=OverkizCommand.SET_BOOST_MODE_DURATION,
174 set_native_value=_async_set_native_value_boost_mode_duration,
175 entity_category=EntityCategory.CONFIG,
179 key=OverkizState.IO_AWAY_MODE_DURATION,
180 name=
"Away mode duration",
181 icon=
"mdi:water-boiler-off",
182 command=OverkizCommand.SET_AWAY_MODE_DURATION,
185 entity_category=EntityCategory.CONFIG,
189 SUPPORTED_STATES = {description.key: description
for description
in NUMBER_DESCRIPTIONS}
195 async_add_entities: AddEntitiesCallback,
197 """Set up the Overkiz number from a config entry."""
198 data: HomeAssistantOverkizData = hass.data[DOMAIN][entry.entry_id]
199 entities: list[OverkizNumber] = []
201 for device
in data.coordinator.data.values():
203 device.widget
in IGNORED_OVERKIZ_DEVICES
204 or device.ui_class
in IGNORED_OVERKIZ_DEVICES
214 for state
in device.definition.states
215 if (description := SUPPORTED_STATES.get(state.qualified_name))
222 """Representation of an Overkiz Number."""
224 entity_description: OverkizNumberDescription
229 coordinator: OverkizDataUpdateCoordinator,
230 description: OverkizNumberDescription,
232 """Initialize a device."""
233 super().
__init__(device_url, coordinator, description)
236 state := self.
devicedevice.states.get(
243 state := self.
devicedevice.states.get(
251 """Return the entity value to represent the entity state."""
256 return cast(float, state.value)
267 value, self.
executorexecutor.async_execute_command
271 await self.
executorexecutor.async_execute_command(
None set_native_value(self, float value)
float native_max_value(self)
float|None native_value(self)
None __init__(self, str device_url, OverkizDataUpdateCoordinator coordinator, OverkizNumberDescription description)
None async_set_native_value(self, float value)
None _async_set_native_value_boost_mode_duration(float value, Callable[..., Awaitable[None]] execute_command)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)