Channel Apps
[Markdown] 

Photovoltaik und Co: S0 Bus vom Stromzähler

S0 Bus vom Stromzaehler in Fhem verarbeiten

Arbeiten am Strom können tödlich sein. Arbeiten bitte vom Fachmann ausführen lassen!

Mein Stromzaehler für die PV Anlage selbst hat einen S0-Bus. Dieser S0 Bus besteht aus 2 Kontakten, die über einen Optokoppler in Intervallen zusammen geschaltet werden. Der Optokoppler trennt diese Kontakte von den 230v bzw 400v.

Der Optokoppler zieht die Leitung von S+ nach S- (auf Masse), schliesst den Kontakt und erzeugt so eine Flanke. Mein Stromzaehler macht für 1KWatt/h 1000 Impulse/h. Lässt sich also gut zählen.

Mein Ansatz ist 1Min zu zählen und dann hoch zurechnen. Der andere Ansatz wäre gewesen, zu messen wie lange es von einem Impuls zum anderen braucht und das dann hochzurechnen. Das wäre sicherlich genauer gewesen, doch mir reicht eigentlich die Auflösung in 60'er Schritten.

Hinweis: Es soll auch Stromzähler geben, die 800 Impulse für 1KWatt machen! In dem Fall muß mit einem anderen Faktor gerechnet werden.

An diese S+ und S- Klemmen kann man also auch einen Telefondraht oder CAT6 Kabel anschließen.

Anschluß der Leitung am Stromzaehler: image

Als Schnittstelle am Linux Computer kann man eine serielle RS232 Schnittstelle nehmen. Früher hat man über diese Schnittstelle Modems oder Mäuse angeschlossen. Kaum ein morderner Computer hat diese Schnittstelle noch. Doch es gibt Adapter von USB auf RS232 für aktuell knapp 10€.

Die Belegung habe ich dieser Webseite entnommen. Auf die Polung achten, sonst schaltet der Optokoppler nicht.

Apropos USB und schalten: Der Optokoppler vom S0 Bus benötigt eine gewissen Spannung um Schalten zukönnen. Wenn ich den USB Adpater an einen passiven (ohne eigene Stromversorgung) USB-Hub hänge, funktioniert die Zählerei nicht mehr. Zumindest ist dies meine Erfahrung.

Ein RS232-Stecker:

image

Ein passender USB Adapter:

image

Passend zum Adapter muss noch das Linux Kernel Modul geladen. Dies geschah bei mir diesmal automatisch. Welches Device ist dem neuen Gerät zugeordenet worden? Dies kann heraus gefunden werden mit dem Kommando:

dmesg | grep tty
[   17.973615] usb 1-3: cp210x converter now attached to ttyUSB0
[   21.828432] usb 1-4: FTDI USB Serial Device converter now attached to ttyUSB1

In dem Fall ist mein Serial2USB Stick als Device /dev/ttyUSB1 erkannt worden. Der Owl Strommesser ist allerdings auch elektrisch ein Serial2USB Device und wurde schon als /dev/ttyUSB0 erkannt. Der Owl Strommesser wird in diesem Beitrag und diesem behandelt.

Um auf die schnelle zu testen, ob der S0-Bus funktioniert gibt es folgendenes Kommando.:

strace -t -e read cat  < /dev/ttyUSB1 > /dev/null 

Mit jedem Implus kommt hier eine neue Zeile in der Ausgabe hinzu.

c-Programmierung

Da alle Versuche mit Bash Bordmitteln fehlschlugen habe ich mich dann doch dazu durchgerungen ein kleines C Programm zu schreiben. Ich bin wahrlich kein Experte in C-Programmierer, ich möchte mich daher für meine stümperhafte Arbeit bei den Profis entschuldigen. Dieses kleine C-Progrämmchen findet Ihr hier.

Am Anfang des Programms wird die Schnittstelle konfiguriert, verändert man hier die Einstellungen, kann dies dazu führen, dass die Schnittstelle nicht mehr wie gewünscht arbeitet. Über die Bash kann man sich die gesetzten Einstellungen anzeigen lassen und ggf. korrigieren, bzw. sich Einstellungen, die funktionieren, raussuchen und dann im Programm entsprechend setzen.

Diese Programm hat ein paar Nachteile, die ich evtl. mit etwas Einsatz noch verbessern kann: * Es werden kaum Fehlerabgefangen * Das Programm liest so lange an der Leitung bis ein Zeichen kommt, doch in der Nacht kommen keine Zeichen. Doch dazu später mehr. Es gibt auch die Möglichkeit mit einem Timer Signale abzufragen, doch das habe ich in meinem Programm nicht hinbekommen.

Dies kann man mit folgendem Kommando unter Linux kompilieren:

gcc -o pvzaehler pvzaehler.c

Anschließend wird noch das erzeugte Binary in mein lokales ~/bin/ Verzeichnis kopiert.

Config in Fhem

In die fhem.cfg habe ich lediglich eingetragen:

define pvzaehler dummy
define FileLog_pvzaehler FileLog ./log/pvzaehler-%Y-%m.log pvzaehler
attr FileLog_pvzaehler logtype text

Shell Script mit Übergabe an FHEM

cat /opt/fhem/bin/pvzaehler.sh
#!/bin/bash
killall pvzaehler
export zaehler=0
zaehler=$(/opt/fhem/bin/pvzaehler)
export leistung=$(($zaehler*60))
/opt/fhem/fhem.pl localhost:7072 "set pvzaehler $leistung"

Da das C-Programm unendlich lange auf Zeichen wartet und wir nicht mit jedem Cronjob alle 2 min einen neuen Job starten wollen, der dann auch bis zum St. Nimmerleinstag wartet ist hier ein

killall pvzaehler

notwendig. Damit werden noch offene Zählvorgänge geschlossen, bevor wir einen neuen Starten. Nicht hübsch, funktioniert aber. In der Zeile

zaehler=$(/opt/fhem/bin/pvzaehler)

wird unser kleines C-Programm ausgeführt und liefert dann zurück, wie viele Impulse in 1Min gezählt wurden. Das Ergebnis wird in der Variable zaehler gemerkt.

export leistung=$(($zaehler*60))

In dieser Zeile multiplizieren wird die gezählten Impulse mit 60 weil die Stunde 60Min hat. Dies entspricht der momentanen Leistung.

/opt/fhem/fhem.pl localhost:7072 "set pvzaehler $leistung"

Hier rufen wir das fhem perl Script auf und übergeben die gemessene Leistung.

Cron Job

Der Cron Job wird bei mir alle 2min gestartet:

*/2 * * * *    /opt/fhem/bin/pvzaehler.sh  >> /dev/null 2>&1

SVG Datei noch generieren lassen

Dazu habe ich mir aus der Log Datei noch eine SVG generieren lassen. Die Config sieht so aus:

image

Ja, heute gab es einige Wolken und bei Schatten bricht die Leistung der PV Anlage ein.