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

18 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

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