Ok I am absolutely sure there are better ways to do this but it has been on my to do list for over three years and finally got it done today.
First of all the goal here is flex the Gas Central Heating boiler so that the Flow Temp ( temperature of the water flowing to radiators) to keep the house at the desired target temperature.
The Worcester Weather Comp kit is about £200, I want to know and control what is happening so not my first choice.
ie use as little gas as possible to keep the house at the target temp.
So
Flow Temp= “Desired Room Temp” +(“Heating Curve Slope” * (“Desired Room Temp” - “Outdoor Temp”))
Desired Room Temp - I get from the Tado Thermostat in the Lounge, I chose the Lounge as it is a room where we spend most of our time and is one of the warmest rooms in the house (Bathroom gets warmer and cooler throughout the day)
Heating Curve Slope (HCS) - is the Heat Loss Parameter I (HLP) get from the Glow integration that has a Gas and Elec meter AND a temp/humidity sensor in the lounge. This runs for 21 days during the heating system and calculates the HLP, mine if 1.6.
So today, Desired Temp is 21c, Outdoor temp is 12.3c, DLP (HCS) is 1.6 so the Target Flow temp is 35c.
Outdoor Temp - I get from the average two outdoor Hue Motion Sensors in the (North side of the house) and a failover of the Tado reported Outdoor Temp (form cloud source)
I recently purchased the bbqkees EMS (a esp32 device) that connects into the bus port on my Worcester 400 boiler, it can be connected using the thermostat or service ports also, so is pretty flexible. This gives me access to control the Boiler Flow Temp - along with a massive load of other interesting things…
I wanted to do it all in Node Red - my preferred automation tool sitting on Home Assistant.
At its simplest I get the Desired Temp and the Outdoor temp and store them in Global variables, I also did that for the HLP but realistically it should be hard coded in.
Then I just use an inject mode to run the Flow Temp calculation every 30 mins and use a Function node with this in it.
let a1 = global.get("CH-TargetTemp");
let a2 = global.get('CH-HLP');
let a3 = global.get('OutdoorTemp');
let result = (a1 + (a2 * (a1 - a3)));
result = Math.round(result);
result = Math.max(30, Math.min(82, result));
msg.payload = result
return msg;
Then the output is fed to a Home Assistant Action Node to set the Flow Temp.
I have continued to enhance this with the help of chatgpt to make it more resilient and respect the upper and lower limits of the boiler to this
// Get values
let a1_raw = global.get("CH-TargetTemp");
// CH-Target Temp taken from Tado Lounge Thermostat Setting
let a1 = (a1_raw !== undefined && a1_raw !== null && !isNaN(Number(a1_raw)))
? Number(a1_raw)
: 20; // FAILOVER = 20
let a2 = Number(global.get("CH-HLP")) || 0;
let a3_raw = global.get("OutdoorTemp");
// ----------- Outdoor Temp Validation -----------
// If missing / undefined / null / NaN, fallback
let a3;
if (a3_raw === undefined || a3_raw === null || isNaN(Number(a3_raw))) {
a3 = global.get("LastGoodOutdoorTemp") || 10;
} else {
a3 = Number(a3_raw);
}
// Reject impossible readings
if (a3 < -20 || a3 > 50) {
a3 = global.get("LastGoodOutdoorTemp") || 10;
} else {
global.set("LastGoodOutdoorTemp", a3);
}
// ----------- Optional smoothing to reduce noise -----------
let prevAvg = global.get("OutdoorAvg") || a3;
let smooth = (prevAvg * 0.8) + (a3 * 0.2);
global.set("OutdoorAvg", smooth);
a3 = smooth;
// ----------- Main calculation -----------
// Using the weather Comp Formula using Outdoor (northern side) Temp,
// Tado Lounge Thermostat for Lounge, and Heating Curve Slope from the
// Heat Loss Parameter from Glow House Heat Loss assessment
let result = a1 + (a2 * (a1 - a3));
// round
result = Math.round(result);
// clamp 30 ≤ result ≤ 82 - Lowest and Highest limit on Boiler
result = Math.max(30, Math.min(82, result));
msg.payload = result;
return msg;
It will continue to evolve but wanted to share what I learned so far.
It is running, it is working nicely.
Will be interesting to see what Tado makes of a variable Flow Temp.
Also will need to drive the Hot Water using the Immersion Heater instead of the System Boiler, easily done using overnight cheap 7p/kWh elec, about 30 mins at 3 kWh does it.
As a recap this is what I am using to make all this work
Tado - Each room has its own thermostat/schedule and it turns on off the Boiler, failover cloud based our door temp
bbqkees ems - Lets me access the central heating boiler and manage it from Home Assistant /Node red - about £100
Hue - Outdoor Motion Sensors ( using 2 and averaging them)
MQTT - bbqkees ems and writes to MQTT
Home Assistant - through MQTT to manage the boiler
Node Red - as the automation tool
Glow Display & CAD with in room Temp/Humidity Sensor - to calculate the Heat Loss - also feeds into MQTT for real time elec and gas meter readings
The Glow Meter readers and temp/humidity sensors cost about £100 - but is great for tracking energy usage in Home Assistant
Shelly 16a relay with add on to add three temperature probes, one for flow, return and hot water, the relay controls the hot water tank immersion heater and is set to auto turn off in 30 mins, I added a hardwired switch to the Shelly for my wife to have access to an easy hot water boost control.
Update day later
Changed lowest Flow to 40c, I need to see it performing at that first, if it needs to it will automatically flex up.
Looking at the delta-t, difference between flow (out) and return (back) I am recording a very low 4c so this indicates a radiator balancing issue or I can address by reducing the radiator pump using the bbqkees device. Will see if that improves it.
I also suspect the return temp sensorI have on the boiler is mounted too close to the boiler and may be reading boiler temp increase rather than the actual return temp, will relocate further away from boiler.


