Improve efficiency: Heat the hot water when it's cold

My flow controller has a mode that tells it to heat the hot water if the temperature (measured at the bottom of the tank) drops by 5C. You can extend that all the way to a drop of 15C if you look in the menus.

Sadly that means a shower at 20:00 causes the heat pump to kick in when the outside temperature may have dropped.

As discussed elsewhere, it’s better to wait for it to be warm outside before you use the heat pump.

However, another factor is that the default behaviour means the water in the tank is already warm when the heat pump kicks in.

My hot water is at 42C so a 5C drop = 37C and the theoretical CoP is 2.9. If we use a drop of 15C then it begins heating when the water is at 27C and a CoP of 3.7. However, if we leave it alone and wait until shower is completely done then for example yesterday the water in the tank dropped to 11C and the CoP was 4.

In this graph looking at the efficiency of the hot water based on the average outside temperature for the day, we can see there was a bit of an improvement. The blue and green lines represent some of the experimental outcomes and the red line was the old behaviour.

Mine appears to allow up to 30C drop… but how cold can the bottom of the tank get before there’s not enough hot water for a bath? That’s about the point where I expect occupants to start complaining… but maybe not too strongly at first because the old analogue oil boiler and smaller tank fairly often got it wrong if no-one pressed the “heat now” button when a bath was drawn. :wink:

1 Like

Luckily my lot take showers and if it gets cold they get out of the shower :slight_smile:

However, it’s invariably fine and they don’t ever mention it.

In the Summer the solar panel excess heats the water and in the Winter the heat pump is on so often that the water is always warm.

Maybe use your old tiny water tank as the new bath?

I’ve taken the exact opposite approach, which I’m now wondering is a mistake.

I prohibit the hot water mode overnight, until 9am when it heats up to 40°C, and then at noon I heat it again to 45°C (when it’s warmer / sunnier). The target temperature is then dropped back down to 40°C at 7pm, though it won’t fire up until it’s dropped 13 degrees below that.

Gonna try heating it just once in the morning instead, see how that affects CoP.

I also tried to preempt the legionella cycle by heating it up to 50°C before the immersion kicks in, but then the unit decided to do it a day earlier than I expected. :man_facepalming:

Incidentally, I assume you’ve found the “Eco mode” for hot water? Accessible via long-press on menu button on main unit (IIRC). I think this heats the water more gently over a slightly longer period, for better efficiency at the expense of space heating. Any thoughts on whether that’s worthwhile or not? It might be something to programmatically enable/disable depending on season or outside temperature perhaps?


Nice to hear people trying different things.

Although I have ECO mode enabled mine is still pretty fast. Sadly you can’t change it via the API.

I’ve disabled the legionella run on mine but the Python code keeps an eye on case it’s been a long time. Now that I’m lifting the DHW temp higher overnight for cheaper electricity it gets sorted very often.

1 Like

I don’t. I heat one tank about 4am to use the cheaper overnight rate to be ready for morning washing. I’m contemplating whether to do that at midnight instead, when it tends to be warmer, but that would mean the pumps running when people are trying to get to sleep, so I probably won’t.

I also raise the tank target temperature during the last two hours before sunset on a warm day.

I’ve found that allowing too large a drop means that the reheat takes so much longer that it consumes more power over a day. I suspect the sweet spot is to reheat when the tank temperature is approximately the heating flow temperature, but I’ve yet to test that.

Oh that’s interesting: I hadn’t noticed that the heat pump was only used to take it up to tank target temperature. I think we may be better reacting to OperationMode 6 (which seems to be what causes pymelcloud’s device.status = ‘legionella’) than doing it on a timer: I’ll try it before next run. I’ve not taken @MyForest’s approach of implementing my own legionella logic because I am trying to leave the ecodan controller with a sane setup if my Pi crashes or dies.

Yes. Seems to work well enough for us.

Very sensible. If our things goes wrong for more than a week I will need to hand full control back to the Ecodan.

