A Heat Pump That Thinks for Itself

Every heat pump ships with an answer to the same question: given the weather outside, how hot should the water going to the radiators be? The answer is a line on a graph — cold outside means hot water, warm outside means cool water — and the slope of that line, the heat curve. The factory default, in almost every case, is wrong for your house. Not badly wrong, but wrong enough that the gap between a default heat curve and a correctly-tuned one is the difference between a heat pump that performs well on paper and one that actually delivers the numbers in the brochure.

Worse, the default heat curve is also myopic. It lives in the moment. It doesn’t anticipate. It knows the current outdoor temperature, and to some extent the indoor temperature, and that is it. It doesn’t know the sun is, or will be, streaming in through the south windows, or that the wind is, or will be, pulling heat out faster than usual. It sets a flow temperature, commits to it, and waits for the next weather-driven update.

For a house like ours — 1874 stone, high thermal mass, 17 radiators, variable impact of wind speed and direction — a myopic heat curve is a bit like driving by looking only at the speed limit sign, never at the road. It gets you roughly where you’re going. But it leaves a lot on the table.

The thought experiment

The right control system, roughly, should think like a person who actually understands the house they live in — not the one in a warehouse where the heat pump was tested:

“It’s 3°C outside, and the forecast says it will stay around 3°C for the next few hours. The house will need about 6 kW of heat to hold 20°C. At the current flow rate, that means 32°C flow temperature. But the ground floor is already 20.4°C — we’re slightly ahead. Trim a degree off. And by the way, the wind drops tonight and turns south-westerly — the heat curve slope can ease back for the next few hours.”

No heat pump controller does this out of the box. They can’t, really — despite having access to the room temperatures, they don’t have the weather forecast, they don’t know the house’s heat loss coefficient, they don’t know what the wind is doing or how that will affect the fabric of our house. The information they’d need to reason like this lives in the monitoring stack, not in the heat pump.

So we built it there.

Layer one: the heat curve, but moving

The Vaillant’s own logic is, at heart, a single equation relating flow temperature to outdoor temperature and a heat curve slope. Reverse-engineering what the controller actually does (thanks to the work of Andre_K), the relationship comes out as:

TFlow = 2.55 × (HC × (Tset − Tout))^0.78 + Tset

Where Tset is the indoor setpoint, Tout is outdoor temperature, and HC (Heat Curve) is the heat curve slope. The exponent of 0.78 is the non-linearity — radiators output heat as roughly a 1.3-power function of their temperature-above-room, so the inverse relationship lives at that exponent inverted.

A textbook control theorist would probably use the equation to back-solve: start from the heat loss coefficient, compute the house’s current demand from the indoor–outdoor differential, work out what flow temperature is needed to deliver it, and then invert the formula to find the HC value that produces that flow temperature. Clean, principled, reproducible. I considered it. I didn’t do it.

What the coarse layer actually does is more pragmatic. The base HC is a piecewise-linear lookup against outdoor temperature — a hand-tuned curve, anchored at 0.75 for −3°C and colder, sloping down to 0.40 above 16°C, with a gentle inflection around 10–12°C where the house’s response changes character. That curve was tuned empirically against the house’s actual behaviour. Which means our measured heat loss coefficient (HLC) of 0.540 kW/K is baked into it rather than computed from it. The HLC sits in the coefficients, not in the code path.

The coarse slope is derived from this lookup and nothing else. No forecast term, no indoor feedback, no wind correction, no small-weather boost — all of those live in the fine layer, for reasons that will become clear in a moment. The coarse layer’s one job is to track the outdoor-temperature regime.

That slope gets snapped to the nearest 0.05 on the HC dial — the only granularity the Vaillant’s own register understands — clamped to the 0.20–0.95 range, and, as a matter of discipline, only written to the heat pump if the change exceeds 0.045. In practice that means the slope only moves when outdoor temperature has crossed a regime boundary. Writing tiny adjustments every few minutes isn’t control; it’s fidgeting.

That threshold matters. The heat pump’s internal state machine responds to curve changes by re-evaluating its compressor behaviour, and constantly nudging the slope sends it into small cycles of confusion. Let it settle. Only nudge when outdoor conditions genuinely cross a regime boundary.

Layer two: the trim

The coarse layer is good but slow. It captures sustained changes — the cold snap that lasts 48 hours, the shoulder-season warmth that drifts in over a week. It doesn’t capture the thing happening right now.

