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 ID | Frame Type | Direction | Purpose |
|---|---|---|---|
| 0x03 | Air Heater Command | Master → Slave | Room temperature setpoint |
| 0x04 | Water Heater Command | Master → Slave | Water temperature setpoint |
| 0x05 | Fuel Command | Master → Slave | Fuel/electric enable control |
| 0x06 | Electro Command | Master → Slave | Electric heating power level |
| 0x07 | Vent Command | Master → Slave | Fan/ventilation control |
| 0x16 | Info | Slave → Master | Temperature and status telemetry |
Air Heater Command (0x03)
Controls the room temperature setpoint.
Frame Structure
| Byte | 0-1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| Content | Target Temperature | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF |
| Format | 16-bit LE | Padding | Padding | Padding | Padding | Padding | Padding |
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
| Byte | 0-1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| Content | Target Temperature | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF |
| Format | 16-bit LE | Padding | Padding | Padding | Padding | Padding | Padding |
Temperature Encoding
Same encoding as Air Heater Command (Kelvin × 10, little-endian).
Water Temperature Levels:
| Level | Temperature | Hex Value | Decimal | Description |
|---|---|---|---|---|
| Off | - | 0x0000 | 0 | Water heating disabled |
| Eco | 40°C | 0x3A0C | 3130 | Energy-saving mode |
| Hot | 60°C | 0xD00C | 3280 | Maximum 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
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| Content | Enable Flags | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF |
| Format | Bitmap | Padding | Padding | Padding | Padding | Padding | Padding | Padding |
Enable Flags (Byte 0)
| Bit | Function | Values |
|---|---|---|
| 0 | Fuel enable | 0 = Disabled, 1 = Enabled |
| 1 | Electro enable | 0 = Disabled, 1 = Enabled |
| 2-7 | Reserved | Must be 0 |
Common Values
| Configuration | Hex Value | Binary | Description |
|---|---|---|---|
| Both Off | 0x00 | 0b00000000 | No heating source |
| Fuel Only | 0x01 | 0b00000001 | Gas/diesel heating only |
| Electro Only | 0x02 | 0b00000010 | Electric heating only |
| Both On | 0x03 | 0b00000011 | Fuel + 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
| Byte | 0-1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| Content | Power Level | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF |
| Format | 16-bit LE | Padding | Padding | Padding | Padding | Padding | Padding |
Power Level Encoding
| Power Level | Hex Value | Decimal | Description |
|---|---|---|---|
| Off | 0x0000 | 0 | No electric heating |
| 900W | 0x8403 | 900 | Low power (900W) |
| 1800W | 0x0807 | 1800 | High 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
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| Content | Fan Level | 0xFE | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF |
| Format | Code | Fixed | Padding | Padding | Padding | Padding | Padding | Padding |
Fan Level Codes
| Level | Hex Value | Description |
|---|---|---|
| Off | 0xE0 | Ventilation disabled |
| Comfort | 0xE1 | Automatic comfortable mode |
| Boost | 0xE2 | Maximum ventilation |
| Level 1 | 0xF1 | Manual level 1 (minimum) |
| Level 2 | 0xF2 | Manual level 2 |
| Level 3 | 0xF3 | Manual level 3 |
| Level 4 | 0xF4 | Manual level 4 |
| Level 5 | 0xF5 | Manual level 5 |
| Level 6 | 0xF6 | Manual level 6 |
| Level 7 | 0xF7 | Manual level 7 |
| Level 8 | 0xF8 | Manual level 8 |
| Level 9 | 0xF9 | Manual level 9 |
| Level 10 | 0xFA | Manual 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
| Byte | 0-1 | 2-3 | 4-5 | 6-7 |
|---|---|---|---|---|
| Content | Status Flags | Room Temperature | Water Temperature | Additional Flags |
| Format | 16-bit LE | 16-bit LE | 16-bit LE | 16-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:
- Send all relevant command frames in sequence
- Maintain consistency between commands (e.g., fuel enable flag must match fuel command)
- 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
- TIN Protocol Overview - General TIN protocol information
- New TIN Protocol - Modern unified protocol
- Implementation:
womonet-drivers/src/tin/protocol/tinold/
