-
Notifications
You must be signed in to change notification settings - Fork 9
30C9: Zone Temperature
Description: | Request or return the zone temperature or a list of zone temperatures |
---|---|
Examples: | I --- TRV --:------ TRV 30C9 003 000729 |
RQ --- GWY CTL --:------ 30C9 001 00 | |
RP --- CTL GWY --:------ 30C9 003 000729 | |
I --- CTL --:------ CTL 30C9 030 0007D00107E00207C70407E90507930607810707A80807D90907300B0864 |
Payload decode: | ||
---|---|---|
Zone | [0:2] | Zone number (0-11) |
Temperature | [2:6] | Value/256 = temperature (degrees C) |
Zone | [6:8] | Zone number (0-11) |
Temperature | [8:12] | Value/256 = temperature (degrees C) |
The payload of this message contains the current temperature of a zone/all zones, or the current temperature as measured by a device which is/could be in a zone (e.g. a HR92, or a T87RF, but not a CS92).
Message/Command types:
I: the controller sends out the temperature of all zones every Sync Interval. The payload length is a multiple of 3 (note a payload length of 24, below – the payload is truncated here for convenience).
I --- CTL --:------ CTL 30C9 024 00085801081002...
The controller's payload is an array. See an example (non-truncated) for zones 0-7, below (note the first two bytes of each block, below):
000858 010810 020789 030792 047FFF 050770 0607B6 070829
RQ/RP: the controller will respond to an RQ with the current temperature of a zone.
RQ --- HGI CTL --:------ 30C9 001 06
RP --- CTL HGI --:------ 30C9 003 0607B6
I: a device will report its current temperature every sync interval (?), and when a significant change occurs(?).
I --- STA --:------ STA 30C9 003 030852
I --- TRV --:------ TRV 30C9 003 0307FB
Note that in this case (from a device, not from a controller), the zone_idx (03 in 030852) is the parent_zone of the device, and the temperature is of the device, not the zone's temperature.
It is unlikely that a device (especially battery-powered devices) will respond to a RQ.
Payload decode:
Temperatures are sent as hexadecimal values that appear to be signed (twos-complement). Thus, the maximum positive value is 0x7FFF, but this appears to be used to represent an invalid temperature.
For a message broadcast from a device (won't work for negative values):
{
"parent_zone": payload[:2],
"temperature": int(payload[2:6], 16) / 100 if payload[2:6] != "7FFF" else None
}
For a payload of "0607B6"�, this will give:
{
"parent_zone": "06",
"temperature": 19.74
}
For a payload of "04FEA2", the temperature should be -3.50. (using two's complement).
Limitations:
The confidence in this data is high, but negative temperature still need to be checked. Also, what happens to a zone's temperature when a device stops reporting its temperature?
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