Heat pump experiment review after two years

Yep, 21:30 was it doing the hot water in it’s usual enthusiastic way.

When we tried overheating the house the people noticed. Also, having it get colder as the outdoor temp fell would make them more upset. The heat pump was fitted to keep us warm.

You’re right it’s bad to heat the house when it’s cold outside. If you wanted optimal efficiency you could heat it in the Summer and ensure it was well insulated :slight_smile:

One thing extra control has helped with is a 10 minute nudge at 20:00 in September which makes everyone feel warm for very little cost. That’s how to earn brownie points.

1 Like

Ha! I wonder what temperature would be required in September to last the winter(!)

Going back to the melcloud output: does anyone know how to tell if the heating controller is in flow or curve mode? I can detect room mode because there’s a Zone1InRoomMode flag, plus TargetHCTemperatureZone1 and SetHeatFlowTemperatureZone1 differ in that mode, but I’ve yet to spot the difference between flow and curve modes.

Why this matters: if I give the Pi control based on the data stored in emoncms, I want it to give up if it sees settings being changed on the controller — such as someone putting it back into curve mode or changing the target temperatures — rather than start a fight it’ll probably lose because local hardware usually beats cloud service commands.

While I’m asking, does anyone know if pymelcloud can see or set the curve delta, the +/- 0-9°c that appears on the controller unit in curve mode? I don’t think it can, but I could be wrong.

1 Like

You mean like this :slight_smile:

icon = {
    0: "operation-mode-room",
    1: "operation-mode-flow",
    2: "operation-mode-curve",
}.get(deviceInfo["OperationModeZone1"], "")

operationModeZone1Title = {
    0: "Using room temperature in utility room to decide when to run",
    1: "Using the flow temperature like the oil boiler did",
    2: "Adapting the flow temperature based on how cold it is outside",
}.get(deviceInfo["OperationModeZone1"], "")

That’s really important for the humans. In our house it allowed them to feel in control. Also, it allowed the algorithm to be a bit over-zealous and have it’s nose tweaked by the humans when it went too far.

I don’t think so either. It uses the same API I do and I didn’t see flags for it because it’s not being set via the app. Here’s the flags I bothered to record:

