Skip to content

1F41: DHW Operating Mode

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

When the DHW operating mode is changed, the controller will broadcast the new mode via a 1F41 packet:

046  I --- 01:145038 --:------ 01:145038 1F41 006 000102FFFFFF

If the change is temporary (until some future point in time), then a datetime will be added to the end of the payload.

047  I --- 01:145038 --:------ 01:145038 1F41 012 000104FFFFFF2816160B07E3

Thus, this packet has two possible lengths, 6 or 12 bytes.

Other Verbs

The controller will respond to an RQ with the current operating mode:

095 RQ --- 18:013393 01:145038 --:------ 1F41 001 00
045 RP --- 01:145038 18:013393 --:------ 1F41 006 000000FFFFFF

The RQ payload must be 00.

In addition, the controller should accept an W with a new operating mode (to be confirmed).

Payload Structure

segment size contents
unused [0:2] always 00

Sample Code

Using Python, the payload can be decoded as:

from datetime import datetime as dt

def _datetime(seqx) -> str:
    return dt(
        year=int(seqx[8:12], 16),
        month=int(seqx[6:8], 16),
        day=int(seqx[4:6], 16),
        hour=int(seqx[2:4], 16) & 0b11111,  # 1st 3 bits: DayOfWeek
        minute=int(seqx[0:2], 16),
    ).strftime("%Y-%m-%d %H:%M:%S")

def parser_1f41(payload, msg) -> Optional[dict]:  # dhw_mode
    assert len(payload) / 2 in [6, 12]
    assert payload[:2] == "00"

    assert payload[2:4] in ["00", "01"]
    assert payload[4:6] in list(ZONE_MODE_MAP)
    if payload[4:6] == "04":
        assert len(payload) / 2 == 12
    assert payload[6:12] == "FFFFFF"

    return {
        "active": {"00": False, "01": True}[payload[2:4]],
        "mode": ZONE_MODE_MAP.get(payload[4:6]),
        "until": _datetime(payload[12:24]) if payload[4:6] == "04" else None,
    }

Related Packets

  • 0x10A0: DHW Cylinder Setpoint
  • 0x1260: DHW Cylinder Temperature
  • 0x1F41: DHW Operating Mode
Clone this wiki locally