Heater Command (0x20)

Signal ID: 0x20 | PID: 0x20 | Direction: Master → Slave

Unified command frame controlling all heater functions: room heating, water heating, ventilation, and energy source selection.

Frame Layout

Frame: C2 2B D0 FA 09 B3 E0 0F
       │  │  │  │  │  │  │  └─ Byte 7: Usually 0x0F (?)
       │  │  │  │  │  │  └──── Byte 6: Always 0xE0 (?)
       │  │  │  │  │  └─────── Byte 5: Vent level + energy bitmap (✓)
       │  │  │  │  └────────── Byte 4: Electric power level (✓)
       │  │  │  └───────────── Byte 3: Fuel control (✓)
       │  │  └──────────────── Byte 2: Water temperature level (✓)
       │  └─────────────────── Byte 1: Water hot flag + Room heating (✓)
       └────────────────────── Byte 0: Room temperature code (✓)

       ✓ = Confirmed    ? = Unknown/Partially known

Byte 0: Room Temperature Code

Target room temperature encoded as a single byte.

Special: 0xAA = Off (no room heating)
Formula: code = (170 + (temp_celsius - 5) * 10) & 0xFF
Temp (°C)CodeTemp (°C)Code
Off0xAA180x5E
50xDC190x68
60xE6200x72
70xF0210x7C
80xFA220x86
90x04230x90
100x0E240x9A
110x18250xA4
120x22260xAE
130x2C270xB8
140x36280xC2
150x40290xCC
160x4A300xD6
170x54

Decoding Example

Code 0x86 = 134 decimal
temp = ((134 - 170) & 0xFF) / 10 + 5
     = (220) / 10 + 5
     = 22 + 5 - 5 = 22°C

Byte 1: Control Flags

Byte 1 uses a base value of 0xAA with only bit 0 and bit 7 being modified. Bits 1-6 are always fixed.

Bit-Level Breakdown

Byte 1: 0x2B = 0b00101011
                 │││││││└─ Bit 0: Room heating enable (✓)
                 ││││││└── Bit 1: Fixed (1)
                 │││││└─── Bit 2: Fixed (0)
                 ││││└──── Bit 3: Fixed (1)
                 │││└───── Bit 4: Fixed (0)
                 ││└────── Bit 5: Fixed (1)
                 │└─────── Bit 6: Fixed (0)
                 └──────── Bit 7: Water hot flag (INVERTED!) (✓)

Bit 0: Heating Enable

heating_enabled = (byte1 & 0x01) != 0
ValueMeaning
0Room heating OFF
1Room heating ON

Bit 7: Water Temperature Level Flag

Note: This bit indicates the water temperature level, not a simple boiler on/off. It is inverted - 0 means Hot (60°C), 1 means Off or Eco (40°C).

water_hot = (byte1 & 0x80) == 0
ValueMeaning
0Water Hot (60°C)
1Water Off or Eco (40°C)

Observed behavior:

  • Water Off: bit 7 = 1
  • Water Eco (40°C): bit 7 = 1
  • Water Hot (60°C): bit 7 = 0

Bits 1-6: Fixed Pattern

Bits 1-6 are always 0b010101 (inherited from base value 0xAA). They are never modified.

Common Byte 1 Values

ValueBinaryWater TempRoom Heating
0xAA1010 1010Off/EcoOFF
0xAB1010 1011Off/EcoON
0x2A0010 1010HotOFF
0x2B0010 1011HotON

Byte 2: Water Temperature Level

Target water temperature setting.

ValueLevelTemperature
0xAAOffWater heating disabled
0xC3Eco~40°C
0xD0Hot~60°C

Note: Bytes 1 and 2 work together for water temperature:

  • Off: byte 2 = 0xAA, byte 1 bit 7 = 1 (0xAA or 0xAB)
  • Eco (40°C): byte 2 = 0xC3, byte 1 bit 7 = 1 (0xAA or 0xAB)
  • Hot (60°C): byte 2 = 0xD0, byte 1 bit 7 = 0 (0x2A or 0x2B)

Byte 3: Fuel Control

Enables or disables fuel-based heating (gas or diesel).

ValueMeaning
0x00Fuel disabled
0xFAFuel enabled

Byte 4: Electric Power Level

Sets the electric heating element power limit.

ValuePowerWatts
0x00Off0W
0x09Level 1900W
0x12Level 21800W

Note: Value appears to be power in 100W units (0x09 = 9 = 900W, 0x12 = 18 = 1800W).

Byte 5: Ventilation Level + Energy Bitmap

Byte 5: 0xB3 = 0b10110011
              ││││││││
              ││││││└┴─ Bits 0-1: Energy source bitmap (✓)
              ││││└┴─── Bits 2-3: Reserved (always 0) (✓)
              └┴┴┴───── Bits 4-7: Ventilation level (✓)

Bits 0-1: Energy Source Bitmap

Mirrors the fuel and electric settings from bytes 3 and 4.

BitsBinaryEnergy Source
0x000None (off)
0x101Fuel only
0x210Electric only
0x311Mix (fuel + electric)

Bits 2-3: Reserved

Always 0 in all observed frames and implementations. Purpose unknown, likely reserved for future use.

Bits 4-7: Ventilation Level (Upper Nibble)