That’s what the fine layer is for.

Every cycle, four small adjustments are computed against current conditions and summed. A mild boost in the −1 to 9°C band, where observation showed the base curve was slightly conservative. A forecast-aware correction that looks six hours ahead at OpenMeteo, weights the nearer hours more heavily, and if the forecast diverges sharply from current conditions, blends the two rather than trusting either alone. An indoor-temperature feedback term — the average of five ground-floor sensors — that trims up or down if the house is drifting from setpoint. And a wind-exposure boost that only kicks in when the wind is coming from the 0–110° arc — the direction the house is most exposed to.

The four are summed in heat-curve-equivalent units, then converted to a °C trim by a sensitivity factor — how much flow temperature each unit of heat curve change actually buys you. That °C value is written to a Vaillant register called Hc1ExcessTemp: a trim that sits on top of whatever target flow temperature the coarse curve is producing, added or subtracted in small increments.

The sensitivity factor comes from the Vaillant formula above, differentiated with respect to the heat curve:

∂TFlow / ∂HC = 2.55 × 0.78 × (Tset − Tout)^0.78 × HC^−0.22

Which, in plain English, says: the colder it is outside, the more flow temperature you get from each unit of heat curve change. Trim harder in winter, more gently in shoulder seasons. The formula does this for us automatically — and it applies uniformly to all four adjustments, so the wind boost on a cold day gets scaled up by exactly the same factor as the indoor feedback.

There is a quiet architectural choice hiding in this. All four adjustments could have been stacked onto the coarse slope instead — it’s the obvious thing to do. They aren’t, for two reasons. First, the slope is quantised to 0.05 steps, so small continuous adjustments would round away and be lost. Second, the Vaillant flinches every time the slope is rewritten, re-evaluating its compressor behaviour; a trim value can be updated every cycle without disturbing it. So the slope gets to do what slopes do — track regime — and the trim does what trims do: reject disturbance. Two layers, two jobs, no overlap.

Coarse adjustment plus fine trim, operating on different timescales and with a clean separation of what each is responsible for, is exactly the structure every good control system in any domain eventually converges on — from aircraft autopilots to thermostats to central banks. Slow loops for steady state. Fast loops for disturbance rejection. Let each do what it’s good at.

The hydraulic body around the brain

None of this works if the plumbing isn’t cooperating. A heat pump that thinks is only as good as the pipes that carry its decisions to the radiators, and the 17 smart TRVs on those radiators are each, in effect, small autonomous controllers of their own. Left to their defaults, they would close when their rooms get warm, starving the flow loop and confusing the heat pump into thinking the house is satisfied when it isn’t.

The smart TRVs are managed in Home Assistant through an integration called Versatile Thermostat, which uses a TPI algorithm to modulate each valve’s opening percentage. Every TRV has a maximum closing setting so that it never shuts fully, guaranteeing a design flow rate of around 2,014 L/h through the system at all times. That alone isn’t quite enough — as the TRVs open and close to match each room’s heat demand, the system flow rate still wanders. So one TRV — the utility room’s, because nobody lives there — is repurposed as a compensating valve: an automation trims it open or closed in real time to hold the whole-system flow rate at target, absorbing the small variations as the other 16 TRVs move around it.

Each TRV takes its cue from the room temperature of the space it serves, and the lockshield side of every radiator is left fully open — the smart TRVs are the balancing device. That went directly against the installer’s advice, which was to replace every smart TRV with a lockshield. One more piece of received wisdom that didn’t survive contact with the data.

The result is a hydraulic circuit that behaves, from the heat pump’s perspective, as one predictable load rather than 17 competing ones. That predictability is what allows the coarse–fine control architecture to work. Without it, the flow temperature sensitivity formula wouldn’t hold, and the trim loop would be chasing noise.

What it actually bought us

After the two-layer architecture went in, COP improved — not dramatically, because the low-hanging fruit was already picked, but consistently and measurably across outdoor temperatures. More importantly, the behaviour of the system became legible. We could look at a day’s flow temperature trace and say which adjustments were coarse-layer response to the weather and which were fine-layer response to solar gain, wind, or occupancy. The heat pump stopped being a thing that happened to the house and started being something the house was in conversation with.

That conversation is what turns a factory-default ASHP into one that delivers a seasonal COP of 4.21 in a solid-stone Victorian building and most importantly a comfortable and dry home. It’s not a hardware story. It’s a reasoning story — orchestrated inside Home Assistant, speaking to the Vaillant over a protocol it was never designed to be talked to over.

One thing I should be add before closing: I am not an engineer. Before this heat pump, I knew nothing about heating or controls. What’s above is the result of a lot of reading, a lot of iteration, and using AI tools like Claude, which I’d never used before any of this started. There were wrong turns and wasted evenings. There were moments the formula looked right on paper and behaved badly on the house. There was a lot of trying things, watching what happened, and going back.

A heat pump that thinks for itself, in the end, is just a heat pump given enough information to reason with. The information was always there. Somebody had to go and fetch it — and the tools to do that are now, finally, within reach of anyone willing to look.

4 Likes

Sorry to burst your bubble, but Daikin Altherma does. I suspect other heat pump vendors products do as well. In Daikin’s world it’s called Modulation and is provided by the indoor ‘thermostat’. Provided the weather compensation curve is close to the house’s real heat loss (not some random overinflated survey heat loss figure), modulation can keep the house temperature just right. In theory. In practice, if it’s an oversized heat pump, then during milder weather, it can’t but during the colder months, it can.

Thank you — this is a genuinely useful pushback, and you’re right that the sentence “no heat pump controller does this out of the box” was drawn too broadly. Daikin’s Madoka and Vaillant’s own controller do modulate compressor output against a measured room temperature, and I should have drawn the line more carefully. Fair catch.

Where I’d gently add a distinction, though: what that modulation does is trim the compressor output around a fixed weather curve in response to one room sensor. What the chapter’s Layer Two is doing is something different — it’s adjusting the slope of the curve itself, ahead of time, based on information the factory controller doesn’t have: the six-hour forecast, the house’s empirically-measured heat loss behaviour, and wind direction (the NE quadrant pulls heat out of our specific fabric faster than the SW does, and a temperature-only controller can’t see that). Modulation handles the present. The trim layer handles the near future and the directional physics of one specific house. Different jobs, overlapping vocabularies.

Two smaller points worth naming, because I think they matter to the argument:

First, “weather compensation” is a bit of a misnomer as the industry uses it. What factory controllers actually do is outdoor-temperature compensation — one sensor, one lookup. Weather, in any meaningful sense, is a vector: temperature, wind, sun, humidity. A 5°C still day and a 5°C day with a strong NE wind are different heat-loss regimes, but a temperature-only controller treats them as identical.

Second, the indoor-feedback loop you’re describing is only as good as the single sensor it’s reading. A thermostat in a hallway, near a radiator, or in a sun-gain room will bias the whole modulation loop toward whatever that one sensor happens to see. Our Layer Two feedback signal is a calibrated average of five independent ground-floor sensors, which is a meaningfully different input to the control law even when the maths downstream looks similar.

There’s also a building-fabric point lurking underneath all of this. Our house is solid stone, and we measured its thermal mass at about 8 kWh/K — which means the fabric responds to heat input over hours, not minutes. In a low-mass building, a purely reactive controller works fine; any error gets corrected before it matters. In a stone house, by the time a reactive loop notices the house is drifting, the stone is already drifting with it, and getting it back is slow. Play catch-up in a 1874 stone house and the house is either never quite comfortable or always slightly overshooting by evening. Anticipation isn’t a luxury for buildings like ours — it’s what makes them liveable at a modest flow temperature. That’s as much what the trim layer is for as the efficiency numbers are.

And your point about oversizing is exactly right — and, for me, the most important thing in your comment. None of the reasoning in the chapter rescues a heat pump that can’t modulate down to match mild-weather demand. Right-sizing (the subject of the overarching piece, The House That Couldn’t Have a Heat Pump) is the precondition for any of this to pay off. A correctly-sized unit with a well-tuned curve and good modulation will do much of this work; an oversized one will cycle through the shoulder seasons regardless of how clever the control layer above it is.

Thanks again for engaging this carefully — comments like yours are how the detail gets sharper.

1 Like

Agree that multiple sensors are better than one, but ultimately that’s more cost and most people won’t care that much.

Weather forecasts are only somewhat reliable and can be highly locally dependent, so I’m not convinced that is the way forward either.

I’m not sure there is much value using outside temperature to govern heat output either, for some of the reasons you mention, solar gain, human activity, cooking etc.

