TRVs horribly inaccurate - any suggestions?

I've just added my first Tado TRV to my system and have noticed that the TRV is reporting a far, far higher temperature than the room actually is. As of now, the TRV is reporting 24C but my (separate) room temperature monitor is reporting 19C (which is definitely about right, based on other temperatures in the house).

My assumption is that the TRV is picking up radiated heat from the adjacent radiator and, if so, I can't actually see this working very well for my needs. I've attached a photo of the stat in-situ:

Any suggestions?



  • andreig1978
    andreig1978 ✭✭✭
    edited December 2019
    Yes. Vote this:

    But, while you're waiting, you can either set a measurement offset (meaning you will have innacurate measurements when the radiator is cold) or install one more smart thermostat (or TRV) in each room and use that device as the measuring device (meaning you will have substantialy less money :p).

  • Thanks Andrei.

    Unfortunately, I don't think a measuring offset will not really help as the radiator will be constantly calling for demand when it doesn't need to.

    i.e. real temperature 19C, recorded temperature 24C, so apply a 5C offset. This means that the set point will need to be 24C (effective 19C), but when the radiator is off, the stat will believe it is seeing a temperature much lower than is really there and will attempt to warm the room up again, thus forcing the system into an inefficient "hunting" state.

    Will see what Tado say, but I suspect that the TRVs are about to be returned!

  • Just to show why an offset doesnt work:

    That graph shows two TRVs in the same room. The purple one on a radiator, the red one 1m away from it, on my desk (and used as trigger).

  • I have had good improvements by mounting the TRV horizontally; if you have some plumbing skills, you need to rotate (or change in your case) the Trv body
  • You wait till you fit one in your bedroom, I fitted my first last night, so loud, at 5 in the morning I was removing it and refitted standard TRV.
  • I agree with jacoscar, fitting the valves horizontally does make a huge difference, moves the head just that little bit further away from the radiator, also there is already temperature compensation built in the software to account for them being close to the radiator, if you have had the old style wax TRV’s in the past, these work in a similar way to account for them being close to an heat source.

    As for the system not heating the room fully to the set point, there are several things that can cause this too, not just tado.
    Is the whole heating system balanced properly so each radiator in the system gets the correct temperature of water (lots of videos on youtube explaining this), again this can make a huge difference to how well an heating system performs, are there any cold spots on the radiator indicating possible blockage or air locks, has the TRV valve pin stuck in one position, what temperature is the boiler set at for the heating?

    I’ve had tado for 2 years now and was a little disappointed at first, but after a little patience got it working really well across the whole house with comfortable even temperatures in each room.
    As for how loud they are, to be fair to tado they are no louder than other electronic TRV’s, (not smart) have had 3 different brands in the past and they all sounded the same, problem is the metal pipes and radiators amplify them.
  • At least the Tado vertical TRV has two temperature sensors (not sure about the horizontal model) which Tado claim help prevent the heat problems of being right next to the radiator. However posts in this and other threads suggest this is not adequate.

    If you have two (or more) radiators in a single room each with a Tado TRV then you are supposed to group them as a room and you can get Tado to nominate one of them as the 'master' for the room.

    Another suggestion is to have an additional Tado Smart Thermostat in the room and link the Tado TRVs to it so they use that Tado Smart Thermostat rather then their own internal sensors. This solution is exactly that proposed in the discussion linked to by @andreig1978 however a Tado Smart Thermostat costs a lot more than the proposed solution, partially due to having a display and touch controls.

  • I'm struggling with mine, fitted last week. Vertically mounted. Played with offsets but wasn't happy. Now have zero offset but have them set very high to account for the innacurate high temps due to their proximity of the radiator. Only current issue is in the living room where the max 25 degrees isn't really enough... As the actual is probably only 21degrees. Love the concept but a little frustrated.

  • Instead of a Tado wall thermostat to measure the temperature, you could sacrifice another radiator valve and put it somewhere else in the room
  • Thanks all, some good suggestions here. It does sound like a horizontally fitted install might work better, but none of my radiators are setup to work like this and I don't really want to change the pipework just at the moment. Being honest, an external temperature sensor would be the thing, so it could be installed a the other end of the room. I've already got one (self-built ESP8266 thing), but sadly no way to integrate this with the Tado, and I don't really see the need to purchase either an additional smart thermostat, or TRV to fix this.

    I'm still pondering how to move forward with this, but at the moment the TRV has been taken off.

  • I am thinking of using home assistant to constantly check the offset between the TRV and an external sensor, then using the Tado web app to dynamically update the the offset; this should work in theory but:
    1- you can only apply full degree offsets
    2- it’s not an instantaneous change

    However I’ve noticed that the history graph probably do some smoothing of the temperature trend so it might work in our favour and not upset the Tado algorithm too much

    But I don’t know how to make the http request or use the API to set the offset
    If anyone does, please get in contact and let me know
  • Jon_On_A_Bike
    edited December 2019

    I've successfully updated the offset via the API in Postman, not yet got as far as using it.

    (Used info on )

    First login...

    You need client secret, I believe this stays static, but is found at

    You also need to replace 'zzz' with your own email & password for tado


    Authentication - None


    Content-Type: application/x-www-form-urlencoded








    From the response retrieve the access_token with the test script...

    var data = pm.response.json();

    pm.environment.set("Ttoken", data.access_token);

    Assuming that you create an environment variable 'Ttoken' to hold the Tado token

    Then use GET your home ID...

    Authentication - Bearer Token

    Token {{Ttoken}}

    and then use that to GET your device serial{{homeID}}/zones

    And finally PUT the offset you want...{{device_id}}/temperatureOffset



          celsius: 2.0


    Note that you can use one decimal place

    If anyone successfully uses this in Home Assistant, please post here!

    ps I'm also going to attempt to do it directly with an ESP32, but not sure if it's possible to get the authentication to work properly. If I do I'll post it.


    ps be care with copy/paste of " , it seems to often use the wrong type and fail

  • Hi, I also successfully wrote a python script to update the offset based on an external sensor integrated in home assistant

    I noticed that I can write an offset with 2 decimal places and it looks like it is stored with 2 decimal places; however I’m still not sure if the corrected temperature accounts for the decimal places or just rounds it up to the nearest integer

    Anyway, this is what I obtain when calling for heat from 13 to 16 degrees on a valve that would normally pickup the heat from the radiator

    Not bad, right?
  • Great, any chance you can share the script?
  • Ok, so I've had a play, and written some code that directly sends information from an ESP8266 to Tado

    It's not great code, but it does work. It's probably a bad idea to use more than one.

    I intend to replace it with several feeding into Home Assistant, to reduce the number of API calls

    ps, I hesitated to publish this, if you don't understand it, it's probably not for you ;-)

  • Quick update - 1st version of code failed to incorporate any existing offset, so I've amended and re-posted to github.

    To re-create this, you need and ESP8266, a DHT22 and enough knowledge to flash firmware onto the ESP8266 using either Platformio or the Arduino IDE.

    If you use Arduino IDE you'll need to remove the #include <Arduino.h> at the beginning of the code, but other than that it should compile.

    You also need your home ID, and I've just found a way to get it without needing to code: -

    Login to Tado.

    Open More Tools.. 'Developer Tools' in Chrome (probably similar in other browsers)

    Goto 'Network' tab

    Hover over any of the 'state' entries, and see the url e.g.

    The '12345' will be your home ID

    I also now think you could use multiple devices without an issue, having seen how often Home Assistant calls the Tado API without issue!

    edited December 2019

    Great stuff, just need someone to start building and selling these on eBay 😉

  • Pretty sure that if you used a Wemos D1 it's just 3 wires to the DHT 22, with power via USB.

    Other than that it's a matter of setting up Platformio or Arduino IDE for esp8266, add the libraries, add your config to the code, compile and upload.
  • @Jon_On_A_Bike

    I keep getting Authorization: Bearer _client","error_description":"Bad client credentials"}

    u/n & p/w is correct, set home number and zone id.

    Changed password to something a little easier and same issue. Got any ideas? Using an 8266 & DHT22.

  • @Rossco from the serial output, is the bearer being shown properly?
  • Jacopo2
    Jacopo2 ✭✭✭
    Have you got any special character in your username or password? That was my problem when I got that message
  • @Jon_On_A_Bike Output from one loop below. Stared out anything personal.

    @Jacopo2 No special characters at all in either un, pw.

    18:17:52.559 -> Connecting........

    Connected to *******

    IP address: ********

    Temperature: 22.80°C

    actTemp: 22.40°C

    Using fingerprint 'A3 D1 64 E8 F4 FE 55 A9 05 32 D4 15 A3 15 32 22 3F 9A 8A 70'

    HTTPS ConnectingConnected to web

    requesting URL:

    HTTP request is: 

    POST /oauth/token HTTP/1.1


    Content-Type: application/x-www-form-urlencoded

    Accept: */*

    Cache-Control: no-cache


    Content-Length: 191

    Connection: keep-alive

    client_id=tado-web-app&grant_type=password&scope=home.user&username=****@**********&client_secret=wZaRN7rpjn3FoNyF5IFuxg9uMzYJcvOoQ8QWiIqS3hfk6gLhVlG57j5YNoZL2RtcConnection: close

    request sent

    headers received


    Using fingerprint 'E3 F4 F5 81 49 0A 2D 49 BD 2C EE F6 E9 CA 9C B3 CE DE 39 8D'

    HTTPS ConnectingConnected to web

    requesting URL:

    HTTP request is: 

    GET /api/v2/homes/*****/zones/2/state HTTP/1.1


    Authorization: Bearer _client","error_description":"Bad client credentials"}

    Accept: */*

    Cache-Control: no-cache


    Connection: close

    request sent

    headers received

    reply was:



    deserializeJson() failed: IncompleteInput

  • Jon_On_A_Bike
    edited January 2020


    Apologies, I appear to have a regression in my code

    The content-length field needs to be accurate, not fixed at 191, and is therefore dependent on the length of the password & username.

    To start with I hard-coded it, than later calculated it and added it in dynamically.

    Somehow the version on github doesn't do this...

    Doubt I'll get it done today, but at some point I'll amend. in the meantime the value to the length of the body manually should fix it

    This bit...


  • @Jon_On_A_Bike

    No apology required, I've set the content length to the string size and is now working.

  • Code on GitHub now updated - see line 162 onward for the change

  • Forked it and made a couple of changes.

  • As an aside I'm working on a version using the ESP32 based TTGO-Display, as I picked some up from Banggood for $6.

    I intend to do the automation via MQTT / Home Assistant, but as I've already ported the existing code I'll probably publish a stand alone version, too.

  • Working version for ESP32 TTGO-display now posted on github

    Displays room name, temperature, radiator temperature and offset on screen

  • Jacopo2
    Jacopo2 ✭✭✭
    edited January 2020

    hi, I haven't had a look at your work yet, but I have a couple of questions (since I'm using a python script to do the same thing):

    • I have noticed that when using the API I can apply offset with decimal places (unlike the Tado App), but I still haven't understood if the decimal places are ignored or actually used; do you have any idea?
    • how often do you update the offset? I've noticed that every time I send an update, the valve makes a noise (like it's closing and opening) and this could be an issue for battery life (and comfort); have you noticed this problem?