Building a Tado replacement with HASS

Hi All,
Long term lurker, first time poster.

My subscription to Tado Auto-Assist is coming up for renewal and I’d like to replace it with some kind of custom set-up within Home Assistant.
I have a Tado v3 with the Apple HomeKit dongle, Thermostat and Wireless Extender, along with 6 Tado Smart Radiator Valves. I’m based in the UK. The system works fine and I have schedules set-up without issue in the Tado app. Overall, I’m happy with it.

It does however, have some shortcomings, such as:

  • Heating rooms, like my office, when I’m on annual leave: I may be in the house but I’m not using the room like I normally do so it doens’t need to be heated.
  • Weather detection: Tado says they do this already but I’ve never witnessed this working in reality. In the colder months, when it’s windy, all temperatures in the house need to be increased automatically by between 0.5ºC and 1ºC. When it’s sunny, temperatures need to be decreased by a similar amount.
  • Presence Detection: HASS already knows when I’m at home or away via my phone, I don’t need to pay Tado to detect the same thing in order to use their ‘Auto Assist’ feature.

Fixing these through HASS should be possible but I’m falling short on working out how to do some of it which I’m hoping you may be able to help with.

I’ve started by created a dashboard in HASS and adding a scheduler card which I’ve then populated with the schedules from Tado for each room. I’ve quickly realised I have to create two schedules - one for the week, and one for the weekend.
I can also set conditions, such as ensuring a schedule for a room only runs if I’m home, and not on annual leave (on or off state via a calendar integration).

However, I can’t seem to work out the following:

  1. How do I allow it to increase or decrease temperatures depending on weather conditions, such as increasing the temperature by 1ºC if it’s currently windy outside?
    Can I trick the current_temperature attribute of one of my Tado Smart Radiator Valves in HASS to be 1ºC too low so that it reaches the desired temperature? If so, how?
  2. How can I create something that guages the distance I am from my Home so that I can adjust temperatures accordingly. I.e. I want the heating to be on (it’s scheduled to be on) but I don’t want it to be 20ºC if I’m 10 miles away. Ideally, I’d like to replicate Tado’s behaviour by adjusting it on a sliding scale. E.g. If you’re 1-mile away, drop the temperature to 18ºC, if you’re 2-miles away, drop it to 16ºC and so on. And then to heat or not heat depending on if I’m getting closer or further away. Alternatively, don’t run the schedule and instead start the schedule only when I’m 2-miles away instead.

With these two things worked out, I should be able to make something where the heating schedule stays on all year around, but will switch off, vary in temperature, depending on outside temperature, season, location, etc. and should be more comfortable, and probably more effecient than what Tado currently offer.
I can then disable Tado’s connection to their services via Pihole, which I have running on my network, and cancel my subscription to their Auto-Assist service at a cost of £29.99 / year.

Is this possible? Does this sound like a good idea? Have I missed anything? Am I asking too much from HASS?

Hoping you all can help.

I’ve been able to find a solution for point number 2: The Proximity integration does exactly what I’m looking for, and the example used is for lowering and raising heating depending on distance from Home - perfect!
Details here: Proximity - Home Assistant

I haven’t found a solution for point number 1 yet but I’m hoping someone may know of a way to do this. If you do, please let me know.

I don’t have any experience with Tado as I use Hive, does Tado have a boost feature? I have decided to create automations using the boost feature rather than a defined schedule as it allows me to add multiple conditions.

To achieve the weather part, you can retrieve the forecast data from a weather integration (like this) and then you could use that to alter the boost temperature.

I’d split the actions into multiple choose with various conditions and then if it was windy you could set the desired temperature to be 1 degree less. I’d probably create a number helper to set my desired temp and then reference that.

There might be an easier way of doing it but that’s the way I’d attempt it!

action: tado.set_climate_temperature_offset
data:
  offset: "{{ states('input_number.my_temp_compensation') | float(0) }}"
target:
  entity_id: climate.thermostat_myroom

However, the Tado integration is cloud based, so you can’t use this without their servers.

What you can do is use the Homekit device integration to create a local connection to your Tado. But then you’ll get pretty basic thermostats, and not the service I named above.

Also, without a cloud link, you’ll lose the basic scheduling functionality. But that is something HA can easily replicate. But you’ll probably also lose some of the self learning capabilities of the thermostats to prevent overshoot.

