Autoterm Heizgerät Protokoll
Erkenntnisse stammen aus folgenden Community-Projekten:
- Grimoire314 — Autoterm/Planar Reverse Engineering
- schroeder-robert/autoterm-air-2d-serial-control
- prclm/AutotermHeaterController (sowie der kalutep-Fork)
- Pekaway/VAN_PI (Node-RED-Flow)
- csreades/AutothermDieselRepeater
Autoterm-Heizgeräte stellen ein einfaches binäres Anfrage/Antwort-Protokoll über eine 5V-UART-Verbindung bereit. Das Bedienteil fragt das Heizgerät zyklisch mit einer Statusanfrage und einem Heartbeat mit Paneltemperatur ab und sendet bei Bedarf Steuerungs-Frames (Start, Stopp, Einstellungen, Lüftung).
Übertragungsschicht
| Parameter | Wert |
|---|---|
| Signalpegel | 5V, 8N1, keine Flusskontrolle |
| Baudrate | 9600 oder 19200 (modell- bzw. firmwareabhängig) |
Zur automatischen Erkennung der Baudrate kann eine Statusanfrage bei jeder Kandidatenrate gesendet werden; die Rate, bei der eine gültige Antwort zurückkommt, ist die konfigurierte.
Rahmenformat
Alle Frames verwenden dieselbe Hülle:
Beispiel: AA 03 06 00 01 01 ... 05 CC CC
│ │ │ │ │ └───────┘ └───┘
│ │ │ │ │ │ │
│ │ │ │ │ │ └── CRC-16/Modbus (Big-Endian)
│ │ │ │ │ └────────── Payload (Länge = Byte 2)
│ │ │ │ └───────────────── Befehls-ID
│ │ │ └──────────────────── Reserviert (immer 0x00)
│ │ └─────────────────────── Payload-Länge
│ └────────────────────────── Richtung
└───────────────────────────── Präambel (immer 0xAA)
| Byte | Feld | Werte |
|---|---|---|
| 0 | Präambel | 0xAA |
| 1 | Richtung | 0x03 = Bedienteil → Heizgerät, 0x04 = Heizgerät → Bedienteil |
| 2 | Payload-Länge (N) | Bytes der Payload (ohne Header und CRC) |
| 3 | Reserviert | Immer 0x00 |
| 4 | Befehls-ID | Siehe Befehle |
| 5 .. 4+N | Payload | Befehlsspezifisch |
| 5+N .. 6+N | CRC-16/Modbus | Berechnet über Bytes 0 .. 4+N, High-Byte zuerst |
CRC-16/Modbus-Parameter: Polynom 0xA001, Initialwert 0xFFFF, keine Spiegelung
des Ergebnisses. Die CRC wird Big-Endian übertragen — das High-Byte geht zuerst
über die Leitung, entgegen der bei den meisten Modbus-Implementierungen üblichen
Byte-Reihenfolge.
Antworten
Jeder Bedienteil → Heizgerät-Befehl erhält eine Antwort mit Richtung = 0x04 und
derselben Befehls-ID in Byte 4. Die Payload der Antwort folgt einem von drei
Mustern: strukturierte Daten (0x0F Status, 0x02 Lesen), ein Payload-Echo
der Anfrage (0x01, 0x02 Schreiben, 0x11, teilweise 0x23), oder leer
(0x03). Die genauen Bytes finden sich beim jeweiligen Befehl.
Antwort-Payload-Inhalte abseits von 0x0F Status und 0x02 Lesen stammen aus
Community-Reverse-Engineering-Aufzeichnungen und sind nicht unabhängig verifiziert.
Befehle
| ID | Name | Richtung | Antwort-Payload |
|---|---|---|---|
0x01 | Start | B → H | 6-Byte-Echo der Einstellungen |
0x02 | Einstellungen | B → H | 6 Bytes Einstellungen (Schreiben: Echo, Lesen: aktuell) |
0x03 | Stopp | B → H | leer |
0x0F | Status | beide | 19-Byte-Status |
0x11 | Paneltemperatur / Heartbeat | beide | 1-Byte-Echo |
0x23 | Lüftung | B → H | 4-Byte-Teil-Echo |
0x01 — Start
Startet einen neuen Heizzyklus aus dem Standby. Die 6-Byte-Payload entspricht der von Einstellungen (0x02); die Feldbelegung ist dort beschrieben.
TX AA 03 06 00 01 01 00 04 00 00 05 <CRC> ; Beispiel: Leistungsmodus, Stufe 5
RX AA 04 06 00 01 01 00 04 00 00 05 <CRC> ; Heizgerät echot die übernommenen Einstellungen
Der Zustand wechselt anschließend bei den folgenden Statusabfragen von
Startphase zu Heizen.
0x02 — Einstellungen
Befehl 0x02 hat zwei Varianten:
- Schreiben (6-Byte-Payload) — aktualisiert Parameter eines laufenden Heizgeräts, ohne es neu zu starten.
- Lesen (leere Payload) — fragt die aktive Konfiguration des Heizgeräts ab. Das Heizgerät antwortet mit einer 6-Byte-Payload in derselben Feldbelegung.
AA 03 06 00 02 01 00 02 14 01 05 CC CC ; Schreiben: useWT=1, Quelle=Panel, Soll=20°C, Wartemodus=an, Stufe=5
AA 03 00 00 02 9D BD ; Leseanfrage
AA 04 06 00 02 01 00 02 14 01 05 <CRC> ; Leseantwort (gleiche Feldbelegung)
| Payload-Byte | Feld | Hinweise |
|---|---|---|
| 0 | useWT | 0x01 deaktiviert die Laufzeitbegrenzung (Heizgerät läuft unbegrenzt) |
| 1 | Laufzeit | Minuten der programmierten Laufzeit; nur relevant, wenn useWT = 0x00 |
| 2 | Temperaturquelle | Betriebsmodus — siehe Temperaturquelle |
| 3 | Solltemperatur | Sollwert in °C (vorzeichenlos). Ignoriert, wenn Temperaturquelle = 0x04 |
| 4 | Wartemodus | 0x00 = Abschalten bei Erreichen des Sollwerts, 0x01 = Leerlauf-Lüftung bei Sollwert, Wiederzündung bei Unterschreitung |
| 5 | Leistungsstufe | 0x01 – 0x09 (1 = niedrigste). Wird im Leistungsmodus direkt verwendet und in Thermostatmodi als Anfangsleistung |
Die Leseform beim Start abzufragen, stellt nach einem Neustart des Controllers den aktiven Modus, Sollwert und die Leistungsstufe wieder her; zyklisches Abfragen erkennt Änderungen, die ein anderer Controller am Bus vorgenommen hat. OEM-Bedienteile fragen sie alle paar Sekunden ab.
0x03 — Stopp
Stoppt das Heizgerät. Der Zustand wechselt über die folgenden Abfragen von
Abschalten zu Abkühlen zu Standby.
TX AA 03 00 00 03 5D 7C
RX AA 04 00 00 03 29 7D ; Quittung mit leerer Payload
Keine Anfrage-Payload; die Antwort enthält ebenfalls keine Payload.
0x0F — Status
Fragt den aktuellen Zustand und die Sensorwerte des Heizgeräts ab.
Anfrage (keine Payload):
AA 03 00 00 0F 58 7C
Antwort (19-Byte-Payload):
AA 04 13 00 0F 03 00 00 0A 7F 00 84 01 B2 04 00 37 37 00 6D 00 6D 00 64 C3 0A
│ │ │ │ └──┴── Wärmetauschertemperatur (K)
│ │ │ └────────────────── externer Temperatursensor
│ │ └───────────────────── interne Temperatur
│ └─────────────────────────── Zustand Minor
└────────────────────────────── Zustand Major
| Payload-Byte | Feld | Kodierung |
|---|---|---|
| 0 | Zustand Major | Siehe Heizgerätestatus |
| 1 | Zustand Minor | Siehe Heizgerätestatus |
| 2 | Unbekannt | Beobachtet 0x00 |
| 3 | Interne Temperatur | Signed 8-Bit, °C |
| 4 | Externer Temperatursensor | Signed 8-Bit, °C. 0x7F = Sensor nicht angeschlossen |
| 5 | Unbekannt | Beobachtet 0x00 |
| 6 | Unbekannt | Beobachtet 0x84 |
| 7–8 | Wärmetauschertemperatur | u16 Big-Endian, Kelvin (°C = Wert − 273) |
| 9 | Unbekannt | Beobachtet 0x04 |
| 10 | Unbekannt | Beobachtet 0x00 |
| 11 | Unbekannt | Beobachtet 0x37 |
| 12 | Unbekannt | Beobachtet 0x37 |
| 13 | Unbekannt | Beobachtet 0x00 |
| 14 | Lüfterdrehzahl | RPM ÷ 60 (Umdrehungen pro Sekunde) |
| 15 | Unbekannt | Beobachtet 0x00 |
| 16 | Pumpenfrequenz | Hz × 100 (Wert 0x6D = 1,09 Hz) |
| 17 | Unbekannt | Beobachtet 0x00 |
| 18 | Unbekannt | Beobachtet 0x64 |
Dekodierungsbeispiel
Für den obigen Antwort-Frame:
Zustand: Major=0x03, Minor=0x00 → Heizen
Intern: 0x0A = 10 → 10°C
Extern: 0x7F → Sensor nicht angeschlossen
Wärmetauscher: 0x01B2 = 434 → 434 − 273 = 161°C
Lüfter: 0x6D = 109 → 109 × 60 = 6540 RPM
Pumpe: 0x6D = 109 → 109 × 0.01 = 1,09 Hz
0x11 — Paneltemperatur / Heartbeat
Überträgt die Paneltemperatur an das Heizgerät und dient zugleich als verpflichtender Heartbeat. Das Bedienteil muss diesen unabhängig von der konfigurierten Temperaturquelle einmal pro Sekunde senden; das Heizgerät meldet nach etwa drei Sekunden Stille einen „Kein Panel"-Fehler. Das Heizgerät schickt denselben Frame als Bestätigung zurück.
AA 03 01 00 11 1A 76 D0 ; Anfrage: Paneltemperatur = 26°C
AA 04 01 00 11 1A B6 65 ; Echo
| Byte | Feld | Kodierung |
|---|---|---|
| 5 | Paneltemperatur | Signed 8-Bit, °C. 0x7F signalisiert „kein Panelsensor" |
Im Modus Temperaturquelle = 0x02 (Panel) ist das Byte der Wert, gegen den das
Heizgerät regelt. In allen anderen Modi ist das Byte weiterhin erforderlich,
aber rein informativ — 0x7F ist die übliche Wahl und das, was OEM-Bedienteile
senden, wenn kein Panelsensor verbaut ist.
0x23 — Lüftung
Betreibt nur den Lüfter, ohne Zündung.
TX AA 03 04 00 23 FF FF 08 FF E1 0B ; Lüftungsstufe 8
RX AA 04 04 00 23 FF FF 08 43 B6 4B ; Bytes 0–2 spiegeln die Anfrage, Byte 3 weicht ab
| Payload-Byte | Feld | Werte |
|---|---|---|
| 0 | Unbekannt | In der Anfrage immer 0xFF |
| 1 | Unbekannt | In der Anfrage immer 0xFF |
| 2 | Lüftungsstufe | 0x00 – 0x09 |
| 3 | Unbekannt | In der Anfrage 0xFF; das Heizgerät antwortet mit einem abweichenden Wert (Zweck unbekannt) |
Feld-Referenz
Temperaturquelle
| Wert | Modus | Verhalten |
|---|---|---|
0x01 | Interner Sensor (Thermostat) | Regelt gegen den eigenen Ansaugluftsensor des Heizgeräts. Ungenau, da diese Sonde im Lufteinlass des Heizgeräts sitzt und nicht im Wohnraum |
0x02 | Panelsensor (Thermostat) | Regelt gegen die Temperatur, die das Bedienteil über 0x11 sendet |
0x03 | Externer Sensor (Thermostat) | Regelt gegen eine separate, direkt am Heizgerätekabelbaum angeschlossene Sonde |
0x04 | Leistungsmodus | Kein Thermostat — Heizgerät läuft mit fester Leistungsstufe (1 – 9). Bytes 3 und 4 der Einstellungen-Payload werden ignoriert |
Heizgerätestatus
Wird als (Major, Minor)-Paar in der Statusantwort kodiert. Das Major-Byte beschreibt die übergeordnete Phase; das Minor-Byte einen Unterschritt.
| Major | Minor | Zustand | Beschreibung |
|---|---|---|---|
0x00 | 0x01 | Standby | Bereit, wartet auf Befehle |
0x01 | 0x00 | Abkühlen | Nachlauf nach dem Abschalten (Lüfter läuft, keine Flamme) |
0x01 | 0x01 | Lüftung | Nur-Lüfter-Modus (nach Lüftungsbefehl) |
0x02 | beliebig | Startphase | Zündvorgang läuft |
0x03 | beliebig | Heizen | Stabiler Heizbetrieb |
0x04 | 0x00 | Abschalten | Abschaltvorgang läuft |
Timing
| Parameter | Wert |
|---|---|
| Abfrageintervall (Status + Heartbeat) | 1 s |
| Tolerierte Stille vor „Kein Panel"-Fehler | ~3 s |
| Antwort-Timeout | 600 ms |
| Tolerierte aufeinanderfolgende ausgebliebene Antworten, bevor die Verbindung als unterbrochen gilt | 2 |
Betriebsabläufe
Initialisierung — Heizgerätestatus ermitteln
Nachdem der Controller (neu) verbunden hat, weiß er nicht, ob das Heizgerät im Standby, mitten im Heizbetrieb oder im Abschaltvorgang ist. Zur Synchronisation:
- 0x11 senden — stellt die Verbindung her und bestätigt die Baudrate.
- 0x0F senden — liefert den aktuellen Betriebszustand.
- 0x02 Lesen senden — liefert den aktiven Modus, Sollwert und die Leistungsstufe.
Ab hier wechselt der Controller in den unten beschriebenen zyklischen Abfragetakt.
Zyklische Abfrage
Im Sekundentakt:
- Bedienteil → Heizgerät: 0x11 mit aktueller Paneltemperatur (oder
0x7F, falls kein Panelsensor) - Heizgerät → Bedienteil: Heartbeat-Echo
- Bedienteil → Heizgerät: 0x0F
- Heizgerät → Bedienteil: Statusantwort
0x02 Lesen kann alle paar Sekunden zusätzlich gesendet werden, um Einstellungsänderungen anderer Controller am Bus zu erkennen.
Heizen mit Leistungsstufe 5 starten
- Bedienteil → Heizgerät: 0x01 mit Payload
01 00 04 00 00 05 - Heizgerät → Bedienteil:
0x01-Antwort, die die 6-Byte-Einstellungs-Payload echot - Folgende Abfragen zeigen den Zustandswechsel von
StartphasezuHeizen.
Leistungsstufe im laufenden Betrieb ändern
- Bedienteil → Heizgerät: 0x02 Schreiben mit neuer Leistungsstufe in Payload-Byte 5
- Heizgerät → Bedienteil:
0x02-Antwort, die die 6-Byte-Einstellungs-Payload echot
Stopp
- Bedienteil → Heizgerät: 0x03
- Heizgerät → Bedienteil:
0x03-Antwort mit leerer Payload - Der Zustand wechselt über die folgenden Abfragen von
AbschaltenzuAbkühlenzuStandby.
