weheat blackbird heatpump not receiving room or target temp
Hi folks/Laxilief, Up to recently I've using OTGateway on my remeha CV boiler and it was working great. Thanks again.
I have now replaced the boiler with a weheat blackbird P60 heatpump, all electric. They (weheat) officially support opentherm but I am having trouble getting OTGateway to work with it. Perhaps you can point me at a good place to debug it, I'd like to contribute, and maybe get the OTGateway listed on their site of compatible thermostats as others may benefit.
The weheat system has a webportal which allows to test the connection to the thermostat. Initially it says everything is working correctly but about 20mins later it says "We detected your OpenTherm thermostat, but it is not giving a room temperature or desired room temperature."
I tried all the troubleshooting OT suggestions. duplicate to CH2, summer/winter etc. but Ive not yet been successful. Ive disabled the OT option "Sync max heating temp with target temp" as that was also throwing telnet errors.
I disabled the sensors it doesnt support, exhaust temp, pressure, and even though it reports the DHW values, the weheat system does not yet allow OT to set the desired temp so i disabled DHW too so I could inspect the telnet logs without extra errors.
For simplicity I have PID enabled but equitherm disabled. The indoor temp is being published via the homeassistant automation and it updating and working correctly, I can see it in the dashboard of OTGateway and in homeassistant.
To test, I used my old remeha isense thermostat which worked, and I also reflashed the D1mini32 im using to the DIYLess original firmware which also works, the weheat system doesnt complain (tested over multiple days). I inspected the mqtt published opentherm messages on both the DIYLess and the OTGateway to see if I could see the difference. I can see that for the OTGateway under indoor_temp->set ={} , where this was a value when using the DIYLess firmware.
Heres the MQTT opentherm messages (grabbed from MQTT explorer)
state = {"slave":{"memberId":64,"flags":93,"type":1,"appVersion":1,"protocolVersion":1,"connected":true,"flame":false,"cooling":false,"modulation":{"min":15,"max":0},"power":{"min":1.5,"max":10},"heating":{"active":false,"minTemp":20,"maxTemp":30},"dhw":{"active":false,"minTemp":30,"maxTemp":60},"fault":{"active":false,"code":0},"diag":{"active":false,"code":0}},"master":{"heating":{"enabled":true,"blocki…
settings = {"heating":{"enabled":true,"turbo":false,"target":19.3,"hysteresis":0.5,"turboFactor":7.5,"minTemp":21,"maxTemp":30,"maxModulation":75,"overheatProtection":{"highTemp":40,"lowTemp":10},"freezeProtection":{"lowTemp":10,"thresholdTime":600}},"dhw":{"enabled":true,"target":40,"minTemp":30,"maxTemp":60,"maxModulation":100,"overheatProtection":{"highTemp":95,"lowTemp":90}},"equitherm":{"enabled":false,…
sensors
heating_temp = {"connected":true,"signalQuality":100,"value":20.16}
heating_return_temp = {"connected":true,"signalQuality":100,"value":21.934}
heating_setpoint_temp = {"connected":true,"signalQuality":100,"value":21}
dhw_temp = {"connected":false,"signalQuality":100,"value":53.137}
dhw_flow_rate = {"connected":false,"signalQuality":100,"value":0}
exhaust_temp = {"connected":false,"signalQuality":100,"value":0}
pressure = {"connected":false,"signalQuality":100,"value":0}
modulation_level = {"connected":true,"signalQuality":100,"value":0}
power = {"connected":true,"signalQuality":100,"value":0}
outdoor_temp = {"connected":true,"signalQuality":100,"value":14.395}
indoor_temp = {"connected":true,"signalQuality":100,"value":19.7}
set = {}
status = online
and heres the DIYLess version
state = {"slave":{"memberId":64,"flags":93,"type":1,"appVersion":1,"protocolVersion":1,"connected":true,"flame":false,"cooling":false,"modulation":{"min":15,"max":0},"power":{"min":1.5,"max":10},"heating":{"active":false,"minTemp":20,"maxTemp":30},"dhw":{"active":false,"minTemp":30,"maxTemp":60},"fault":{"active":false,"code":0},"diag":{"active":false,"code":0}},"master":{"heating":{"enabled":true,"blocki…
settings = {"heating":{"enabled":true,"turbo":false,"target":19.2,"hysteresis":0.5,"turboFactor":7.5,"minTemp":20,"maxTemp":30,"maxModulation":75,"overheatProtection":{"highTemp":40,"lowTemp":10},"freezeProtection":{"lowTemp":10,"thresholdTime":600}},"dhw":{"enabled":true,"target":40,"minTemp":30,"maxTemp":60,"maxModulation":100,"overheatProtection":{"highTemp":95,"lowTemp":90}},"equitherm":{"enabled":false,…
sensors
heating_temp = {"connected":true,"signalQuality":100,"value":22.938}
heating_return_temp = {"connected":true,"signalQuality":100,"value":25.68}
heating_setpoint_temp = {"connected":true,"signalQuality":100,"value":20}
dhw_temp = {"connected":true,"signalQuality":100,"value":53.316}
dhw_flow_rate = {"connected":false,"signalQuality":100,"value":0}
exhaust_temp = {"connected":false,"signalQuality":100,"value":0}
pressure = {"connected":false,"signalQuality":100,"value":0}
modulation_level = {"connected":true,"signalQuality":100,"value":0}
power = {"connected":true,"signalQuality":100,"value":0}
outdoor_temp = {"connected":true,"signalQuality":100,"value":17.469}
indoor_temp = {"connected":true,"signalQuality":100,"value":19.69}
set = {"value": 19.68}
status = online
I notice I can get it to temporarily send the indoor temp if I enable the "Native heating control" opentherm option but 20mins later I hit the same issue, and of course that's not the idea as the OTGateway should be the heating control in this example.
In the telnet logs, with other issues solved, the only useful message is "[OT][HEATING][WARN] Failed set target temp"
Any debugging suggestions or obvious mistakes? Or should I just start adding debug messages and recompiling? Thanks again.
Hi,
but about 20mins later it says "We detected your OpenTherm thermostat, but it is not giving a room temperature or desired room temperature."
Indeed, the project reports the current indoor and target indoor temperatures only when "Native heating control" is enabled. It is assumed that in this mode the boiler itself calculates the required heat carrier temperature to maintain the set target indoor temperature.
For simplicity I have PID enabled but equitherm disabled. The indoor temp is being published via the homeassistant automation and it updating and working correctly, I can see it in the dashboard of OTGateway and in homeassistant.
For testing, it is better to disable PID and Equitherm and simply change the temperature of the heat carrier.
In the telnet logs, with other issues solved, the only useful message is "[OT][HEATING][WARN] Failed set target temp"
This means that the boiler is not accepting the target temperature of the heat carrier. It is possible that the temperature being set is lower than the minimum or higher than the maximum. Sometimes this can be due to the master member ID.
First, try enabling the Get min/max temp from boiler option, after 2 minutes look at the minimum and maximum heating temperature in the "OpenTherm diagnostic" section and try setting the heating temperature within these limits.
If after this you still see the error [OT][HEATING][WARN] Failed set target temp in the logs, then you should try changing the master member id.
upd: try with Master member ID = 11, Master flags = 1
Hi, thanks for the response. It helped me understand a bit more but didn't crack it yet.
Disabled PID and equitherm to just set the temp of the heat carrier. Enabled the "get min/max temp from boiler" option and after a restart and a wait, I set the temp to 20.1 which is within the opentherm diagnostics read limits, though 20-30 seems like a small range but could be for a heatpump I guess.
Opentherm diagnostic
Vendor: unknown vendor
Member ID: 64
Flags: 93
Type: 1
AppVersion: 1
OT version: 1
Modulation: min: 15 %, curr. max: 0 %
Power limits: 1.5...10 kW
Heating limits: 20...30 °C
DHW limits: 30...60 °C
The "[OT][HEATING][WARN] Failed set target temp" warning didn't change.
I then tried the "master member ID" = 11 and the "Master flags" = 1, but the same warning is there with no useful change to the telnet logs or the behaviour of the heat pump messages.
I noticed when the DIYless firmware was working, the set value was 19.68 which is outside the range of the opentherm reported limits of 20-30. But it appeared to work without error messages from the heat pump webportal.
Could be dodgy behaviour or reporting from the heat pump I guess. It's a shame the DIYless firmware isn't open to inspect the code flow, also can't get the same telnet logs, only a serial output, which looks like hex. The other thing i can think to try is to temporarily flash the ESPHome or Tasmota to compare the opentherm messages to see if they work or they could give clues to the difference.
Im 90% certain that the heatpump doesnt calculate its own heat carrier temp when using a thermostat as when i test the other thermostats i have i can change the PID settings and influence the behaviour. When the "Native heating control" option is enabled, and the indoor temp is reported, the heat pump doesn't throw the same warning for 20ish minutes but then then OTGateway does seem to stop reporting the indoor temp.
Thanks again for the help.
Hello, in my case HA rocognize only 2 entities homeassistant/climate/energy Loria_heating Loria_dhw
Nothing more, I use latest OTGateway 1.5.6 and newest homeassistant. must pain problem is that heatpump cant stop heating, because indoor_temp is still zero. Please, can we explaine how to ?
It's a shame the DIYless firmware isn't open to inspect the code flow, also can't get the same telnet logs, only a serial output, which looks like hex.
The diyless website says you can connect using OpenTherm Monitor to get useful information. This would help to understand what commands the diyless firmware sends to the boiler:
Enable OpenTherm serial output Enables OpenTherm commands dump to the serial (micro-USB) port. You can use OpenTherm Monitor software to monitor your setup. It allows you to inspect opentherm messages log and draw history graph to visualise system behavior. COM port is configured at baud rate of 9600bps.
Logs from the moment the boiler/esp was started would help me.
Thanks for the OpenTherm Monitor tip. I got time today to try it.
I'm picking through the logs, other than it also sends the room temp and room setpoint, along with the control setpoint, I dont see anything obvious. Its not yet obvious to me how to compare the serial output from the OTGateway and the OpenTherm Monitor output for the DIYLess 1 to 1, but I'm looking up the msg IDs to try and compare them more closely.
When I get time, I will try to recompile OTGateway with the option to send the room temp and room setpoint without the 'native control' option set just for a test, I see where to enable it in OpenThermTask.h.
In the mean time, I captured a few mins of logs for the ESP start and separately for the boiler start.
Okay, I looked at the logs, but I'm confused by the fact that the boiler returns 0 for many Write-Data requests instead of what we send it:
22:37:49.890731 T100e4b00 Write-Data Maximum relative modulation level (MsgID=14): 75.00
22:37:50.025656 Bd00e0000 Write-Ack Maximum relative modulation level (MsgID=14): 0.00 <<<
22:37:51.525766 T10010a00 Write-Data Control setpoint (MsgID=1): 10.00
22:37:51.660641 Bd0010000 Write-Ack Control setpoint (MsgID=1): 0.00 <<<
22:37:57.525831 T90101500 Write-Data Room setpoint (MsgID=16): 21.00
22:37:57.659710 Bd0100000 Write-Ack Room setpoint (MsgID=16): 0.00 <<<
22:38:22.529123 T907c0433 Write-Data OpenTherm version Master (MsgID=124): 4.20
22:38:22.664168 Bd07c0000 Write-Ack OpenTherm version Master (MsgID=124): 0.00 <<<
22:38:44.893516 T90181368 Write-Data Room temperature (MsgID=24): 19.41
22:38:45.027408 B50180000 Write-Ack Room temperature (MsgID=24): 0.00 <<<
And what's interesting is this:
22:38:07.893111 T80000200 Read-Data Status (MsgID=0): 00000010 00000000
22:38:08.027866 B4000020c Read-Ack Status (MsgID=0): 00000010 00001100
According to these flags, only DHW is enabled. Why?
The only difference I see in the logs is that if native heating is enabled, we don't set the control setpoint (ID 1), while diyless sets it to 10 degrees.
Thanks for taking a look.
It is strange also because while the heatpump sends the temp info for DHW back to the thermostat via OT messages, it does not allow control of it (the DHW set point or when to heat the DHW tank) via a thermostat, it has to be controlled through their web portal or app. They only (currently) allow the heating to be controlled via OT/thermostat. They say more control over DHW is coming in a future release so that people can make better use of daytime solar and variable rate electricity contracts but its not yet available. It is my only criticism of the company so far, that they don't allow fully local control, as it has an independent 4G connection for complex settings with their app and only local thermostat control via OT. They have an official home assistant integration but its for reading values only.
They have a list of compatible thermostats for OT (https://support.weheat.nl/s/article/Welke-thermostaten-zijn-er-getest-op-samenwerking-met-de-warmtepompen?language=nl_NL), sorry it seems in Dutch only, but they dont appear to have a better manual or white paper detailing the OT messages they actually send/listen to. Interestingly they list the Tasmota OT as not sending the set/actual room temp also.
What I can derive from that compatibility list and the behaviour of the DIYLess firmware and another OT thermostat I tested (Remeha iSense), is that the reporting and setting of room temperature should be optional, and appears to be only used for recording historical data to graph for the user so they can see how well the thermostat settings (PID etc) is achieving the desired temp. But the set and desired room temp is still expected, even when the thermostat is setting the heat carrier temp and not in 'native heating' mode.
What I would expect is that the OTGateway works without modification, and that I get (and ignore) a warning from the heatpump that the set/actual room temp is not being sent but in practice, without the room temp being sent, or for another reason, the heatpump is just not accepting the target temperature of the heat carrier from OTGateway.
Do you know of any way of setting/sending the OT messages manually for development/testing? Or is making temporary hardcoded changes in OTGateway, recompiling and reflashing the best way to go?
Regarding DHW. I meant why do you only have DHW on and heating off?
22:38:07.893111 T80000200 Read-Data Status (MsgID=0): 00000010 00000000
22:38:08.027866 B4000020c Read-Ack Status (MsgID=0): 00000010 00001100
HB: Master status 00000010 = Heating off, DHW on, Cooling off, OTC off, CH2 off, bit5 off, bit6 off, bit7 off LB: Slave status 00001100 = No fault, Heating not active, DHW active, Flame on, Cooling not active, CH2 not active, No diag, bit7 off
That is, in diyless you only have DHW enabled. Where do you see the heating working?
But the set and desired room temp is still expected, even when the thermostat is setting the heat carrier temp and not in 'native heating' mode.
Let's assume we can set the desired room temperature. With PID/Equitherm enabled this will work fine. But what value should we set if these modes are disabled? That is, when we're simply controlling the heat carrier temperature.
Or is making temporary hardcoded changes in OTGateway, recompiling and reflashing the best way to go?
For testing, I would suggest making changes to the sources and building the firmware. Change this: https://github.com/Laxilef/OTGateway/blob/master/src/OpenThermTask.h#L1212-L1213
To this:
// Native heating control
if (true) {
They have a list of compatible thermostats for OT (https://support.weheat.nl/s/article/Welke-thermostaten-zijn-er-getest-op-samenwerking-met-de-warmtepompen?language=nl_NL)
However. If I understand correctly, the current and desired room temperature are not necessary for weheat:
Wanneer de thermostaat de waardes voor kamertemperatuur en gevraagde kamertemperatuur niet beschikbaar zijn, zullen deze een waarde van -1 krijgen in de portal / app (of 20 bij zoneregeling).
Upd. Since your heat pump supports cooling, and an air-to-water heat pump operates on the same principle as an air conditioner, I've added a commit that sets the cooling setpoint equal to the maximum heating modulation. Please try building the firmware with this commit and enabling the "Cooling support" option.
This issue is stale because it has been open 15 days with no activity. Remove stale label or comment or this will be closed in 5 days.
This issue was closed because it has been stalled for 5 days with no activity.
Apologies for the inactivity. work got busy and it took me a while to get platformio and visual studio working on linux (i was blocking too many required connections with opensnitch)
That is, in diyless you only have DHW enabled. Where do you see the heating working?
Given your explanation of the flags, I can see why this shouldn't work but yet the heating works with DIYLess firmware. When I raise the target room temp above the current room temp, the heatpump starts heating. I can see it in the weheat portal and in home assistant and the radiators get warmer.
Got a chance to compile OTGateway today with the suggested line change in OpenThermTask.h and it appears to have had the desired effect.
The indoor room temp is now showing up in the weheat portal and so far it has not thrown an error after 20mins like before. I appear to be able to set the target water temp. Also the PID and equitherm behaviour seem right.
I will test it for a few days and report back.
The telnet logs still show warnings but the heatpump appears to be acting correctly.
[00:40:18][OT][HEATING][WARN] Failed set current indoor temp
[00:40:19][OT][HEATING][WARN] Failed set target indoor temp
[00:40:19][OT][HEATING][WARN] Failed set max heating temp: 21.00 (converted: 21.00)
[00:40:19][OT][HEATING][WARN] Failed set target temp
When the 'cooling support' option is enabled, telnet shows an additional warning,
Failed set cooling setpoint: 60% (response: 0%)
But I have not tested the cooling further. The cooling function of this heatpump is enabled but untested and is subject to a cooling test, which i dont know if its been performed. I have a low temp radiator due to be installed from the same company that supposedly allows the direct request for lower temperatures from the heatpump. I can test more once that is installed.
Will report back after a few days of testing for the indoor temp reporting. Thanks again.
Still working today, so I added an extra opentherm option to always send the indoor current and target temps. Created a PR for it. https://github.com/Laxilef/OTGateway/pull/192
The telnet warnings are still there but I think thats because the heatpump is accepting the value (it shows up in their portal) but it's not sending a valid response back. I'll see if I can capture the responses and contact weheat to see if they can confirm.
Hi @mipisoft,
Thank you for the detailed research!
Based on this experience, I don't think we need the Native heating control option at all; we can simply always send the boiler the Indoor temp via this->setRoomTemp(...) and the desired temperature via this->setRoomSetpoint(...). This is essentially what diyless does.
Hi everyone,
I Glad that little helps. I try research without heatpump, because must heating house :-) But few chips info: setRoomTemp is desired temperature in room, house (just simple heating area)
setRoomSetpoint by my research is temperature of heating fluid (meantime water) at outlet to heat (radiators, floorheat etc)
By more investigation of my heatpump (Atlantic Loria Duo) is more inteligent than i Think. "Selfone sets modulation of compressor".
My result is there is simple need send setRoomSetpoint and setRoomTemp if together dont know. But there is have logic. By me there is need send only while change one of them value.
I hope thats helped too. Tonight I try compile and test .