we replaced our old oil burner with a new air heat pump and I`ve chosen a product that had some kind of smart home integration. I just had to add the great KM200 Binding from @Markinus to manage the heat pump via OH.
the first thing I optimized was the time when the heat pump heats the warm water tank. by default water is simply heated when a low-temp trigger value is reached. an air heat-pump extracts energy from the outside air, hence the higher the outside temperature the more efficiently the pump works.
the attached rule tries to find the peak of the outside temperature during the day and triggers the heat process.
I can image to adopt the rule also for the heating circuits as well, like stopping the heating in the morning when weather forecast announces warm weather.
anybody else optimizing a heat-pump with OH? I guess this saves some $$$ on heating billsâŠ
val mailActions = getActions("mail","mail:smtp:xxx")
var Number avgtemplast10min = 99
rule "WĂ€rmepumpe daily runtime u starts"
when
Time is midnight
then
Buderus_daily_runtime.sendCommand((Buderus_heatS_workingTime_totalSystem.state as Number - Buderus_heatS_workingTime_totalSystem.historicState(now.minusHours(24)).state as Number))
val Number dailymins = (Buderus_daily_runtime.state as Number / 60)
logInfo("Buderus.rules: ", "Heatpump Laufzeit: " + dailymins + " Minuten")
Buderus_daily_starts.sendCommand(Buderus_heatS_numberOfStarts.state as Number - Buderus_heatS_numberOfStarts.historicState(now.minusHours(24)).state as Number)
logInfo("Buderus.rules: ", "Heatpump tÀglich " + Buderus_daily_starts.state + " Starts")
end
rule "find highest temperature"
when
Time cron "0 0/10 * 1/1 * ? *"
then
if (Buderus_dwh1_Operationmode.state != "off" && (now.getHourOfDay() >= 9 && now.getHourOfDay() <= 18) && (Buderus_Outsidetemp.averageSince(now.minusMinutes(10)) < avgtemplast10min ) && avgtemplast10min != 99) {
logInfo("Buderus.rules: ", "Temperatur sinkt, avgtemp last 10min Intervall: " + Buderus_Outsidetemp.averageSince(now.minusMinutes(10)) + " previous 10min Intervall: "+ avgtemplast10min + ", in 3h:"+localForecastTemperature_3hoursN.state + ", in 6h:"+localForecastTemperature_6hoursN.state+ ", in 9h:"+localForecastTemperature_9hoursN.state )
if ((Buderus_Outsidetemp.state >= localForecastTemperature_3hoursN.state) && (Buderus_Outsidetemp.state >= localForecastTemperature_6hoursN.state) && (Buderus_Outsidetemp.state >= localForecastTemperature_9hoursN.state) && Buderus_WW_run.state == OFF ) { //(Buderus_dwh1_temp.state <= 48|"°C")
logInfo("Buderus.rules", "WW wird jetzt aufbereitet, Outsidetemp: " + Buderus_Outsidetemp.state + ", WW Zieltemperatur: " + Buderus_dwh1_currentSetpoint.state)
Buderus_dwh1_Charge.sendCommand("start")
//Buderus_dwh1_singleChargeSetpoint.sendCommand(Buderus_dwh1_currentSetpoint.state as Number)
//Buderus_WW_run.sendCommand(ON) //item mit 12h autooff oder in der frĂŒh auf off
}
}
if ((now.getHourOfDay() >= 9 && now.getHourOfDay() <= 18) && (Buderus_Outsidetemp.averageSince(now.minusMinutes(10)) >= avgtemplast10min ) && avgtemplast10min != 99){
logInfo("Buderus.rules: ", "Temperatur steigt oder konstant, avgtemp last 10min Intervall: " + Buderus_Outsidetemp.averageSince(now.minusMinutes(10)) + " previous 10min Intervall: "+ avgtemplast10min + ", in 3h:"+localForecastTemperature_3hoursN.state + ", in 6h:"+localForecastTemperature_6hoursN.state+ ", in 9h:"+localForecastTemperature_9hoursN.state )
}
avgtemplast10min = Buderus_Outsidetemp.averageSince(now.minusMinutes(10))
end
rule "start water heating at 7pm when forecast temp is still higher then meassured value"
when
Time cron "0 0 19 1/1 * ? *"
then
if (Buderus_WW_run.state == OFF) {
logInfo("Buderus.rules", "WW wird jetzt aufbereitet, Outsidetemp: " + Buderus_Outsidetemp.state + ", WW Zieltemperatur: " + Buderus_dwh1_currentSetpoint.state)
Buderus_dwh1_Charge.sendCommand("start")
}
end
rule "WW manuell aufgewÀrmt"
when
Item Buderus_dwh1_Charge received command "start"
then
Buderus_WW_run.sendCommand(ON)
postUpdate(Buderus_WW_LastUpdate, new DateTimeType())
logInfo("Buderus.rules", "WW wurde manuell aufgewÀrmt: " + new DateTimeType().format(" %1$td.%1$tm %1$tH:%1$tM"))
end
rule "reset WW_run"
when
Time cron "0 0 8 1/1 * ? *"
then
Buderus_WW_run.sendCommand(OFF)
end
rule "Alert on Failure"
when
Item Buderus_noti_nbrErrors changed
then
Thread::sleep(500)
logInfo("Buderus.rules", "Fehlermeldung der Heizungspumpe: " + Buderus_noti_Text.state)
sendNotification("xxx", "Fehlermeldung der Heizungspumpe: " + Buderus_noti_Text.state)
mailActions.sendMail("xxx", "ALARM: WĂ€rmepumpe", "Fehlermeldung der WĂ€rmepumpe: \n\n " + Buderus_noti_Text.state + " \n\nAchtung im Winter vor Frostgefahr! \n\nMeldung vom: " +new DateTimeType().format("%1$td.%1$tm.%1$ty %1$tH:%1$tM"))
end
Yes, Iâm even selling an energy management system that does this based on OH (sorry for the advertising break).
Itâs got a slightly different approach on run times as it is primarily targeting PV power cost savings.
When you have a PV whatâs really determining heat pump start and runtime is (excess) solar production so you can maximize self consumption thus (directly) save $$$ on power cost.
This may be specific to Germany, not sure about other countries.
It more or less boils down to the same heatpump run times (around midday).
Iâd be interested to know how do you determine how long to (pre-)heat.
If you know the maximum possible tank temperature, you could consider the tank to be a âthermal batteryâ with the current temperature being the SoC (state of charge).
Could you elaborate on the Buderus channels you have found out about ? Show the items you use, please. According to the KM200 binding docs there is no documentation on those so a lot of trial & error ahead for anyone with such a system I guess.
My first heat pump died after 8 years and my new one has a Tuya controller built in. I find they (heat pumps) work well, just you have to run to them when the air is hottest and hopefully your solar is producing for best savings.
I have a sensor glued to the shower pipe that knows when the first shower of the day is taken, this starts the heating during winter.
Once it gets to 60 degrees c to kill bacteria the heat pump stops for the day so the pump only starts once to reduce wear and tear.
In winter after not running all night the tank is warm enough for 3 people to have long showers, if it starts heating at the first shower then I get four showers with ease from the 170 litre tank.
not sure if I got your question, I donât care about the heat time. the boiler stops when the setpoint temp is reached. buderus allows to define a chargeduration after which the boiler also stops.
true, thats my future approach when I add PV on the roof. you should use a mixing valve at the outlet of the boiler and set that to eg 60°C. you donât want to burn yourshelf with 90°C hot water in the showerâŠ
I even plan a step further and want to use the whole house as thermal battery. one could use excess energy from PV to heat the cellar (which I normally donât do) and maybe even raise the temperature in other rooms by 1-2°C.
I simply added all channels the binding did provide and checked wether values were reported back or not. I then compared these values with the config panel (HMC310 in my case) to figure out what value had which description and purpose.
I can start heating the boiler via OH but I canât change either chargeduration nor singlechargesetpoint. I can change those values but theyâre changed back on the next sampling intervall⊠does this work in your setup?
those are the items that work with my Buderus Logathem WLW196i.2 AR heat pump with external boiler:
Iâm not an expert, but what I read is that the amount of starts of the compressor massively influences the heat pumps life-time. if the heat curve is not properly set and produces too much heat such that the thermostat valves are closing, then the compressor starts modulating resulting in many start/stops. best would be to lower the heat curve and find a pleasant room temperature while having all valves fully opened. this should run the compressor on a constant enduring level. less starts with longer runtimes should be the goal:
Explicit charge duration or setpoint to stop heating is different ways to ultimately achieve the same thing, maximum energy efficiency.
The more heat you generate when itâs the warmest phase of the day (or same while PV excess is available) the more efficient/cheaper your heating will be overall.
So how do you determine the heating stop setpoint ?
It must not be your warm water preset (I assume water from the tank will be downmixed anyway so you donât get a 90°C shower) as then youâre wasting a big part of your âbatteryâsâ capacity, harming efficiency.
I have three heating circuits, one for floor heating, one for radiators and one for the external hot-water tank. till now I only tuned the hot-water heating process: heat up once a day when max outside temp is reached.
the other two I did not touch yet, theyâre fully managed by the buderus logic. as soon as I found the ideal heat curve for my house Iâll start tweaking.
hoped to find others here to share tips/recommendations/experiences etc
I meanwhile have extended our energy management system so it now can combine cheapest hours of a dynamic tariff with PV surplus into an âenergy availability indexâ thatâs used to run/charge all sorts of time-variable consumption such as delayed start of washing machine, EV charging and of course heat pump buffer loading. Just won the German industry award for our EMS. So it seems to be working
BTW you can download a free demo and see how itâs built. Itâs all OH rules and config.
I am looking to optimize my warm water circulation system. My current setup includes an extra pipe to each warm water endpoint, with a circulation pump that distributes warm water three times per hour. Hereâs how I plan to optimize it:
Stop the Circulation Pump When Nobody is Home:
I have a working âat homeâ presence detection system. When it detects that nobody is home, the circulation pump should be stopped.
Pause the Circulation Pump Based on Room Usage:
I have room presence detection in place. If no one visits any of the warm water endpoints (such as the bathrooms, kitchen, etc.) for a defined period, the running cycle should be paused.
I have looked at the things and channels that the KM200 gateway is exposing, but I am not sure where to start. Can anybody give me a hint on how to achieve this?
As a last option, I would consider controlling the circulation pump directly with a switching module.
I do operate my cirulation pump with a sonoff device, a motion sensor in the bathroom starts the pump only when movement occures during times we usually have a shower. having a shower outside of these hours I can manually start the pump with a voice command to Alexa. the runtime of the pump is only 2min, this is enough in my case. Iâve also attached a couple of DS18B20 temp sensors. I found out that the buderus temp sensor for the water boiler is just a calculated number and totally nonsense, so I use my own temp sensor to control times of when to heat the boiler.
My last option is something similar.
I am also thinking of going with EMS Gateway from BBGKees.
On their wiki, I found some references to the circulation pump, which on the KM200 things channels do not see: