S0-Stromzähler am RaspberryPi

RaspiUm den heimischen Energieverbrauch messen und auswerten zu können, habe ich mir einen RaspberryPi und einen Hutschienen-Stromzähler mit S0-Ausgang besorgt. In den nächsten Tagen und Wochen werde ich hier beschreiben, wie man

  1. den Zähler direkt am RaspberryPi ausliest, ohne eine S0-Adapterplatine zu verwenden
  2. den Zähler für höhere Genauigkeit modifiziert
  3. die eingelesenen Werte abspeichert und visualisiert.

Als Zähler habe ich den Swissnox S-Watt gewählt, den es online für ca. 20,-€ zu kaufen gibt. Der hat nämlich die Eigenschaft, dass er sich mit geringem Aufwand so modifizieren lässt, dass er ca. 400 bis 500x höher auflöst als er das von Haus aus tut. Mehr dazu in einem weiteren Artikel oder hier bei volkszaehler.org. Aber nun mal los.

Anschluss des Zählers

Der S0-Ausgang des Zählers gibt im Standard 1000 Impulse pro kWh aus. Das kann man sich ungefähr vorstellen wie einen Taster, der 1000x gedrückt und wieder losgelassen wird. Die Länge eines solchen Impulses beträgt im Falle des Swissnox wohl ca. 70-90ms. Wir behandeln den S0-Ausgang also ab jetzt erst mal als „Taster“ (im Zähler übernimmt ein Optokoppler diese Funktion).

Um diesen „Taster“ nun mit den GPIO-Anschlüssen des RaspberryPi zu verbinden, nehmen wir einen der Pins, die von Haus aus mit einem internen Pull-Up-Widerstand ausgestattet sind. Bei den Boards der Rev. 2 trifft das auf die Pins GPIO 2 und GPIO 3 zu, wir wählen den Pin 3. Natürlich könnte man auch einen der anderen Pins nehmen und selbst einen Pull-Up-Widerstand hinzufügen, aber wir wollen uns ja nicht mehr Arbeit machen als nötig.

S0 RasPi wiringKurzer Einwurf: Der S0-Ausgang des Zählers funktioniert offiziell mit Spannungen von 5-27VDC, der RaspberryPi arbeitet aber mit 3.3V. Funktioniert aber genauso gut.

Nun bleibt nur noch, den Pin GPIO 3 mit S0+ des Zählers und GND mit S0- zu verbinden – fertig.

Impulse zählen mit wiringPi

Um die Impulse nun auch zählen zu können, werden wir uns der großartigen wiringPi Library bedienen, die uns das Leben hier sehr leicht macht. Installationsanleitung für Raspbian hier. Praktischerweise ist auch direkt ein Stück Beispielsoftware dabei, nämlich die Datei ISR.c, die bei jedem Interrupt (also jedem Impuls) eine Zählervariable hochsetzt. Wir müssen jetzt noch die Pin-Nummer von 0 auf 9 anpassen (Achtung, die wiringPi Pin-Nummerierung unterscheidet sich von der normalen GPIO-Nummerierung, Tabelle hier):

Jetzt den Code kompilieren und ausführen:

Nun kann der erste Test erfolgen: Der Counter sollte bei jedem Impuls um 1 erhöht werden.

Basierend auf diesem Beispielprogramm habe ich nun etwas C-Code geschrieben um die Impulse pro definiertem Zeitintervall zu zählen und im CSV-Format auszugeben. Mehr dazu und wie man daraus eine anschauliche Grafik erstellt, in einem der folgenden Beiträge.

 

9 thoughts on “S0-Stromzähler am RaspberryPi

  1. Aaron
    1. April 2014 um 14:08

    Sehr geehrter Herr Stefan,

    Ihr Beitrag ist sehr interessant. Ich habe nun auch einen S0 Zähler an den Raspberry PI angehängt und Ihr Tutorial an meinen Anforderungen angepasst.
    Ich wäre Ihnen sehr dankbar, wenn Sie mir noch auf diese Fragen antworten könnten.
    1. In Ihrer Skizze habe ich gesehen, dass Sie einen Kondensator verwenden. Ich bin kein Elektroniker und verstehe leider nichts diesbezüglich :)
    2. Ich habe die Schaltung ohne Kondensator gemacht. An den Raspberry PI hängt noch ein Relaisemodul welches wiederum ein 230V relais ansteurt. Jedesmal wenn das Relaise schaltet, bekomme ich eine falsche Impulsanzahl. Es werden gleich auf einmal 5 – 9 Impulse generiert… Demzufolge ist dann auch meine Energiemessung falsch. Haben Sie irgend eine Idee was hier das Problem sein könnte?
    Danke für Ihren Beitrag!

    MfG

    Aaron Andreis

    1. Mario
      4. März 2015 um 09:34

      Hallo Aaron,
      ich habe genau die gleichen Fragen zu diesem Projekt wie Sie.
      Konnten Sie diese inzwischen beantworten??
      Vielen Dank
      LG Mario

  2. Stefan
    26. März 2015 um 16:26

    Hallo,

    wenn beim Schalten des Relais mehrere Impulse ausgelöst werden, liegt das vermutlich daran, dass das Relais „prellt“. Eine Lösung dafür kann ich leider auch nicht aus dem Ärmel schütteln, schon gar nicht ohne eure Schaltungen zu kennen, aber sucht mal nach dem Stichwort „Entprellung“, das sollte euch auf die richtige Fährte bringen.

    Schönen Gruß, Stefan

  3. Ralf
    18. April 2015 um 12:51

    Hallo Stefan,

    ich habe großes Interesse an deinem o. g. C-Code zur Erstellung der Daten im CSV-Format.
    Ich habe einen Stromzähler mit 2 S0-Ausgängen für Bezug und Einspeisung.
    Die Daten werden vom PV-Wechselrichter auch im CSV-Format ausgegeben.
    Ich könnte dann die Daten vom Stromzähler in die bereits vorhandene Website mit einbinden.

    Viele Grüße, Ralf

  4. Martin Poth
    23. April 2015 um 09:37

    Hallo,
    ich denke nicht das Relais prellt, sondern es gibt störimpulse, die die messung verfälschen.
    Der 100nF Kondensator kann schon helfen. an sonsten mal eine Diode an dem Relais anschliessen.
    Stichwort: Freilaufdiode.

  5. Sven-Olaf
    5. Mai 2015 um 13:22

    Hallo Stefan,

    habe dein Projekt erfolgreich umgesetzt.
    Der Counter läuft.
    Nun fehlt mir noch deine beschriebene Auswertemöglichkeit.
    Kannst Du mir deinen C-Code zur Verfügung stellen?

    MfG Sven-Olaf

  6. Alexander
    11. Mai 2015 um 11:10

    Hallo,

    ich überlege mir gerade zwei S0 Zähler mit dem Raspberry auszulesen. Dazu würde ich GPIO2 und 3 verwenden. Derzeit läuft ein Stromzähler bereits mit GPIO3 und Ground (Pin 5+6). Wenn ich zusätzlich den GPIO 2 bestücken will, kann ich dann ebenfalls denselben Ground auf Pin 6 verwenden, oder muss ich einen extra Ground Pin verwenden?

    Grüße
    Alex

    1. Ralf
      11. Februar 2016 um 14:36

      Ground kann gemeinsam verwendet werden.

Schreibe einen Kommentar

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