Tado set offset using separate temperature sensor

Fair enough, different solutions for different use cases. I rarely (actually never) touch my physical thermostats. I also found the battery drain of this solution to not be a little, but quite significant. I also find the Tado app awful. I also find the noise of Tado annoying. I also prefer a simpler approach than tricking Tado using offsets. I also prefer to have my “brains” of a smart home in one place - so having HA being the scheduler and source of truth for thermostats is preferable for me.

Horses for courses :slight_smile:

1 Like

Thank you very much! I have a question: My log shows:

2022-09-19 21:08:09.532 INFO (MainThread) [blueprints.tado.offset] climate.wohnzimmer has temp difference of 2. Setting offset to 11

2022-09-19 21:08:09.537 DEBUG (MainThread) [blueprints.tado.offset] target: climate.wohnzimmer source: sensor.garten_temperatursensor_temperature temp difference: 2 actual_temp: 20.82 tado_temp: 19.1 current_offset: 9.0 calculated_offset: 11

However, when I open the Tado app, I don‘t see any change in the adjustment number for that room. Is the log indicating that it is working correctly?

Last year I used the offset method with my system. Yeah it’s can be a bit annoying with the noise.
But the app works just fine and the valves can be open just a bit or in half if needed. So it should be smoother with the heating.

But I will try your setup so thank you :slight_smile:
Any chance to add my ac for preheating?

Hello,

I have started setting up the automation to adjust the Tado TRVs temperature with the temperature of a Aqara Temperature Sensor. This is what my automation looks like:

alias: Tado Offset Adjust Wohnzimmer
trigger:
  - platform: state
    entity_id:
      - sensor.wohnzimmer_temperature
condition:
  - condition: template
    value_template: >-
      {% set tado_temp = states('sensor.wohnzimmer_temperature_tado')|float(20) %}
      {% set room_temp = states('sensor.wohnzimmer_temperature')|float(20) %}
      {{ (tado_temp - room_temp) | abs > 0.5 }}
    alias: Check if Tado temp is +0,5°C away from room sensor
  - condition: state
    entity_id: climate.thermostat_wohnzimmer_hk
    state: heat
action:
  - service: tado.set_climate_temperature_offset
    target:
      entity_id: climate.wohnzimmer
    data:
      offset: >-
        {% set tado_temp = states('sensor.wohnzimmer_temperature_tado')|float(20) %}  
        {% set room_temp = states('sensor.wohnzimmer_temperature')|float(20) %}  
        {% set current_offset = state_attr('climate.wohnzimmer', 'offset_celsius') %} 
        {{ (-(tado_temp - room_temp) + current_offset)|round(1) }}

Tado TRV Temp Sensor: sensor.wohnzimmer_temperature_tado
Tado TRV: climate.wohnzimmer
Aqara Temp Sensor: sensor.wohnzimmer_temperature

Sadly, the TRV’s temp sensor isn’t changing when I run it manually. Here the trace:

Executed: December 18, 2022 at 1:16:43 AM
Result:
params:
  domain: tado
  service: set_climate_temperature_offset
  service_data:
    offset: -10.2
    entity_id:
      - climate.wohnzimmer
  target:
    entity_id:
      - climate.wohnzimmer
running_script: false
limit: 10

Not sure what’s happening. Can anyone help?

Sounds like you should be ditching tado for something else as there is nothing you like about it. Your solution is pretty awful for anyone digital modulation on their boilers and tado is actually using the power levels. I’d rather replace a few batteries than spend more in gas than is needed. I get you want it all in one place but in my opinion what you are advocating here is making a smart heating system real dumb.

Your solution is pretty awful for anyone digital modulation on their boilers

This is a fair point, but I’ve refined my solution to take this into account:

platform: generic_thermostat
    name: Study Climate Tado Proxy
    unique_id: study_climate_tado_proxy
    heater: switch.study_heater_tado_proxy
    target_sensor: sensor.study_climate_sensor_temperature
    target_temp_step: 0.5
    keep_alive:
      seconds: 10

study_heater_tado_proxy:
        turn_on:
          service: tado.set_climate_timer
          target:
            entity_id: climate.study
          data:
            temperature: "{{ state_attr('climate.study_climate_tado_proxy', 'temperature') + (  state_attr('climate.study', 'current_temperature') - state_attr('sensor.study_climate_sensor_temperature', 'temperature')    ) | round(1) }}"
         turn_off:
           service: climate.turn_off
           target:
             entity_id: climate.study

This way Tado receives an actual temperature close to the required target temperature and thus uses boiler modulation (I can see it working in the Tado app).

