RS485 ModBus – Nächstes Level

Das die Messeinheit funktioniert, konnte ich ja schon die letzten Wochen feststellen. Die ModBus RS-485 Schnittstelle konnte ich ja auf Protokollebene auch schon mal erfolgreich antesten. Nun geht es dran, hier eine funktionierende Lösung für die Solaranlage zusammenzubauen.

Projekt: Solaranlage

Kontakt: Boris Dirnfeldner

Link: – eigenes Projekt –

Situation, Probleme und Lösungen:
Nach dem ersten Trockenversuch war ich schon recht zuversichtlich, das die Lösung nun deutlich näher gerückt ist. Die Idee war mit einem ESP32 und einem RS-485 Adapter den PC-Client zu ersetzen und die Messdaten dann im ESP32 mit einem kleinen Webserver zu visualisieren. Letzteres hatte schon recht schnell ganz ordentlich funktioniert (als UI habe ich ESP-DASH verwendet). Dafür hat der RS-485 Anteil so gar nicht wollen. Zum einen ist der ESP32 mit 3,3V unterwegs, ich hatte aber nur Teile für die Arduinos bzw. Raspberries (beide mit 5V Bordnetz). Beim Versuch für 3,3V entsprechende Boards zu bekommen war der erste Einkauf leider nur mit baugleichen Gegenstücken kompatibel. Danach habe ich (vermutlich) eine bessere Alternative gefunden, aber bisher noch nicht verbaut. In der Wartezeit hatte ich im Bereich Software weiter bearbeitet und leider herausgefunden, das die ModBus-Libaries für den ESP32 (eigentlich alle Arduino-Umgebungen) ein Timing-Problem haben und die Kommunikation damit nicht funktioniert. Zwar kann man das auch lösen, aber so richtig wollte mir das nicht schmecken (wenn ich schon die Libs erst mal berichtigen muss kommt sicher noch einiges anderes dazu). In der Kombination gab es mir zu viele (potentielle) Probleme.

Also nochmal einen Schritt zurück und das Konzept überdacht. Ich habe ja schon ein fertiges Python-Skript zum Auslesen im Netz gefunden (war ja als Basis für den ESP32-Code gedacht) und einiges an Hardware rumliegen. Da ich ja einen funktionierenden USB-Adapter für RS-485 habe (getestet) und auch noch diverse Raspberries, ist die neue Lösung nun darauf aufgebaut. Die Library für ModBus scheint hier keine Probleme zu haben und der Raspi ist auch generell flexibler für ungeplante Ergänzungen oder Versuche (der ESP war mit dem Webserver dann schon recht ausgelastet). Für den Raspberry musste noch ein Gehäuse zur Schienenmontage her, ein entsprechendes Netzteil zur Montage auf einer Schiene hatte ich schon. Da nun mehr Platz benötigt wurde, brauchte es auch insgesamt ein Gehäuse-Upgrade. Nebenbei wollte ich ohnehin den „Notaus“-Schalter gegen ein Modell tauschen, das neben der Phase auch den Nullleiter unterbricht (bei einer gewissen Leistung „reisst“ das System sonst den FI im Schaltschrank).

Nachdem alle Teile eingetrudelt sind, wird nun der erste Grundaufbau getestet. Der Raspberry hat das aktuelle Raspian bekommen und wurde in sein Gehäuse eingebaut. Das ganze wird nun mit dem 5V-Netzteil schon mal provisorisch ins Gehäuse reingesetzt. Da ich die Energiezählerklemme derzeit in der Solaranlage benutze, ist der kleine Bruder (mit gleichem Interface) als Testklemme dazugebaut worden. Danach das ganze noch sauber verkabeln und mit einem normalen Haushaltsstecker als Teststromlieferant verbunden.

Der Raspberry musste mit neuen Image noch eingerichtet werden, das Skript draufkopiert und die abhängigen Libs dazu installiert. Dann der erste Start und siehe da, Exception und nix passiert. Wie immer halt, manchmal könnte man schon die Kriese bekommen.

Unmittelbar klar ist schonmal, das das Skript nur auf Python 2.x läuft (Python 3 hat z.B. für print einen anderen Syntax). Aber auch dort kommt es nur zur Exception.
Nach einigen Versuchen stellt sich heraus, das die erforderlichen Libs für die Raspberry-Umgebung leider nicht ganz gestimmt haben. Statt der gelisteten Lib „Serial“ braucht es „pySerial“, dann klappts auch auf dem Bus. Wenn ich „Serial“ dazu installiere, geht es schief. Das Skript holt sich nun die Daten richtig ab. Nach ein Paar weiteren Tests ist nun klar, das der Aufbau sicher funktioniert und die finale Lösung angegangen werden kann.

