Tado - Hot Water Boost supported?

Hi all,

I notice that the Tado integration has progressed substantially since I set it up late last year, which is great. One welcome addition is the support for hot water control and I can now use entity water_heater.hot_water to turn the hot water on and off - superb!

One piece of functionality that I use today is the ability to “boost” the hot water for a period of time if the temperature drops too low. Currently, this is triggered by an MQTT temperature monitor on the water tank, which fires a webhook off to IFTTT to boost the water for one hour (this pre-dates support for hot water directly in home assistant) and it’s proven to be extremely useful - especially when the kids return from exercise and insist on draining all of the hot water in the middle of the day when the system is normally set not to reheat!

I’d love to get rid of this bit of IFTTT fudge, but I notice that the new native hot water support doesn’t support the boost functionality that Tado supports natively (i.e. you can tell it to run the water for a period of time directly through their API, after which time it will return to normal, automatic operation). Now I guess I could do it manually, but I’ve had issues with HassIO and long running tasks in the past (e.g. turn on a light for 15 minutes) where it doesn’t always turn the light back off at the end of the period, so it feels a much safer implementation to just tell tado directly to “boost the water for one hour” in a single API call and then not have to worry about something going wrong and leaving the water stuck on 24/7.

I would be interested to hear other people’s thoughts on this and how they might go about implementing this. FWIW, there’s no particular reason for me to get rid of the IFTTT webhook implementation (which has been very reliable), other than to tidy things up a bit.

1 Like

How did you get that entity? Which kind of Tado thermostat do you have?

I’ve fudged together a boost, it’s other peoples work that I’ve kind of shoe horned to do what I wanted.

Based on packages

climate:
  - platform: generic_thermostat
    name: Hot Water
    heater: water_heater.hot_water
    target_sensor: sensor.hotwater_temp_bottom
    min_temp: 35
    max_temp: 55 
    ac_mode: false
    hot_tolerance: 1
    cold_tolerance: 0.5
    min_cycle_duration:
      minutes: 5
    initial_hvac_mode: 'off'

sensor:
  - platform: time_date
    display_options:
      - 'time'
      
input_boolean:
  boost:
    name: Boost
    initial: off

timer:
  boost:
    name: Boost CountDown
   

input_number:
  heating_temperature:
    name: Set Max Temp
    min: 35
    max: 50
    step: 5
    unit_of_measurement: '°C'    
    icon: mdi:thermometer
    initial: 35
  heater_boost:
    name: Minutes
    initial: 45
    min: 15
    max: 120
    step: 15
    unit_of_measurement: 'min'
    icon: mdi:clock-start
  heater_time:
    name: Auto Off After
    initial: 2
    min: 2
    max: 5
    step: 1
    unit_of_measurement: 'hours'

script:
  hot_water_off:
    alias: Turn Off Hot Water
    sequence:
    - data:
        operation_mode: auto
      entity_id: water_heater.hot_water
      service: water_heater.set_operation_mode

  hot_water_on:
    alias: Turn On Hot Water
    sequence:
    - data:
        operation_mode: heat
      entity_id: water_heater.hot_water
      service: water_heater.set_operation_mode

  hot_water_auto:
    alias: Auto Hot Water
    sequence:
    - data:
        operation_mode: auto
      entity_id: water_heater.hot_water
      service: water_heater.set_operation_mode


then automations

- id: '1572900431040'
  alias: Boost Start
  description: ''
  trigger:
  - entity_id: input_boolean.boost
    from: 'off'
    platform: state
    to: 'on'
  condition: []
  action:
  - service: timer.start
    data_template:
      entity_id: timer.boost
      duration: 00:{{ states.input_number.heater_boost.state | int }}
  - service: script.turn_on
    entity_id: script.hot_water_on

- id: '1572901200125'
  alias: Boost Cancel
  description: ''
  trigger:
  - entity_id: input_boolean.boost
    from: 'on'
    platform: state
    to: 'off'
  condition: []
  action:
  - service: timer.cancel
    data:
      entity_id: timer.boost
  - service: script.turn_on
    entity_id: script.hot_water_auto
  - service: input_boolean.turn_off
    entity_id: input_boolean.boost

- id: '1572935060390'
  alias: Boost End
  description: ''
  trigger:
  - event_data:
      entity_id: timer.boost
    event_type: timer.finished
    platform: event
  condition: []
  action:
#  - service: notify.home_assistant
#    data:
#      message: Your Hot Water is ready! The current hot water temp is {{states('sensor.hotwater_temp_bottom')
#        | float}} °C
  - service: input_boolean.turn_off
    entity_id: input_boolean.boost
  - service: script.turn_on
    entity_id: script.hot_water_auto