You may not like my solution but in my opinion it’s far more elegant than the one proposed in this thread. Tado’s are NOISY AF when they readjust. And for what it’s worth, I found another person with a blog post that ended up approaching it in exactly the same way. Although my approach has better refinements such as the modulation.

I get you want it all in one place but in my opinion what you are advocating here is making a smart heating system real dumb

I don’t really see how it’s dumb? Tado itself is pretty dumb unless you pay for the extras. Now I’m in full control of everything in HA.

nothing you like about it.

The app is awful. I now have a much better version of it remade in HA:

See how I can quickly increase the temp or turn on the hot water, without having to open and flick around with stupid Tado UI switches that take 5 seconds to register?

In an ideal world the HA Core Tado component should accept external temp sensors as part of the climate control. This would avoid us even having this discussion and “hacks”. I actually looked at adding this into the core code, but the HA Tado python code doesn’t seem to follow HA standards (I can’t figure out how to make calls to external entities).

Yes, you are right that controlling the Tado valves using a plan drains the batteries a lot. What is the battery consumption using your solution?

Can I just use the homekit integration with climate.set_temperature with your solution?

I don’t really see how it’s dumb? Tado itself is pretty dumb unless you pay for the extras. Now I’m in full control of everything in HA.

And by the way… I love your approach. Tried it with setting the offset, that kept my valves open every 10 seconds and the result was constant overheated rooms. It doesn’t matter that the thermostat itself is not used correctly if it doesn’t even work correctly in the first place.

I have setup my schedule of heating partly in HA and Tado Cloud.

I was trying to move everything local by using the HomeKit integration.
But one important features is not available useing the HK integration. You cannot control the temperature offset.

Anyone has a solution for that?

The cloud entity

The local entity
tado local

Hi there,

I’m trying to get this offset blueprint to work but the automations never gets riggered. Looking at the logfiel I see the following line:

2023-01-17 08:43:18.154 ERROR (MainThread) [homeassistant.components.automation.offset_kitchen] Error rendering variables: TypeError: unsupported operand type(s) for +: 'float' and 'NoneType'

Any ideas what is wrong here?

I already found out that if the offset on my tado is 0, HA will get a value of ‘None’ in stead of ‘0’… Is there any way to covert None into 0 in the script?