Die Hardware ist unproblematisch und wird einfach umgebaut werden. Da wird es keinerlei Probleme mehr geben (zumindest bis ich es besser weiss). Nur die WLAN-Reichweite des Raspberries könnte noch ein Thema sein, das wäre es dann aber auch mit dem ESP32 geworden.
Das vorhandene Skript wird ersetzt durch eine Python 3- Variante, die Daten in eine SQLite-Datenbank hinterlegt. Dazu kommt ein zweites Skript, das diese Daten dann als Webservice visualisiert. Wahrscheinlich erfolgt dies mit pydash, muss aber noch ausgetestet werden. Beide Skripte werden dann noch als Service eingerichtet. Die Datenbank schiebe ich dann noch regelmäßig auf das NAS als Backup oder zur manuellen Analyse. Auch wieder ein kleines Skript und etwas Aufwand.

Bewertung:
Mit dem Set habe ich dann eine von den Launen der Hersteller unabhängiges System, alle auch jetzt schon verfügbaren Messdaten und die Option den Raspi sukzessive mit weiteren Funktionen auszustatten. Potential hat das System für viele Erweiterungen, aber erst mal muss die Basis laufen. Als einzigen Nachteil zur Herstellerlösung sehe ich, das die internen Messfühler des Wechselrichters (natürlich) nicht zu sehen sind. Das wäre z.B. die Leistung an den einzelnen Strings. Die sind aber bei meinem Aufbau mit parallel verschalteten Modulen auch nicht mehr so eindeutig, daher egal. Und das der Hersteller für die eingebaute ZigBee-Schnittstelle keine Specs herausgibt ist schon schade. Das er aber dann fast 200€ verlangt für ein (nicht wetterfestes, geschweige den außenbereich-taugliches) Gateway und den Zwang sich an die Herstellercloud zu hängen, ist unverschämt. Wohl dem der sich hier helfen kann und nicht jeden Unsinn mitmachen muss.

Fazit:
Nach etwas Zeit im Abklingbecken kann ich nun endlich den Zielaufbau angehen. Die Basis-Infrastruktur ist getestet, jetzt muss ich das noch umbauen (der nächste Schlechtwettertag kommt bestimmt) und die Software richtig implementieren. Zum Glück kann ich das in mehreren Schritten machen und dann (remote) aktualisieren. Ich freue mich schon auf die ersten richtigen Daten, ohne jedes mal durch den Garten zur Anlage hin zu schlappen.

Der Weg ist das Ziel, aber das Etappenziel kommt näher!

Komponenten:
RS485-USB Converter
DDS238-1 ZN Smartmeter
Raspberry PI3B+
Netzteil-Klemme

Überlegungen:
Das manuelle Ablesen von Leistungsdaten ist doof und die Herstellerlösung zur Darstellung der Wechselrichterleistung ist teuer, cloudabhängig und damit auch doof. Wird Zeit das ich endlich das Monitoring auf die Reihe bekomme.

Houston – wir haben ein Bild

Das ewige An-die-Anlage-Latschen-um-Leistungsdaten-zu-bekommen ist mir nun endgültig zu blöd, zumal es bei mehr als 35° noch weniger Laune macht als ...

RS485 ModBus – Nächstes Level

Das die Messeinheit funktioniert, konnte ich ja schon die letzten Wochen feststellen. Die ModBus RS-485 Schnittstelle konnte ich ja auf ...

RS485 ModBus – Aller Anfang ist schwer

Obgleich ich nur eine Kleinst-Solaranlage installiere, will ich natürlich trotzdem bunte Diagramme zu den wichtigten Parametern sehen. Da das Teil ...

RS485 ModBus – Aller Anfang ist schwer

Obgleich ich nur eine Kleinst-Solaranlage installiere, will ich natürlich trotzdem bunte Diagramme zu den wichtigten Parametern sehen. Da das Teil unter Kostendruck steht kann und will ich mir die herstellereigenen Lösungen für den Wechselrichter dazu nicht leisten. Ersatzweise ist in den Aufbau ein Energiemesser mit RS485 reingekommen, der aber noch an meinen Controller angeflanscht werden muss. Als „Trockenübung“ und ersten Schritt ist erst mal die Funktion zu testen, also das Thema von heute.

Projekt: Solaranlage

Kontakt: Boris Dirnfeldner

Link: – eigenes Projekt –

Da die Umwälzpumpe vom Pool übers Jahr einiges an Strom braucht, ist gerade eine Mini-Solaranlage mit 540Wp in Arbeit. Die Anlage an sich beschreibe ich dann in einem anderen Artikel, aber ein Teil davon ist ein Smartmeter mit RS485-Interface zum Auslesen einiger Betriebsparameter. Das Teil wird für ca. 15€ gehandelt und ist damit in meinem Beuteschema.

