Konubinix' opinionated web of thoughts

Should I Have My Radiators Flushed?

Fleeting

I’ve been told to flush them every 10 years. But it’s also said that they should be flushed if the temperature difference between the top and bottom is significant.

Here, “significant” is pretty vague. Let’s consider that 5°C of difference is a good start and definitively 10°C says that we have to do something right now!

This winter, I installed a Zigbee sensor on the top of a radiator and one on the bottom. Let’s see what the results are.

First, let’s get the data out of my database and perform a little bit of cleanup and formatting to ease playing with the data.:

from redis import StrictRedis
import pandas as pd
from datetime import datetime
d = StrictRedis()
t = d.ts()
top = pd.DataFrame(t.range("zigbee.RadiatorTop", int(datetime.strptime("2024-01-23", "%Y-%m-%d").timestamp() * 1000), int(datetime.strptime("2024-03-01", "%Y-%m-%d").timestamp() * 1000)))
bottom = pd.DataFrame(t.range("zigbee.RadiatorBottom", int(datetime.strptime("2024-01-23", "%Y-%m-%d").timestamp() * 1000), int(datetime.strptime("2024-03-01", "%Y-%m-%d").timestamp() * 1000)))
top.columns = ['time', 'top']
bottom.columns = ['time', 'bottom']
top = top.set_index('time')
bottom = bottom.set_index('time')
r = pd.concat([top, bottom])
r.index = pd.to_datetime(r.index, unit="ms")
r = r.sort_index()
# remove the days we were out of the home and the radiator were off
r = r[(r.index < '2024-02-17') | (r.index > '2024-02-23')]
# let's try hard to have values for both top and bottom at each point in time, so that we can compare them
r = r.interpolate(method='polynomial', order=5).dropna()
file = "/tmp/radiator.csv"
r.to_csv(file)
return file
https://konubinix.eu/ipfs/bafybeib7nacfjayqutve75blqlrni6xg3iilssudn5atziyvur6xxm5nm4

This is the data I will use hereafter.

Let’s load it.

import pandas as pd
r = pd.read_csv(file, parse_dates=["time"], index_col="time")
print(r)
                           top     bottom
time
2024-01-22 23:12:02  30.180000  25.047615
2024-01-22 23:15:29  29.770144  24.630000
2024-01-22 23:22:02  29.190000  24.002997
2024-01-22 23:25:56  28.872237  23.710000
2024-01-22 23:31:53  28.370000  23.250299
...                        ...        ...
2024-02-29 22:43:00  34.462688  28.970000
2024-02-29 22:44:09  34.290000  28.825460
2024-02-29 22:48:37  33.702131  28.320000
2024-02-29 22:49:07  33.650000  28.267985
2024-02-29 22:53:37  33.300166  27.670000

[6124 rows x 2 columns]

Let’s try to simply plot them to have a feeling of how they look like.

The data looks clean.

from pathlib import Path
out=Path("/tmp/plot.html")
import plotly.io as pio
variable=locals()[var]
function=variable.__getattr__(fct)
kwargs={
    "backend":"plotly",
}
if marker:
    kwargs["markers"] = True

out.write_text(
    pio.to_html(
        function(**kwargs)
    )
)
print(out)

In case I want to get a deeper interactive look at the data, I will also provide a plot made with plotly.

look at outliers

One of our hypothesis is that sludge is supposed to cause the bottom part of the radiator to be significantly colder than the top, as the sludge hinders the flow of water. The water will simply flow were the sludge is not, hence at the top.

Let’s find out whether that hypothesis holds.

print(r[r.bottom > r.top])
                           top     bottom
time
2024-02-04 02:14:42  17.486029  17.620000
2024-02-04 02:30:59  17.490000  17.739859
2024-02-28 17:13:05  22.417144  22.810000
2024-02-28 17:19:12  22.420000  22.614221

Hmm, that’s not bad. But there are still two outliers. Let’s take a look at them.

First, at about [2024-02-04 Sun 02:20], something apparently went wrong.

a = r["2024-02-04 00:00":"2024-02-04 04:00"]

This is strange. The values are pretty close, so maybe this goes into simple precision errors. I think this one won’t harm the analysis.

The second one occurs at [2024-02-28 Wed 17:15].

a = r["2024-02-28 17:00":"2024-02-28 18:00"]

The temperature of the top probe suddenly drops before getting back to normal. This is most likely the effect of opening the window. I can assume that at that time, we had to open them for a little while, like for cleaning them. Again, it does not seem that problematic, so let’s keep it that way.

analysis

r.describe()
               top       bottom
count  6124.000000  6124.000000
mean     30.355279    26.400982
std       6.203890     5.397042
min      17.212234    16.480128
25%      24.970635    21.350000
50%      31.500000    27.006118
75%      35.810000    31.400295
max      43.140000    36.485341

The data are pretty close, let’s take a look at the difference.

a = (r.top - r.bottom)
a.describe()
count    6124.000000
mean        3.954297
std         1.397309
min        -0.392856
25%         3.028367
50%         3.930668
75%         4.894372
max         9.447843
dtype: float64

This indicates that, for the most part, the top part is around 4°C hotter than the bottom part.

The mean and the median are very close, indicating a symmetry.

It might be easier to see this visually.

And the same with plotly (just for fun).

We can see what the data indicated: The hot part being about 4°C hotter for the most part.

conclusion

We decided that if the top part would be more than 5°C hotter than the bottom one, we would consider flushing the radiators.

This in not the case this year. Therefore, without a good reason to believe, we claim that this is not needed (this year).