Add a service for setting the timer to tado water heaters (#36533)
* Add service to support setting timer on water heater component * Update water_heater.py Remove info logging Return if unsupported option used * Added default temperature as it is optional * Update homeassistant/components/tado/services.yaml Co-authored-by: Franck Nijhof <frenck@frenck.nl> * Update homeassistant/components/tado/services.yaml Co-authored-by: Franck Nijhof <frenck@frenck.nl> * Update homeassistant/components/tado/services.yaml Co-authored-by: Franck Nijhof <frenck@frenck.nl> * Update homeassistant/components/tado/water_heater.py Co-authored-by: Franck Nijhof <frenck@frenck.nl> * Fix to remove else statement, and fix lint error * Reinstate entity id on schema, allow setting with temperature on devices that dont support it * Remove entity id from schema as not required Co-authored-by: Franck Nijhof <frenck@frenck.nl>pull/37292/head
parent
247bc6f673
commit
0a0b60566d
|
@ -0,0 +1,12 @@
|
|||
set_water_heater_timer:
|
||||
description: Turn on water heater for a set time.
|
||||
fields:
|
||||
entity_id:
|
||||
description: Entity ID for the tado component to turn on for a set time.
|
||||
example: water_heater.hot_water
|
||||
time_period:
|
||||
description: Set the time period for the boost.
|
||||
example: "01:30:00"
|
||||
temperature:
|
||||
description: Temperature to set heater to
|
||||
example: 25
|
|
@ -1,6 +1,8 @@
|
|||
"""Support for Tado hot water zones."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.water_heater import (
|
||||
SUPPORT_OPERATION_MODE,
|
||||
SUPPORT_TARGET_TEMPERATURE,
|
||||
|
@ -9,6 +11,7 @@ from homeassistant.components.water_heater import (
|
|||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import ATTR_TEMPERATURE, TEMP_CELSIUS
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.helpers import config_validation as cv, entity_platform
|
||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||
|
||||
from .const import (
|
||||
|
@ -46,6 +49,16 @@ WATER_HEATER_MAP_TADO = {
|
|||
|
||||
SUPPORT_FLAGS_HEATER = SUPPORT_OPERATION_MODE
|
||||
|
||||
SERVICE_WATER_HEATER_TIMER = "set_water_heater_timer"
|
||||
ATTR_TIME_PERIOD = "time_period"
|
||||
|
||||
WATER_HEATER_TIMER_SCHEMA = {
|
||||
vol.Required(ATTR_TIME_PERIOD, default="01:00:00"): vol.All(
|
||||
cv.time_period, cv.positive_timedelta, lambda td: td.total_seconds()
|
||||
),
|
||||
vol.Optional(ATTR_TEMPERATURE): vol.Coerce(float),
|
||||
}
|
||||
|
||||
|
||||
async def async_setup_entry(
|
||||
hass: HomeAssistant, entry: ConfigEntry, async_add_entities
|
||||
|
@ -55,6 +68,12 @@ async def async_setup_entry(
|
|||
tado = hass.data[DOMAIN][entry.entry_id][DATA]
|
||||
entities = await hass.async_add_executor_job(_generate_entities, tado)
|
||||
|
||||
platform = entity_platform.current_platform.get()
|
||||
|
||||
platform.async_register_entity_service(
|
||||
SERVICE_WATER_HEATER_TIMER, WATER_HEATER_TIMER_SCHEMA, "set_timer",
|
||||
)
|
||||
|
||||
if entities:
|
||||
async_add_entities(entities, True)
|
||||
|
||||
|
@ -212,6 +231,15 @@ class TadoWaterHeater(TadoZoneEntity, WaterHeaterEntity):
|
|||
|
||||
self._control_heater(hvac_mode=mode)
|
||||
|
||||
def set_timer(self, time_period, temperature=None):
|
||||
"""Set the timer on the entity, and temperature if supported."""
|
||||
if not self._supports_temperature_control and temperature is not None:
|
||||
temperature = None
|
||||
|
||||
self._control_heater(
|
||||
hvac_mode=CONST_MODE_HEAT, target_temp=temperature, duration=time_period
|
||||
)
|
||||
|
||||
def set_temperature(self, **kwargs):
|
||||
"""Set new target temperature."""
|
||||
temperature = kwargs.get(ATTR_TEMPERATURE)
|
||||
|
@ -241,7 +269,7 @@ class TadoWaterHeater(TadoZoneEntity, WaterHeaterEntity):
|
|||
self._tado_zone_data = self._tado.data["zone"][self.zone_id]
|
||||
self._current_tado_hvac_mode = self._tado_zone_data.current_hvac_mode
|
||||
|
||||
def _control_heater(self, hvac_mode=None, target_temp=None):
|
||||
def _control_heater(self, hvac_mode=None, target_temp=None, duration=None):
|
||||
"""Send new target temperature."""
|
||||
|
||||
if hvac_mode:
|
||||
|
@ -270,10 +298,12 @@ class TadoWaterHeater(TadoZoneEntity, WaterHeaterEntity):
|
|||
self._tado.set_zone_off(self.zone_id, CONST_OVERLAY_MANUAL, TYPE_HOT_WATER)
|
||||
return
|
||||
|
||||
# Fallback to Smart Schedule at next Schedule switch if we have fallback enabled
|
||||
overlay_mode = (
|
||||
CONST_OVERLAY_TADO_MODE if self._tado.fallback else CONST_OVERLAY_MANUAL
|
||||
)
|
||||
overlay_mode = CONST_OVERLAY_MANUAL
|
||||
if duration:
|
||||
overlay_mode = CONST_OVERLAY_TIMER
|
||||
elif self._tado.fallback:
|
||||
# Fallback to Smart Schedule at next Schedule switch if we have fallback enabled
|
||||
overlay_mode = CONST_OVERLAY_TADO_MODE
|
||||
|
||||
_LOGGER.debug(
|
||||
"Switching to %s for zone %s (%d) with temperature %s",
|
||||
|
@ -286,7 +316,7 @@ class TadoWaterHeater(TadoZoneEntity, WaterHeaterEntity):
|
|||
zone_id=self.zone_id,
|
||||
overlay_mode=overlay_mode,
|
||||
temperature=self._target_temp,
|
||||
duration=None,
|
||||
duration=duration,
|
||||
device_type=TYPE_HOT_WATER,
|
||||
)
|
||||
self._overlay_mode = self._current_tado_hvac_mode
|
||||
|
|
Loading…
Reference in New Issue