Does your condensing gas boiler leave your home swinging between too hot and too cold? Do you see big plumes of steam from the flue even when only the heating is running? If so, your boiler may not be condensing properly — and that inefficiency costs money.
This project explains the fundamentals of condensing boilers and shows how to build a simple device that automatically adjusts your boiler’s flow temperature. The goal is to keep the boiler in condensing mode during central heating, but still raise the temperature when heating your hot water cylinder. In effect, this creates a pseudo priority domestic hot water (PDHW) system.
I’m not a heating engineer — everything here is based on my own research and measurements. I can’t advise on your specific system, but I hope this helps you understand how yours works. Any changes you make are at your own risk.
How a Condensing Boiler WorksA condensing boiler can reach efficiencies of up to 95% by extracting heat from exhaust gases using a secondary heat exchanger. For this to work, the return water temperature must be low enough — ideally 30–45°C, and condensing stops entirely above 55°C.
Most UK boilers were installed with flow temperatures of 70–80°C, which means the return temperature is far too high for condensing. In that state, efficiency can drop to ~70%, wasting around 25% of the gas you pay for.
If you have a combi boiler, you can usually turn down the central heating flow temperature directly. But for systems with a hot water cylinder, things get more complicated.
Why My System Needed a Different ApproachMy boiler uses an S‑plan layout with a single flow/return pair feeding both radiators and the hot water cylinder. Although the boiler has separate dials for heating and hot water, only the heating dial actually does anything.
This means I had two bad choices:
- Efficient heating but lukewarm hot water
- Hot water at the correct temperature but inefficient heating
Running the boiler too cool also increases the (small but non-zero) risk of Legionella, so simply lowering the temperature permanently wasn’t an option.
Oversized Boilers & Microbore PipeworkLike many UK homes, mine has an oversized boiler — 28 kWfor a house with a heat loss of only 5–8 kW. Combine that with 8 mm microbore pipework, and the system simply can’t achieve the 20°C delta‑T needed for proper condensing.
By adding temperature probes, I discovered my system had a delta‑T of only 5°C. The pump was running at maximum speed, and the boiler was delivering far more power than the system could absorb.
Two simple changes helped:
- Reducing pump speed doubled the delta‑T to 10°C
- Limiting boiler output to 30% effectively turned it into an 8.4 kW unit
But without a way to adjust flow temperature automatically, it still wouldn’t condense reliably.
The Solution: A Motorised Flow Temperature ControllerManually turning the flow temperature dial twice a day wasn’t realistic, so I built a device to do it automatically. I have hot water boost periods scheduled on my Nest thermostat / controller twice a day. So the device needs to be programmed to set a high flow temperature at the same times as scheduled by the Nest programmer. I achieved this by using an ESP8266 microcontroller to control a servo motor that turns the dial on the boiler. The ESP8266 is programmed using ESPHome from within Home Assistant which can automate the necessary actions to set the dial's position. I built a Meccano frame to hold the servo motor onto the temperature dial and used magnets to keep it in place whilst also allowing the whole assembly to be easily removed.
The summarised explanation of how it works:
- Home Assistant schedules hot water boosts
- ESPHome receives commands
- Servo rotates the boiler’s flow‑temperature dial
- Flow temp is high during hot water, low during heating
- Load‑compensation logic adjusts CH temperature dynamically
Hardware Overview
- ESP8266 (or ESP32) running ESPHome
- Servo motor to rotate the boiler’s physical dial
- Buck converter to step down voltage from wall outlet 9v supply to 5v for the ESP8266
- Metal frame (Meccano) to hold the servo
- Neodymium magnets to attach the frame to the boiler casing
- metal bracket to grip the dial (or you could 3d print something
- 9 V DC supply → buck converter → 5 V for servo
I used a mains to 9volt DC supply plugged into a nearby wall socket. The 9volt is reduced to 5volt by the buck converter.
The servo turns the spindle that turns the flow temperature dial has 3 wires:
- red for +5v - connected to the +ve output of the buck converter
- black for ground - connected to the -ve output of the buck converter
- orange - control - connected to GPIO15 of the ESP8266 - labelled as D8 on the physical board. see Random Nerd Tutorial for more info on the pinout https://randomnerdtutorials.com/esp8266-pinout-reference-gpios
- I defined the ESP8266 within ESPHome inside Home Assistant. If you're not familiar with the process then there's documentation here https://esphome.io/guides/getting_started_hassio/
There's an excellent video on controlling a servo motor using Home Assistant here:
and more documentation here:https://esphome.io/components/servo/
I also created:
- A script: setBoiler
- An automation: HW / CH Thermostat Control
Script: setBoiler
Parameters:
- duration (minutes of hot water boost)
- hw_config (true = hot water mode, false = heating mode)
The script begins with an if condition on the passed in hw_config boolean. If true then it configures hot water boost sessions; if hw_config is false then it's setting the flow temperature for central heating mode.
For the hot water configuration it uses the duration parameter to determine whether to turn the flow temperature to its minimum (duration=0) or maximum (duration > 0). If duration > 0 then it uses a timer for 30, 60 or 90 minutes. I've hard coded these values as these are the values used by my Nest thermostat controller when selecting a hot water boost.
Hot Water Mode
- If duration = 0: set flow temperature to minimum
- If duration > 0: set flow temperature to maximum and start a timer
For the central heating part it determines the difference between the target room temperature and the current temperature which it obtains from the Nest thermostat integration. If the house is cold, it increases flow temperature. As the room approaches target, it reduces it — mimicking load compensation. If you don't have access to the room and target temperatures just try setting the flow temp to a set value and test to see if that keeps the house warm enough; adjust as you see fit.
The automation HW/CH Thermostat control calls the script with the appropriate parameters based on the trigger for the automation:
- Time = 08:30 - for the scheduled morning hot water boost
- Time = 16:00 - for the scheduled evening hot water boost
- Timer - finished event - When the timer started by a hot water boost period expires
- Every 10 mins - to set the flow temperature for CH
I also created a dashboard in Home Assistant that displays the hot water cyclinder temperature (provided by another ESP8266 and Dallas probe), four buttons for predetermined hot water boosts, indicators that show whether hot water boost is on and how much time is remaining in boost mode.
After implementing the controller:
- My home now maintains a steady 20°C without overshooting
- The boiler runs cooler, reducing thermal stress
- Cycling is reduced but not eliminated
- Gas usage averages approx. 5 kWh per heating degree day since installation (https://www.degreedays.net/)
- The system now behaves more like a low‑temperature heat pump system
While I can’t prove a large reduction in gas usage (due to weather variability and prior insulation upgrades), the comfort improvements are significant.
🔧 Possible Future Improvements
Currently, the system raises flow temperature based on a schedule, not on whether the cylinder actually calls for heat. If the cylinder is already hot, the boiler stops heating but the flow temperature remains high.
A better approach would be to detect actual hot water demand using an optocoupler relay on the cylinder thermostat circuit. This would:
- Raise flow temperature only when needed
- Lower it immediately when the cylinder reaches temperature
- Allow ad‑hoc hot water boosts without extra logic
However, this involves working with mains wiring, so only attempt it if you’re confident and competent.
Another improvement would be in the setBoiler logic. It currently performs load compensation which means it adjusts the flow temperature based on the measured temperature in the house. An improvement would add weather compensation which takes account of the outside temperature. There's an excellent article on load (or proportional control as Michael de Podesta call it) and weather compensation here if you wish to investigate more.
ConclusionMy boiler is over 20 years old. For most of those years I've ignored it and taken it for granted. It's had a hard life and I feel a bit guilty that I didn't appreciate how it kept me warm. But it's also a bit of a monster and is too powerful for efficient heating of my house. It's like putting a Formula 1 engine in a small family saloon.
This project has also kept my house at an even temperature with no wild swings from too hot to too cold whilst keeping my gas bill reasonable. I've also learnt more than I really need to know about delta T, the history of boiler oversizing and how condensing boilers should work.
I'm heading towards a heat pump soon and this project has allowed me to test my house and see if it's sufficiently insulated and draught proof to take a heat pump. Prior to any heat pump installation it's vital that you get an accurate heat loss survey performed. This will determine how many kiloWatts leaks out of your walls, windows and doors. It's often an educated estimate based on assumptions about the construction of a house but it's better than guessing. You can provide supporting evidence by calcualting your own heat loss based on your energy usage on the really cold days of the year. https://protonsforbreakfast.wordpress.com/2022/11/07/what-to-do-on-the-coldest-day-of-the-year/ It doesn't replace getting a survey done but if the survey differs wildly from your own measures then it might be worth getting another survey done.






Comments