It is weird wondering what would happen if you ended up in ICU for a month with COVID. How would the family cope with keeping things running that you just gently nudge every day.

Interesting. Do you have some figures on that? If it’s true then this whole thread is sorta nonsense and we should remove this suggestion. Honestly, I’d be quite happy to be proven wrong on anythign like this.

1 Like

Only on melcloud (so not easy to extract or illustrate) and I think it’s pretty marginal, in the realm of 2-3kWh a week. Over 80% of our power usage in winter is space heating so I’ve been focusing on that since getting emoncms/emonSD up and running. As I suspect you all already know, the biggest water-heating-related gain is to run the space heating for 30-60 minutes after finishing heating water so at least that period starts from hot not cool.

1 Like

I’ve been meaning to see what our hot water costs; please note we have a Samsung heat pump which doesn’t seem to have the control you guys have (although I’m now going to have a look in the manual to see if I can use the Hive to control it’s hot water so I can get some automation going).

I just posted this on another forum:

I’ve just had a look at our energy consumption for heating hot water via heat pump. Tank is 250l, 2 in the household.

It runs each morning at 2am to heat to 50c with a weekly legionella run.
2am is not the best time for efficiency as it’s pretty cold outside but we’re on Octopus Go so only 5p/kWh.
Typically it is heating from around 44c and stops between 50.5c and 51.0c.
On Sunday morning, legionella runs after this and takes just the top half of the tank from 50c to 68c.
The day after legionella it doesn’t heat because the tank is still hot enough.

For the last week of January it used 11.9kWh, so is about £31/year!

In warmer times we will get greater efficiency from the heat pump and may return to PV diversion in really sunny times.
Thinking about it though, perhaps it would be even better to heat water in the afternoon using the heat pump with either PV or stored energy.
Just harder to control and more expensive if I get it wrong because of using full-price kWh!

At the moment, I’m quite pleased with this.


What I’d really like to see, is inline electric water heaters that take warm water. I looked for these when I built my house and couldn’t find any, but if they do now exist, tell me.

I think heating a tank so it is hot enough for shower/bath is always going to be inefficient. An electric inline heater that heats the warm water to a specified target temp is a better solution. It is targeted and gives you exactly what you need when you need it.

The discussion is then all about how hot the ‘warm’ water in the tank will be heated to, and when, to maximise the trade off between high COP and tank losses.

Equally, when there is really cheap (or negative) electric, you can heat the tank restively to a higher temp. Any inline heater will just cope.

You can also then put the inline heater close to the point of demand. Minimise pipe losses for short bursts of hot water, and minimise losses for longer draws as well.

It seems an obvious solution to me, so do not know why they are not readily available.


Well, you’ve made me investigate what our system is doing @christian

The bottom of our hot water tank drops almost to the “incoming cold water temp” when someone has a shower. So in this case that’s about 14 °C:

How is your tank starting out at 44 °C? Is that the reading from the top of your tank?

In other news you can see how our Ecodan is getting very excited, even in Eco mode, and is pushing the flow up to 55 °C so that the tank gets to 45 °C. I wish it would just be a lot more relaxed.

That chart is showing the replenish after a single shower. It used 1.2kWh input and produced 2.8kWh output. An electric shower is about 10kW and the people here shower for about 10 minutes so that would be about 1.6kWh required output. So clearly we’re using a lot of power to re-heat the hot water tank which isn’t good - you’d hope it would be 1.6kWh or less output (and consequently less input too).

However, our four-person house is using way more power than you to heat water…the last month was 167kWh so even that month (at 24GBP) was almost as much as your annual cost. We’re pretty much only using hot water for bathing.

You are using 6 °C * 250L * 4kJ/L/°C = 6,000kJ = 1.67kWh of output per day. So that’s about half the output of a single shower here.

Bear in mind I removed the power shower (16L/min) and we’re on the mains pressure now which gives about 12L/min. We measured it with a jug so it’s empirically 12L/min, not just a number from a guide.

