Stromzähler mit S0-Impulsausgang an Raspberry Pi mit Volkszähler auswerten
Ich nutze seit geraumer Zeit das freies Smart Meter von Volkszähler, um meinen Stromverbrauch am Stromzähler grafisch zu erfassen. Ich habe als Stromzähler eine “moderne Messeinrichtung”, also einen Stromzähler mit SML Datenschnittstelle. Aber um diesen Zähler soll es heute gar nicht gehen. Interessieren soll uns heute ein einfach Wechselstromzähler mit einem Impulsausgang.
Der Impulsausgang wird in diesem Fall “S0”-Schnittstelle genannt und ist nicht mit der gleichnamigen S0-Schnittstelle von ISDN zu verwechseln. Im Prinzip handelt es sich um einen potentialfreien Schaltkontakt, der oft über einen Optokoppler ausgeführt ist, so auch in meinem Beispiel bei dem Wechselstromzähler Typ DDS5188. Dieser gibt wür jede “verbrauchte” Kilowattstunde 2000 Impulse aus, sprich einen Impuls pro 0,5 Wattstunden. Die Anbindung an Volkszähler, genauer gesagt den VZLogger hat mir einiges an grauen Haaren bereitet, denn ich wollte nicht die Impulse aufsummiert dargestellt haben, sondern live die verbrauchte Leistung darstellen.
Hardware-Setup
In den meisten Fällen haben die Zähler einen “S0+”- und einen “S0-“-Anschluss. Ich habe den “S0-“-Anschluss direkt auf Masse gelegt, wenn der Zähler einen Impuls ausgibt, wird der “S0+”-Anschluss also gegen Masse gezogen. Damit dieser sonst nicht in der Luft hängt, kann man am GPIO den Pullup-Widerstand aktivieren, oder man baut einen ein, wie im Schaltplan dargestellt. Wichtig: Die GPIO des Raspberry Pi sind nicht 5V-tolerant, man muss den Pullup also auf 3,3V legen!
Bei jedem Impuls des Zählers, also bei jeder “verbrauchten” halben Wattstunde bekommt der Raspberry Pi an GPIO 18 (Pin 12) nun also einen negativen Impuls von einigem Millisekunden. Nun gilt es, den vzlogger dafür zu konfigurieren.
Konfiguration des vzloggers
Die Konfiguration des vzloggers befindet sich in der Datei /etc/vzlogger.conf und muss mit root rechten bearbeitet werden. Es folgt eine erläuterte Beispiel-Konfiguration für den Zähler:
{
"retry": 0,
"verbosity": 3, //die SD-karte nicht zu sehr belasten...
"log": "/var/log/vzlogger.log",
"local": { //Ich möchte auf lokal auf die Daten zugreifen, ohne push
"enabled": true,
"port": 8084,
"index": true,
"timeout": 0,
"buffer": 0
},
"meters": [
{
"enabled": true,
"allowskip": false,
"aggtime": 0, //Die Daten werden nicht zusammengefasst
"aggfixedinterval": false,
"aggmode": "sum",
"protocol": "s0", //S0-Impulse
"gpio": 18, //Broadcom-Pin an dem der Impulsausgang hängt
"mmap": "",
"gpio_dir": -1,
"configureGPIO": true, //vzlogger soll die GPIO für mich konfigurieren
"resolution": 1, //hier könnte man die 2000 Impulse pro kWh eintragen
"send_zero": false, //keine Nullen übertragen
"channels": [
{
"uuid": "4307f540-dcb4-11eb-b124-5da08f82312d",
"identifier": "Power", //DAS ist die wichtigste Stelle! Wer hier "Impulse" einträgt bekommt nicht die aktuelle Leistung
"api": "volkszaehler",
"middleware": "http://localhost/middleware.php",
"timeout" : 10,
"duplicates": 30
}
]
}
]
}
Das Ganze kann dann so aussehen:
Möchte man mehrere Zähler mit einem Raspberry Pi auslesen, so müssen mehrere “meters” in geschweiften Klammern angelegt werden. Leider auch dann, wenn man pro Phase einen S0-Ausgang hat.
Als kleinen Tipp am Ende kann ich noch die fertigen Images für den Raspberry Pi von Volkszähler empfehlen: https://wiki.volkszaehler.org/howto/raspberry_pi_image