Legacy TIN Protocol

Overview

The Legacy TIN protocol is used by legacy Truma heating devices (TIN 1.0 and TIN 3.2). It features separate command channels for each heating function, with individual signal frames for air heating, water heating, fuel control, electric power, and ventilation.

This protocol was superseded by New TIN (TIN 4.0) in mid-2018 but remains important for supporting older installations.

Signal Frame Types

Signal IDFrame TypeDirectionPurpose
0x03Air Heater CommandMaster → SlaveRoom temperature setpoint
0x04Water Heater CommandMaster → SlaveWater temperature setpoint
0x05Fuel CommandMaster → SlaveFuel/electric enable control
0x06Electro CommandMaster → SlaveElectric heating power level
0x07Vent CommandMaster → SlaveFan/ventilation control
0x16InfoSlave → MasterTemperature and status telemetry

Air Heater Command (0x03)

Controls the room temperature setpoint.

Frame Structure

Byte0-1234567
ContentTarget Temperature0xFF0xFF0xFF0xFF0xFF0xFF
Format16-bit LEPaddingPaddingPaddingPaddingPaddingPadding

Temperature Encoding

Format: Kelvin × 10, stored as 16-bit little-endian

Formula:

encoded_value = (temp_celsius + 273) × 10
temp_celsius = (encoded_value / 10) - 273

Example Frames

Set room temperature to 22°C:

[0x86] [0x0B] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]
 └─┬──┘ └─┬──┘
   │      └─ High byte (2950 / 256 = 11 = 0x0B)
   └─ Low byte (2950 % 256 = 134 = 0x86)

Turn off room heating:

[0x00] [0x00] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Water Heater Command (0x04)

Controls the water boiler temperature setpoint.

Frame Structure

Byte0-1234567
ContentTarget Temperature0xFF0xFF0xFF0xFF0xFF0xFF
Format16-bit LEPaddingPaddingPaddingPaddingPaddingPadding

Temperature Encoding

Same encoding as Air Heater Command (Kelvin × 10, little-endian).

Water Temperature Levels:

LevelTemperatureHex ValueDecimalDescription
Off-0x00000Water heating disabled
Eco40°C0x3A0C3130Energy-saving mode
Hot60°C0xD00C3280Maximum hot water

Example Frames

Set water to Eco mode (40°C):

[0x3A] [0x0C] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]
 └─┬──┘ └─┬──┘
   │      └─ High byte (3130 / 256 = 12 = 0x0C)
   └─ Low byte (3130 % 256 = 58 = 0x3A)

Set water to Hot mode (60°C):

[0xD0] [0x0C] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Turn off water heating:

[0x00] [0x00] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Fuel Command (0x05)

Controls fuel and electric heating enable flags.

Frame Structure

Byte01234567
ContentEnable Flags0xFF0xFF0xFF0xFF0xFF0xFF0xFF
FormatBitmapPaddingPaddingPaddingPaddingPaddingPaddingPadding

Enable Flags (Byte 0)

BitFunctionValues
0Fuel enable0 = Disabled, 1 = Enabled
1Electro enable0 = Disabled, 1 = Enabled
2-7ReservedMust be 0

Common Values

ConfigurationHex ValueBinaryDescription
Both Off0x000b00000000No heating source
Fuel Only0x010b00000001Gas/diesel heating only
Electro Only0x020b00000010Electric heating only
Both On0x030b00000011Fuel + electric (mix mode)

Example Frames

Enable fuel only:

[0x01] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Enable electric only:

[0x02] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Enable both (mix mode):

[0x03] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Disable all:

[0x00] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Electro Command (0x06)

Controls the electric heating power level.

Frame Structure

Byte0-1234567
ContentPower Level0xFF0xFF0xFF0xFF0xFF0xFF
Format16-bit LEPaddingPaddingPaddingPaddingPaddingPadding

Power Level Encoding

Power LevelHex ValueDecimalDescription
Off0x00000No electric heating
900W0x8403900Low power (900W)
1800W0x08071800High power (1800W)

Note: The encoding appears to represent actual wattage values directly.

Example Frames

Set to 900W:

[0x84] [0x03] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Set to 1800W:

[0x08] [0x07] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Turn off electric heating:

[0x00] [0x00] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Vent Command (0x07)

Controls the ventilation fan level.

Frame Structure

Byte01234567
ContentFan Level0xFE0xFF0xFF0xFF0xFF0xFF0xFF
FormatCodeFixedPaddingPaddingPaddingPaddingPaddingPadding

Fan Level Codes

LevelHex ValueDescription
Off0xE0Ventilation disabled
Comfort0xE1Automatic comfortable mode
Boost0xE2Maximum ventilation
Level 10xF1Manual level 1 (minimum)
Level 20xF2Manual level 2
Level 30xF3Manual level 3
Level 40xF4Manual level 4
Level 50xF5Manual level 5
Level 60xF6Manual level 6
Level 70xF7Manual level 7
Level 80xF8Manual level 8
Level 90xF9Manual level 9
Level 100xFAManual level 10 (maximum)

Example Frames

Set to comfort mode:

[0xE1] [0xFE] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Set to boost mode:

[0xE2] [0xFE] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Set to manual level 5:

[0xF5] [0xFE] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Turn off ventilation:

[0xE0] [0xFE] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

Info Signal (0x16)

Reports current temperatures and system status from the heater.

Frame Structure

Byte0-12-34-56-7
ContentStatus FlagsRoom TemperatureWater TemperatureAdditional Flags
Format16-bit LE16-bit LE16-bit LE16-bit LE

Temperature Decoding

Same encoding as command frames (Kelvin × 10, little-endian).

Decoding:

temp_celsius = ((byte_high << 8) | byte_low) / 10.0 - 273.0

Status Flags (Bytes 0-1)

Common flag patterns observed:

  • 0x0042: Normal operation
  • Additional bit patterns indicate various operational states

(Full flag documentation requires further protocol analysis)

Example Frame

Room at 22°C, water at 45°C:

[0x42] [0x00] [0x86] [0x0B] [0x3A] [0x0C] [0xFF] [0xFF]
 └─┬──┘ └─┬──┘ └────┬────┘ └────┬────┘
   │      │         │            └─ Water: 3130 = 40°C (Eco)
   │      │         └─ Room: 2950 = 22°C
   │      └─ Status flags (high)
   └─ Status flags (low)

Complete Control Sequence Example

To fully control a heater using Legacy TIN protocol:

Scenario: Heat room to 22°C, water to Eco, use fuel only, comfort ventilation

1. Air Heater Command (0x03): Set room to 22°C

[0x86] [0x0B] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

2. Water Heater Command (0x04): Set water to Eco (40°C)

[0x3A] [0x0C] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

3. Fuel Command (0x05): Enable fuel only

[0x01] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

4. Electro Command (0x06): Disable electric

[0x00] [0x00] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

5. Vent Command (0x07): Set to comfort mode

[0xE1] [0xFE] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF] [0xFF]

6. Info (0x16): Receive status (slave response)

[0x42] [0x00] [0x86] [0x0B] [0x3A] [0x0C] [0xFF] [0xFF]

Implementation Notes

Command Coordination

Since Legacy TIN uses separate command channels, implementations must:

  1. Send all relevant command frames in sequence
  2. Maintain consistency between commands (e.g., fuel enable flag must match fuel command)
  3. Handle frame timing properly (typically 40-60ms between frames)

Temperature Conversion Utilities

Celsius to Legacy TIN:

fn celsius_to_tin_old(temp_c: u8) -> u16 {
    ((temp_c as u16 + 273) * 10)
}

Legacy TIN to Celsius:

fn tin_old_to_celsius(encoded: u16) -> f32 {
    (encoded as f32 / 10.0) - 273.0
}

Typical Frame Timing

Time     Frame
----     -----
0ms      0x03 (Air Heater Command)
40ms     0x04 (Water Heater Command)
80ms     0x05 (Fuel Command)
120ms    0x06 (Electro Command)
160ms    0x07 (Vent Command)
...
[periodic]  0x16 (Info response from heater)

Migration to New TIN

Modern installations use New TIN protocol which combines all commands into a single frame (0x20). When implementing drivers:

  • Legacy devices: Use Legacy TIN with separate command frames
  • Modern devices (2018+): Use New TIN with unified command frame
  • Detection: Use product identification to determine protocol version

See New TIN Protocol for modern protocol details.

References