Leider habe ich weder mit RS485 noch mit ModBus Erfahrung, oder diese waren so übel das sie schon wieder verdrängt wurden. Nach einiger Recherche im Internet sieht es so übel nicht aus, RS485 ist ein serieller Bus mit Differential-Signal für lange Distanzen. Ansonsten nix neues. Das Teil kann im Zweidraht-Verfahren angesteuert werden (Anschlüsse A,B) oder ergänzend mit Masse, optional dazu mit Spannung. Es gibt Umsetzer für RS485 auf RS232 oder auch zu USB. So ein Teil liegt wegen eines anderen geplanten aber nie gemachten Versuchs noch rum, also rausgesucht und angeklemmt.

Der Adapter kommt in den PC und wird als serielle Schnittstelle eingebungen. Das Energiemessgerät ist bereits in ein Gehäuse mit anderer Elektrik eingebaut, daher müssen nur noch die beiden Signalleitungen angeklemmt werden und Saft auf die Leitung gegeben werden. Das Messerät zeigt auf dem Display viele Daten an, scheint also zu arbeiten. Verbrauch ist bei 0 in beiden Richtungen, da weder ein Verbraucher noch die Solaranlage dran hängt.

Da ich von ModBus keine Ahnung habe, war ein erster Versuch einfach am Bus mit einem Terminalprogramm zu horchen und siehe da, nix los. Wär auch zu einfach gewesen.
Also doch reinlesen und auch hier zeigt sich die wunderbare Komplexität von IT-Umgebungen. Zum Glück lässt sich das Thema eingrenzen, denn ich muss lediglich per „RTU“ einzelne Register auslesen.
Das geht mit Python und entsprechenden Libs recht komfortabel. Irgendwie will ich aber trotzdem erst mal sehen ob das Teil läut, bevor ich noch mehr Fehlerquellen dazu nehme.

Bei der Recherche ist mir ein Blog-Artikel untergekommen, der für Python die Lösung beschreibt. Das ist schon mal super, denn so muss ich zumindest nicht alles erraten. Damit kenne ich schon mal die Registerbelegungen und habe einen Codeschnipsel für später. Ich brauche die Register 0-43 vom Client 0 im 16-Bit-Format. Leider gibt es vom Hersteller diese Dokumentation nicht, irgendwo muss der Preis ja herkommen.

Es hat sich auch ein Tool gefunden, mit dem ich versuchweise mal mit ModBus-RTU „spielen“ kann. Damit sehe ich mit den ersten Versuchen zumindest schon mal das der Rechner irgendwas sendet. Aber keine Antwort…
Also Weiterlesen, der Bus will es mir nicht einfach machen. Verbindungsparameter passen schon mal (gemäß Datenblatt, zumindest sowas hat der Hersteller), soweit so gut.
Nach einiger Suche (diesmal in der Doku der Python-Library) ist der Fehler klar, bei ModBus werden Register mit Offset angegeben. Das Register 99 wird mit 40100 addressiert. Eine Lib kapselt das schön, aber direkt am Bus muss es halt stimmen.

Neuer Versuch, und nun meldet sich das Messgerät brav und schickt mir alle angefragten Register.
Das 13. Register soll die Spannung enthalten, und das ist auch so (Werte am Display und im Register sind gleich).

Damit scheint alles zu funktionieren und ich kann mich nun der richtigen Lösung mit einem ESP32-Contoller widmen.
Das kommt aber in einen anderen Artikel, für heute habe ich genug geforscht.

Fazit:
Nachdem ich RS485 mit ModBus mal kapiert hatte und die übelsten Anfängerfehler hinter mir gelassen hatte, kann es nun mit guten Gewissen an die Integration in die Steuerung gehen. Ich weiß nun das die Teile funktionieren und zumindest keinen offensichtlichen Blödsinn produzieren. Und was gelernt habe ich auch wieder dabei.

Komponenten:
RS485-USB Converter
DDS238-2 ZN/S Smartmeter

Test: Simply Modbus Master 6.4.1

Überlegungen:
Das Smartmeter der Solaranlage unterstützt RS485 zum Auslesen der Parameter. Sollte doch kein Thema sein an die Daten zu kommen, ne c’est pas?

Schäden:
– Keine. Alles Ok.

Houston – wir haben ein Bild

Das ewige An-die-Anlage-Latschen-um-Leistungsdaten-zu-bekommen ist mir nun endgültig zu blöd, zumal es bei mehr als 35° noch weniger Laune macht als ...

RS485 ModBus – Nächstes Level

Das die Messeinheit funktioniert, konnte ich ja schon die letzten Wochen feststellen. Die ModBus RS-485 Schnittstelle konnte ich ja auf ...

RS485 ModBus – Aller Anfang ist schwer

Obgleich ich nur eine Kleinst-Solaranlage installiere, will ich natürlich trotzdem bunte Diagramme zu den wichtigten Parametern sehen. Da das Teil ...

Wir benutzen Cookies und Logs mit personenbezogenen Daten ausschließlich für essentielle Funktionen wie z.B. bei der Benutzeranmeldung oder der Fehlersuche. Für Videos werden weitere Cookies von Drittanbietern benötigt. Details finden sie unter dem Link "Weitere Informationen".