šŸ”„ šŸŒ”ļøTado Offset adjustment (Zigbee thermometers, Start/End times, Switch for only when HEAT, Open window aware)

Blueprint: Update Entity Offset with Switch Control

Tado/Zigbee/Working Hours/ON-OFF Switch

Open your Home Assistant instance and show the blueprint import dialog with a specific blueprint pre-filled.

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

:mag: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

2 Likes

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.

Thanks!
Got it to work!

1 Like

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’.

- condition: template
  value_template: '{{ enable_switch == false }}'
- condition: and
  conditions:
  - condition: template
    value_template: '{{ enable_switch == true }}'
  - condition: state
    entity_id: !input entity_to_update
    attribute: hvac_action
    state: heating
1 Like

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.

Thanks.

1 Like

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’ve recently updated the BP so, just in case, try and add it again so if you have an older version you get the latest code.
Let me know!

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.

Code Github:
action:

  • if:
    • condition: numeric_state
      entity_id:
      • !input sensor_to_monitor
      • !input entity_to_update
        value_template: ā€œ{{ (states(sensor_to_monitor)|float - state_attr(entity_to_update, ā€˜current_temperature’)|float)|abs }}ā€
        above: !input threshold
        then:
    • 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

trace:
stored_traces: 96

Code BP:
action:

  • if:
    • condition: numeric_state
      entity_id:
      • !input sensor_to_monitor
      • !input entity_to_update
        value_template: ā€œ{{ (states(sensor_to_monitor)|float - state_attr(entity_to_update, ā€˜current_temperature’)|float)|abs }}ā€
        above: !input threshold
        then:
    • 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

trace:
stored_traces: 96

That’s crazy because it’s the very same code…

Thanks both of you. I’m glad it’s not just me doing something wrong.

I would like to try this and copy the code as suggested. Where would I do this, I’m not a coder and do everything via the GUI.

Should I update the BP code or the automation code? Also would you mind telling me how.

Thanks again.

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. :wink:

Thanks for your help and a great Blueprint.

1 Like

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.

:rocket: UPDATE: 3.0

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).

Thanks @TDCroPower for the suggestion (here](šŸ”„ šŸŒ”ļøTado Offset adjustment (Zigbee thermometers, Start/End times, Switch for only when HEAT) - #13 by TDCroPower)):

Don’t forget to re-download this blueprint to update your local file!

1 Like

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

1 Like

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…

Take a look here Using tado° Smart Thermostat X through Matter - #122 by TDCroPower

It looks like this user has accomplished your need with this blueprint, on TadoX evironment.

it works with the tado X devices, but you should note that it takes some time until the value is actually set in the tado system.