Tobias Reithmeier

Blog

Unbekannte Modbus-Register kartieren, ohne etwas kaputtzumachen

Teil 4 der Serie „Smart Home in der Praxis". Teil 3 endete mit der Frage, woher man weiß, was hinter Register 12 steckt, wenn kein Datenblatt passt. Hier ist die Antwort - sie funktioniert für jedes Modbus-Gerät, nicht nur für Wärmepumpen.

Modbus ist ein herrlich einfaches Protokoll: Ein Master fragt „gib mir Register 12", der Slave antwortet mit einer Zahl. Was die Zahl bedeutet, steht auf einem anderen Blatt - dem Datenblatt nämlich, und wenn das fehlt oder schlicht nicht stimmt, steht man vor einem Gerät, das brav antwortet und nichts verrät. Genau da stand ich mit der Wärmepumpe aus Teil 3: Sie beantwortet Modbus-Anfragen, hält sich aber an keine der veröffentlichten Registerkarten - auch nicht mit Versatz.

Was folgte, war eine eigene kleine Disziplin. Die Werkzeuge dafür sind inzwischen Teil der Firmware und laufen als Buttons und Schalter direkt in Home Assistant.

Die eiserne Regel: lesen ja, blind schreiben nie

Bevor irgendein Scanner läuft, eine Regel, die alles andere überlebt: Ein unbekanntes Register wird nie beschrieben, um herauszufinden, was es tut. Bei einem Temperatursensor wäre das egal. Bei einer Heizungsanlage liegen auf unbekannten Coils womöglich Dinge wie Notaus, Notbetrieb oder ein Desinfektionszyklus, der den Warmwasserspeicher stundenlang auf 70 Grad heizt - in LGs offizieller Karte liegen genau diese Funktionen auf benachbarten Positionen.

Dazu kommt eine Tücke, die gern übersehen wird: Rücklesen beweist nichts. Wer eine 1 in ein Coil schreibt, danach eine 0 zurückliest und daraus „hat nicht funktioniert" folgert, könnte genauso gut ein flankengetriggertes Bit erwischt haben - eines, das seine Aktion ausführt und sich selbst zurücksetzt. Ohne die Antwort des Busses im Detail zu protokollieren (Exception? Quittung? Was liefert das Rücklesen wann?), ist so ein Test wertlos und potenziell gefährlich.

Schritt 1: den Adressraum abtasten