flags = {
    "Power": 1,
    "OperationMode": 2,
    "EcoHotWater": 4,
    "OperationModeZone1": 8,
    "OperationModeZone2": 16,
    "SetTankWaterTemperature": 32,
    "TargetHCTemperatureZone1": 128,
    "TargetHCTemperatureZone2": 512,
    "ForcedHotWaterMode": 65536,
    "HolidayMode": 131072,
    "ProhibitHotWater": 262144,
    "ProhibitHeatingZone1": 524288,
    "ProhibitCoolingZone1": 1048576,
    "ProhibitHeatingZone2": 2097152,
    "ProhibitCoolingZone2": 4194304,
    "Demand": 67108864,
    "ThermostatTemperatureZone1": 8589934592,
    "ThermostatTemperatureZone2": 34359738368,
    "SetFlowTemperature": 281474976710656,
    "After here I added manually": True,
    "SetHeatFlowTemperatureZone1": 281474976710656,
    "SetTemperatureZone1": 33554432,
    "ProhibitZone1": 524288,

Just so. It hadn’t occurred to me that the values of OperationModeZone1 meant different things to the same values in OperationMode. I was expecting it to flit between 0 and 2 depending on what OperationMode was doing. As they say around here: that’ll learn me!

1 Like

That json.dumps call seems to need to be json.dumps(data, separators=(',', ':')) else most of the created feeds have spaces on the front of their names which messes up @MyForest’s MMSPHeatPump app in ways I found non-obvious.

1 Like

Signed up to thank @MyForest for all the useful information he’s posted here and on other threads.

I’ve had a heat pump for 2 months now (EcoDan 11.2 kW in 1960s bungalow with rads near York), and quickly had my own PHP* code pulling all the necessary data out of MELCloud into Emoncms.
(*Python’s okay and all, but I just prefer semi-colons and curly brackets :smiley: ).

I’ve also got some code to control the HP via MELCloud, though only simple basic time-based settings so far, such as reducing the flow temperature overnight, gradually increasing it in the early morning. My unit really likes to run in 20 minute cycles, and I’ve not yet figured out how to convince it to run longer. Maybe I’ll try controlling the HP more dynamically instead.

Edit: I’ve just realised that they installed a “smart” room thermostat with the heat pump, which is setup to do 3 cycles per hour. Given that I have temperature sensors in every room feeding EmonCMS, I may implement a thermostat in software instead.

Here are some other observations I’d like to share:

  • I was also looking for a way to read and control the ‘curve delta’ setting, but it doesn’t look to be exposed by MELCloud. The only way would be to take over the weather curve function entirely, which I may try one day.
  • if you don’t have proper metering, then the HeatPumpFrequency is the % power being used. Multiply this by the maximum input power of the unit (3730 watts in my case), and you get a half decent measure of the power its drawing.
  • I’m using openweathermap.org/api to get outside temperatures for my location, which seems to match the thermometer on the back of the HP pretty well. This also gives me future temperatures, which I might try factoring into a control algorithm.

Still figuring out how best to get the best out of the HP, but it seems to be working pretty well so far.


Welcome and glad you have improved your heatpump with emoncms too.

I have wondered about the above too. Something along the lines of extracting more heat now at higher efficiency if it is going to get colder or waiting a bit if it will warm up soon. At the moment, I do this a bit crudely by changing my temperatures at different times of day, but it is not always coldest just before sunrise, for example.

In case you didn’t know, melcloud sends three or so crude weather forecasts, but I think they’re not short-term enough for this use. They’re for 12-hour periods and I think it would need 1-hour period at most for this to work well.

If you implement a control algorithm containing future temperature predictions, I look forward to reading your experiences.


I have my own designed and built heat pump (plus controller) for my heating (underfloor).

As part of the development I included predictive heating requirements using the 3 hour forecast from openweathermap. Initially I just used the forecasted temperature but then I changed to the ‘feels_like’ as windchill needs to be factored in.

To determine the required temperature I just use an array to lookup the required temperature based on the feels_like temperature. It’s hard coded but can be easily updated.

As underfloor heating has a slow response time I use the value of the next time interval (+3 hours) to set my temperature.

As an addition I reduce the nighttime temperature by a few (configurable) degrees as reduced heating aids sleep.


Wow, so I guess you’ve done it for pure reasons without going for the government incentives like me and many others on here. If you feel like describing your system (maybe in a new discussion?), I’d read it. I’d be particularly interested in the controller hardware and software, of course, but I think your temperature calculation for underfloor heating will be different to someone like me with radiators.

Oh and welcome and are you using emoncms to monitor it or considering it?

1 Like

That’s wonderful to hear @Timbones - welcome to the forum!

If you fancy a chat in real life please DM me. I’m about 15 miles south of York.

No, I’m afraid it isn’t.

Here’s my curve in code including my comments about why it’s set this way. It was originally based on the Ecodan curve.

# 2020-02-29 Reducing top from 40 to 38 now we have longer, gentler heating
# 2020-03-02 Bumping back up to 40, <significant other> was cold this morning
# 2020-03-05 Bumping back to 38 now I found it wasn't using the effective temp
# 2020-12-25 Reducing uplift from 4 to 2 to make it run more gently
# 2021-01-03 Increasing uplift from 2 to 4 because <significant other> is cold

compCurveValue = int(38 - 2 * effectiveOutdoorTemperature / 3)
ensureNotTooHigh = min(compCurveValue, 50)
ensureNotTooLow = max(
    TemperatureThresholds.minFlowTemp(calculationMoment, deviceInfos),
return ensureNotTooLow + 4

I’ll be interested to see how you get along. I wasn’t able to work out how to make a decision about what to do because there is one heating system trying to feed all the different rooms with their different behaviours. In the end I fell back to a very dumb approach of pumping the water round and letting each room decide what to do it with using a local TRV custom-programmed for that room.

Ooh, well spotted. Thanks for sharing.

That’ll be interesting to see too.

I have a cunning plan that might help you. You can see I have a calculationMoment argument in my system. I can use that to move backwards (or forwards!) in time to see how the system would behave when I’m altering the algorithm. It means I don’t need to wait for a scenario to occur in real life, I can just find a time when the system was in an interesting state and see what the algorithm would do with it. Of course it means I have 6 million state files giving me the data from every minute since I got the heat pump (and also my weather station, solar panels and electricity usage).

I’ve also got Python unit tests which make up interesting scenarios and I have those gating the release of the Docker container. The most important one being TestSignificant OtherWillGetShower which ensures I don’t messing up the hot water cycle and upset the occupants.

I’m sure your more than capable of doing that in PHP too. That’ll give you good insights into how your new control algorithm will behave with varying future windows (such as that 3 hour window mentioned by @Acuario )

Thanks again for sharing.

1 Like

I’d concur with @Acuario on this.

When we had some storms here I adapted the code to use effective temperature and it made it much better. It turned out it helps the heat pump respond more appropriately at other times too, but it’s less obvious to the occupants. Of course it would be better to fix the draughts (we’ve done this) and to insulate the house so the wind wasn’t cooling the walls so much.

It’s nice to see you doing this but I’m still confused that so many people run their heat pumps overnight. Here’s the cron-formatted schedule I use:

0 6 * * 1-5 On
30 8 * * 0,6 On

0 22 * * * Off

Which means the heating is off for about 8+ hours overnight. I do sometimes nudge it back on at 01:00 if I’m working or guests are still around.

We’re in a 200 year old house with solid walls and quite a bit of internal brick. It does get a bit cooler overnight, but not dramatically. Here’s a couple of the sensors.

Can someone help me understand why so many people are running the heat pumps overnight?

There seems to be a persistent myth that heat pumps should run 24-7. One reason may be the dent that start-up puts in the measured efficiency, so if you run it all the time, your efficiency/CoP looks better, even though you end up using more power than needed as you probably heated some rooms more than needed — and pumped water around for longer than needed, because I think yours is still the only system I’ve read about where it deliberately shuts the pump down and waits a while for radiators to lose some heat.

Also, it’s not really helped by statements like on this Energy-Saving Trust blog that “In Europe, however, they’re more likely to leave heating equipment on for longer,” although it does continue to advise “and instead of turning it off, they simply reduce the temperature overnight or during the day when out at work. This is a good strategy.”

I guess strictly-speaking mine is still “on” overnight these days, in that the system is powered-up just with the target temperature turned down, so it can come to life if it gets really really cold, but the heat pump has never yet run overnight without being prompted (like at New Year).

We have to remember that even with old boiler systems, some people still claim it’s cheaper to heat rooms to the same temperature all the time instead of letting them cool when you know no-one will be there and heating them back up just before use.

Edit to add: Ecodan poster-child case study on Mitsubishi’s website says “We run it at 22 degrees 24 hours a day, seven days a week and are toasty. We have full time confidence that we will be warm, that cost is not an issue and our arthritis has been less painful.” I wonder if they still feel that “cost is not an issue” after the £/kWh has doubled in less than a year?

1 Like

For my property, I found that the room temperatures were plummeting during the night, and then the heat pump was having to work extra hard in the morning to get the house warm again, and it wasn’t until about lunch time that the temperatures were back up to where they should be. I estimate my heat loss is between 400 and 450 W/K, even after fitting in extra insulation where I can.

So, I switched to keeping the heat pump on overnight, with the room thermostat turned down a bit, the house manages to maintain that temperature with short 20-minute bursts of heat pump. I feel like this is producing better efficiency, though I accept I may be consuming more electricity overall. The house is more consistently warm though, and and I get fewer complaints from the inmates.

I might try turning it off overnight again and gently increasing the flow temp in the morning, though EcoDan seems to ignore that setting half the time.

I come up with the following formula for the weather compensation curve of my property:

(diffT * HeatLoss / HeatOutput + 0.117) / 0.0223 + T

  • diffT = difference between outside temperature and the desired indoor temperature (°K)
  • HeatLoss = how many watts of heat are lost per degree of delta temperature - 410 for me (W/°K)
  • HeatOutput = total output of all central heating emitters at standard dT of 50°C - mine is 16655 (W)
  • 0.117) / 0.0223 = is derived from the magic gradient that maps dT 50°C to lower flow temps
  • T = the desired target temperature for the whole house (°C)

This gives me typical looking “curve”, with a gradient close to 1. Probably not much better that any wet finger approach I did before, but it’s nice to see it come from real numbers.

1 Like

It all started a number of years ago when I decided I wanted to heat my pool with a heat pump. After some investigation I discovered how to convert a pure cooling split aircon into a heating (only) machine. I built my own coil heat exchanger and installed it where it has now been running for a number of years. It didn’t have any sort of control system (and still doesn’t) but works very well.

Following on from that I decided to add a heat pump in series with my oil boiler which at that time fed radiators (iron!). I upgraded and enlarged the radiators to aluminium and started developing a controller for the heat pump. Originally I was using a PIC processor but it was limited on memory etc… so I then changed to an Arduino Mega. Much better until along came the ESP8266 with WiFi and all.

The heat pump(s) that I have are from old mini-split systems. They aren’t inverter, just on/off compressors. I did hack a Daikin split inverter but it’s a huge challenge when there is absolutely no published information. I did get a very basic controller working with the Daikin but as I can’t rely on the machine lasting indefinitely it seemed an excessive effort that may later be wasted. So I decided to stick with the non-inverter machines. As I install air conditioning systems I regularly obtain old machines so have a reliable source.

As I said, the controller uses an ESP8266, the -12 which has plenty of memory but is a little lacking on I/O so I designed an expansion board with I2C parallel I/O and analogue inputs (for temperature sensors).

One of the interesting challenges of the software was developing the auto-defrost algorithm, it took a couple of years to perfect it but it’s now working a treat. Typically heat pumps have freezing problems around 5 to 6 degrees C but not always - it depends on the dew point.

Initially I used my own coil heat exchanger fitted inside a 100 litre hater heater. Later (when one happened to become available) I upgraded to a plate heat exchanger - I now have 2 machines, each with their own plate heat exchanger, connected in series.

After running the heat pump with radiators for a couple of years we did a renovation on the house and so as part of that I installed underfloor heating (all our floors are concrete slabs).

The (huge) plus side of underfloor heating is that I can use it in the summer for under floor cooling - something that radiators can’t do. For anyone without the option of changing to underfloor heating/cooling you could use a fan-coil although I don’t have experience of them.

As part of my controller I have added a web based interface for programming/monitoring and also an android app that connects via MQTT so I can control the machines remotely.

There’s loads of information on the ecorenovator.org website, including more details/photos of my build - just search for posts under my name, Acuario.

At the moment, no I don’t use emoncms but you never know, I might add it.
And no, I didn’t build the system for any government incentive (where I live in Spain I don’t think there are any…). I built it all because it was (and still is) a fun challenging project to do. If you discount my time, it has probably cost me less than 500 euros to build as almost everything is recycled.


It ignores you setting the flow temp in heat-flow mode? I’ve not tried setting that yet but I think @MyForest must as part of his controller. I think I have noticed a quirk where the reported target flow temp does not change while the ecodan is heating tank water, the setting only changes after it switches back to space heating, but I suspect you would have realised if that was what you’re seeing.

I just checked and there is a MELCloud integration in HomeAssistant (MELCloud - Home Assistant). There are also a multitude of ways to control the demand, get weather info in etc. I don’t have a heatpump but use HA to control the temp of each room depending on day of week/ time of day & presence. I’ve not added any real weather compensation in other than gradually raising the target temp in the morning. I know that, by x o’clock, the room temp really needs to be Y for it to be comfortable when we get up.

Any folk who do not want to play with Python directly, may find this route useful.

I’m a fan of Homeassistant and you really can do anything you need either directly or in the Node-RED addon.

I am also hoping that companies wake up to the benefits of making their systems accessible to things like HomeAssistant. For me it is a key element of the purchase decision going forward.


Well that’s quite beautiful @Timbones

I love the scientific approach to diffT * HeatLoss / HeatOutput and your T makes sense. I think the bit I find hard is that I don’t have a T because there can be 5 °C difference between the rooms here. Notably HeatOutput is variable here because each TRV could be on / off depending on the local temp so I very rarely get full output.

I almost fell off my chair when I compared your 410W/°K to what I was seeing here. It’s roughly 20 °C in my house and the temp outside is 7 °C so the delta is 13 °K.

Here’s a typical run from today.

That 0.696kW at the top is the average power draw. So my total power draw is less than twice what yours is per degree!

Luckily I noticed that you are of course measuring heat loss after it’s come out of the heat pump :slight_smile:

So in my case that’s 2.63kW on average => 200W/°K. As I mentioned, I’m near York so we’re seeing much the same weather. I’m right out in the countryside so we get blasts of wind hitting us. We’re in a 4-bed semi which is 200 years old and has lamentable insulation. I’m surprised you are seeing so much heat loss. According to BRE we might expect your heat loss to half of mine, not double - although having said that they expect my heat loss to be 640W/°K !

BTW I love this quote I tripped over:

In a typical British home up to one third of the heat produced by central heating systems is lost through the roof, walls, floor and windows.

Where does the other two-thirds go? Down the sink?

Maybe Brownian motion is great at cooling.

My science teacher used to tell us that we can only move energy around, and only God can create or destroy it. Maybe the author of the above lives with God?


1 Like

Well, maybe my numbers are off, but I worked it out from the other direction: I entered the dimensions and materials for each room into a heat loss calculator. I found this one to be sufficiently sophisticated for my needs, using the default winter design temperature of -1°C and typical indoor temperatures. Adding them all up comes to a total of 9.5 kW. Divide by the delta (which could be different for each room) to get W/K. I actually got 473 out of my sums, but I found with trial and error that 410 just seemed to fit better with the curve. I think this is because there are other heat sources contributing to the home.

Using a calculator for radiators, I get a total output of 16.6 kW @ dT 50, or 9 kW @ dT 30 [see this conversion table]. That means for a room at 20 degrees, that would be for a flow temperature of 50°C, which would roughly match my heat loss when it’s freezing outside. My formula is working out the flow temperature needed for the radiators to replace the heat that is lost at a certain outside temperature.

I’m not sure if you can look at the heat pump output to judge the heat loss, but maybe you can?

Say it’s 10 degrees outside and 20 degrees inside, and my ASHP likes to hum along producing 4 kW of heat. Given that 10° delta, my calculated heat loss is also about 4 kW, and the house is staying a pretty constant temperature. [Massively simplified numbers, but it close enough for the illustration.]

Anyway, I think I’ve convinced myself that a) that heat loss figure is probably close, and b) I need to invest in a lot better insulation and draft proofing!

1 Like

Your approach makes sense @Timbones

I’m doing roughly the same thing, but my heat pump is only running maybe a third of the time.

I’d credit all the non-heat-pump electricity as heating your home too …where else does it go? The inmates are 100W each.