Truma LIN Protocol (TIN)
This document describes Truma’s LIN-based protocol used for communication between Truma heating devices and control panels.
Related Documentation
- Heater Command (0x20) - Detailed heater command frame documentation
- Heater Info 1 (0x21) - Temperature readings from heater
- Heater Info 2 (0x22) - Power supply and boiler status
- Device Discovery - Discovery and NAD assignment process
- Error Handling - Error codes and status queries
Protocol Versions
| Protocol | Signal IDs | Description |
|---|---|---|
| Legacy | 0x03-0x07, 0x16 | Older heaters with separate command frames |
| Modern (4.0) | 0x17, 0x20-0x22 | Modern heaters (mid-2018+) with unified command structure |
| Diagnostic | 0x3C, 0x3D | Standard LIN diagnostic frames |
Signal Frame Overview
| Signal ID | PID | Direction | Protocol | Purpose |
|---|---|---|---|---|
| 0x03 | - | Master → Slave | Legacy | Air Heater Command |
| 0x04 | - | Master → Slave | Legacy | Water Heater Command |
| 0x05 | - | Master → Slave | Legacy | Fuel Command |
| 0x06 | - | Master → Slave | Legacy | Electro Command |
| 0x07 | - | Master → Slave | Legacy | Vent Command |
| 0x16 | - | Slave → Master | Legacy | Info (temperatures, status) |
| 0x17 | - | Master → Slave | Modern | Aircon Command |
| 0x20 | 0x20 | Master → Slave | Modern | Heater Command |
| 0x21 | 0x61 | Slave → Master | Modern | Heater Info 1 |
| 0x22 | 0xE2 | Slave → Master | Modern | Heater Info 2 |
| 0x3C | 0x3C | Master → Slave | Diagnostic | Master Request |
| 0x3D | 0x7D | Slave → Master | Diagnostic | Slave Response |
Unknown/Unconfirmed Signals
| Signal ID | Direction | Notes |
|---|---|---|
| 0x09 | Unknown | Seen in logs, purpose unknown |
| 0x0A | Slave → Master | iNetX only, purpose unknown |
| 0x18 | Unknown | Seen payload: FE FF FF FF FF FF FF FF, purpose unknown |
| 0x1F | Slave → Master | iNetX only, purpose unknown |
Modern Protocol (4.0)
Used by modern Truma heating devices (mid-2018 onwards), InetX control panels, iNet X Connect remote modules, and modern Aventa air conditioning units.
Heater Command (0x20)
See heater-command for complete documentation.
Heater Info 1 (0x21)
See heater-info-1 for complete documentation.
Heater Info 2 (0x22)
See heater-info-2 for complete documentation.
Aircon Command (0x17) - Master → Slave
Controls air conditioning units on the bus (Truma Aventa and Saphir units).
| Byte | Bits | Field |
|---|---|---|
| 0-7 | Unknown - AC control data |
Frame structure requires further analysis.
Legacy Protocol
Used by older Truma heating devices with separate command frames for each function.
Air Heater Command (0x03) - Master → Slave
| Byte | Bits | Field | Values |
|---|---|---|---|
| 0 | 7:0 | Target Temperature (low byte) | Kelvin × 10, little-endian |
| 1 | 7:0 | Target Temperature (high byte) | |
| 2-7 | Unknown | Typically 0xFF padding |
Formula: temp_celsius = (u16_le(byte0, byte1) / 10) - 273
Special case: 0x0AAA (2730 in Kelvin × 10) = Off (0°C)
Water Heater Command (0x04) - Master → Slave
| Byte | Bits | Field | Values |
|---|---|---|---|
| 0 | 7:0 | Target Temperature (low byte) | Kelvin × 10, little-endian |
| 1 | 7:0 | Target Temperature (high byte) | |
| 2-7 | Unknown | Typically 0xFF padding |
| Temp | Bytes (LE) |
|---|---|
| Off | 0xAA 0x0A |
| Eco (40°C) | 0x3A 0x0C |
| Hot (60°C) | 0xD0 0x0C |
Fuel Command (0x05) - Master → Slave
| Byte | Bits | Field | Values |
|---|---|---|---|
| 0 | 0 | Fuel enable | 0=Off, 1=On |
| 0 | 1 | Electro enable | 0=Off, 1=On |
| 0 | 2-7 | Unknown | |
| 1-7 | Unknown | Typically 0xFF padding |
Electro Command (0x06) - Master → Slave
| Byte | Bits | Field | Values |
|---|---|---|---|
| 0 | 7:0 | Electro mode (low byte) | See table below |
| 1 | 7:0 | Electro mode (high byte) | See table below |
| 2-7 | Unknown | Typically 0xFF padding |
| Mode | Byte 0 | Byte 1 |
|---|---|---|
| Off | 0x00 | 0x00 |
| 900W | 0x84 | 0x03 |
| 1800W | 0x08 | 0x07 |
Vent Command (0x07) - Master → Slave
| Byte | Bits | Field | Values |
|---|---|---|---|
| 0 | 7:0 | Vent mode | See table below |
| 1 | 7:0 | Unknown | Typically 0xFE |
| 2-7 | Unknown | Typically 0xFF padding |
| Value | Mode |
|---|---|
0xE0 | Off |
0xE1 | Comfort |
0xE2 | Boost |
0xF1 - 0xFA | Level 1-10 |
Info Frame (0x16) - Slave → Master
| Byte | Bits | Field | Values |
|---|---|---|---|
| 0 | 7:0 | Unknown | Seen: 0x00 |
| 1 | 7:0 | Unknown | Seen: 0x05, 0x0F, 0x17 |
| 2 | 7:0 | Room Temperature (low byte) | Kelvin × 10, little-endian |
| 3 | 7:0 | Room Temperature (high byte) | |
| 4 | 7:0 | Water Temperature (low byte) | Kelvin × 10, little-endian |
| 5 | 7:0 | Water Temperature (high byte) | |
| 6 | 7:0 | Unknown | Seen: 0xDB, 0x59, 0x77, 0xF5, 0xFF |
| 7 | 7:0 | Unknown | Seen: 0x85, 0x7F |
Diagnostic Frames
Standard LIN diagnostic frames using classic checksum (no PID in checksum calculation).
Master Request (0x3C)
ReadByIdentifier (SID 0xB2)
| Byte | Field | Values |
|---|---|---|
| 0 | NAD | 0x01=Single, 0x7F=Broadcast |
| 1 | PCI | 0x06 (length) |
| 2 | SID | 0xB2 (ReadByIdentifier) |
| 3 | Identifier | See table below |
| 4 | Supplier ID (low) | 0x17 (Truma) |
| 5 | Supplier ID (high) | 0x46 (Truma) |
| 6 | Function ID (low) | Product-specific |
| 7 | Function ID (high) | Product-specific |
Identifier Types
| Value | Identifier |
|---|---|
0x00 | Product Identification |
0x01 | Serial Number |
0x20 | Firmware Version |
0x23 | Current Error (see Error Handling) |
See Device Discovery for the complete discovery process.
Vendor-Specific Diagnostic (SID 0xB8) - Heating Control
Controls the overall heating active state. This frame must be sent alongside the 0x20 Heater Command frame to activate heating.
| Byte | Field | Values |
|---|---|---|
| 0 | NAD | 0x01 (always single) |
| 1 | PCI | 0x06 (length) |
| 2 | SID | 0xB8 |
| 3 | Function ID (low) | 0x40 (CombiGas), 0x20 (CombiD) |
| 4 | Function ID (high) | 0x03 |
| 5 | Heating Active | 0x00=Off, 0x01=On |
| 6 | Unknown | Always 0x00 |
| 7 | Padding | Always 0xFF |
Heating Active Bit (Byte 5)
This bit controls whether the heater is actively heating. It must be set to 0x01 when any heating is requested (room heating, water heating, or both).
| Value | Meaning |
|---|---|
0x00 | Heating off (idle/standby) |
0x01 | Heating active (room and/or water) |
Important: The 0x20 Heater Command frame sets the target temperatures and modes, but the heater will not start until this B8 diagnostic frame is sent with byte 5 = 0x01.
Example Frames
Idle (heating off):
01 06 B8 40 03 00 00 FF
Heating active (room and/or water):
01 06 B8 40 03 01 00 FF
Function ID Variants
| Bytes 3-4 | Device |
|---|---|
40 03 | Combi Gas (Function 0x0340) |
20 03 | Combi D (Function 0x0320) |
10 03 | Combi Gas Old (Function 0x0310) |
01 03 | Combi Gas Old (Function 0x0301) |
Clock Commands (Vendor-Specific)
Truma uses these vendor-specific SIDs (in the LIN reserved range 0xB8-0xFF) for clock/time synchronization with the CP Plus display.
| SID | RSID | Purpose |
|---|---|---|
0xB9 | 0xF9 | Prepare Read/Write |
0xBA | 0xFA | Read Clock |
0xBB | 0xFB | Write Clock |
Note: These are not standard LIN services. Per LIN 2.2A spec (Section 4.2.3.4), SIDs 0xB8-0xFF are reserved and refer to ISO 15765-3. Truma uses this range for proprietary extensions.
Frame structure and payload format are not fully documented.
Reset Command
All bytes set to 0xFF triggers error reset:
[0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]
Slave Response (0x3D)
ReadByIdentifier Response (RSID 0xF2)
| Byte | Field | Values |
|---|---|---|
| 0 | NAD | Responding node |
| 1 | PCI | Length |
| 2 | RSID | 0xF2 (= SID + 0x40) |
| 3+ | Payload | Depends on identifier requested |
See Device Discovery for Product Identification responses. See Error Handling for error response decoding.
Vendor-Specific Response (RSID 0xF8)
| Byte | Field | Values |
|---|---|---|
| 0 | NAD | 0x7D |
| 1 | Unknown | Seen: 0x00, 0x01, 0x02 |
| 2 | Unknown | Seen: 0x01, 0x02, 0x04 |
| 3 | Unknown | Seen: 0x00, 0xFF |
| 4 | Unknown | Seen: 0xFF |
| 5 | Unknown | Seen: 0x05 |
Seen response payloads:
01 02 00 FF 0500 01 00 FF 0501 01 FF FF FF02 02 FF FF FF00 04 00 FF 05
Clock Responses (Vendor-Specific)
| RSID | Purpose |
|---|---|
0xF9 | Prepare Read/Write Response |
0xFA | Read Clock Response |
0xFB | Write Clock Response |
See Clock Commands section above for details.
Timing
| Parameter | Value |
|---|---|
| Startup break | 1.3ms |
| Startup pause | 1600ms |
| Between keepalive frames | 60ms |
| Frames per keepalive block | ~40 |
| Keepalive block interval | ~10s |
| Between control frames | 40ms |
Typical Control Frame Sequence
- 0x20 (Heater Command)
- 0x61 (request for 0x21) - may have no response
- 0xE2 (request for 0x22) - may have no response
- 0x3C (Diagnostic Request)
- 0x7D (request for 0x3D) - may have no response
- Repeat…
After several cycles, responses start appearing on 0x21 and 0x22.
Checksum
Enhanced Checksum (Signal Frames 0x00-0x3B)
sum = PID + data[0] + data[1] + ... + data[7]
while (sum >> 8) sum = (sum & 0xFF) + (sum >> 8)
checksum = ~sum
Classic Checksum (Diagnostic Frames 0x3C+)
sum = data[0] + data[1] + ... + data[7] // No PID
while (sum >> 8) sum = (sum & 0xFF) + (sum >> 8)
checksum = ~sum
