1 """Support for Tado hot water zones."""
6 import voluptuous
as vol
10 WaterHeaterEntityFeature,
19 from .
import TadoConfigEntry
25 CONST_MODE_SMART_SCHEDULE,
27 CONST_OVERLAY_TADO_MODE,
29 SIGNAL_TADO_UPDATE_RECEIVED,
32 from .entity
import TadoZoneEntity
33 from .helper
import decide_duration, decide_overlay_mode
34 from .repairs
import manage_water_heater_fallback_issue
35 from .tado_connector
import TadoConnector
37 _LOGGER = logging.getLogger(__name__)
43 OPERATION_MODES = [MODE_AUTO, MODE_HEAT, MODE_OFF]
45 WATER_HEATER_MAP_TADO = {
46 CONST_OVERLAY_MANUAL: MODE_HEAT,
47 CONST_OVERLAY_TIMER: MODE_HEAT,
48 CONST_OVERLAY_TADO_MODE: MODE_HEAT,
49 CONST_HVAC_HEAT: MODE_HEAT,
50 CONST_MODE_SMART_SCHEDULE: MODE_AUTO,
51 CONST_MODE_OFF: MODE_OFF,
54 SERVICE_WATER_HEATER_TIMER =
"set_water_heater_timer"
55 ATTR_TIME_PERIOD =
"time_period"
57 WATER_HEATER_TIMER_SCHEMA: VolDictType = {
58 vol.Required(ATTR_TIME_PERIOD, default=
"01:00:00"): vol.All(
59 cv.time_period, cv.positive_timedelta,
lambda td: td.total_seconds()
61 vol.Optional(ATTR_TEMPERATURE): vol.Coerce(float),
66 hass: HomeAssistant, entry: TadoConfigEntry, async_add_entities: AddEntitiesCallback
68 """Set up the Tado water heater platform."""
70 tado = entry.runtime_data
71 entities = await hass.async_add_executor_job(_generate_entities, tado)
73 platform = entity_platform.async_get_current_platform()
75 platform.async_register_entity_service(
76 SERVICE_WATER_HEATER_TIMER,
77 WATER_HEATER_TIMER_SCHEMA,
85 water_heater_names=[e.zone_name
for e
in entities],
86 integration_overlay_fallback=tado.fallback,
91 """Create all water heater entities."""
94 for zone
in tado.zones:
95 if zone[
"type"] == TYPE_HOT_WATER:
97 tado, zone[
"name"], zone[
"id"],
str(zone[
"name"])
99 entities.append(entity)
105 """Create a Tado water heater device."""
106 capabilities = tado.get_capabilities(zone_id)
108 supports_temperature_control = capabilities[
"canSetTemperature"]
110 if supports_temperature_control
and "temperatures" in capabilities:
111 temperatures = capabilities[
"temperatures"]
112 min_temp =
float(temperatures[
"celsius"][
"min"])
113 max_temp =
float(temperatures[
"celsius"][
"max"])
122 supports_temperature_control,
129 """Representation of a Tado water heater."""
132 _attr_operation_list = OPERATION_MODES
133 _attr_temperature_unit = UnitOfTemperature.CELSIUS
140 supports_temperature_control: bool,
144 """Initialize of Tado water heater entity."""
146 super().
__init__(zone_name, tado.home_id, zone_id)
168 """Register for sensor updates."""
172 SIGNAL_TADO_UPDATE_RECEIVED.format(
182 """Return current readable operation mode."""
187 """Return the temperature we try to reach."""
192 """Return true if away mode is on."""
197 """Return the minimum temperature."""
202 """Return the maximum temperature."""
206 """Set new operation mode."""
209 if operation_mode == MODE_OFF:
210 mode = CONST_MODE_OFF
211 elif operation_mode == MODE_AUTO:
212 mode = CONST_MODE_SMART_SCHEDULE
213 elif operation_mode == MODE_HEAT:
214 mode = CONST_MODE_HEAT
218 def set_timer(self, time_period: int, temperature: float |
None =
None):
219 """Set the timer on the entity, and temperature if supported."""
224 hvac_mode=CONST_MODE_HEAT, target_temp=temperature, duration=time_period
228 """Set new target temperature."""
229 temperature = kwargs.get(ATTR_TEMPERATURE)
236 CONST_MODE_SMART_SCHEDULE,
241 self.
_control_heater_control_heater(target_temp=temperature, hvac_mode=CONST_MODE_HEAT)
245 """Load tado data and update state."""
251 """Load tado data."""
252 _LOGGER.debug(
"Updating water_heater platform for zone %d", self.
zone_idzone_idzone_id)
258 hvac_mode: str |
None =
None,
259 target_temp: float |
None =
None,
260 duration: int |
None =
None,
262 """Send new target temperature."""
275 "Switching to SMART_SCHEDULE for zone %s (%d)",
286 self.
_tado_tado.set_zone_off(self.
zone_idzone_idzone_id, CONST_OVERLAY_MANUAL, TYPE_HOT_WATER)
290 tado=self.
_tado_tado,
295 tado=self.
_tado_tado,
298 overlay_mode=overlay_mode,
301 "Switching to %s for zone %s (%d) with temperature %s",
307 self.
_tado_tado.set_zone_overlay(
309 overlay_mode=overlay_mode,
312 device_type=TYPE_HOT_WATER,
float|None target_temperature(self)
None _async_update_data(self)
def set_timer(self, int time_period, float|None temperature=None)
bool is_away_mode_on(self)
None set_operation_mode(self, str operation_mode)
None set_temperature(self, **Any kwargs)
str|None current_operation(self)
None _async_update_callback(self)
_supports_temperature_control
None async_added_to_hass(self)
None __init__(self, TadoConnector tado, str zone_name, int zone_id, bool supports_temperature_control, min_temp, max_temp)
def _control_heater(self, str|None hvac_mode=None, float|None target_temp=None, int|None duration=None)
None async_write_ha_state(self)
None async_on_remove(self, CALLBACK_TYPE func)
None|int decide_duration(TadoConnector tado, int|None duration, int zone_id, str|None overlay_mode=None)
str decide_overlay_mode(TadoConnector tado, int|None duration, int zone_id, str|None overlay_mode=None)
None manage_water_heater_fallback_issue(HomeAssistant hass, list[str] water_heater_names, str|None integration_overlay_fallback)
def create_water_heater_entity(TadoConnector tado, str name, int zone_id, str zone)
None async_setup_entry(HomeAssistant hass, TadoConfigEntry entry, AddEntitiesCallback async_add_entities)
list _generate_entities(TadoConnector tado)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)