Home Automation: Reverse engineering a Worcester-Bosch DT10RF wireless thermostat.

Way back in 2007 I had a new boiler and central heating system installed. I chose the Worcester-Bosch Greenstar 30CDi combi-boiler as the heart of the system since the manufacturer has a very good reputation for reliability and efficiency.

Worcester-Bosch Greenstar 30CDi

This boiler has various control systems that can be used to operate the heating and direct hot water. I selected the DT10RF Optimising Digistat since, although it was quite expensive, it was the best Worcester-Bosch offer and promised further cost-savings through the use of its “optimising” feature.

Worcester-Bosch DT10RF Mk I

The DT10RF controls both the operation of the central heating, and also the timing of the hot-water pre-heat function which allows the boiler to deliver hot water more quickly. When running the heating, the optimiser function calculates the time the boiler needs to start in order to reach the correct temperature at the programmed times.

You can set up to four different time periods for each day of the week for heating. You can set the room temperature for each of these four periods. The timing for hot water can be different for each day of the week. The wall-mounted room thermostat is wireless and uses the standard 433MHz band. This controls the temperature for the heating, and the boiler mounted receiver controls the timings of the hot-water pre-heat.

Right from the beginning I’ve never been very satisfied with this control system. Firstly, the “optimising” feature only works to delay the on-time of the heating, and does nothing to optimise the time the heating turns off which it could do by learning the time it takes the house to cool down. Not only that, but it only optimises the first time-slot of the day so only the morning start-up is optimised. The time at which the temperature set-point changes from day-time to evening is not optimised. Also, the optimisation will only delay the heating coming on in the morning for up to one hour. Since it takes my heating at least one hour to warm the house up, the optimiser basically never did anything at all.

While it is true that you can set four different time periods each day for the heating, you can’t change the temperature set point. The set point for each of the four time slots is set once, and then applies every day. So you can’t have complete flexibility in how the heating is configured.

Even the wireless side of the thermostat has never been very reliable, with the signal constantly dropping out and requiring the transmitter to be temporarily moved closer to the boiler and the set point manually turned up and down to give the system a kick and get the communication going again. It’s certainly not fun waking up on a cold winter morning to find the heating hasn’t come on because, yet again, the wireless communication has failed over night. This is with a house of normal construction, and not a huge distance between the transmitter and receiver. I did have the control system replaced under warranty, but the new one was no better. There are lots of posts on the internet where people are experiencing the same problems with the DT10RF. Worcester-Bosch blame anything from too-thick walls to interference from WiFi access points. That is simply not acceptable, and the design of the wireless system is frankly not fit for purpose.

Since purchasing this thermostat Worcester-Bosch have released a new version, the DT10RF Digistat optimiser (MK II). From what I can tell, aside from having six time slots rather than four, it is simply a cosmetic change. I don’t expect this version to be any more reliable, and from forum posts it looks like the same problems still exist.

The last straw was when, during the previous winter, the thermostat simply refused to work when it was any further than about two metres away from the boiler. This was with a fresh set of batteries, and the whole thing reset and reprogrammed from scratch. Hardly any point in it even being wireless.

Time to start looking for a new heating control system.

Ideally I would like something that connects to my local network, either WiFi or Ethernet. This would make it easy to programme, and also remotely adjustable over the internet. This would mean that when I’m out somewhere and I’m going to be back home later than expected, I can easily change the timing of the heating so that it comes on later and does not burn gas unnecessarily.

I would also like something that is far more intelligent than the current heating control systems. I want it to learn how long it takes the house to warm up and cool down, and decide for itself when the heating needs to be on. Rather than saying “I want the set point to change from 12C to 20C at 4pm”, I want to be able to say “I want the house to be 20C at 5pm” and have the system work out itself when to fire the boiler, based on the outside temperature and its own knowledge of how quickly the house warms up. Likewise, I want to say “I’m happy for the temperature to have dropped to no less than 18C by 11pm” and have the system work out itself when it can stop heating, based on its knowledge of how quickly the house cools.

I want to have multiple temperature sensors around the house, to get an overall view of the system, rather than just the temperature state in one room. It could decide which sensor gets to control the heating based on the time of day. For example, in the mornings I only care about the temperature of the bedrooms. I’m not worried about the temperature of the downstairs open-plan area that typically takes a lot longer to warm up, since I’ll very shortly be leaving to go to work. So the master bedroom could control the system in the morning, while the lounge controls the system in the evening.

It could also do other nifty things, like if the current temperature is below the set point at 8am, but the local weather forecast pulled from the internet predicts that it is going to be a lovely day and warm up by 10am, then it could decide to not turn on the heating at all. I don’t want it to burn gas for two hours just because the morning is a little chilly, and then end up having to open a window once the sun comes out.

Looking around the central heating market, I see several manufactures are now producing WiFi enabled thermostats, such as the Heatmiser PRTHW-TS WiFi. However, not only are they very expensive and get some poor reviews, they also don’t appear to do what I want. They allow only programming over WiFi, they don’t do anything clever regarding heating control. If you’ve managed to find one that does – please do tell me about it in the comments section below!

I decided what I really want to be able to do is control the boiler from my PC. If I could send a command to turn the heating on or off, I could then write my own code to control it and have it do whatever I want.

I know that the DT10RF uses the 433MHz band to transmit the on/off signal. If only I could capture the signal it sends, I could then reproduce it and take control. I decided to purchase a 433MHz transmitter and receiver pair from eBay. At a price of just ยฃ2.80 it was worth a gamble as to whether I would be able to receive anything from the thermostat.

433MHz Wireless Receiver

One slightly annoying thing about these cheap 433MHz receivers is that when there is no signal present, their Automatic Gain Control circuit gets ramped up and all you get is receiver noise on the data pin. This makes it rather difficult to actually pick out any data from the noise. Luckily, you get about 100mS of “radio silence” after a signal has been received before the AGC winds back up again. So it is possible to look for this silence, and then look for the data immediately before it in order to “sniff” the signal.

I hooked up the data pin of the receiver to an oscilloscope, and sure enough when I turned the thermostat up I could see a signal go through. Likewise when I turned it back down, another signal was visible. It was impossible to capture the signal to analyse it since it was far too fast. Since I didn’t have access to a storage-oscilloscope, I decided to make use of a “soundcard logic analyser” that I had made previously.

Signal Capture

By feeding the signal from the receiver into the soundcard on my computer, I could capture the data continuously and then look at the signals at my leisure. I connected it all up, and turned up the thermostat until it started calling for heat. It visibly sent an “on” signal three times. I then turned it back down again, and it sent an “off” signal three times. You can see the data in the screenshot below. The 100mS periods of “radio silence” make the data stand out easily from the receiver noise. In the data below there are three on-pulses separated by approximately 1.9 seconds, followed by three off-pulses separated by 1.9 seconds.

DT10RF Transmission

Zooming in on one of the “on” transmissions we can see the following pulse train.

DT10RF Boiler ON

Zooming in on one of the “off” transmissions we can see the following pulse train.

DT10RF Boiler OFF

As you might expect, the signals are nearly identical except for the last few pulses. I haven’t made any attempt to work out what it is actually sending, except to recognise that there appears to be a “preamble” that is used to give the receiver time to adjust its AGC, followed by a series of pulses that represent the boiler/thermostat ID, followed by either the “on” or “off” message.

