Skip to content

30C9: Zone Temperature

David Bonnes edited this page Mar 7, 2020 · 2 revisions
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?

Related Packets

  • 000A: Zone Configuration
  • 1F09: System Synchronization
  • 2309: Zone Setpoint
  • 30C9: Zone Temperature
Clone this wiki locally