-
Notifications
You must be signed in to change notification settings - Fork 9
Packet Structure
The basic packet structure is:
aaa XX bbb DEVICE_ID DEVICE_ID DEVICE_ID CODE nnn PAYLOAD.....
It is a number of fixed-length ascii fields, separated by spaces, with a variable length payload at the end. See here for specific detail how to check that a packet is valid, before decoding the payload.
In short, these can usually be ignored; in particular, Evohome does not use sequence numbers.
WIP: The text aaa
is the RSSI strength number field but it is not considered to be used by Evohome devices.
WIP: The text bbb
is a legacy message number field and this is not usually used in messages between Evohome devices.
These fields will have a 3-digit _decimal _number, with leading zeros, or ---
if they are not used.
The RSSI field is used by a HGI80, and the 'strongest' (best) signal is set to a lower bound of 045
and the weakest (worst) has an upper bound of 095
(i.e. there is no 096
).
Tip: A RSSI of
095
may indicate that the packet has come from your neighbour!
Packet type will be one of the following:
-
' I'
information (note the space before the I) -
'RQ'
request -
'RP'
response (to a request) -
' W'
write (note the space before the W)
Documentation on each code is available separately.
Beware: For historical reasons, the name commonly used for packet codes may - strictly speaking - be misleading, for example Zone Temperature (
30C9
) can contain a temperature that is the temperature of a device rather than a zone.
The payload is a sequence of (8-bit) bytes represented in hexadecimal (i.e. 00
to FF
) and with a maximum length of 48 (minimum length 1). If the message will not fit into the payload, then additional packets are sent (or can be requested) with the remaining portion of the message (e.g. codes 000A
, 0404
).
Payload length is interpreted as a decimal number with leading zeros.
Beware: The payload length field is the length of the payload in pairs of hexadecimal characters. Thus, a
PAYLOAD
of001234
would havennn
equal to003
, which is 6 characters;034
is 68 characters.
The payload for a given code will not always be a particular length (this is true even for payloads that are not arrays):
095 I --- --:------ --:------ THM:227486 1100 005 0018040400
095 I --- BDR:171587 --:------ BDR:171587 1100 008 00180404007FFF01
Each payload is decoded according to its packet type
, code
, and the sending device_type
to provide a message (e.g. 'set the system to away mode'). For example, a temperature packet (30C9
) from:
- a device: is the temperature recorded by that device, and is always of length 6 bytes
- the controller: is an array of temperatures (one for each zone), and in thus a multiple of 6 bytes
The first byte of a payload may contain an index value, such as a zone_idx
(00
to 0B
), a domain_id
(F9
, FA
, FC
), or some other value.
Beware: A value of
00
is not always for zone 0.
For some packets, usually from the controller, the payload may be an array of payloads, each with its own index value (see code 30C9
), for example:
045 I --- 01:145038 --:------ 01:145038 2309 018 00076C0107D002079E03073A0406D60506D6
where the payload, 00076C0107D00...
, can be shown as and array of 6 zone entries:
00-076C 01-07D0 02-079E 03-073A 04-06D6 05-06D6
CHECK: Beware, the zone_idx
numbers to not have to be an ascending sequence, for example, if zone 3 is deleted, the devices in zone 4 will continue to believe themselves to be in zone_idx == 04
(even if, ultimately, that is the only zone).
The encoding of the payload varies greatly, according to the packet code. Notably, it can contain device numbers, command codes, and ASCII characters. Numbers (integers and floats) may be stored as hexadecimal, integers, or even a sequence of bits.
Many packets have no functional payload, those will be 00
, with a length of 001
.
Valid packets have three address fields that may contain a device ID, for example: 12:123456
and 18:105324
. In this standard device ID format, the two digits before the colon (:
) represent the device type.
Device IDs may also appear in payloads, although they will appear a hexadecimal format, for example: 3C6FA9
and 06368E
. An evohome controller's ID can be obtained through its user interface and will be in this format.
See Device IDs for detail on this data structure (such as device types, and converting between the two formats).
Packets are invariably from (sent by) the device that is in the first address field (the only known exception to this is for non-evohome devices).
Packets are usually to (sent to) the device in the third address field. For announcements, the 3rd address will match the 1st, for example, here are the packets send by a controller every sync interval:
045 I --- 01:145038 --:------ 01:145038 1F09 003 FF073F
045 I --- 01:145038 --:------ 01:145038 2309 021 0007D00107D002079E03073A04079E0506D606073A
045 I --- 01:145038 --:------ 01:145038 30C9 021 0007DF01080B0207D10307660407550508100608AB
There are special device IDs, such as --:------
(no device) and 63:262142
(aka FFFFFF
) (null device).
049 I --- 30:082155 63:262142 --:------ 10E0 038 000001C90011006C...
053 I --- 04:189082 63:262142 --:------ 1FC9 006 0030C912E29A
WIP: HGI and CTL are conventions used ...
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