- id: '1572939461079'
  alias: Max hot water Set
  description: ''
  trigger:
  - platform: template
    value_template: "{{ states('sensor.hotwater_temp_bottom') | float >states('input_number.heating_temperature') | float}}"
  condition: []
  action:
  -  service: script.turn_on
     entity_id: script.hot_water_auto
#  -  service: notify.home_assistant
#     data:
#       message: Hot water temp reached  Max Temp set! The current hot water temp is
#         {{states('sensor.hotwater_temp_bottom') | float}} °C. Turned
#         to auto...



- id: '1572939091079'
  alias: Min hot water Set
  description: ''
  trigger:
  - platform: template
    value_template: "{{ states('sensor.hotwater_temp_bottom') | float <states('input_number.heating_temperature') | float}}"
  condition: []
  action:
  - service: script.turn_on
    entity_id: script.hot_water_on
#  - service: notify.home_assistant
#    data:
#      message: Hot water temp below Max Temp set! The current hot water temp is
#        {{states('sensor.hotwater_temp_bottom') | float}} °C. Turned
#        to on...

and the code for lovelace

      - entities:
          - entity: sensor.hotwater_temp_top
          - entity: sensor.hotwater_temp_bottom
          - entity: input_boolean.boost
          - entity: timer.boost
          - entity: input_number.heater_boost
          - entity: input_number.heating_temperature
          - entity: water_heater.hot_water
        title: Hotwater Boost
        type: entities

Don’t know if that helps someone… it could do with some refining.

I use a si7021 temp sensor pushed inside a spare thermostat tube on the hotwater tank for the bottom temp and another one on the water output at the top of the tank for top temperature.

These are both connected to a tasmota sonoff.

My irritation with this system is that all the commands go via the web, I’ve not been able to get direct control of the equipment.

1 Like

Hi all,

Thanks for the nudge on this topic, which I’d completely forgotten about!

I had been running the IFTTT interface until earlier this month when IFTTT effectively removed the free tier, which finally gave me the impetus I needed to sort this properly. I used the included tado integration (managed through the UI), which exposes the following devices:

  • Heating
  • Home
  • Hot Water

I then created the following scripts, to manage my four use cases:

heating_water_away:
  sequence:
    - service: climate.set_preset_mode
      data:
        entity_id: climate.heating
        preset_mode: away

heating_water_home:
  sequence:
    - service: climate.set_preset_mode
      data:
        entity_id: climate.heating
        preset_mode: home

boost_heating:
  sequence:
    - service: tado.set_climate_timer
      data:
        entity_id: climate.heating
        time_period: "01:30:00"
        temperature: 19

boost_water:
  sequence:
    - service: tado.set_water_heater_timer
      data:
        entity_id: water_heater.hot_water
        time_period: "01:00:00"

These allow for native management of the Tado cloud API from HA. So, my workflow in automation looks a bit like this:

Turn off heating and hot water if away from home for more than 30 mins. This actually switches Tado into away mode, which effectively disables all water and heating schedules:

- id: heating_off_away_from_home
  alias: Turn heating off if noone home for 30 minutes
  trigger:
  - platform: state
    entity_id: binary_sensor.someone_near_home
    from: 'on'
    to: 'off'
    for: 00:30:00
  action:
  - service: script.heating_water_away

Turn on water (i.e. reenable schedules), and boost water and heating when returning home:

- id: heating_on_near_home
  alias: Turn heating back to automatic if near home
  trigger:
  - platform: state
    entity_id: binary_sensor.someone_near_home
    from: 'off'
    to: 'on'
  action:
  - service: script.heating_water_home
  - service: script.boost_heating
  - service: script.boost_water

Boost hot water if the tank gets below a certain temperature, and there are people in the house, and it’s not night time:

- id: boost_hot_water
  alias: Boost hot water if it gets too cold when people are in
  trigger:
  - platform: template
    value_template: "{{ is_state('binary_sensor.house_occupied_day', 'on') and\n \
      \  is_state('binary_sensor.house_occupied_night', 'off') and \n   is_state('sensor.hot_water_power',\
      \ 'OFF') and\n   states('sensor.heating_hot_water_temperature') != 'unknown'\
      \ and\n   states('sensor.heating_hot_water_temperature') | float < 45 }}\n"
  action:
  - service: script.boost_water

Obviously, the only bits you really need are the scripts and then you can call them from whatever workflow suits your needs, but I find that a bit of context really helps! For the purposes of my setup, someone_near_home doesn’t get set to false unless the whole family are a good 20 miles away from home. I’m not interested in messing with the heating if we just go out for lunch - this is about holidays and longer trips, hence the boost upon return, which works extremely well.

A note on the boost - this is done directly through the Tado API, so once issued you can check the Tado app and it will show “hot water on until xx:xx” - this is a good solution as it means that HA doesn’t need to remember to turn it off again later - the tado system is entirely autonomous in this regard.

Hope this helps! I’m very happy and it means I’ve been able to remove all of my tado integration from IFTTT.