Seeing as you are having two showers a day that’s 0.8kWh output per shower. That would be 4.8 mins with an electric shower so I’m assuming you are taking sensible-length showers.

As another example, here’s a time when the tank went down from 44 °C to 9 °C using two showers and was then pushed back up by the heat pump. That shows we used 6.2kWh output for those two long showers which would be the equivalent of running an electric shower (10kW) for 37 minutes!

I just measured our shower (37 °C) and incoming water (7 °C). So, for instantaneous heating we would need a 30 °C uplift at 12L/min = 30 °C * 12L/min * 4kJ/L = 30 °C * 0.2L/s * 4kJ/L = 24kW. That would be 100A using 240V in the UK! Here in the UK most houses are supplied with between 60A and 100A.

It turns out an instantaneous electric shower would simply not be capable of doing this:


So, as @borpin says, you’d need to start with warm water. If we take the 10kW inline heater as an example, it would be able to raise a 12L/min flow by about 13 °C. So we’d need a store of water where we’d already come up from 7 °C mains up to 24 °C. That sounds like ideal heat pump territory.

Now the interesting bit. An inline heater would be 100% efficient. However our heat pump is over 200% efficient. Arguably it’s much, much more expensive to build though.

Here’s that “double shower” re-heat run from above viewed from the perspective of the heat pump heating up the DHW.

You can see it got down to around 200% efficient as it got to the end and the tank water got up to 44 °C.

I actually run the hot water at 42 °C most of the year but it gets boosted to 44 °C in the Winter to be prepared in case someone comes back chilled-to-the-bone and needs a boost. However, I just spoke to the primary need person and they are happy it’s plenty warm enough so I think I’ll drop the target temp and see if that helps.

Looking back at the Summer is so weird. For example, it looks a lot happier on this run which was only one of four in the entire week (versus three or four a day in the Winter). It has far less work to do and the air is so much warmer. Summer is nice :slight_smile:

When it’s cold all the “losses” from the hot water tank actually heat up the utility room where we chose not to have a radiator so they aren’t really “losses”. When it’s warm it doesn’t lose so much (smaller deltaT) and there’s much more heat available so I’m not so worried about those losses.

It’s actually the same with the pipe runs to the shower. I don’t mind that water being wasted in the pipes because it’s “poor person’s underfloor heating” and the heat is lost (mostly) into the lived-in spaces.

1 Like

Altough I have a ground source heatpump with a custom heating control system, I have a recoreded sensor both at the bottom and at the top of my 300L tank. Results might be interesting here.
I was playing with the settings of water heating, because heat pump was starting too often.

Here is a graph of the last 24 hours.
Yellow is the temperature at the upper sensor.
Blue the temperature at the bottom sensor.
Red shows the time, when the heatpump was running to heat the tank.

The controller is now set to a minimum of 36°C and a maximum of 42°C, measured at the bottom sensor.
One of my changes was to lower the minimum temp from 39°C to 37°C some years ago.
That already resulted in less heatpump startup count. After installing the upper sensor last year, I lowered the lower setting to save some HP startups.
Then I set it up in the controller to not heat the tank, when the alarm system is armed (meaning nobody is at home). That is why the controller didn’t start to heat the tank yesterday afternoon.

As you can see, the temperatures at the upper half are moving much slower. That means, the water is hot enough for nearly everything even after some hours out and not reheating the tank.

The results would be similar also with a gas heated tank (difference between top and bottom sensor temperatures), although the temps much higher.


But accounting for the other losses (pipes, tank, heating unused water), the difference in efficiency is far less.

On my gas boiler, I have a mixing valve such that the flow from the boiler does not enter the tank until the output temp is 55 deg (IIRC). I’d found that the big slug of cold water that was sitting in the flow pipe killed the tank when the boiler started. There is very little dip as the heat cycle starts.

You must be hardy folk. a tank that cold would never satisfy me for a shower.

1 Like

Thanks for sharing @bekesizl