Thanks @mp583 and @Edwin_D,
I’ve made a little more progress based on your recommendations.

Firstly, I removed my Tado integration in Home Assistant so I know I wasn’t seeing those ‘cloud-based’ devices and instead made sure I was only using the local versions of those devices that were exposed by the HomeKit Devices integration.

I then created a new Dropdown Helper to allow me to manually set a heating state, based on a proximity automation.

I then watched and set-up automations as per this excellent video on the Proximity integration: https://youtu.be/0ojMz1s3Y84?si=FRBVpDT8Lj1HwGWM
For each action (Home or Away), I chose the appropriate option from my helper.
This should, in theory, allow me to use that helper state as a condition in my scheduler card to see if it needs to be heating or not.

The ‘boost’ function is a great idea but sadly, whilst Tado has this functionality in their app, it doesn’t appear as an option for each Tado HomeKit device in Home Assistant.

I may create a new automation that checks against various weather conditions, and the state of my helper, to see if it needs to raise or lower the temperature, but I haven’t worked out how to override the reported temperature of a climate entity yet.

Once I’ve tested and know my proximity automation is working and the helper state is being set correctly, I’ll look into the rest.

Thanks for your help so far.

1 Like

Oh good, I’ll have a look at the proximity automation because I’d like to so something similiar!

I had a look at the Tado integration docs and there is a ‘tado.set_climate_timer’ action which is the same as the Hive boost function I was referring to (turn heating on at X °C for Y minutes/hours). Does the HomeKit integration allow you to access this or a similar action?

I think it makes a lot more sense to alter the target heating temperature dynamically rather than try to artificially change the reported current temperature of a room/device.

Here’s an example I’ve just made using my Hive integration, where I have Hive in the action section you could use the ‘tado.set_climate_timer’ action.

description: ""
mode: single
trigger:
  - platform: time
    at: "08:00:00"
    id: 8am
condition: []
action:
  - choose:
      - conditions:
          - condition: template
            value_template: >-
              {{ (state_attr('sensor.daily_weather','forecast')[0].wind_speed )
              < 20 }}
          - condition: trigger
            id:
              - 8am
        sequence:
          - action: hive.boost_heating_on
            data:
              entity_id: climate.thermostat
              time_period: "01:00:00"
              temperature: 20
      - conditions:
          - condition: template
            value_template: >-
              {{ (state_attr('sensor.daily_weather','forecast')[0].wind_speed )
              >= 20 }}
          - condition: trigger
            id:
              - 8am
        sequence:
          - action: hive.boost_heating_on
            data:
              entity_id: climate.thermostat
              time_period: "01:00:00"
              temperature: 21

You can configure this in the UI but I’ve shared the code for ease. You can have multiple triggers and then add various sections in the ‘then do’ part of the automation in order to create a sort of schedule.

For this to work, you need to have a weather integration and a forecast sensor defined as a template in your configuration.yaml or templates.yaml:

template:
  - trigger:
      - platform: time_pattern
        hours: /1
    action:
      - service: weather.get_forecasts
        target:
          entity_id: weather.home_2
        data:
          type: daily
        response_variable: daily
    sensor:
      - name: Daily Weather
        unique_id: weather_forecast_daily
        state: "{{ now().isoformat() }}"
        attributes:
          forecast: "{{ daily['weather.home_2'].forecast }}"

I’m using the accuweather integration here which provides wind_speed.

Thanks, that’s really helpful.
I’ve checked but nothing is exposed for tado.set_climate_timer in the HomeKit integration.
I did finish setting everything up, with the exception of weather detection, a few days ago and let it run. So far, everything seems to be working on the schedules set, to the temperatures set (albeit with a little overshoot, which I understand is common), and working with proximity detection. I’ll need to do some checks and tests with this to ensure I’m happy with it but it’s allowed me to cancel my yearly ‘Auto Assist’ subscription with Tado and block and DNS requests to *.tado.com in Pihole (running on my network) so I know it’s not communicating or controlling any of my devices.

1 Like

Glad you got most of it set up!

There will be some sort of action to turn the heating on to a certain temperature for a defined amount of time otherwise you wouldn’t be able to control the heating through home assistant at all. Try going to http://homeassistant.local:8123/developer-tools/action and searching through the available actions.

Ah, I understand. Yes, you’re right. I think the scheduler card uses climate.set_hvac_mode and then changes the temperature and duration depending on the time block it’s in.