I think heat pump controllers should be able to learn the correct weather curve just from the indoor sensor and how the house responds to heat output. Obviously if the installer places the indoor sensor in the path of a heat source or the sun, then they shouldn’t be installing anything, but assuming it is somewhere sensible, the heat pump’s controller should have all the information it needs, just from that internal sensor. It should be able to calculate the rate of change of indoor temperature, which naturally would represent all the possible variables (solar gain, cooking etc) and could then adjust the heat pump’s output accordingly.

Aside from a massively oversized installation, in theory it becomes a fit and forget system. The customer sets the desired temperature on the thermostat and the heat pump controller takes care of the rest, dynamically, all year round. With all the technology and computing power we have in today’s world, how hard can that be?

(btw: I’m using a third party thermostat with my Altherma because Madoka has other fundamental flaws, I use Home Assistant to make the flow temperature adjustments and the third party thermostat as the final cut out - this is mostly because my heat pump can’t modulate low enough in the shoulder months - so I fully accept current controls (certainly Daikin’s) are flawed. Very flawed.)

Yeah, but does it work well enough?

Doesn’t predict forecasts?

It could even look at the tree pollen​:rofl: to get an idea spring has sprung as that info is in the Onecta app.

Would be good to know what it does actually look at & why it seems so off.

I feel most of us ditch Madoka and use Leaving Water Control and tune weather curve, and in my case the external temp sensor positioning has helped hugely.

Using Madoka control messed up the Eco DHW control badly for me and others.

It would work okay with Comfort mode but fail with Eco. Perhaps that is a bug they have fixed? But I’ve not received any SW / firmware updates I’m aware of.

Nope @HeatStig it most definitely doesn’t work well enough. :slight_smile: but really it’s just the shoulder months that are the problem which is, of course, the bulk of the heating season, in time at least. Daikin and other manufacturers do need to up their game.

You raise another good point that relying on external sensors to govern the heat output based on the configured curve is also problematic - some have had sensor failures, some have had problems with sun hitting them skewing values.

Our installers put our external temp sensor on the north face of the adjacent garage / wall gate, so it really was in a quadrant of cold sheltered, never see any warmth masonary mass.

I moved it to full sunlight on the front and got the HP to actually throttle back in line with the solar gain the full south facing, not very deep house gets.

It’s been so much better since doing this - almost totally autonomous! When the sun goes in the sensor cools in line with the house, slowed by the brick it’s screwed to.

When there is no sun / cold days the sensor reads ambient temp spot on..

Each property will be different.

Agree fully - HP manufacturers could and should do so much more!

Question is how to get them to do it? They obviously think the all over the place yawing system is adequate and energy companies like Octopus sell er.. energy, so little incentive from them to make things really efficient.

1 Like

This reads exactly like the responses that I get from my occasional interactions with Gemini AI .

1 Like

This is my experience also. Installer placed the external sensor on a west-facing wall (behind a downpipe) because there was no north-facing wall available. For my property I suspect it’s a better arrangement than having the temp sensor facing north. When the sun is out at the end of the day, the house is warmed by the sun through west-facing glazing. As the temp sensor is being heat at that time, heating by the heat pump is suspended.

Good Morning.

I am responding to the wider point that your post raises: temperature control with heat pumps - particularly the reliance on weather compensation (WC) - brings unnecessary complication to heat pump installations.

As an absolute minimum - a user should be able to set their room temperature using a thermostat - because that it is the best way to achieve a stable temperature. The algorithm that achieves that can include WC or not: many alternatives are available.

But it should be totally unacceptable for a user to have to adjust a WC curve in order to achieve a set temperature. I still hear from people who installed expensive systems that lack the most basic and essential control any heating system should have: a thermostat.

Best wishes

Michael

1 Like

I would say that weather compensation isn’t just a feature of heat pumps. I installed a weather compensating controller on an oil boiler in 1991, and on the replacement log boiler/thermal store some time later.

Some sort of flow temperature control is highly desirable on a heat pump as it should optimise efficiency, but it shouldn’t be something that the end user adjusts. Once set up correctly it shouldn’t be touched. The complication should be dealt with by the installer.

Weather compensation doesn’t preclude the use of a thermostat. Both the my old systems used a thermostat as does the current Samsung Gen 6 - it’s built into the controller as it is with many other heat pumps.

Of course, the trouble is that a well designed heat pump system responds very slowly to control adjustments. A user expecting a rapid response to a thermostat adjustment is likely to be disappointed.