Your ground source heat pump is allowing you to chose when to heat the water much more comfortably than our air source ones where we try to find a warm time of day. It’s nice to see you benefiting from that.

Haha yes.

Yes, top of the tank which has 3 pockets, top (153cm up from the floor), middleish (135cm from floor) and bottom (18cm from floor). The heat pump uses the middle which is just above the upper immersion.

I wanted to monitor the bottom too but I already have 6 DS18B20s off the emonPi (heatpump flow/return, tank top, cylinder flow and heating flow/return after the buffer). I may repurpose the cylinder flow now as I wanted to know when the heat pump is heating the tank.

Reading just the top of the tank I know if there’s more than 42c the shower’s going to be okay.

Oh, @MyForest , you caught me out; we shower every second day, but we don’t smell, honest! Shower is from unvented cylinder/mains pressure.

While I currently only heat water at night, I like this idea for the heating. Our heating is 19.5c from 08.00, 20c at 14.00 then 21c at 18.30. If we’re out it would be better to hold the current temperature rather than ramp it up.

On the subject of in-line heaters I agree, it’s what I thought I was getting some years ago with a boiling water tap in the kitchen and we were deeply disappointed to come home to find we effectively had a kettle under the sink! It was a nice thing to have though.
In my mind it it could be such a simple thing, but I guess it gets really complex to deal with different flow rates and deliver the right amount of heat without burning people.

1 Like

I’ve had some thoughts that may support the theories presented above, having been sat in draft for several weeks, and in no particular order:

  • A hot tank loses heat faster than a warm tank, so it seems wise to avoid heating the water for times or temperatures that aren’t required.
  • Air source heat pumps will be more efficient when the ambient temperature is higher.
  • Conversely, if one has access to a lower nighttime tariff, then there’s clearly a benefit to storing energy when it’s cheap.
  • There may be a considerable amount of “hot enough” water in the tank than a bottom sensor might indicate, and running the heat pump may not be always necessary.
  • A heat pump works hard to get up to temperature, so it seems logical to do this as infrequently as possible, and maximise how much water is heated each time.
  • If the tank temperature has dropped by (say) 5°C, then the flow/return temps may have a long climb to “catch up”, using the heat in the tank. Only once the flow temp exceeds tank temp does the heat pump actually start up (at least on my system). While the actual heat loss is probably minimal, it still seems a bit backward.

I’ve since changed my approach slightly:

  • Hot water heating is prohibited overnight until 10am, when it is heated up to the ideal temperature (45°C). There is always enough hot water from the previous day for a shower one is needed before then.
  • At noon, I consider how much solar energy has been stored in the battery, and how much more is forecast to be collected in the afternoon. If this exceeds the capacity of the battery, then I’ll heat the hot water again up to 50°C. This is, in effect, to emulate having a PV diverter, while taking advantage of the heat pump’s CoP.
    As we get in to the summer months I might combining both of these into a single heating cycle, and experimenting with higher temps.

Thanks for sharing @Timbones

It seems we’re coming around to something like the same way of doing things.

Here’s my current setup:

def tankTemperatureToTriggerHotWater(calculationMoment: datetime.datetime, deviceInfos: DeviceInfos) -> float:
    """Only turn on the water if it goes below this temp"""

    desiredWaterTemperature = TargetWaterTemperature.targetTankTemperature(calculationMoment, deviceInfos)

    deviceInfo = deviceInfos[-1]
    flowTemp = float(deviceInfo["FlowTemperature"])
    tankTemp = float(deviceInfo["TankWaterTemperature"])
    powerIsOn = deviceInfo["Power"]

    # Go just because the flow is really hot
    if flowTemp >= desiredWaterTemperature:
        # Don't just keep coming on all the time, we'll keep doing 2 minutes of water heating
        # Let the tank drop a bit below the target
        return desiredWaterTemperature - 10

    midpoint_temp = MidPointTemp.midpoint_temp_for_month(calculationMoment, deviceInfos)

    if midpoint_temp > TemperatureThresholds.quiteColdOutdoorTemp() and midpoint_temp < TemperatureThresholds.noHeatingRequired(calculationMoment, deviceInfos):
        # Always warm straight back up when someone has a shower
        # It's not likely to be heated by the space heating or solar diverter
        # When it's hotter than this we usually have some solar diverter action
        return desiredWaterTemperature - 15

    if powerIsOn and TimeBasedCriteria.warmPartOfDay(calculationMoment):
        return desiredWaterTemperature - 10

    if OctopusGo.powerWillBeCheapForNextFifteenMinutes(calculationMoment, deviceInfos):
        return desiredWaterTemperature - 10

    # Flow is colder than the desired water temp
    # If the flow is quite a bit warmer than the tank then still plough ahead
    # If the flow is cold, don't do anything even if the tank is way colder than we'd like
    # Eventually some space heating will lift the flow and then we'll do the hot water

    return flowTemp - 20

