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!

Wechselstromzähler mit S0 Impulsausgang am Raspberry Pi Zero

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:

Leistung dargestellt über die Zeit

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

33 Kommentare

  1. Hi,
    gibt es noch eine Bezugsquelle für den Zähler oder ist das ein DIY mit Phototransistor?
    Wie kann mit VZ ein Zweirichtungszähler ausgewertet werden?
    Cruiz ElektroFix

    1. Hallo!

      Für einen einfachen Stromzähler einfach “S0 Stromzähler” bei eBay suchen. Mein Modell ist schon gar nicht mehr verfügbar.

      Für Zweirichtungszähler wird’s dann schon komplexer. Da empfehle ich einen Blick auf diesen Artikel: https://go-seven.de/2021/10/easymeter-stromzaehler-in-home-assistant-einbinden/ und den Gebrauchtmarkt von Easymeter Stromzählern.

      Wenn es nur für den Eigenbedarf ist, und nicht zur Abrechnung, dann kann man sich auch einen Shelly 3EM einbauen (lassen). Preislich ist das vergleichbar mit dem Easymeter.

  2. Hi,
    danke für die ausführliche Erklärung speziell der Config Ausführungen für die S0 Schnittstelle. Ich habe bereits meine Hauptzähler über die IR Schnittstelle am VZLogger und möchte noch einen S0 Zähler aus einer Einliegerwohnung dazu nehmen, kenne mich aber zu wenig mit S0 aus. Eines würde mich daher interessieren: Hast Du das S0 – Ausgangssignal von Deinem Zähler direkt am Pi verwendet oder einen externen Optokoppler verwendet?
    Wenn ich in der Doku meines Zählers (ELTAKO DSZ15D 3×80) schaue, steht beim S0 Signal nämlich folgendes:

    Schnittstelle lmpulsausgang S0 nach DIN EN 62053-31,
    potenzialfrei durch einen Optokoppler,
    max. 30V DC/2OmA u. min.5V DC.
    Impedanz 100 Ohm,
    Impulslänge 30ms, 1000Imp./kWh

    Die 5-30V machen mich halt stutzig…

    Danke!

    1. Hallo Tobias!

      Der im Datenblatt erwähnte Optokoppler sitzt bereits im Zähler. Du kannst dir die zwei Anschlüsse vorstellen wie zwei Pins eines Tasters, der alle X kWh gedrückt wird. Ich habe einen der Pins mit GNS (Masse, Minus, Null, Erde) verbunden und den anderen mit einem GPIO des Raspberry. Damit “nicht gedrückt” aber ein definiertes Signal gibt, muss man den Pin am GPIO des Raspberry noch auf 3,3V (niemals 5V) “ziehen”. Dazu nutzt man einen Wiserstand mit 10 kOhm (10000 Ohm) oder mehr. Wenn jetzt der gedankliche “Taster gedrückt” wird, liegen kurz am GPIO des Raspberry das GND-Signal an statt wie sonst die 3,3 V. Diese “negative Flanke” kann man registrieren und zählen. Und das mach der Volkszähler für dich.

      Wichtig ist nur, dass dir dein Datenblatt sagt, welcher der beiden Anschlüsse am Zähler an “GND” muss. Sonst funktioniert der Aufbau nicht.

      Gruß

      Pascal

  3. Hallo Pascal,

    super! Vielen Dank für dieses Tutorial! Das hat mir (zusammen mit anderen) zum Durchbruch verholfen 🙂

    1.) Ich nutze einen Raspberry Pi 4 Model B und habe über PIN03 (GPIO02) als Plus und PIN05 (GND) als Minus das Ganze an einem Stromzähler (S0-Ausgang) laufen.
    Es funktioniert ohne einen Widerstand. Ist das in Ordnung, oder sollte zur Sicherheit trotzdem einer verbaut werden?

    2.) Ich würde auch gerne noch weitere Eingänge für Stromzähler nutzen wollen. Weißt du vielleicht, welche man wie zusätzlich nutzen kann?

    3.)Momentan nutze ich die Impulserfassung – also die erfassung des Verbrauchs und würde auch gerne die Leistung (wie in deinem Beispiel) erfassen wollen. Ich habe bei volkszaehler.org gelesen man kann virtuelle Eingänge in vzlogger definieren:
    https://wiki.volkszaehler.org/software/middleware/einrichtung?s%5B%5D=virtuelle

    Vielen Dank schon mal für deine Tipps 🙂

    1. Danke!

      Zu 1: Wenn du den Eingang als “Pullup” definierst, dürfte das OK sein.
      Zu 2: Nutze einfach weitere Pins am selben Raspberry nach dem selben Prinzip.
      Zu 3: Ich bin nicht ganz sicher, was hier die Frage ist 😀

      1. Hallo Pascal, vielen Dank für deine schnelle Antwort.

        1) super, ich lasse es mal ein paar Tage laufen und gleiche dann den erfassten Verbrauch mit dem Stromzähler ab

        2) muss ich da dann widerstände dazwischen schalten, weil sie ja teilweise bestimmte Bezeichnungen haben? (Sorry, ich bin ganz neu im Bereich der GPIO´s beim Raspi).

        3) Ich erfasse momentan den Impuls – also den Verbrauch. Ich würde zusätzlich (als zusätzliche Zeile im WebUI von Volkszähler) auch die Leistung erfassen, so wie du es gemacht hast. Kann ich da einen zweiten Eintrag mit der gleichen GUID einfügen oder muss ich das über virtuelle Eingänge machen?

  4. Hallo Zusammen,

    gibt es so etwas auch für die Industrie? Um dort eine Art Live Messung ders Aktuellen Stromverbrauchs sichtbar zu machen?

    Die Herausforderung ist: Die eingespeiste Leistung einer Photovoltaikanlage soll vor der Einspeisung in den Transformator Minuten genau erfasst werden. Diese Daten sollten dann Grafisch am Rechner sichtbar gemacht werden

  5. Hallo Pascal,

    Ich habe dank deiner Beschreibung nun schon 2 Zähler erfolgreich einrichten können.

    Nun steht mir die nächste Herausforderung bevor: einen Zähler über die blinkende LED auf Momentanverbrauch zu überwachen, weil er weder einen S0 noch I/R Schnittstelle besitzt.

    Hast du dazu auch eine Anleitung verfasst bzw. Einen link, dem ich folgen kann?

    Mfg Andreas

    1. Im Prinzip genauso, allerdings musst du das analoge Signal der LED vorher digitalisieren. Dazu musst du es mit einer Photodiode “einfangen” und mit einem Schmitt-Trigger in Nullen und Einsen wandeln. Danach kann man das Signal genauso nutzen, wie von einem Optokoppler.

      Hier wird das für einen Arduino beschrieben: https://forum.arduino.cc/t/photodiode-with-schmitt-trigger-generating-unwanted-interrupts/691916 das kann man aber recht einfach für den Raspberry adaptieren.

        1. Das spezielle Modell kenne ich nicht, aber dadurch, dass gleich ein “Komparator” mit drauf ist, sparst du dir auf alle Fälle den Schmit-Trigger. Ich vermute daher, dass du damit erfolgreich sein wirst.

        1. Beachten solltest du, dass der Sensor dann auch auf andere Lichtimpulse reagiert. Also musst das Modul irgendwie “Lichtdicht” auf den Zähler bekommen. Schwarzes Isolierband hilft hier ganz gut, wenn es schnell gehen soll.

          1. Hallo Pascal, entschuldige das doppel-Posting. Es hat mir im Browser die letzte Nachricht nicht angezeigt und dadurch hatte ich sie nochmal abgeschickt.

            Okay, Teil ist bestellt.

            Ja ich werde es ausreichend ‘abdichten’ und melde mich dann wieder, wie es funktioniert hat… Oder auch nicht 🙂

          2. Kein Problem mit dem Doppelpost. Das ist eher mein Fehler, denn JEDER Kommentar wird manuell freigeschaltet. Ich will halt aktiv kontrollieren was auf meienr Seite auftaucht.

  6. Hallo Pascal,

    vielen Dank für deine gute Beschreibung des Projektes und der Configuration für den Volkszähler.
    Anmerkung: wer den Fehlercode 73 erhält muss ggf das Verzeichnis der Log Datei anpassen:

    “log”: “/var/log/vzlogger.log”, – > “log”: “/var/log/vzlogger/vzlogger.log”,

    Ich habe noch eine Frage zum Thema Power bzw Impulse. Du schreibst in der Config, dass hier Power eingetragen werden muss. Warum? Trage ich in der Config Power ein, kommen Werte im MW und GW Bereich raus. Stelle ich das auf Impulse um, scheint es zu passen (geschätzt natürlich).

    Was hast du im Frontend für den Kanal für Einstellungen verwendet, damit Power bei dir funktioniert?

    Grüße

    Florian

    1. Hallo Florian,

      da ich nicht weiß, welchen Zähler du hast, ist es schwer abzuschätzen, warum bei Power komische Werte heruaskommen. Den Faktor kannst du aber immer über “resolution”: 1 anpassen. Eventuell musst du da 1000 oder 2000 eintragen.

      Gruß

      Pascal

      1. Hi Pascal,

        ich habe den Eltako DSZ15D-3x80A verbaut. Der macht 1000 Impulse pro kwh, das habe ich auch so eingestellt in der Konfigdatei.

        https://www.eltako.com/fileadmin/downloads/de/_bedienung/DSZ15D-3x80A_28380015-1_dt.pdf

        Was hast du bei dir für den Kanal im Frontend eingestellt?

        Zur Auswahl gibt es:

        El. Energie (S0 Impulse)
        El. Energie (Leistungswerte)
        El. Energie (Zählerstände)

        Hier habe ich S0 Impulse ausgewählt. Habe heute den Raspberry mit dem Zähler verglichen, das scheint aber auch nicht zu stimmen (Verbauch laut Raspberry 2,35 kwh, laut Zählerablesung aber ca 6 kwh).

        Grüße

        Flo

        1. Ich muss ehrlich gestehen, ich nutze das Frontend nicht mehr, weil ich auf eine andere Lösung umgestiegen bin (Home Assistant mit einem ESPHome Mikrocontroller). Ich würde dir an der Stelle empfehlen, dich im Photovoltaikforum zu melden, die können dir da sicher mehr weiterhelfen. Es gibt noch Parameter zum optimieren, insbesondere bezüglich der Impulsdauer. Aber da bin ich im Moment überfragt.

          https://www.photovoltaikforum.com/board/131-volkszaehler-org/

          1. Hallo Fourstroker,
            mal ne Frage. Bist Du in dem Forum fündig geworden. Ich habe nämlich das gleiche Problem, finder aber nix passendes für das Web-Frontend.
            VG, Thomas

          2. Hallo, Danke für die super Anleitung. Würde mich gerne an die Frage dranhängen. Bekomme auch immens große Werte

  7. Hallo! Super erklärung! Vielen Dank für die Mühe. Kurze Frage: hast du auch das Schaltbild für mehrere Zähler mit s0? Kann ich die 3,3V einfach nach dem Widerstand auf alle Zähler verteilen? Danke!

      1. DAnke, ich hatte noch überlegt über dioden zu gehen und wenigstens “nur” einen GRND zu verwenden, aber ich glaub das funktioniert bei diesen schwachen Spannungen nicht so gut, zumindest hatte ich mit Dioden nur Rauschen im Graphen. Ein Problem habe ich allerdings mit Peaks, ist das bei dir auch so? Eigentlich müsste die türkisene Kurve unterhalb der roten liegen. Rot ist der Bezug am Stromzähler 1.8.0 und türkis ein Zwischenzähler den ich per s0 abgreife und meinen allgmein-Strom anzeigt (Hauptsächlich die Wärmepumpe). Die Skalierung passt nicht ganz und vor allem sind da doch starke peaks drin. Hast du das auch erlebt? (Bild bei der Website)

  8. Hallo,
    vielen Dank für die Anleitung, hat mir sehr geholfen. Der erste Wert im JSON unter tuples steht für den aktuellen Zählerstand und der zweite für den aktuell Verbrauch, oder? Habe ihn zumindest dafür genommen. So sieht meine Konfig aus:

    {
    “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”: 23, //Broadcom-Pin an dem der Impulsausgang hängt
    “mmap”: “”,
    “gpio_dir”: -1,
    “configureGPIO”: true, //vzlogger soll die GPIO für mich konfigurieren
    “resolution”: 1000, //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”: “null”,
    “timeout” : 10,
    “duplicates”: 30
    }
    ]
    }
    ]
    }

    Und die Sensoren in Home Assistant so:

    sensor:
    – platform: rest
    resource: http://localhost:8084
    value_template: >
    {% for i in value_json.data %}
    {% if i.uuid == “4307f540-dcb4-11eb-b124-5da08f82312d” %}
    {{ ‘%.2f’%(i.tuples[0][1]) | float }}
    {% endif %}
    {% endfor %}
    method: GET
    name: Stromverbrauch
    unit_of_measurement: “W”
    device_class: power
    – platform: rest
    resource: http://localhost:8084
    value_template: >
    {% for i in value_json.data %}
    {% if i.uuid == “4307f540-dcb4-11eb-b124-5da08f82312d” %}
    {{ ‘%.2f’%(i.tuples[0][0] / 100000000) | float }}
    {% endif %}
    {% endfor %}
    method: GET
    name: Stromverbrauchzähler
    unit_of_measurement: “kWh”
    device_class: energy

    Das JSON sieht so aus:

    { “version”: “0.8.1”, “generator”: “vzlogger”, “data”: [ { “uuid”: “4307f540-dcb4-11eb-b124-5da08f82312d”, “last”: 1673892199775, “interval”: -1, “protocol”: “s0”, “tuples”: [ [ 1673892199775, 93.933463679606092 ] ] } ] }

    Auf dem Zähler steht allerdings 16694,69. In Home Assistant zeigts mir aber 16.738,92 kWh an (93,93 W) (logisch, steht ja auch so im tuple).
    Ich habe einen B+G E-Tech DRT428B Stromzähler (https://bg-etech.de/download/manual/DRT428B.pdf).

    Ist das so alles korrekt? Vielen Dank!

    Viele Grüße
    Bernhard

  9. Hey Pascal super danke dir für diesen Post er hat mir sehr geholfen.

    Eine Frage:
    (1) Warum nehmt ihr nicht einfach diesen simplen python code? Warum volkszaehler rasp img oder vzlogger Ich hab den witz noch nicht ganz verstanden man muss doch nur pulse zählen und beim eltako weiß man aus dem Datenblatt: 1000Imp./kWh

    import RPi.GPIO as GPIO
    PIN = 4
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(PIN, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)

    counter = 0
    while True:
    GPIO.wait_for_edge(PIN, GPIO.RISING)
    counter += 1
    print(“Counter is now”, counter/800.0, “kWh”)
    GPIO.wait_for_edge(PIN, GPIO.FALLING)

    GPIO.cleanup()

    1. Der Grund ist simpel: Über sml bekomme ich nicht nur den “Verbrauch” (Bezug) sondern auch meine Einspeisung, die Leistung pro Phase, Powerfactor usw…

      Und wenn der Pi Mal ausfällt, bleibt der Zähler nicht stehen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.