And now I really found the issue. HA doesn`t see the offset setting for my Tado. The attributes are way different. I’ll first have to figure out how I get the offset attribute working in HA and then I can change the script with the new attribute names…

1 Like

Hello, is there anything more that I need to do to make this work? I am pretty sure I have got pretty much the same thing but my generic thermostat is stuck at ‘IDLE’…

Solution!
I have looked pretty long for a solution to fix the wrong Tado temperatures.
Finally I have come up with a solution!

The features:

  • Work around the inaccurate Tado temperatures
  • No shitty recalibration
  • Able to set the temperature to 30°C max and not 25°C (Theoretically even 35°C) (Could not work for everyone if the tado temp is way to high)
  • Custom presets in the climate entity
  • This works completely local with the HomeKit integration (I’m not using the cloud integration and have blocked internet access for the bridge - still works)

Drawbacks:

  • You will no longer be able to set the temperature directly on the thermostat by turning the knob. If you do, your room is most likely heating to much and the temperature will be overwritten shortly after.
  • Does not work with tado° schedules. However you can use the scheduler component to set up schedules directly in HA.
  • Does not work if your tado° temperature is inaccurate by more than 10°C. This really needs to be fixed by Tado themselves and can’t be done with this workaround (However it will still improve the heating experience then).

So how does it work?
Instead of changing the offset each time the Tado temperature is too inaccurate, we constantly automatically adjust the target temp. So far it hasn’t noticeable impacted the battery life (running for a few weeks).

Let’s start by preparing the thermostat. For this, we need to give the bridge internet access once during setup (if it doesn’t have already). But don’t worry. You only have to set the offset to at least -5°C once. You can also go with -10°C, but -5 works for me just fine. After that, you can cut the internet connection again.

The HA part:
First, you have to create a custom climate entity. You will no longer be using the “real” climate entity from the HomeKit integration.
Make sure to change it to your preferences:

climate:
    # Tado fix
  - platform: generic_thermostat
    name: MyRoom Fix
    unique_id: tado_myroom_fix
    # heater is not needed but required by the integration's setup. 
    # The entity don't has to exist to work, but it will throw a warning.
    # You can set up a helper switch here.
    heater: input_boolean.generic_thermostat_dummy 
    # The sensor with the actual temperature
    target_sensor: sensor.myroom_temperature
    min_temp: 15
    max_temp: 30
    # Configure your preset temperatures
    away_temp: 21
    comfort_temp: 24.5
    home_temp: 23.5
    sleep_temp: 22
    target_temp_step: 0.5

Now the second part - the automation.
Make sure to change all entities accordingly.
You have to change the 3 entities in the trigger at the top and the first 3 entities at the bottom in variables.

alias: Tado Climate Fix (MyRoom)
description: ""
trigger:
  - platform: state
    entity_id:
      - climate.tado_myroom # The real climate
    attribute: current_temperature
  - platform: state
    entity_id:
      - climate.myroom_fix # The custom fix climate
    attribute: temperature
  - platform: state
    entity_id:
      - climate.myroom_fix # The custom fix climate
    attribute: hvac_action
condition:
# You can put conditions here if you want (optional)
  - condition: state
    entity_id: input_boolean.heizung_sommerpause
    state: "off"
action:
  - if:
      - condition: template
        value_template: "{{ states(entity_proxy) == 'heat' }}"
    then:
      - if:
          - condition: template
            value_template: "{{ actual_temp + 0.1 < target_temp  }}"
        then:
          - service: climate.set_temperature
            data:
              hvac_mode: heat
            data_template:
              temperature: "{{ new_tado_target_temp }}"
            target:
              entity_id: "{{ entity_tado }}"
        else:
          - service: climate.set_hvac_mode
            data:
              hvac_mode: "off"
            target:
              entity_id: "{{ entity_tado }}"
    else:
      - service: climate.set_hvac_mode
        data:
          hvac_mode: "off"
        target:
          entity_id: "{{ entity_tado }}"
variables:
  entity_tado: climate.tado_myroom # Tado climate
  entity_proxy: climate.myroom_fix # Custom fix climate
  tado_temp_offset: -5 # The offset that you have set in the tado app
  # No more things to do
  tado_temp: "{{ state_attr(entity_tado, 'current_temperature') - tado_temp_offset }}"
  actual_temp: "{{ state_attr(entity_proxy, 'current_temperature') }}"
  target_temp: "{{ state_attr(entity_proxy, 'temperature') }}"
  new_tado_target_temp: |
    {% if is_number(actual_temp) %}
      {{ (target_temp|float(1) + tado_temp_offset|float(1)) + (tado_temp|float(1) - actual_temp|float(1)) }}
    {% else %}
      {{ (target_temp|float(1) + tado_temp_offset|float(1)) }}
    {% endif %}
mode: single

I haven’t created a blueprint yet and have not planned to do so for now because I currently don’t have time for it.
I hope that this helps others having the same problem! :slight_smile:
And hopefully this works the way I have posted it and I didn’t forget anything. If there are any problems with the custom climate or automation, please let me know. You can also let me know when everything has worked flawlessly :slight_smile:

Before:

After:

How Tado looks like:

Puhh, it took a whole hour to write this comment! I hope so much that this helps other people with their tado thermostat :smiley:

8 Likes

Sounds great! Thanks! A blueprint of that would be awesome!

Hey all,
I have a question. How does this work if you use TADO´s external room sensors ? They do the same but just in the tado app. They get exposed to HA without sensors. Does this mean that the tado valves do in this case already consider the external sensor and send these value to HA upfront ?
Thanks all !

I think you forgot one more adjustment in your automation. In the variables, actual_temp still contains a dedicated sensor. Shouldn’t that also be a state_attr with entity_proxy and 'current_temperature'?

If I use your adjustments, the schedules of tado° also no longer work. I have found the scheduler component in HACS.

Fixed.

I actually totally forgot about the schedules from tado because I’ve never used them. I’m controlling mine with the scheduler component from the beginning :laughing:

That is correct. You can define in the tado° app under Settings - Rooms & Devices for each room which device is the (temperature) measuring one. If you have external smart thermostats from tado°, you should also use them to measure the temperature instead of the smart radiator thermostats, as they are more accurate and can be placed freely in the room.

Thanks for the automation Xitee! Now that the heating season is coming I’m going to try it out and see how it goes.
One question, what is the purpose of adding the -5°C offset in Tado App? Can it be left at 0? Thank you

The purpose is to prevent heating problems and be able to set a higher target temperature. Tado’s limit is 25°C if I remember it correctly, which should be enough for most normal use cases. But the problem we are having is that Tado’s internal temp sensor shows (way) to high values. So if the temp is actually 21°C, Tado’s internal temp could show 25°C. Then we are no longer to heat because the max target temp that we can set is 25°C. With the offset, it would however think that it’s only 20°C and with a target temp of 25°C the thermostat will still heat.

So, you can leave it at 0, but you might experience heating issues if you set a high target temp (> ~24°C) and/or your tado temperature readings are way off.

1 Like

To prevent the thermostats to open and close the valve every few seconds/minutes, I want to set the offset for example every hour.
Is this possible with your blueprint?