It’s having that fight with itself about whether to come on when the power is cheap / low CO2 or to wait until the ambient temp is warmer.

I turned off the forced heating at 00:30 because it was dreadfully inefficient.

Weirdly though it did turn itself on during the night on 2022-03-25 because the water was cold due to a late shower and the drop in price looked encouraging. That brought the cost of the shower down to just under 0.05GBP but the CoP was a lousy 2.

Log 00:31: We’re going to heat the tank to 39 °C because it’s at 20.5 °C which is lower than the trigger temperature of 29 °C and the flow is at 24.0 °C (ForcedHotWaterMode → true from ManageSpaceHeatingPower.manage)

It was incredibly close to coming on when the space heating finished at 22:42 but the tank wasn’t quite cold enough to trigger it by half a degree:

Log 22:42: The trigger is 18.0 °C, the tank is 18.5 °C and the desired hot water temp is 39 °C

So it seems we’re getting very close to edge with the types of approach we’re taking. Trying to balance the ambient temp / cost / CO2 / unpredictable demand and other things is clearly very tricky. In fact I don’t think I could train some ML to do this because the utility function is so shaky. I thought I’d be using my ML stuff from a couple of years ago to do this but I don’t think it’s worth the effort seeing as my DHW for the year is about 200GBP.

Having your battery in the mix must make it even more interesting, especially if you’re also trying to mix and electric car into it at some point!

1 Like

I tried another experiment where I try to heat the water as late as possible in my “cheap electricity” window. It runs from 00:30 to 04:30 at the moment.

Here is the behaviour when I start heating the DHW as soon as the electricity is cheap at 00:30. The yellow line is the temperature at the bottom of the 300L tank:

and here is what happens if I leave it as late as possible - it just about finishes heating the water at 04:30:

So at 08:00 when the residents come to have a shower the bottom of the tank is at 49.5 °C instead of 46 °C.

That’s not really much difference at all.

There is also the magic of deciding when to start heating the water having imperfect information about the amount of heating required and what we will be able to deliver.

As you can imagine, I’m building up to trying to use the power more flexibly when we can move back to Octopus Agile when the current price madness is over (if ever).

1 Like

I have belatedly come to that same conclusion. I’d previously thought long boiler runs would be better, but I think shorter runs more often to a lower temp are better.

A hardy soul. I like my showers hot :rofl:

Yes and only the Mk1 Brain can do that!


there are some (ie bradford white → kwick shot) or you can use my adruinio sketch ( posted on OEm some time ago ) that make and any one of those instant water heaters into one
that will work with warm input - I made it for my solar water heater and heatpump that all connected to the DHW – it monitors the tank the instant water heater and the out put if the DHW is above 50C in the tank the instant water heater does not come on if below it will heat the water to 50C.

it also make the hp more effecient as i only heat the DWH to 44 c which is in the range of high COP if 50 or above the COP dropps significantly . and I just use the IWH to top it up… it saves you more energy because the tanks temperature is lower so the heat loss is lower and the cycling is lower as well it saves you about 1/3 of energy usage over all I would estimate for DHW