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
jfearon 2020-07-01 15:20:50 +01:00 committed by GitHub
parent 247bc6f673
commit 0a0b60566d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 6 deletions

View File

@ -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

View File

@ -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