NibbleLevelDescription
0x0OffNo ventilation
0x1Level 1Lowest manual
0x2Level 2
0x3Level 3
0x4Level 4
0x5Level 5
0x6Level 6
0x7Level 7
0x8Level 8
0x9Level 9
0xALevel 10Highest manual
0xBEcoAutomatic/Comfort mode
0xC?Not documented, possibly undefined
0xDHighHigh-speed/Boost mode

Note: Manual ventilation levels (1-10) can be used when heating is off. Eco and High are typically used with active heating. Value 0xC has not been observed in any implementation.

Bytes 6-7: Constant/Unknown (Partially Confirmed)

ByteValueStatus
60xE0Always constant (✓)
70x0FUsually constant, but 0x00 observed in some frames (?)

Observations

  • Byte 6 (0xE0): Confirmed constant across all implementations and observed frames.
  • Byte 7 (0x0F): Usually 0x0F, but one test case in truma-driver shows 0x00. This might indicate:
    • Device-specific variation
    • Protocol version indicator
    • Reserved/unused field

Example Frames

Everything Off

AA AA AA 00 00 00 E0 0F
│  │  │  │  │  │
│  │  │  │  │  └─ Vent: Off, Energy: None
│  │  │  │  └──── Electric: Off
│  │  │  └─────── Fuel: Disabled
│  │  └────────── Water: Off
│  └───────────── Flags: Boiler OFF, Heating OFF
└──────────────── Room: Off

Fuel Only, Vent Level 2

AA AA AA FA 00 21 E0 0F
│  │  │  │  │  │
│  │  │  │  │  └─ Vent: Level 2 (0x2), Energy: Fuel (0x1)
│  │  │  │  └──── Electric: Off
│  │  │  └─────── Fuel: Enabled
│  │  └────────── Water: Off
│  └───────────── Flags: Boiler OFF, Heating OFF
└──────────────── Room: Off

Room Heat 28°C, Fuel Only, Comfort Fan

C2 AB AA FA 00 B1 E0 0F
│  │  │  │  │  │
│  │  │  │  │  └─ Vent: Comfort (0xB), Energy: Fuel (0x1)
│  │  │  │  └──── Electric: Off
│  │  │  └─────── Fuel: Enabled
│  │  └────────── Water: Off
│  └───────────── Flags: Boiler OFF, Heating ON
└──────────────── Room: 28°C

Room Heat 28°C, Water Hot, Fuel Only, Comfort Fan

C2 2B D0 FA 00 B1 E0 0F
│  │  │  │  │  │
│  │  │  │  │  └─ Vent: Comfort (0xB), Energy: Fuel (0x1)
│  │  │  │  └──── Electric: Off
│  │  │  └─────── Fuel: Enabled
│  │  └────────── Water: Hot (60°C)
│  └───────────── Flags: Boiler ON, Heating ON
└──────────────── Room: 28°C

Room Heat 28°C, Water Hot, Mix Mode (900W), Comfort Fan

C2 2B D0 FA 09 B3 E0 0F
│  │  │  │  │  │
│  │  │  │  │  └─ Vent: Comfort (0xB), Energy: Mix (0x3)
│  │  │  │  └──── Electric: 900W
│  │  │  └─────── Fuel: Enabled
│  │  └────────── Water: Hot (60°C)
│  └───────────── Flags: Boiler ON, Heating ON
└──────────────── Room: 28°C

Water Boost Only (No Room Heat)

Water boost is water heating without room ventilation. The fan stays off since no warm air needs to be distributed.

AA 2A D0 FA 00 01 E0 0F
│  │  │  │  │  │
│  │  │  │  │  └─ Vent: Off (0x0), Energy: Fuel (0x1)
│  │  │  │  └──── Electric: Off
│  │  │  └─────── Fuel: Enabled
│  │  └────────── Water: Hot (60°C)
│  └───────────── Flags: Water Hot, Heating OFF
└──────────────── Room: Off

Note: Water boost is identical to water hot - the difference is that room heating is disabled, so the fan doesn’t run. This allows all heating energy to go to the water tank.

Initial Filling (Room 30°C, Fuel, Comfort)

D6 AB AA FA 00 B1 E0 0F
│  │  │  │  │  │
│  │  │  │  │  └─ Vent: Comfort (0xB), Energy: Fuel (0x1)
│  │  │  │  └──── Electric: Off
│  │  │  └─────── Fuel: Enabled
│  │  └────────── Water: Off
│  └───────────── Flags: Boiler OFF, Heating ON
└──────────────── Room: 30°C

State Dependencies

Water Boost Mode

Water boost is a display-side concept, not a separate protocol flag. It is derived from the combination of settings:

water_boost = water_temp == Hot AND NOT room_heating_enabled

When water boost is active:

  • Water is heated to 60°C (Hot)
  • Room heating is disabled (byte 0 = 0xAA, byte 1 bit 0 = 0)
  • Fan stays off (byte 5 upper nibble = 0x0)
  • All heating energy goes to the water tank

The heater sees the same command as “Water Hot” - the behavioral difference is that without room heating, the fan doesn’t run.

Energy Source Bitmap Calculation

The energy bitmap in byte 5 (bits 0-1) should mirror bytes 3 and 4:

bitmap = 0
if fuel_enabled:
    bitmap |= 0x01
if electric_power > 0:
    bitmap |= 0x02

Ventilation Modes

  • Off (0x0): No ventilation - used for water-only heating
  • Manual Levels (1-10): Can be used independently of heating
  • Eco/Comfort (0xB): Automatic mode, typically used with active room heating
  • High (0xD): High-speed ventilation