This blueprint extends temperature offset calibration for a Tado climate entity by adding window-awareness to the logic.
It dynamically aligns the climate deviceās temperature offset with a reference Zigbee sensor, limits execution to defined working hours and heating states, and automatically disables heating when a window is left open.
The result is tighter temperature accuracy combined with basic energy-waste prevention.
Use Case:
You rely on an external Zigbee temperature sensor for better accuracy than the built-in thermostat reading, but you also want the system to behave intelligently when a window is opened.
This blueprint keeps the offset calibrated only when it makes sense, and cuts heating entirely if fresh air is coming in.
How It Works:
Temperature Calibration:
Periodically compares a Zigbee temperature sensor with the climate entityās current temperature and adjusts the offset when the difference exceeds a user-defined threshold.
Window Awareness:
If the window sensor stays open for at least 2 minutes, the climate entity is immediately set to HVAC OFF.
When the window closes, HVAC mode is restored to AUTO.
Time Window Control:
Calibration only runs between the configured start and end times.
Heating State Control:
Optionally restricts calibration to moments when the climate entity is actively heating.
User-Defined Interval:
Calibration runs at a fixed interval (e.g. every 15, 30, or 60 minutes), avoiding unnecessary updates.
Inputs:
Zigbee Sensor to Monitor:
The temperature sensor used as the reference.
Tado Entity to Update:
The climate entity whose temperature offset will be adjusted.
Window Sensor:
A binary sensor, switch, or input_boolean representing window open/closed state.
Threshold:
Minimum temperature difference required to trigger an offset update.
Start Time / End Time:
Time range during which calibration is allowed to run.
Time Interval (minutes):
Frequency at which the calibration logic is evaluated.
Enable Automation Only When Heating:
When enabled, calibration only runs if the climate entity is in HEAT action.
Example:
A Zigbee sensor in your living room reads 20.5 °C while your Tado thermostat reports 19.7 °C.
Every 15 minutes, between 06:00 and 22:00, the blueprint checks the difference and updates the offset accordingly ā but only if heating is active.
If a window is opened and left open for more than 2 minutes, the heating is shut off automatically.
Once the window is closed, the system returns to AUTO mode and normal operation resumes.
Trigger & Condition:
Time-based trigger (every minute, internally filtered by interval)
Window open (held for 2 minutes)
Window closed (immediate)
Calibration runs only when:
Current time is within the configured range
Interval condition is met
Heating condition is satisfied (if enabled)
Action:
Sets HVAC to OFF when a window remains open
Restores HVAC to AUTO when the window closes
Recalculates and updates the temperature offset when the threshold is exceeded
Changelog:
V1.0: Sep 30, 2024 - Uploaded initial blueprint.
V2.0: Oct 22, 2024 - Added condition and switch to let in run only when heating + added more traces.
V2.0.1: Nov 7, 2024 - Name changed V2.1: Nov 14, 2024 - Fixed the āonly when heatingā condition V3.0: Dec 6, 2024 - Added condition and switch to let it run based on userās preferred frequency V4.0: Feb 13, 2025 - Minimum calibration interval edited V5.0: Jan 31, 2026 - Door/Window opening aware enhancement
Hi DLLFPP, thanks for this blueprint. I will check it out. Did you just update this blueprint? Do you use this blueprint in combination with better thermostat or the advanced heating control blueprint?
Hi!
Iāve been using this blueprint since last cold season but only now I had the idea of sharing it because I thought it was worth it.
I personally use Tado app for scheduling so thatās why I needed an external offset.
Great blueprint. Saves me a lot of templating/testing.
But there is one remark I want to make. The switch was not working in my setup (Tado). After some investigation I found out that the blueprint is checking the state to be āheatā. But as I use the tado app to set up the time schedules, the state of my climate entity stays on āautoā. So the switch in the template does never get triggered.
Therefor I changed the blueprint to check the attribute āhvac_actionā to be āheatingā.
Thanks, awesome example of how the community helps and supports each other members.
Iāve updated my GitHub code (see details), you can just re-add the blueprint and overwrite it.
I suggest the same to all of those who downloaded the bp to proceed and update it again.
Thanks!
This automation blueprint is exactly what Iāve been looking for / trying to create. So thank you for sharing.
I do have an issue I canāt solve though, if anyone can help.
I have set the automation for my Tado system, when ever I run the trace, I get True/True and a offset figure⦠but then the offset of the tado never updates and the temps in the tado app donāt match my Zigbee 2ās
I being trying to solve this for a while now, but Iām not getting anywhere. Can anyone help me please.
Have you ever tried to run the offset update action manually with a static value, just to see if your Tado integration works correctly? Iām not having this issue honestly.
Iām running into the same problem as David.buck.
I tried the action in de developers tools as you suggested, that works fine. It looks like the BP doesnāt execute the set offset action somehow.
I copied the last part of your code on your Github en replaced it for the code in the BP I downloaded, now it is working as expected.
service: tado.set_climate_temperature_offset
data:
offset: ā{{( state_attr(entity_to_update, āoffset_celsiusā)|float if state_attr(entity_to_update, āoffset_celsiusā) is not none else 0 ) + ((states(sensor_to_monitor)|float - state_attr(entity_to_update, ācurrent_temperatureā)|float) if states(sensor_to_monitor) is not none and state_attr(entity_to_update, ācurrent_temperatureā) is not none else 0 ) | round(1)}}ā
target:
entity_id: !input entity_to_update
service: tado.set_climate_temperature_offset
data:
offset: ā{{( state_attr(entity_to_update, āoffset_celsiusā)|float if state_attr(entity_to_update, āoffset_celsiusā) is not none else 0 ) + ((states(sensor_to_monitor)|float - state_attr(entity_to_update, ācurrent_temperatureā)|float) if states(sensor_to_monitor) is not none and state_attr(entity_to_update, ācurrent_temperatureā) is not none else 0 ) | round(1)}}ā
target:
entity_id: !input entity_to_update
Iāve actually just got it to work, I had added the radiator thermostat entity to the automation, and after some trial and error in the Dev tool area, I found I needed to add the room climate entity. All
5 rooms now work perfectly and have updated offsets. First time theyāve ever read the right temp on the Tado app.
Thanks for the blueprint, thatās exactly what I was looking for to avoid using Better Thermostat.
Iāll see how well the blueprint works as it is, but for now Iāve converted it to customise it myself.
What would be desirable is to be able to customise the 15min trigger in the blueprint.
I myself want it to trigger every 60 minutes.
One question:
What are the checks enable_switch == false and enable_switch == true for?
The switch makes the automation run based on the condition:
attribute:hvac_action
state: heating
If turned on, the automation will run only when the heating is active (this to save unnecessary offset calibration when radiator is off). When off, automation will run even when hvac is on off/auto, always still within time ranges defined in the blueprint.
Fot what concerns timing, I tried to let users specify but couldnāt get through it. Since it was done a long time ago, Iāll have a look soon.
Bug fixes:
None
New features:
- Added the possibility to change the frequency of the offset to be calibrated for each automation (before 15 minutes was hardcoded).
My bad, I copied the same code twiceā¦
But anyway, I donāt know why my imported blueprint had a different code for action, but I doesnāt matter. I re-downloaded your newest version and it works perfect! Thanks so much!!
Thanks for the blueprint! Iām playing around with it now but canāt seem to get the offset to update (Presume I should be able to see the offset change within the tado app?)
Seems like everything is being fired so not sure where Iām gone wrong, any ideas?
P.s Iām on the new Tado X system.
if
Executed: 21 December 2024 at 15:26:20
Result:
result: true
if/condition/0
[If Outdoor temperature and Loft Smart Radiator Thermostat X are above 1]
Executed: 21 December 2024 at 15:26:20
Result:
result: true
if/condition/0/entity_id/0
[Unknown condition]
Executed: 21 December 2024 at 15:26:20
Result:
result: true
state: 4.210000000000001
if/condition/0/entity_id/1
[Unknown condition]
Executed: 21 December 2024 at 15:26:20
Result:
result: true
state: 4.210000000000001
Huhā¦I suppose thatās the problem here.
Most likely the system is speaking a different language than mine, but unfortunately I donāt have therefore I cannot test/fix anything on this, Iām sorryā¦