By simply writing down the lengths of the high and low pulses it is possible to reproduce them using a microcontroller and 433MHz transmitter. I’ve been using Atmel AVR ATMega328P microcontrollers in a lot of projects lately, so I decided to use one here as well. This one is mounted on an Arduino Uno board. It’s simple to connect up the transmitter, just power and ground, and the data pin connected to pin 2 of the Arduino (PORTD, PD2, pin 4 of the IC).

433MHz Wireless Transmitter

It works! I can turn the central heating on and off again using my PC. Now that I have full control of the system I can work on writing some algorithms that optimise comfort and, most importantly, minimise gas usage. Helpfully it also seems to have much better range than the transmitter in the commercial thermostat – I can easily activate the heating using my laptop over on the other side of the house from the boiler. If I find that I need even more range, the transmitter can be operated from up to 12V with increased transmission power. At the moment I am powering it with the normal 5V logic supply to the microcontroller.

The following code-snippet shows how I control the 433MHz transmitter. It’s only intended to be an example, you probably wont be able to just cut and paste it into your own Arduino sketch since I don’t use the Arduino framework. But it is simple enough to follow and can easily be made to work in your own application.

  rf.cpp (3.2 KiB, 3,696 hits)

If you want to try to control your own Worcester-Bosch boiler and have a DT10RF thermostat, you should be able to use the same RF messages as me provided you put your boiler into “learn” mode and then transmit the “on” signal so that the boiler knows what messages to expect. If, like me, you want to be able to switch seamlessly between computer control and the thermostat whilst you develop your heating control application then you’ll need to follow the procedure I have detailed and capture the code your own thermostat is sending.

In the next tutorial, I’ll detail how to build your own inexpensive wireless temperature sensors for distributing all over your house. After all, what use is having control of the heating system if we don’t know what the temperature is?

Posted in Geekorama.

Steven Hale leads the operation and development of the international Birmingham Solar Oscillations Network (BiSON), a global network of automated robotic solar telescope run by the University of Birmingham in the UK. His research interests are instrumentation and electronics, and high-resolution optical spectroscopy techniques. In his spare time he has many interests including photography and aviation, and has a private helicopter license rated on the Robinson R22 and R44 aircraft.