Der erste Scanner beantwortet die Frage, wo überhaupt etwas ist. Er fragt stur Adressen ab und notiert, welche antworten und welche mit Exception 2 („illegal data address") abgelehnt werden. Schon die Fehlermeldung ist ein Signal: Ein Gerät, das Exception 2 sendet, existiert und redet - es lehnt nur diese Adresse ab. Totale Stille dagegen heißt: falsche Baudrate, falsche Adresse, falsches Protokoll oder falsche Verdrahtung.

Der Tiefenscan über alle 65536 Adressen je Registertyp fand bei der Wärmepumpe 32 antwortende Punkte, verteilt auf wenige Inseln. Er hat aber eine Schwäche, die mich zwei Register gekostet hätte: Aus Zeitgründen fragt so ein Scan in Gruppen ab - und lehnt ein Gerät eine Gruppe ab, sobald ein einziges Register darin nicht existiert, verschwinden die vorhandenen Nachbarn gleich mit.

Deshalb der zweite Durchgang: Einzelabfragen über den nahen Adressraum. Der fand fünf Register, die der Gruppenscan übersehen hatte - darunter ausgerechnet den Flüstermodus. Die Lehre als Merksatz: Gruppenabfragen finden schnell, Einzelabfragen finden alles.

AnsatzStärkeSchwäche
Tiefenscan in Gruppenganzer Adressraum in vertretbarer Zeitversteckt Register, wenn die Gruppe ein Loch hat
Einzelabfragefindet jedes antwortende Registerzu langsam für den ganzen Adressraum
Passives Mithörenvöllig risikofreizeigt nur, was ohnehin gesprochen wird

Schritt 2: den Registern beim Ändern zusehen

Damit ist bekannt, wo etwas liegt - aber nicht, was. Das stärkste Werkzeug dafür ist bestechend einfach: ein Beobachtungsmodus. Eingeschaltet pollt die Firmware alle bekannten Register schneller als sonst und meldet jede Änderung als Klartext: welcher Punkt, alter Wert, neuer Wert, kumulierte Liste seit dem Einschalten.

Der Ablauf ist dann Handarbeit mit sofortiger Belohnung: Beobachtung einschalten, ans Bedienteil gehen, genau eine Sache umstellen - Warmwasser-Soll von 48 auf 50 -, zurückkommen und ablesen, welches Register sich bewegt hat. Sekundengenaue Zeitstempel machen die Zuordnung eindeutig. So wurde aus einem anonymen Halteregister der schreibbare Betriebsmodus, und aus einem Coil der Flüstermodus - beides galt nach den veröffentlichten Karten als über diesen Anschluss unerreichbar.

Zwei Details machen den Modus alltagstauglich: Er hat keinerlei Schreibzugriff auf den Bus, und er schaltet sich nach 30 Minuten selbst ab - ein vergessener Beobachtungsmodus kann also weder die Anlage verstellen noch den Bus dauerhaft belasten.

Ein Kniff spart zusätzlich Zeit: Manche Bedienteile zeigen in ihren Servicemenüs dieselben Rohwerte, die auch auf dem Bus liegen. Steht am Display wörtlich „Kältemittel 12000" und liefert ein Register konstant 12000, ist die Zuordnung geschenkt.

Schritt 3: die Physik als Zeuge

Für Register, die sich nicht am Bedienteil umstellen lassen, bleibt die überzeugendste Beweisführung: Der Wert muss sich physikalisch richtig verhalten. Ein Beispiel aus der Praxis: Zwei Register standen im Verdacht, Kältekreisdrücke zu sein. Rechnet man aus dem vermuteten Druck die Siedetemperatur des Kältemittels aus und vergleicht sie mit einer unabhängig gemessenen Temperatur, muss das über jeden Betriebszustand hinweg zusammenpassen - nicht einmal, sondern monoton über Stunden. Tut es das, ist die Zuordnung belegt; die ganze Rechnung zeigt Teil 5.

Umgekehrt entlarvt die Physik auch Fehldeutungen: Ein Register, das als „Verdichterfrequenz" im Raum stand, hielt über neun Stunden Stillstand konstant 10 bis 15 Kelvin Abstand zur Außenluft. Eine Frequenz wäre bei stehendem Verdichter null - eine Gehäusetemperatur nicht.

Der Fallstrick, der Wochen gekostet hätte: Blockbildung

Die unangenehmste Lektion der ganzen Kartierung hat nichts mit dem Gerät zu tun, sondern mit dem eigenen Werkzeug. ESPHome fasst benachbarte Register automatisch zu Blockanfragen zusammen, und diese Gruppierung ändert sich mit jeder Änderung an der Registerliste. Bei dieser Anlage verschob das die Antworten zwischen Nachbarregistern: Ein Register lieferte in drei aufeinanderfolgenden Firmware-Ständen zu 100 Prozent physikalisch unmögliche Werte - bis 451 Grad - und im vierten wieder plausible. Die Sprünge lagen exakt auf den Grenzen der Firmware-Stände, nicht auf Betriebszuständen.

Das Tückische daran: Genau in einer der verfälschten Phasen entstand per Ablesevergleich eine Fehlzuordnung, die sich wochenlang hielt. Daraus folgen zwei Regeln. Erstens gehört in ESPHome an jedes Register ein force_new_range: true - die Einzelabfragen kosten Buslast, aber sie können nicht mehr verrutschen. Zweitens: Eine Zeitreihe über mehrere Firmware-Stände ist kein Datensatz. Wer Auswertungen fährt, begrenzt sie auf einen Stand, sonst korreliert man Artefakte.

Wenn gar nichts antwortet: Es könnte das falsche Protokoll sein

Nicht jede RS485-Klemme spricht Modbus. Die Leitung, an der bei dieser Anlage das alte Cloud-Gateway hing, blieb bei 988 Modbus-Anfragen über 247 Adressen und vier Baudraten vollständig stumm - keine Exception, nichts. Diese Stille ist selbst ein Messergebnis: Dort läuft LGAP, ein LG-eigenes Protokoll mit eigenem Rahmenformat und eigener Prüfsummenregel, zu dem es ein Community-Projekt samt Protokollanalyse gibt. Für dieses Grundstück gilt die Regel von oben in verschärfter Form: In dem Projekt ist dokumentiert, wie Steuerversuche über LGAP eine Anlage real verstellt haben. Beobachten, nicht nachsenden.

Auch banale Fehler haben dort ein klares Signaturbild: Vertauschte Adern liefern keine Antworten, sondern je Anfrage ein einzelnes Nullbyte - und die Aktivitäts-LED des RS485-Wandlers leuchtet dauerhaft statt zu blinken.

Was am Ende steht

Nach Scannern, Beobachtung und Physik-Abgleich sind bei der Wärmepumpe 34 Datenpunkte kartiert, davon fünf schreibbar - dokumentiert mit der jeweiligen Beweisgrundlage in der Registerkarte im Repository. Der ehrliche Teil der Bilanz: Ein Rest bleibt offen, ein paar Register antworten und schweigen sich über ihre Bedeutung aus. Sie bleiben, was sie sind - beobachtete Unbekannte. Nichts davon wird beschrieben, bis eine Beobachtung sie verrät.

Teil 5 macht aus den kartierten Registern dann das, wofür sich der ganze Aufwand gelohnt hat: eine Kältekreis-Diagnose, die mehr zeigt, als die Hersteller-App je konnte.

Quellen