-
Notifications
You must be signed in to change notification settings - Fork 9
0008: Relay Heat Demand
The 0008
packet is a 'call for heat' instruction from a controller, sent to a device which can provide heat (e.g. a boiler, or an electric radiator); usually via a relay such as a BDR91.
16:44:20.110 045 I --- 01:145038 --:------ 01:145038 0008 002 F924
16:45:30.322 045 I --- 01:145038 --:------ 01:145038 0008 002 FCC8
16:45:30.338 045 I --- 01:145038 --:------ 01:145038 0008 002 FAC8
16:47:15.437 045 I --- 01:145038 --:------ 01:145038 0008 002 FC00
16:47:15.449 045 I --- 01:145038 --:------ 01:145038 0008 002 FA00
Compare this with a 3150
packet, which is a request for heat from a sensor (e.g. TRVs, thermostats).
Usually the scenario is a BDR91 connected to boiler, but less common configurations would include a zone with a BDR91 which is used to control, for example, an electric heat source or a 3rd-party UFH system (as BDR91s can only handle small loads, a contactor will be required).
These packets are always 2 bytes long and contain a domain ID and % demand.
segment | size | contents |
---|---|---|
domain_id | [0:2] | 0xF9, 0xFA or 0xFC, or zone_idx
|
demand | [2:4] | % demand (0x00-0xC8) |
In the majority of cases, the domain_id
is one of:
-
F9
: central heating (circulating volume) -
FA
: stored DHW -
FC
: appliance controller (e.g. R8810A OpenTherm Bridge )
However, the domain_id could also be a zone_idx
(0x00-0x0B), representing a Zone Valve or an Electric Heat zone. The distinction between these two zone types is that the former will also call for heat, whilst the latter will not.
The demand is either a percentage (0 to 100), or a boolean (0x00 = off, 0xC8 = on). If a relay/actuator cannot handle partial demands, then any non-zero value is 'on'.
OR:
The demand is a percentage, with a precision of 0.5%. Some scenarios will have only 0% or 100%, whilst others may have any value in the range.
Here is an example of a controller sending an instruction to a Zone Valve zone, with the corresponding instruction the the boiler. In this case, the BDR91 is simply opening a valve, and the boiler is heating/pumping a circulating volume of water.
11:13:05.259 045 I --- 01:145038 --:------ 01:145038 0008 002 073E
11:13:05.263 045 I --- 01:145038 --:------ 01:145038 0008 002 FC3E
...
11:13:05.705 045 I --- 01:145038 --:------ 01:145038 0008 002 073C
11:13:05.706 045 I --- 01:145038 --:------ 01:145038 0008 002 FC3C
def parser_0008(payload) -> dict:
assert len(payload) / 2 == 2
assert int(payload[:2], 16) <= 11 or payload[:2] in ["F9", "FA", "FC"]
return {
"zone_idx" if int(payload[:2], 16) <= 11 else "domain_id": payload[:2],
"relay_demand": int(payload[2:], 16) / 200,
}
0001
RF Check0004
Zone name0008
Relay demand0009
Relay failsafe000A
Zone config000C
Zone actuators0016
RF signal test0100
Localisation0404
Zone schedule0418
System fault1030
Mix zone config1060
Battery state10A0
DHW setpoint10E0
Device info1100
Boiler relay info1260
DHW temperature12B0
Window sensor1F09
System Sync1F41
DHW mode1FC9
RF bind1FD4
Opentherm ticker22C9
UFH setpoint22D9
Boiler setpoint2309
Zone setpoint2349
Setpoint override2E04
Controller mode30C9
Zone temperature313F
System datetime3150
Heat demand3220
Opentherm message3B00
Actuator sync3EF0
Actuator info3EF1
Actuator unknown
0002
External sensor0005
Zone management0006
Schedule sync000E
Unknown01D0
Unknown01E9
Unknown042F
Unknown1280
Outdoor humidity1290
Outdoor temp12A0
Indoor humidity2249
Now/next setpoint22D0
UFH unknown22F1
Ventilation unit command22F3
Ventilation unit temp. high2389
Unknown2D49
Unknown3120
Unknown31D9
HVAC Unknown31DA
HVAC Unknown31E0
HVAC Unknown