Skip to content

1100: Boiler Relay Information

David Bonnes edited this page Feb 2, 2020 · 15 revisions

Boiler/relay control configuration.

00:09:57.152 045  I --- 01:145038 --:------ 01:145038 1100 008 FC181000007FFF01
00:09:57.169 045  W --- 01:145038 13:237335 --:------ 1100 008 00181000007FFF01
00:09:57.216 049  I --- 13:106039 --:------ 13:106039 1100 008 00181000007FFF01

04:39:30.936 095  I --- --:------ --:------ 12:227486 1100 005 0018040400
04:39:31.934 095  I --- --:------ --:------ 12:227486 1100 005 0018040400
04:39:32.934 095  I --- --:------ --:------ 12:227486 1100 005 0018040400

06:47:22.204 045  I --- 12:010740 --:------ 12:010740 1100 008 00180404FF009601
06:47:26.203 045  I --- 12:010740 --:------ 12:010740 1100 008 00180404FF009601

16:00:42.630 045  I --- 01:145038 --:------ 01:145038 1100 008 FC0C1400007FFF01
16:00:42.648 045 RQ --- 01:145038 13:237335 --:------ 1100 008 000C1400007FFF01
16:00:42.664 061 RP --- 13:237335 01:145038 --:------ 1100 008 000C1400007FFF01

This packet has two lengths, either 5 or 8 bytes. Even if it is 8 bytes long, the latter 3 bytes may not be used (and will be set to 7FFF01.

This packet is used by non-evohome systems, e.g. a DTS92 connected directly to a BDR91A.

Payload Structure

segment size description
domain_id [0:2] 0xFC=boiler, otherwise 0x00
cycle_rate [2:4] cycles/hour * 4
minimum_on_time [4:6] minimum on time, minutes * 4
minimum_off_time [6:8] minimum off time, minutes * 4
unknown [8:10] optional, always 0x00 or 0xFF ?
proportional_band_width [10:14] optional, degrees C * 100
unknown [14:16] optional, always 0x01 ?

Sample Code

def parser_1100(payload, msg) -> Optional[dict]:  # boiler_params (domain/zone/device)
    assert len(payload) / 2 in [5, 8]
    assert payload[:2] in ["00", "FC"]
    assert payload[2:4] in ["0C", "18", "24", "30"]
    assert payload[4:6] in ["04", "08", "0C", "10", "14"]
    assert payload[6:8] in ["00", "04", "08", "0C", "10", "14"]
    assert payload[8:10] in ["00", "FF"]

    def _parser(seqx) -> dict:
        return {
            "cycle_rate": int(payload[2:4], 16) / 4,
            "minimum_on_time": int(payload[4:6], 16) / 4,
            "minimum_off_time": int(payload[6:8], 16) / 4,
            "unknown_0": payload[8:10],
        }

    if len(payload) / 2 == 5:
        return _parser(payload)

    assert payload[14:] == "01"
    return {
        **_parser(payload[:10]),
        "proportional_band_width": _temp(payload[10:14]),
        "unknown_1": payload[14:],
    }

Other Python Code

def _temp(seqx) -> Optional[float]:
    "Temperatures are two's complement numbers."
    if seqx == "7FFF":
        return None
    temp = int(seqx, 16)
    return (temp if temp < 2 ** 15 else temp - 2 ** 16) / 100

Related Packets

Clone this wiki locally