This is a private blog and in no way represents opinions or endorsements from the University of Birmingham.


  1. Great write up, thank you! I have been meaning to do something similar for ages, but have never got around to it. The other thing I fany doing is controlling individual radiators, but that needs some actuated valves, so it gets even more complicated.๏ปฟ

  2. Thanks ๐Ÿ™‚ Yes, controlling individual radiators using motorised values would be good. I’m not sure how much use it would be in my system since the house is mostly open plan. I do have TRVs of course, and I’m not convinced of the benefit of those either.

    What I would really like to do is take control of the flow temperature in order to directly control the temperature of the radiators. Then, rather than simply turning the system off when it gets up to temperature, it would be possible to start backing down the radiator temperature and hopefully reach a steady-state for the boiler to run continuously – the thermal input balanced against the losses from the house. I’ve sure that’s got to be more efficient than constantly turning it on/off and getting large fluctuations in temperature around the set point.

    This would probably be quite easily done – there is a temperature control on the front of the boiler. Worst case I could stick a servo on the potentiometer! Or better still, disconnect the pot and use a DAC to control the voltage that the pot would have been applying.

    But all of these require physical modifications to the system. If it were just me in the house I’d most likely go for it, but if I break something and the missus ends up cold I’ll never hear the end of it! :)๏ปฟ

  3. That is an impressive grep of the pulses there with the sound card.

    You may have been able to fix all your problems by adding a better antenna to the receiver downstairs.

    The boiler is an on/off device and not really suited to control the temp of the water except by that means. Having lots of short ON durations is going to stress it over the long haul. You’re not modulating the flame. (even an electric boiler) Is it a zoned system? How many temperature sensors are you going to deploy? Powerline comms like X-10 might be easiest and reliable.

    good read!๏ปฟ

  4. Thanks for your comments.

    A better antenna might have worked, yes. But I didn’t want to mess about inside the boiler. I did take the thermostat apart, and there wasn’t any easy way of improving the transmitting antenna.

    This is a modulating boiler. It does modulate the flame. It varies the burn intensity depending on the temperature of the return water so that it can maintain the flow temperature without having to cycle. The dial on the front allows you to set the flow temperature. However, you are correct that the thermostat only has on/off control. As I said in the post above, at some point I would like to automate control of the flow temperature, which could be done using the dial on the front of the boiler.

    There are some thermostats that are so-called “weather compensating” where the flow temperature is set based on the current external temperature. If it’s cold outside, the radiators are run hotter, if it is mild, the run cooler. But that still doesn’t reduce the radiator temperature as the house approaches the set point, which it what I would like to do.

    No, the system is no zoned. Aside from the TRV on each radiator.

    I’m going to deploy two temperature sensors at first, one on the lounge and another in the master bedroom. Then potentially add more later. I am planning on handling the sensor communication using these,


    given they cost practically nothing and have more than enough range.๏ปฟ

  5. Pingback: Reverse engineering a wireless thermostat - Hackalizer

  6. This is very interesting. I have just got one of these systems (with DT10RF mk II) and the temperature sensor on it responds to ambient temperature changes far far too slowly to be useful. It took two hours in a fridge at 5C to get the reading from 23C down to 13C. Have you noticed this behaviour on your unit? Haven’t had any issues with the wireless connectivity yet but then it’s not been put to much use yet.

  7. Yes, I noticed that behaviour when I was testing. I wanted to find out if the message the thermostat sent varied depending on the temperature – it could be telling the boiler not only to switch on but how hard to burn depending on how far away the room is from the set point (I was being optimistic – I didn’t really think it would be that clever).

    Like you, I put it in the fridge for a while to change the temperature. After half an hour in the fridge, it had gone down from 26C to 24C.

    I think in general it is a good idea to strongly filter the temperature – you don’t want the boiler coming on every time the temperature fluctuates for a couple of minutes just because someone has opened a door. Despite having numerous problems with this thermostat, I’ve never had one related to the rate of change of the measurement. It seems slow, realistic, changes are detected and accepted, but large fluctuations are filtered out.

    In real life usage it’s not going to have to detect a rapid change from 23C to 5C and have to update quickly. So, in this instance, I think the thermostat is doing the right thing. On the other hand, two hours in the fridge is a long time for it to still not have have got down to the correct temperature. I guess there is some strong averaging going on.

    My own temperature sensors are going to just report the current temperature, rapid fluctuations and all. The computer can decide how to average the readings and what decisions to take.

    Thanks for visiting my little blog ๐Ÿ™‚

  8. What a star, this is exactly what I’m looking for to connect to my Homeseer setup. Any chance you could expand on the Arduino sketch – I’m having a little difficulty following it in order to create one for my setup?

    Would appreciate it


  9. Hi Scott,

    It’s simple really, all you need to do is make the data pin go up and down on the 433MHz transmitter module, using the appropriate delays to set the on and off pulses.

    You can just use a for loop over however many pulses you need, and inside the loop toggle the data pin and then use delayMicroseconds() to wait for the appropriate amount of time.

    The hardest part is capturing the code from the thermostat so that you know what pulses to send. If you’ve already done that, you’re 90% of the way there.


  10. Cheers Steve. I give it a go and see how I get on. Maybe need to give you a shout if I have a problem if that’s OK?


  11. Sure Scott, no problem. Just drop me an email, address on the contact page at the top. It would be good to get two of these working ๐Ÿ™‚

    I’ve just finished building my 433MHz boiler controller, and the first 2.4GHz wireless temperature sensor that will go in my living room. I’ll post up some photos and details soon.


  12. Hi Steve
    I Managed to get it working but…. not reverse engineering the RF but ‘replaying’ it. I record the ON and OFF transmissions, save them as snippets then play them back through the sound card to the RF Tx and it works! saves me trying to decode the RF!


  13. Thanks for the write-up. I’ve just got a similar boiler and wireless unit. I was hoping to implement a similar system to what you have described.

    I particularly like your idea of using weather forcasting to judge the heating requirements, very efficient.

    Please keep us updated about your progress and improvements.

  14. Hi Ciarรกn,

    Thanks for your comments. I’m just starting to test out my custom heating controller at the moment. It’s taken a little longer than expected, what with various life and work things getting in the way! Hopefully in the next week or two I should be able to post up a progress report. I’m pleased to say initial testing is looking good!


  15. Thanks for taking the time to share this Steve this is exactly what I was looking for. I’m using a Vokera boiler and danfoss thermostat, I may have a go at this myself.

  16. Hi Steve,
    Have you made any progress with the rest?
    I wondered if you had any ideas on sound analysis on windows etc.
    I don’t wish to control my system wirelessly from my pc but really know how often the boiler is heating when it the system is on.
    I guess I’d have to collate data, and analyse it myself from the figures.

    Thanks for the brilliant piece anyway. It’s excellent.

  17. Hi James,

    Yes, I’ve got a control system running quite well that is doing all the fancy heating and cooling calibration stuff. I just haven’t got around to writing anything up yet. Maybe I will get chance over the holiday.

    On Windows I’m sure there are many different free audio editing tools you could use to capture the signal from your thermostat, in the same way I have done here. You would just need to be able to monitor the on/off signals and simply log the time each one is received. Shouldn’t be too difficult. Alternatively you might be able to hook up to a logic line inside the boiler that goes high/low when it is heating. Depends if you’re willing to take the cover off.

    Thanks for your comments!

  18. Thanks,
    Audacity might actually work. I’m only looking to energy monitor so to speak. So I might be able to manage with the information so far.

  19. I’m just thinking about the idea.
    What would be ideal would be to take temperature readings to cross match the actual gas usage. I don’t know if an arduino could come into play here.
    If an arduino could read the audio signal… Or you put a clock on both systems. Hmm.

  20. You can certainly get Audacity for Windows. But I doubt that is going to help you. I used Audacity to manually read off the pulse-train that the thermostat sent for “on” and “off”. I’m not that familiar with the program, but I very much doubt you would be able to automate it in any way to work out for itself whether it received an “on” or an “off” and do something about it. It’s simply not designed for that sort of task.

    You will still need something like an Arduino to receive the signal, work out what is was, and log it either to an SD card or by sending a message over RS232 to a connected computer. You could certainly also log temperatures using the same micro-controller.

    I think you are making this way too complicated, not to mention that your considered method will be unlikely to tell you anything useful. You would be logging when the thermostat was calling for heat. But the boiler will not necessarily be burning for the whole time the call for heat signal is present – a modern boiler modulates the flame to control the flow temperature. So you wont know anything about how hard the boiler is burning or how much gas it is using.

    The only way to really know how much energy your boiler is using is to keep reading the meter at the same time each day/week/month.

  21. I have started a trying to the same but can’t get a link to my boiler ๐Ÿ™ I think (using a scanner on AM ) that my boiler isn’t quite at 433.92 any one else with a similar problem ?
    I would quite like to hook it up to the ninja block platform

  22. Hi David,

    On my 433MHz RX (and on all the ones I’ve seen) it has a little pot that I assume allows you to tune it somewhat. You could try adjusting that to see if it helps. Usually it has some sealant on there to “fix” it in place – you’ll have to break that to be able to adjust it.

    There is always a risk that you adjust it and then it doesn’t work at all ever again even with the TX it comes with. I suppose they are cheap enough for that not to matter too much – and if it means you get it to work with the boiler then it’s worth a try.


  23. Hi Steve, what arduino sketch code and library are you using to sniff the signal

  24. Hi Gareth,

    I’m not, I used a soundcard to capture the signal as detailed extensively in the article.



  25. Hi,

    I got very excited by this as my DT20RF is always dropping the connection. So I bought me an RX/TX transmitter and built the soundcard bits all as you describe one day over Christmas. I managed to get the pulse trains exactly as you have above (different points obviously), but no matter how hard I tried I couldn’t get the boiler to switch on or off (I’m using a Rpi for mine).

    I tried starting low, starting high, added millisecond delays, but I couldn’t get it to work.

    A couple of questions:

    Where in the pulse train did you start measuring from? I was trying to find a common start for all the ‘ons’ but couldn’t separate out the noise from the commands.

    Did you send each ‘on’ pulse three times? My on pulses all were slightly different, so not sure whether there is too much interference in the capture.

    Many Thanks


  26. Hi Dave,

    The three “on” or “off” messages that the thermostat sends should all be identical. The first thing I did was make sure I had received several messages that all looked exactly the same. If the ones you are receiving are all slightly different, then there’s something wrong and you need to figure that out first.

    I started measuring the pulses from the first full off/on/off pulse I could see. As you already know it’s tricky to find the exact start due to the noise while the receiver automatic gain control is still adjusting itself. However, luckily for us it shouldn’t matter too much since the first few pulses are generally a “preamble” specifically designed to get the TX and RX in sync and so it shouldn’t matter if you miss the first pulse or it’s not quite exact.

    I only have to send the “on” message once for the boiler to fire. And then once for the “off” message to turn it off again. There isn’t a requirement for the boiler to see three “on” messages before it fires. The thermostat just does that for reliability. In my more recent code I too have started sending the on and off messages three times with a slight delay in between, because it definitely does improve reliability. But if you are standing right next to the boiler with your transmitter, it shouldn’t be necessary when testing.

    The only other thing I would say is that I’m not confident a Raspberry Pi will be able to do this. The pulses are only microseconds in length. Since Linux is not a real-time operating system there’s no guarantee that your pulses will be the exact length you are coding them to be. If the pin changes are just a few microseconds too late then the message will end up scrambled.

    You could get around this by trying what Scott above did. He connected the TX to the soundcard output and “played” his recording into the transmitter. Apparently it worked! You could try doing that from the sound output of the Raspberry Pi. That would have the advantage of getting around any timing problems, and you wouldn’t even need to try to interpret the pulse-train.

    The voltage output from the soundcard is only 1-2V. Those 433MHz transmitters ideally need at least 5V, or anything up to 12V if you need increased range. If the soundcard output works but you have range issues, you could put a small transistor on the output and use it to switch a higher voltage to the TX. Worth a try!

    Good luck!


  27. Thanks for the great article, I found this while looking for a way to drive my Greenstar boiler from a Nest Thermostat. Currently I have it hardwired with a 24V transformer to power the Nest and a relay to control the boiler’s switched live. I was considering getting an MT10RF cheaply on ebay and dismantling the thermostat to hack it to send a signal when the Nest requests heat. Looking at your approach I don’t need to dismantle the thermostat and can remove all the fixed controls at the boiler with the neat boiler plug in unit that comes with the MT10RF. I can then position the Nest better in the house. This would have the advantage of being able to fall back to the manual thermostat should I have a problem or move house and want to take the expensive Nest with me.
    Going to attempt the soundcard option. Thanks again for the great write up.

  28. Pingback: Home Automation: An Intelligent Thermostat – Steve's Stuff

  29. Hi Steve,

    Was doing a search on worcester boiler and control and came across your site.

    Thought you might be interested in what i’ve done?

    http://bmslink.co.uk:8180 [guest:guest]

    I have a 3 way RF relay wired in parallel with the programmer inputs for DHW and CH (so it appears stock to the layman).

    My system uses RF sensors placed in each room to provide temperature feedback. Each room has a virtual thermostat (soon to have a physical one too) with dynamic setpoint (by time) with provision for contact sensor to inhibit that room.

    The upshot is, if any room calls for heat, i start the boiler… and i run the boiler on a duty cycle (typically 20 mins on/30 mins off). This saves a lot of energy and the heating often satisfies during the off cycle.

    I’m also using pegler i30 TRV which i can control by RF…so if a room is not calling, its effectively isolated from the system. Thus, only radiators needed are targetted, saving more energy.

    At the moment, i’m just using my system to schedule the hot water permission, but in the future, i’m looking to get the thermalstore tank temperature into my system and then i’ll decide when the tank is to be warmed ๐Ÿ™‚

    Please take a look. Would be grateful of your feedback, as a fellow automater ๐Ÿ™‚


  30. Hi Neil,

    That’s a pretty neat looking interface.

    I have yet to add any web-interface stuff to my system. It’s all running from command-line scripts while I set everything up and program the heating algorithms.

    > I have a 3 way RF relay wired in parallel with the
    > programmer inputs for DHW and CH (so it appears stock to
    > the layman).

    That’s a good way to do it. I didn’t want to mess about inside my boiler, and I always wanted to be able to switch seamlessly between the normal thermostat and my system whilst I was testing things. That’s why I went for the technique of “sniffing” the signals the thermostat sends to control the boiler.

    > My system uses RF sensors placed in each room to provide
    > temperature feedback. Each room has a virtual thermostat
    > (soon to have a physical one too) with dynamic setpoint
    > (by time) with provision for contact sensor to inhibit
    > that room.

    That’s how I intend to build up my system. So far I’ve only got temperature sensors in my “office” room where the control PC and RF “base” is located, and a sensor “node” in my living room. I intend to add “nodes” to every room so that the controller can see the temperature of the entire house.

    It’s great that you’ve got controllable TRV on your radiators too. As you say you can shut them all off and only heat the room that is calling-for-heat. I don’t intend to do that with my current system. But in the future when I move to a new, bigger, house I’ll definitely be adding something like that when uprating the heating systems.

    > The upshot is, if any room calls for heat, i start the
    > boiler… and i run the boiler on a duty cycle (typically
    > 20 mins on/30 mins off). This saves a lot of energy and
    > the heating often satisfies during the off cycle.

    Once the controlling “node” is up to temperature and the system is just maintaining the level, I’ve been using a combination of a fixed duty cycle and a temperature hysteresis.

    My current settings are that once the node drops to 0.25C below the set-point, it fires the system and runs for 15 minutes. As you say it then usually satisfies the set point a few minutes after it shuts off and without overshooting too much.

    When programming the system I found it quite tricky dealing with all the delays, but I think I’ve got it tuned pretty well now. If there isn’t too much human movement and doors opening/closing etc the system can hold a room temperate within +-0.25C which I think is pretty impressive.

    I’m pleased to see someone else is actually adding automation into their home automation system. I find so many people claiming to be “doing home automation” are actually just building systems that allow them to turn a light on and off from with a web interface or phone app. That’s not home automation. That’s just a different kind of manual light switch!

    The big thing for me in doing the heating system wasn’t just being able to programme the heating schedule from a phone app which it seems is all things like Hive can do. I wanted it to actually be more intelligent. The house modelling code that I’m using to estimate how quickly the house will heat or cool is working really well. I just set it to have the house up to temperature at say 6pm when I get in from work and it decides for itself when to fire the heating.

    Maybe when I’ve won the lottery I’ll be able to start a project suitable for Grand Designs ๐Ÿ™‚


  31. Hi Maciek,

    Sorry for the late reply, I didn’t notice the comment notification.

    Yes, that’s the same 433MHz pair that I bought, even from the same supplier. So yes, it should work fine. Of course, you’ll have to grab the message your own thermostat is transmitting. You could re-program your boiler to recognise the message my code sends, but then you wouldn’t be able to easily switch between your custom system and the original thermostat which is useful while you are debugging your custom system.


  32. Last Friday the plumbers left having installed my new Greenstar Heatslave II… complete with the DT10RF (the MkII newer one – your logic does indeed hold true for the newer model) on the wall. I then started to program the times in and found that its a 7 day programmer (no optimiser feature either)… so you can’t set different times for the weekend without adjusting it all the time!

    Googling to see what the ‘next model up’ was so I could get the plumbers to swap it for a more suitable controller I came across this page.

    You sir, deserve a medal. ๐Ÿ˜‰

    I’m a developer with an engineering background that once I’d read the mere title of this page made me instantly forget the notion of replacing the controller… instead I’ll build one using your write up. Far more fun…

    Ordered an arduino, transmitter/receiver pair online on the Sunday, logic analyser was built and preamble/boilerId/on/off signals ‘recorded’ on Monday, Arduino build and some tx/rx testing on the Tuesday and today, Wednesday, I’ve been turning the boiler on/off to my hearts content ๐Ÿ˜‰

    Still very much at the ‘sitting on a breadboard with me tapping a 1 or 0 into a serial console to turn the boiler on/off’ stage but I’ll have a temperature sensor and some rudimentary brains to control it added in no time ๐Ÿ˜‰

    Something this boiler does (and didn’t see it mentioned anywhere), is that it turns off after around 10 minutes of receiving the ‘on’ signal. The DT10RF is off and I’m not transmitting an off command, I have to repeat the ‘on’ signal in order to keep the boiler running. I’m assuming this is some sort of boiler failsafe in case the thermostat batteries run out (or unit fails etc) and the boiler keeps running and running because it never gets an off signal.

    Once I

  33. Hi Roger,

    Great to hear you’ve got it working!

    Yes, you’re right, the thermostat has to keep sending either an “on” or “off” signal otherwise the boiler panics and thinks that it’s lost contact with the thermostat.

    I haven’t tested how often the DT10RF sends anything, but on mine I have a background thread running to constantly send a signal once every minute, and all I do is change a flag to tell it whether it’s supposed to be sending “on” or “off”.

    Let me know how you get on with the rest of your project!


  34. Hi Steve,

    I hit send on the reply above a little too soon…

    ‘Once I’ … get around to it I’ll write it all up. Which I’ve since managed!

    At this stage all I’ve done is what you’ve described in this post so its really just my take on the same subject and doing the exact same thing. I’ll do more on its setup over the coming weeks as I get time. Intending on using a Pi for control, it can run a nice interface in a browser for any authenticated device to connect to for setup and signal the Arduino to make required transmissions.

    Rogers Home Automation Ramblings.

    As for the DT10RF transmission frequency, I’ve since realised the boiler side of the thermostat has an LED on it that flashes as it gets a signal from the thermostat. The manual states this will flash every 5 minutes to indicate the thermostat is working – I guess that’s actually the thermostat re-transmitting its required state.


  35. Hi Roger,

    Looking good! That’s a nice write up, and thanks for linking back to my article. I’ll look forward to seeing what you come up with for the control side of things. I’m just using some command-line Python scripts. I do intend to getting around to developing a nice web interface at some point, but you know how things go – once you have a project mostly working the draw of the next project becomes too great!

    I don’t think my boiler-receiver has an LED to indication reception. It just has a little antenna-symbol on the LCD that flashes eventually when it thinks it has lost contact. I haven’t bothered to time how long it take that to come on. But sending the on/off code once a minute seems to keep it happy.

    I was considering using a Pi for the controller, but I already have a home server PC running 24/7 for media streaming (to a Pi actually), and hosting my SVN repositories, so I just use that to run the boiler process. There doesn’t seem much benefit in setting up another Pi just to handle the boiler.


  36. Hello,

    I am planning on doing something similar to this. I’ll first start logging data from different places around the house and garage until I find a way of measuring outside temperature (finding a place to put the sensor is the problem so far) and then use the data to calculate how long it would take to heat up the house depending on the temperature outside.

    What I’d like to ask is if you tried the Virtual Wire library to pick up the signal from your thermostat. From what I read online about other boyler controls, it seems that this could easily work.


  37. Hi Carlo,

    No, I never tried the Virtual Wire library. I only ever manually captured and generated the signal from the thermostat.


  38. Just thought I’d say great read – though unfortunately I won’t be able to make use!

    About to move into a new house with a new boiler but unfortunately it doesn’t have an RF thermostat, just a manual/mechanical 7 day timer. Current idea is to put DS18B20 temperature sensors in the important rooms and replace the mechanical timer with a relay attached to a Raspberry Pi to control the on/off of the heating.

    I’ll be doing similar with the bedroom taking priority in the morning and living areas in the evening up until bedtime.

    Currently doing some 433 MHz controlling with LightwaveRF light switches. Maybe I’ll buy an RF timer to avoid breaking the boiler.

    Anyway, great read.

  39. Hi Anthony,

    Thanks for your comments. Yes, hooking up a relay to the boiler on/off circuit and controlling it with a Pi should be relatively simple and reliable. Good luck with your project!


  40. Hi, can I ask a really stupid question. I have the DT10RF Digistat, can someone tell me if I can turn my heating off completely from the programmer or do I need to turn my boiler off. I’ve been getting astronomical gas bills since I installed the Worcester boiler.

    Cheers very much. Any help would be great.

  41. Hi Caroline,

    To turn the heating “off” permanently, I used to manually change the thermostat to “night” mode (press select until the moon symbol is showing on both sides). The heating will only ever come on if the temperature falls below your “night” setting. If you have this low enough, say 5C, then the heating will never come on.

    You shouldn’t turn the boiler off completely, because it does various maintenance things during the day even if the heating is not used. For example, it will run the pump for a couple of minutes each day to ensure it doesn’t get stuck as they can do when not run for weeks or months over the summer.

    You should probably also check the “hot water pre-heat” setting to ensure it isn’t set to keep the boiler hot all the time. That could be wasting gas if you’re keeping the boiler hot all night, and all day when you’re at work, for example.


  42. Hi Steve

    Excellent, thanks very much. Will look at my instructions to set timer to off but just turned the Eco button off on boiler which has been on for 6years!!!!


  43. Hi Caroline,

    If you’ve turned the “eco” button “off” (as in the button is now no longer illuminated) then that means the boiler is NOT in “eco” mode.

    You want the “eco” button to be lit up to say the boiler is in “eco” mode, which it sounds like it has been.

    As far as I know, the only difference between “eco” and “non-eco” mode is whether the boiler pre-heat is active or not, which controls whether it keeps the heat-exchanger up to temperature all the while to enable it to supply hot water more quickly.


  44. Oh I thought the post read that I should have this turned off as it was using gas. I read that it was expensive, I’ll give it a try & see what happens. Can’t be any worse! Cheers

  45. I think I’m confusing you.

    The boiler has a function called hot-water pre-heat that, when enabled, keeps the boiler hot. This means that it can supply hot water more quickly since you don’t have to first wait for the boiler to heat up before the water starts running hot.

    This does use a small amount of gas. If you don’t want to “waste” this gas then you can turn the pre-heat off and put the boiler in “eco” mode. However, now when you open a hot tap it will take longer for the water to run hot. If you’re on a water meter then you might waste more money running off extra water than you would waste in the cost of gas keeping the boiler hot.

    When the boiler is in “eco” mode the “eco” light is ON. If you’re saying the eco button has been “on for the last six years” then you have already been running in eco mode.


  46. Ha! Ok, Steve, I’ve got it… Will turn the Eco button back on. Back to the drawing board why I have such large gas bills. Cheers for help.


  47. So now I’ve bookmarked your site and am following intently. Since Christmas I’ve got my Adruino up and running and switching my Worcester Bosch on and off.

    I was looking at a Nest controller (because they were doing a staff discount at work) but then I read your latest installment of an intelligent heating schedule… I’ve just been looking at writing my own version. I already have a Raspberry PI in every room collecting temperature, motion detection, light intensity etc, I just need to be able to collect that info into a central server which can use that to decide when the boiler should be switched on and off, so I’d be really interested in understanding how you wrote your logic and if there is anything you can share that could give me a head start especially around the pre-heating and cooling curves?

    My next step would be to get some electronic radiator valves in each room which could be turned on and off by the same central programme depending upon learned occupancy patterns, temperature and the outside temperature (which is what Nest can do).

  48. This is ingenious! I’ve been wanting to use multiple temperature sensors to control my heating for a while now, but the thought of having to get someone in to wire up a thermostat has put me off – I’d never thought of sniffing the output from my DT20, nor using my soundcard to read the signal.

    Long story short – thank you – signal sniffed, I decoded the output to 0’s and 1’s and then used the following code to send it using my Raspberry Pi – http://www.raspberrypi.org/forums/viewtopic.php?p=499538#p499538

    All I need to do now is start logging the temperature to a database and calculate the heating and cooling coefficients. I’m not quite as proficient with electronics so I’m looking at “slice of pi” and xrf thermistors in a few places.

  49. Hi Steve, great bit of work which worked first time for me (DT20 thermostat and Worcester boiler). I did however get caught by the need to constantly send the on / off signal. Having thought all was well, the boiler eventually went from Timer mode to Off and flashed a green led indicating it had lost contact. I tried your idea of repeating the signal every minute but it still seems to switch off. I’m encouraged that you got it working as I was about to see whether the DT20 sends a separate “hello” pulse rather than just repeating the on/off command (which is simpler), or whether the boiler sends an “are you there” pulse to the thermostat. Maybe I will check my code first! (Arduino driving the 433Mhz tx driven by Homeseer – incidentally great range with a 17.4cm aerial) I took the DT20 out of the way by putting it in the microwave while I was testing, which seemed to work as this would obviously be sending competing signals. Also anyone trying this with Homeseer should note that the PIR movement detectors use 433Mhz and can confuse the issue (although the signal shape is different from the DT20). I’m using Dallas 1 wire sensors and like you trying to put some sense in the control, and also to give me some sensible management when we are away.

  50. Great blog Steve. I have the same problem where my new set-up isn’t as good as the old one apart from a more efficient boiler. I wondered if my experience of industrial process control would be useful in your design. I worked with analog/digital electronics since the sixties but since retirement and wife’s disability I don’t get the time to tinker especially during this cold weather when the although not perfect, it is working ( but only by siting the thermostat next to the boiler to ensure no cold mornings, relying on the TRV’s to avoid overheating).

    Something called 3-term control is used in industry and the 3 terms are proportional, derivative and integral.
    Proportional term is simply proportional to the difference between actual value and set-point like a radiator valve opening. Proportional on its own can result in overshoot where heat in the rads will dissipate after heating is stopped, so you subtract a value derived from the rate of change of temp giving an early reduction in heat to stop overshoot. Another problem with just proportional control is that when the set-point is reached there will be no call for heat so there will always be an error, just enough to produce some heat output. This is where the 3rd term, integral comes in. The error is integrated over time and added to the other 2 terms to produce a control which will demand exactly enough heat to equal the set point. This will result in the demand for heat staying on longer as the ratio between on and off is varied until the set-point is reached. My old wired room stat used to do this on my old boiler, ticking over with heat on for 5 mins every half hour or so when SP was reached. This on period was increased as necessary when more heat was required until it was running continuously. I await the summer for more developments.

  51. Hi Colin,

    Thanks for your comments. I am familiar with PID control, but I haven’t attempted to implement it on my boiler controller. I’m not sure it would work very well, due to the system response time being so slow and the poor control resolution.

    One thing I would very much like to change is the granulation of the control system. I only have the basic on/off “call for heat”. On the front panel of the boiler there is a control where you can set the radiator temperature. It would be much better if, instead of simply turning off the heat when the setpoint is reached, it started to turn down the radiator temperature. That way the system could be allowed to run continuously, and the radiator temperature handled through a full PID control loop.

    But there are other complications. A modern condensing boiler is designed to operate with a 20C differential between the flow and return temperatures. If the return temperature is too high (too close to the flow temperature) then the boiler can’t enter condensing mode and becomes much less efficient. The boiler is most efficient when it’s working hard.

    I suspect that turning down the radiator temperature in an attempt to balance the heat input with the heat loss, and so allow the system to run continuously, would likely result in flow- and return-temperatures that are very inefficient for the boiler.

    It’s practically impossible to test any of this on a home system. You need a test lab with external environmental controls in place. You would think that the boiler and control system manufacturers have already tested all this. But perhaps not. I haven’t looked to see if there are any papers published anywhere.


  52. Hi Steve,
    I’m getting more into the subject having done a bit of reading around. This site is useful for anyone else not familiar with the whys and wherefores of condensing boilers – http://www.condensingboiler.org.uk/

    One of the things I’ve read backs up my experience that an oversized radiator with a TRV reduces the return temp as it is throttled back and hence the condensing will operate well. The flow and return temps are easy to monitor at the bottom rear of the Worcester boiler, the pipes being one in from the end on each side.
    The thermostat I had on my old system was a Drayton which controlled the temp very well using PID varying the on/off ratio of the boiler/pump so I think that is the way to go but I only joined the discussion out of interest in getting the RF stat working reliably. I intend to try and hack the design sometime and possibly add a RF link to a programmable stat like I had before and possibly make a repeater to increase the range. I have a storage scope in the garage so I hope I can decode the protocol and build something. I’ll get back if I do. I suspect it would be illegal to do any mods to the boiler circuit board but a better thermostat will be OK. BTW you might find this site interesting if you don’t already know of it.
    Good luck,

  53. Hi Colin,

    I agree an oversised radiator with a slower pump speed is more efficient. The larger radiator allows a lower flow temperature to be used. The slower pump means the water is inside the radiator longer, which means it gives up more of its heat, and so the return temperature is also lower giving a better flow/return differential.

    However, in an existing system of course you can’t do anything about the size of the radiators, short of actually replacing them at cost. Even when specifying a new system, you’ve got to consider the higher cost of the larger radiators and compare that with the potential savings from efficiency.

    I think this is different from using a TRV to reduce the radiator temperature in an attempt to allow the system to run continuously and balanace the losses from the house. Once the room is at the setpoint, and the TRV has reduced the flow rate, and in doing so reduced the radiator temperature down to just “top up” the room, then very little heat will be leaving the radiator. This means the return temperature will be much higher. But the flow temperature from the boiler will still be the same. The flow/return differential will be lower, and thus less efficient. And all this is assuming that the boiler can modulate its power down low enough to topup the return water without having to cycle the burner. If it starts to cycle because the return flow is too hot then than will cause further inefficiencies. There’s a lot of different factors to consider. It’s tricky.

    I’m not sure why you think modifying the boiler electronics would be illegal. Possibly you’re suggesting a GasSafe registered person would need to do it? I don’t think that’s the case. Remember, you can install the whole system yourself – including the boiler, all the radiators, pipework, and connecting all the water pipes up to the boiler. You only need a GasSafe registered person to connect up the gas supply, or to do any work on the parts of the boiler that involve gas. Of course, installing this way could well affect what warranty is given by the manufacturer, but it’s certainly not illegal.

    I’m about to order a new DSO for work, so likewise I’ll also have an easier time decoding transmission protocols in future projects.



  54. Steve,

    Thanks for this. It’s really helped my understanding. You mentioned in one of your replies that the hardest part is finding the transmitter code. As long as I can get each high/low pulse duration correct it should work. Is the part that transmits the code a difficult signal to extract from the audio recording?

    Thanks, Andy.

  55. Hi Andy,

    I’m not sure I understand your question. So long as you can see the pulses in your audio recording, it’s just a matter of counting the number of samples in each on/off pulse and multiplying by the sampling rate to get the pulse length. Then you can just play those pulse durations back through the 433MHz transmitter, and it should work.


  56. DT10RF – since changing the batteries on the unit it is unusable and only shows the following: ‘E16’

    Can anyone advise?

  57. Hi Steven,
    Can I ask a very simple question about the DT10RF programmer please? I’ve just had a Worcester Greenstar boiler installed today and have been trying to set up the programmer. Should I be able to set up different temperature ‘events’ for individual days? I can’t seem to find this in the manual.
    Thank you in advance

  58. Andrew – No idea, sorry.

    Debbie – Yes, you should be able to set different configurations for each day of the week. You’re almost certainly got a newer version than mine, but if it works in a similar way then you’ll define four fixed temperature profiles, and then on each day of the week set the times at which each one of the four profiles should be active.

  59. Steve, just a quick thank-you for kicking all this off. As a complete newbie to Arduino and suchlike I’m following Roger Garner’s more detailed instructions, and have achieved simple wireless on-off control. I’m now looking forward to connecting it to the Internet. A million thanks to you for whole Audacity idea, which has worked like a charm for me.

  60. Thank you for that Steve. I must have the older digistat as I have been unable to set days of the week.

  61. Hi Steve,

    Great write up, I have been following it and I have sniffed the on and off signals but wondered how you identified which is the preamble, boiler id and the on/off part?



  62. Hi Darren,

    I just compared the two signals, looked at what was the same and what was different, and made an educated guess.

    If you compare them, there are three distinct sections. The beginning is just a series of equally timed high/low pulses. These don’t contain any information, and I call this the “preamble” because I think it’s just there to allow the receiver in the boiler to sort its gain out and get ready to receive something.

    Where the pulses start to change timing, that is where the information actually starts. The first part is the same between the on/off signals. This must be the boiler ID, the part that allows the boiler to know it’s receiving a signal from the correct thermostat. It’s the part that the boiler remembers when you put it in “learn” mode. I haven’t checked, but I assume this would be different between different thermostats.

    Finally, the last pulses at the end are the only part that changes between the messages, and so this must be the part that carries the on/off information.

    Hope that helps, and thanks for reading!


  63. Really appreciate this wonderful post that you have provided for us. Great site and a great topic as well i really get amazed to read this. Its really good.

  64. Great blog Steve.

    I’m just putting together my own version of this. I wanted to contribute my own experience of sniffing the original signal if I may. I do stuff with high altitude weather balloons so I had some radio reception gear lurking around. I use a digital TV USB dongle and SDR# to receive my 434MHz signal and decode it. This setup also worked for this project too. However, I did have some issues to begin with. The .wav file I created contained sinusoidal wave forms rather than nice square waves. After some experimenting I found I needed to tick the ‘raw output’ check box in the recording settings of SDR# and untick the ‘audio’ check box. The resulting wav files were much larger, but contained nice unfiltered data. This was done under Windows. I original tried all this in GQRX under Linux, but had the same sin wave problem and no option to set the output to raw data.



  65. Steve,

    What an interesting blog. I also have a bosch boiler and was thinking if one could calculate the cooling decay curve and determine the efficiency of a house. Along came your blog and I was extremely impressed what you have done. The build of your concept is beyond me, but really interesting.


  66. Pingback: Decoding a Siemens RCR10/433 Thermostat Signal to Control a Boiler from a Raspberry Pi | rossharper.net

  67. Pingback: Blogathon 01/16: Hot (and cold) under the collar – streams of unconsciousness

  68. Hello! Many thanks for this article! I am looking for new thermostat. And I am very greatful for you for this overview. I choose between this model and siemens, in my opinion they are the best 2 variants. But I still have some doubts about siemens. Have you ever used it or maybe heard any comments about it?

  69. Great trail of comments, Steve. I should have found this earlier as I would likely have followed the same approach to tap into the DT10RF communication.
    I managed to improve the range of my remote thermostat dramatically by extending the antenna of the receiver module.
    I have now built a thermostat that I can control from the internet. It uses a small relay inside the Worcester Bosch Greenstar Highflow 440 boiler to override the control signal from the remote control receiver module. The microcontroller is an Arduino Uno that connects to an internet shield. I only use the internet thermostat when we are away from home and I want to switch on the heating a couple of hours before returning home. I then switch the DT10RF to night mode when we are away.
    I am using an Arduino and 433MHz transmitter to control lamps around the house. I bought a set of Energenie remote control sockets. There is already an Arduino program to sniff out the codes when you push a button on the remote control of the set: https://github.com/sui77/rc-switch . That program may be suitable for wireless thermostats with some modifications?

  70. Hi Wim,

    Thanks for your comments!

    I did try out the RC-Switch library but it didn’t pick anything up from the thermostat. I don’t think it uses one of the standard remote control socket protocols. Maybe some other boiler manufacturers do use standard protocols. I’ve never managed to find any information on the actual Worcester-Bosch protocol … it’s just a case of copy and repeat! If it were possible to reverse engineer the protocol certainly it would be possible to contribute something to the RC-Switch library.

    Your system of using a micro-controller and relay directly inside the boiler is certainly the better solution. I’d most likely go down that path next time, now that I’m more experienced with boiler control.


  71. Steve – thanks so much for posting this. I’ve just got my own Worcester boiler radio control working by following your steps. I’m using a Raspberry Pi rather than an Arduino board but the principles are the same. I’ve also put a web front end on it so I can inspect and control the heating from my mobile phone when I’m out. Big smile!!

    What a fantastic piece of lateral thinking to use the soundcard as a makeshift logic analyser! I’ve discovered Audacity as a result – it’s a great piece of software; I’m surprised I’ve not found it before.

  72. Hi Paul,

    Great work! I’m actually running mine from a Raspberry Pi but the AVR is handling the 433MHz transmissions, and also the communication with a remote temperature sensor using the cheap Nordic nRF24L01+ modules.

    I wasn’t sure a non-realtime operating system would have the microsecond timing ability to get the pulse lengths right, so it’s good you’ve got it working and the Pi can do it! ๐Ÿ™‚

    I planned on adding a web interface for mine but I’ve never got around to it. I can still remotely SSH into the Pi and change my heating schedule but obviously it’s not quite as convenient as a web interface.


  73. Hi Steve,

    I used Gordon Henderson’s WiringPi library which, as well as the IO features, has some very useful utility functions for thread handling, process priority and microsecond delay timing. This piece of code works very reliably for wiggling the pulses to the boiler:

    //Data stream is sent 3 times for some reason with 1.5s between each transmission
    for (j=0; j<3; j++)
    //Elevate priority (WiringPi fn) to prevent being scheduled out & messing up timing
    digitalWrite(rftxPin, state);
    for (i=0; i<count; i++)
    //delayMicroseconds is WiringPi fn. It uses the system clock and a tight loop
    state = state ^ 1; //flip state
    digitalWrite(rftxPin, state);
    digitalWrite(rftxPin, 0);


    Very impressed with the Pi. Don't know why I resisted it so long…

  74. Hi Steve, A very interesting blog.
    One question I have which doesn’t seem to have been answered (I think) is why the DT10RF receiver fails to see the DT10RF transmitter but happily sees your own transmitter?
    If the temperature on the DT10RF is manually changed to force a re-transmit of either the ON or OFF commands connection can be restored so why if it is periodically transmitting these messages does it fail to maintain a connection?
    Does the receiver ever fail to receive your own solution’s transmissions?
    Is the DT10RF transmitter power too low?


  75. Hi Stewart,

    This is something I haven’t really looked at. The boiler requires to receive an ON or OFF message from the thermostat every few minutes in order to believe the thermostat is still there. If it stops receiving messages then eventually, after some period, it starts flashing the “connection lost” icon. This means that once it says connection lost it must have missed several messages, not just one bad lost message.

    Given, as you say, you can force a reconnection by changing the setpoint on the DT10RF until it changes ON/OFF state and so forcing it to send a message, that must mean that it has somehow previously got into a bad state where it has either stopped sending messages, or is sending bad messages. It can’t just be a problem with transmission power or antenna size.

    Having said that, “Wim” above says he managed to improve the range of his remote thermostat dramatically by extending the antenna of the receiver module, so who knows!

    When I first wrote the code, I sent the ON/OFF signal once per minute. The boiler did occasionally fail to receive the transmission. But one minute later it would send the command again, and work. So I think that is purely down to noisy signal. Now, I have it set up to send the ON/OFF code three times one second apart, repeated once per minute. This is similar to what the DT10RF does in sending the message three times but it uses some cadence longer than one minute – I haven’t measured it. I haven’t had any RF-related problems since.

    I haven’t worked on this project, or the code, for some time now. But it is still running my home heating! I’m quite pleased with the results of the heating and cooling time calibration stuff, it works well. I just wish I had the time to improve it further.


  76. It works!

    For the record, here are the pulses that I sniffed being transmitted from the newer Digistat MK2 thermostat that I’m now using to control my 30CDi boiler:

    const uint16_t preambleSection[] {400,460,505,495,505,485,505,465,505,485,505,475,1000,1000};

    const uint16_t boilerIdSection[] {490,495,505,495,505,485,505,1000,505,485,1000,475,505,950,1050,1000};

    const uint16_t onSignalSection[] {440,450,505,485,505,495,505,485,505,485,1000,970,505,485,505,495,505,485,505,485,1010,1060,950,485,505,980,1000,1};

    const uint16_t offSignalSection[] {450,450,505,485,505,475,505,485,505,485,505,485,505,485,505,495,505,470,505,485,1000,1000,505,500,980,485,505,1000,1000,1};

    Merry xmas, all the best

    181 181 181 1 214 82 82 210 86 82 210 86 59 59 57

  78. Hi Steve,

    I finally got around to building a complete working system after being inspired by your phenomenal work. My setup is based on an ESP8266 mcu running my own custom code that talks to a MQTT broker on the LAN. I’ve also got node-red running a couple of flows and this also talks to the MQTT broker and it controls switching my heating on/off based on a couple of daily schedules and also by monitoring ambient temperature. The final piece is a node-red-dashboard which provides a nice UI for monitoring how things are going and for controlling the heating on demand as required.

    This is all working quite well however there’s one thing which is nagging which you might be able to help with. I still have the digistat thermostat connected and configured working it’s own schedule and since it and my own widget I’ve built are effectively unaware that either exist, I expect they’re both just doing their own thing independently. I think this probably means the digistat can decide to switch the boiler on/off as it sees fit and so can my own widget setup. The thing I’d like to avoid is both of these systems conflicting / fighting for ‘supremacy’ – I’m even slightly worried that if I leave it as-is, there could be too much boiler switching occurring.

    Do you have any advice in this area? I’d be interested to hear what you eventually did with the digistat in your system.


  79. Hi Joe,

    I simply took the batteries out of the digistat ๐Ÿ™‚ You’re right that you wouldn’t want them both transmitting commands and trying to control the boiler. Even if you put the digistat on “night” mode with the temperature turned down low so that it never calls for heat, it’ll still be transmitting the “off” command every few minutes to maintain contact with the boiler.

    On the old square-style DT10RF as in my photo, there are two battery compartments. The left compartment powers the system logic, and the right compartment powers the radio. I don’t know if the new style one you have has the same arrangement. If it does, and you don’t want to lose your current settings, you can just take the batteries out of only the radio compartment to prevent it sending any commands. The manual says you’re not supposed to do this, you’re always supposed to close the right compartment (radio) first and then close the left compartment (system) afterwards, so I don’t know if it could cause any damage by leaving the radio unpowered. I don’t see why it would.


  80. Thanks Steve that confirms what I thought and since my last comment I’ve switched the DT10RF off. It seems the newer model makes this a little easier – to the right of the display there are up/down buttons and if you push these simultaneously for about 5 seconds the devices goes into off mode.

    I really appreciate your work. I’ve put a little ‘build in pictures’ type post up here for my hacked together system: https://jjssoftware.github.io/esp8266-mqtt-node-red-boiler-hack/

  81. Steve,

    Great solution and article. I’ve found exactly the same issues as you with the DT10RF. The problem with my house in the winter is its warm when the boiler is running but after it switches off the house feels cool rapidly (despite new windows/cavity wall insulation etc) even though the thermostat still reports it as at the demanded temperature. if think the main problem is the thermostat is in the central hall with little outside walls. I’d like to try this hack sometime for fun, but in the short term would like to find out how wim improved the receiver range to fix the reliability issues where the boiler looses comms with the thermostat and the demand is there but the boiler is off!

    Is there a follow up article on the clever controller side?

  82. Has anyone tried this with an dt20rf unit? I’ve been trying to get mine to work for ages, but had not success. I’ve verified that I’m transmitting the correct signal by eaves dropping on it as I did to get the original timings. The timings from my output are a little different (eg 515 vs 510) which I put down to processor signaling etc. I’ve used an oscilloscope to get the timings and I’ve even tried using a frequency agile transmitter (radiometrix MTX2) to get my signal as close to the original transmitter as possible, but no joy.

    Any advise or suggestions?

  83. @Ben (2017/02/05 at 15:08): I don’t have a DT20RF but it seems like it should work because it’s basically still just a 433MHz transmitter/receiver arrangement. With the DT10RF the ON/OFF signals sent are always identical – they never change over time so they’re easily replayed.

    For your problem the only things I can think of are:

    1) Has the RF protocol perhaps been changed in the DT20RF to include a rolling code or some other mechanism to prevent easy replay?
    2) Is your transmitter close enough to the DT20RF receiver?

    These are complete guesses I’m afraid.

  84. @Joe. Thanks for your reply. It is still a fixed protocol, there is no rolling pattern. I’ve connected numerous samples of the on an off commands so I’m confident on this. Regarding the frequency, I’ve tuned the MTX2 as close to the original Tx frequency as i can. I can only assume I’ve done something wrong. I’ll collect everything up and drop it on stack overflow tomorrow. I’ll post a link on here if that’s ok Steve. Grateful for any and all suggestions. Ben

  85. Tried this with a Comfort II RF, I’m getting constant square waves so wondering if the boiler is constantly sending data out. I get them even when I take batteries out of the unit.

  86. Hi Alex,

    Sounds like you’re just seeing noise and the receiver isn’t receiving anything. I haven’t been able to find out for sure, but it looks to me like the Comfort II RF isn’t a 433MHz device. Does it say on it anywhere what radio frequency it uses?


  87. Hi Steven,

    I have a DT10RF wireless thermostat, a few nodemcu’s I’ll go and buy a 433Mhz transmitter/receiver to get the control working – I have no doubt that this will work thanks to your excellent write up and comments.

    What did you use as you algorithm? is there some open source algorithm? some cloud control preferably using MQTT would be nice, although I’d prefer the intelligence to be in the home and not the cloud. Have you got experience of this side?

    Kind regards,


  88. Being able to inform the local algorithm that controls my boiler with the intelligence from IFTTT would be useful.

  89. Hi Ian,

    I wrote up some details on the algorithm in this post.

    It’s not hugely sophisticated. During the heating phase I just assume a linear increase (y = ax + c), which it pretty much is once the radiators are up to temperature. For the cooling phase I model it as an exponential decay (y = ax^(-b) + c) which I fit using scipy.optimize.curve_fit(), and that fits pretty well. I use those to calculate the required heating and cooling duration, and from there it’s just a matter of working out the time to change state based on the required set point.

    Hope that helps!


  90. Great article by the way Steven!

    Any chance that you could post your script on here or github or somewhere? I might as well use my time to improve things, like use IFTTT, have learning etc…



  91. I want to integrate with IFTTT specifically to use its geofencing…

  92. I’ll see what I can do. I haven’t really worked on this project since these posts in 2013/4. The code is terrible, and parts of it have been improved with reuse on other projects, so before sharing this anywhere I’d need to update it to be compatible with my later libraries. Don’t hold your breath …


  93. Hi, I’m a year 12 student doing a home automation project as part of my Design Technology AS-level (final board exams) project. I realise its been a about a year and a bit since the comments died out, but i have a comfort I RF thermostat and after a whole day of trying with 433Mhz and an arduino PC scope i simply can’t pick up any signal from the thermostat. All that i see is a some background noise.

    Nowhere in the documentation does it seem to say what frequency this thermostat uses. Has anyone had any luck with the comfort series of RF thermostats? or does anyone know of the frequency it uses? Any help would be greatly appreciated ๐Ÿ™‚

  94. Iโ€™ve had a quick look around, and as you say itโ€™s not obvious what frequency the Comfort I is using. Does it not say anything on the device itself? It ought to have some indication of the frequency band it is transmitting on.

    I think itโ€™s likely that this isnโ€™t a 433MHz device. Sorry.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.