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