Truma LIN Protocol (TIN)

This document describes Truma’s LIN-based protocol used for communication between Truma heating devices and control panels.

This protocol documentation was created through reverse engineering and may be incomplete or inaccurate.

Protocol Versions

ProtocolSignal IDsDescription
Legacy0x03-0x07, 0x16Older heaters with separate command frames
Modern (4.0)0x17, 0x20-0x22Modern heaters (mid-2018+) with unified command structure
Diagnostic0x3C, 0x3DStandard LIN diagnostic frames

Signal Frame Overview

Signal IDPIDDirectionProtocolPurpose
0x03-Master → SlaveLegacyAir Heater Command
0x04-Master → SlaveLegacyWater Heater Command
0x05-Master → SlaveLegacyFuel Command
0x06-Master → SlaveLegacyElectro Command
0x07-Master → SlaveLegacyVent Command
0x16-Slave → MasterLegacyInfo (temperatures, status)
0x17-Master → SlaveModernAircon Command
0x200x20Master → SlaveModernHeater Command
0x210x61Slave → MasterModernHeater Info 1
0x220xE2Slave → MasterModernHeater Info 2
0x3C0x3CMaster → SlaveDiagnosticMaster Request
0x3D0x7DSlave → MasterDiagnosticSlave Response

Unknown/Unconfirmed Signals

Signal IDDirectionNotes
0x09UnknownSeen in logs, purpose unknown
0x0ASlave → MasteriNetX only, purpose unknown
0x18UnknownSeen payload: FE FF FF FF FF FF FF FF, purpose unknown
0x1FSlave → MasteriNetX 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).

ByteBitsField
0-7Unknown - 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

ByteBitsFieldValues
07:0Target Temperature (low byte)Kelvin × 10, little-endian
17:0Target Temperature (high byte)
2-7UnknownTypically 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

ByteBitsFieldValues
07:0Target Temperature (low byte)Kelvin × 10, little-endian
17:0Target Temperature (high byte)
2-7UnknownTypically 0xFF padding
TempBytes (LE)
Off0xAA 0x0A
Eco (40°C)0x3A 0x0C
Hot (60°C)0xD0 0x0C

Fuel Command (0x05) - Master → Slave

ByteBitsFieldValues
00Fuel enable0=Off, 1=On
01Electro enable0=Off, 1=On
02-7Unknown
1-7UnknownTypically 0xFF padding

Electro Command (0x06) - Master → Slave

ByteBitsFieldValues
07:0Electro mode (low byte)See table below
17:0Electro mode (high byte)See table below
2-7UnknownTypically 0xFF padding
ModeByte 0Byte 1
Off0x000x00
900W0x840x03
1800W0x080x07

Vent Command (0x07) - Master → Slave

ByteBitsFieldValues
07:0Vent modeSee table below
17:0UnknownTypically 0xFE
2-7UnknownTypically 0xFF padding
ValueMode
0xE0Off
0xE1Comfort
0xE2Boost
0xF1 - 0xFALevel 1-10

Info Frame (0x16) - Slave → Master

ByteBitsFieldValues
07:0UnknownSeen: 0x00
17:0UnknownSeen: 0x05, 0x0F, 0x17
27:0Room Temperature (low byte)Kelvin × 10, little-endian
37:0Room Temperature (high byte)
47:0Water Temperature (low byte)Kelvin × 10, little-endian
57:0Water Temperature (high byte)
67:0UnknownSeen: 0xDB, 0x59, 0x77, 0xF5, 0xFF
77:0UnknownSeen: 0x85, 0x7F

Diagnostic Frames

Standard LIN diagnostic frames using classic checksum (no PID in checksum calculation).

Master Request (0x3C)

ReadByIdentifier (SID 0xB2)

ByteFieldValues
0NAD0x01=Single, 0x7F=Broadcast
1PCI0x06 (length)
2SID0xB2 (ReadByIdentifier)
3IdentifierSee table below
4Supplier ID (low)0x17 (Truma)
5Supplier ID (high)0x46 (Truma)
6Function ID (low)Product-specific
7Function ID (high)Product-specific
Identifier Types
ValueIdentifier
0x00Product Identification
0x01Serial Number
0x20Firmware Version
0x23Current 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.

ByteFieldValues
0NAD0x01 (always single)
1PCI0x06 (length)
2SID0xB8
3Function ID (low)0x40 (CombiGas), 0x20 (CombiD)
4Function ID (high)0x03
5Heating Active0x00=Off, 0x01=On
6UnknownAlways 0x00
7PaddingAlways 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).

ValueMeaning
0x00Heating off (idle/standby)
0x01Heating 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-4Device
40 03Combi Gas (Function 0x0340)
20 03Combi D (Function 0x0320)
10 03Combi Gas Old (Function 0x0310)
01 03Combi 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.

SIDRSIDPurpose
0xB90xF9Prepare Read/Write
0xBA0xFARead Clock
0xBB0xFBWrite 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)

ByteFieldValues
0NADResponding node
1PCILength
2RSID0xF2 (= SID + 0x40)
3+PayloadDepends on identifier requested

See Device Discovery for Product Identification responses. See Error Handling for error response decoding.

Vendor-Specific Response (RSID 0xF8)

ByteFieldValues
0NAD0x7D
1UnknownSeen: 0x00, 0x01, 0x02
2UnknownSeen: 0x01, 0x02, 0x04
3UnknownSeen: 0x00, 0xFF
4UnknownSeen: 0xFF
5UnknownSeen: 0x05

Seen response payloads:

  • 01 02 00 FF 05
  • 00 01 00 FF 05
  • 01 01 FF FF FF
  • 02 02 FF FF FF
  • 00 04 00 FF 05

Clock Responses (Vendor-Specific)

RSIDPurpose
0xF9Prepare Read/Write Response
0xFARead Clock Response
0xFBWrite Clock Response

See Clock Commands section above for details.

Timing

ParameterValue
Startup break1.3ms
Startup pause1600ms
Between keepalive frames60ms
Frames per keepalive block~40
Keepalive block interval~10s
Between control frames40ms

Typical Control Frame Sequence

  1. 0x20 (Heater Command)
  2. 0x61 (request for 0x21) - may have no response
  3. 0xE2 (request for 0x22) - may have no response
  4. 0x3C (Diagnostic Request)
  5. 0x7D (request for 0x3D) - may have no response
  6. 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