Skip to content

3B00: Actuator Sync

David Bonnes edited this page Aug 30, 2022 · 14 revisions

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):

  1. a OTB bridge (10:), controlling a modulated heat source (i.e. an OpenTherm boiler)
  2. a BDR relay (13:), controlling an on/off (TPI) heat source (e.g. a gas boiler, or a community HW scheme)
  3. 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.

Example - TPI relay

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 a 3B00 packet.

Example - OpenTherm Bridge

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

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).

Related Packets

  • 1100: Boiler-Relay-Information
  • 3B00: Actuator Sync
  • 3EF0: Actuator Status
  • 3EF1: Actuator Unknown

To Be Added:

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).

Clone this wiki locally