-
Notifications
You must be signed in to change notification settings - Fork 9
3B00: Actuator Sync
The 3B00
packet appears to synchronize a heating cycle between the heat source and the actuators (i.e. those devices requesting heat). The cycle is initiated by the controller announcing a 3B00
at a regular rate, with a frequency which appears related to the TPI cycle rate (see packet 1100
).
There are three distinct scenarios for the heat-source controller (aka boiler relay, TPI relay):
- a OTB bridge (
10:
), controlling a modulated heat source (i.e. an OpenTherm boiler) - a BDR relay (
13:
), controlling an on/off (TPI) heat source (e.g. a gas boiler, or a community HW scheme) - a BDR relay (
13:
), controlling an on/off (TPI) heat source, but configured via stored hot water (as Two 2-port, 3-port valves)
There is a clear relationship between a 3B00
and 3EF0
packets.
Scenario 1: a 3B00
cycle where the heat source controller is an on/off relay (BDR91):
17:03:37.978 045 I --- 01:145038 --:------ 01:145038 3B00 002 FCC8
17:03:38.369 045 I --- 13:081807 --:------ 13:081807 3EF0 003 0000FF
17:03:38.394 045 I --- 13:163733 --:------ 13:163733 3EF0 003 0000FF
17:03:38.518 045 I --- 13:106039 --:------ 13:106039 3EF0 003 0000FF
17:13:33.500 045 I --- 13:237335 --:------ 13:237335 3B00 002 00C8
17:13:33.602 045 I --- 13:237335 --:------ 13:237335 3EF0 003 0000FF
The cycle is initiated by an announcement from the controller (note the FC
at the start of the payload), and is repeated every 10 minutes.
17:03:37.978 045 I --- 01:145038 --:------ 01:145038 3B00 002 FCC8
Here, there are several electrical actuators (BDR relays, e.g. Zone Valve zone), but the boiler is controlled by 13:237335
, as identified by its 3B00
packet at the end of the cycle.
17:13:33.500 045 I --- 13:237335 --:------ 13:237335 3B00 002 00C8
Tip: a TPI relay (if any) can be reliably identified as the
13:
device which periodically sends a3B00
packet.
Scenario 2: a 3B00
cycle where the heat source controller is a OpenTherm bridge (OTB, R8810):
11:00:31.387291 045 I --- 01:078710 --:------ 01:078710 3B00 002 FCC8
11:00:31.490990 045 I --- 13:109598 --:------ 13:109598 3EF0 003 0000FF
11:00:32.317686 045 I --- 13:114333 --:------ 13:114333 3EF0 003 0000FF
11:00:49.378946 045 RQ --- 01:078710 10:067219 --:------ 3EF0 001 00
11:00:49.606205 045 RP --- 10:067219 01:078710 --:------ 3EF0 006 0000100A00FF
11:01:49.744818 045 RQ --- 01:078710 10:067219 --:------ 3EF0 001 00
11:01:59.920265 045 RP --- 10:067219 01:078710 --:------ 3EF0 006 0011100A00FF
11:02:49.912420 045 RQ --- 01:078710 10:067219 --:------ 3EF0 001 00
...
11:20:31.498919 045 I --- 13:109598 --:------ 13:109598 3EF0 003 0000FF
11:20:32.326939 045 I --- 13:114333 --:------ 13:114333 3EF0 003 0000FF
In this instance, the cycle rate is every 20 minutes.
Unlike the BDR, the OTB does not send a 3B00
at the end of the cycle. Instead, but there is a sequence of RP
/RQ
packets every minute until the end of the cycle.
Payload decode: | ||
---|---|---|
domain_id | [0:2] |
0xFC =Boiler |
state | [2:4] | State (00 - C8 ) |
Packets from BDRs will have a domain_id
of 00
.
Values of C8
are usually a percentage, but in the case of 3B00
seems of be only 00
or C8
(off/on).
Here's the heater relay at end of a TPI cycle (I have removed the RQ, which I am sending every 15 secs):
07:03:42.508 | BDR:237335 | | I | actuator_sync | {'sync_tpi': True}
07:03:42.609 | BDR:237335 | HGI:013393 | RP | actuator_state | {'actuator_enabled': True, 'actuator_countdown': 1, 'cycle_countdown': 1}
... the cycle hasn't finished (2nd msg), but the BDR has spontaneously send the actuator_sync (1st msg) - it does this at the end of the TPI cycle (which is cycle_countdown seconds in the future).
Next, the start of the TPI cycle, marked by the actuator_sync from the controller:
07:03:45.830 | BDR:106039 | | I | actuator_enabled | {'actuator_enabled': False}
07:03:45.850 | CTL:145038 | | I | actuator_sync | {'domain_id': 'FC', 'sync_tpi': True}
07:03:46.205 | BDR:081807 | | I | actuator_enabled | {'actuator_enabled': False}
07:03:46.830 | BDR:106039 | | I | actuator_enabled | {'actuator_enabled': False}
07:03:48.830 | BDR:106039 | | I | actuator_enabled | {'actuator_enabled': False}
...the timings aren't clear, but I always saw the heater relay well before the controller, with all other relays sending an actuator_enabled at the same time as (more generally 'after') the controller's actuator_sync.
Next thing is the start of a cycle by the heater relay:
07:03:56.452 | BDR:237335 | HGI:013393 | RP | actuator_state | {'actuator_enabled': False, 'actuator_countdown': 287, 'cycle_countdown': 587}
...you can see it is false for 300 of the 600 secs (i.e. half) of the cycle, and, 5 min later: (edited)
07:08:56.496 | BDR:237335 | HGI:013393 | RP | actuator_state | {'actuator_enabled': True, 'actuator_countdown': 287, 'cycle_countdown': 287}
...you can see it has now switched to active for the remaining portion of the cycle.
So, whilst all this is going on, before the start of the above cycle:
07:01:45.994 | TRV:189082 | CTL:145038 | I | heat_demand | {'parent_idx': '06', 'heat_demand': 0.3}
07:02:48.942 | CTL:145038 | | I | relay_demand | {'domain_id': 'FC', 'relay_demand': 0.07}
07:02:49.842 | CTL:145038 | | I | heat_demand | {'domain_id': 'FC', 'heat_demand': 0.07}
...and during the above cycle:
07:05:07.434 | TRV:056061 | CTL:145038 | I | heat_demand | {'parent_idx': '04', 'heat_demand': 0.35}
07:05:08.163 | CTL:145038 | | I | relay_demand | {'domain_id': 'FC', 'relay_demand': 0.03}
07:05:08.175 | CTL:145038 | | I | heat_demand | {'domain_id': 'FC', 'heat_demand': 0.03}
...in both cases, the dropping demand from a zone (the 1st msg in each block - I don't the previous msgs now, will get them later, but this is well-understood), caused the overall heat demand to fall. The relay demand falls in line.
If the demand is only 7% at the start of the cycle, why did it stay on for 50% of the 10 min cycle?:
20:25:27.744 | CTL:145038 | | I | tpi_params | {'domain_id': 'FC', 'cycle_rate': 6.0, 'minimum_on_time': 5.0, 'minimum_off_time': 0.0, 'proportional_band_width': None}
This says: 6 cycles per hour (so 10 min each), minimum on time 5 mins (NB: 6.5 mins would be OK - it's not only 0, 5 or 10).
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