Underfloor heating control

Running OpenHAB2.5 & openhabian on Raspberry Pi3
Temperature sensors in each room connected via Wifi & MQTT.
Heating control managed by OpenHAB

I want to share my problem; how I have tried to fix it; and reach out to you folks for inspiration and ideas!

I have a mix of wet underfloor heating and wet radiators; fed by a gas fired boiler; and a collection of valve and pumps to divert the hot water to appropriate radiators or floors.
I have a simple On/Off control system. When the room temperature is below the setpoint, the heat is on. When above, the heat is off. Heating, Temperature, Setpoint are all items. Rules implement the On/Off control.
The problem is the control of the kitchen temperature is very poor. Either too hot or too cold.

To analyse the problem, I export temperature, setpoint and Heating to an InfluxDB time series database, then visualise it with Grafana. The problem is the kitchen underfloor heating has a thermal time constant of about 1 hour. Pump in heat to the floor for an hour and the room temperature doesn’t change. But after the heat turns off, the room temperature continues to rise for a few hours afterwards. The kitchen floor is a concrete slab with water pipes embedded in it and consequentially has large thermal mass. So the kitchen overheats because it is still heating when the heat is turned off; and undershoots because the room continues to cool when the heat is turned on.

First idea is to implement proportional control instead of On/Off control. Measure the difference between the actual temperature of the room and the temperature setpoint; multiply by a constant to create an analogue heating demand variable between 0% and 100% heat demand. So the amount of heat going into the floor reduces as the room gets closer to the setpoint.
Modulating the heating of the floor is pretty course! Because the heating is hot water and pumps and hot wax solenoid valves. the frequency of modulation must be pretty slow. The smallest step size is 20 minutes. So my options are: heating for 20 minutes every hour; or 40 minutes every hour or on continuously.
The result was improved temperature but still not good. The heat is still on until the temperature passes the setpoint, so still overshoots. I need to get the heat turned off 1 hour before it reaches the setpoint.

Next idea: extrapolate the temperature an hour in the future, based on the rate of rise in temperature. Using a Cron triggered rule, sample the room temperature every 10 minutes. Calculate the change in temperature over the last 10 minutes. Extrapolate for the next hour. So I get an estimation of the temperature of the room in an hour. Then use this estimated temperature as the input for the proportional control.
The plots show the control in action.
The top plot below shows the heat on and off in the green line and the proportional demand in the orange line over a 24 hour heating cooling cycle.
The bottom plot shows actual temperature in green, estimated temperature in pale blue and setpoint in orange. The setpoint changes based on a calendar entry.

The result is improved temperature control. Smaller overshoot and undershoot. Less heat used.
The control is probably good enough. But what have other people used for underfloor heating control with large thermal inertia?
What are the alternatives?

Thanks in anticipation,

1 Like

Hi - great post. I’ve also experimented with variants on this for our underfloor heating. It’s engineered wooden floors over wet central heating over concrete screed - so quite a large thermal mass.

I was worried that pushing too frequent changes could wear out the solenoids, so ended up with a simple rule that runs every 30 minutes, turns on the heat if (current temp + 2* rate of change in last 30 minutes) < the setpoint, and otherwise turns it off. Very simple but seems to work well enough that we don’t notice over/under heating.

What I’d like to do, but haven’t yet, is adjust for sunny mornings and early evenings, when the sun is low, by pre-emptively under-heating an hour before the strong sun starts flooding into the room.

1 Like