Stromzähler mit S0-Schnittstelle vom Raspberry Pi auswerten

Endlich ist es soweit: Ich lese den Stromverbrauch von unserer Wohnung mit einem Raspberry Pi aus und lasse mir von meinem Monitoring Server (MRTG + Routers2) schöne Graphen malen. Hierfür verwende ich einen Stromzähler mit einer S0-Schnittstelle, welchen ich direkt in der Unterverteilung eingebaut habe. Die Impulse des “Smart Meters” wertet eine Interruptroutine am Pi aus. Der Monitoring Server wiederum fragt den Pi per SNMP ab. Viele kleine Schritte also, die ich in diesem Blogpost ausführlich erläutern möchte. Viel Spaß damit!

Die Idee

Folgenden “Pfad” nehmen die Stromdaten vom Zähler bis zum Monitoring System:

  1. Der Stromzähler (3 Phasen) erzeugt 800 Impulse pro kWh und gibt diese an einer S0-Schnittstelle aus. Sprich: Ein Optokoppler, der bei jedem Impuls kurzschließt.
  2. Mit zwei Adern geht’s dann zum Raspberry Pi, welcher einfach nur eine Textdatei mit einem Counter bei jedem Impuls um eins hoch setzt. (Der Interrupt löst ein kleines Programm aus, welches die Datei beschreibt.)
  3. Der bereits vorhandene Monitoring Server fragt den Pi per SNMP ab, sprich: es wird ein zusätzlich Skript gestartet, welches einfach den Inhalt der Textdatei ausgibt und in einer OID per SNMP transportiert.
  4. Der Benutzer kann wie gewohnt per HTTP auf den Monitoring Server zugreifen.

 

S0-Schnittstelle auswerten Skizze

Die Hardware

Hier ein paar Bilder von der Hardware. Ich habe einen Drehstromzähler von Eltako gekauft, genaue Bezeichnung: DSZ12E-3x80A. Kostenpunkt: ca. 90,- €. Dieser Stromzähler ist NACH dem geeichten und offiziellen Stromzähler der Stadtwerke im Keller eingebaut. Somit gibt es keine Probleme mit der Stromabrechnung. Mit einer Standard Telefon-Doppelader (oben rechts im Bild, gelb und weiß aus dem Sicherungskasten) geht die S0-Schnittstelle dann an den Raspberry Pi.

Hier noch ein animiertes GIF, welches einen Impuls des Zählers zeigt:

Die Software

Eine erste Googelei hatte mich auf ein Projekt von volkszaehler mit dem Artikel S0-Impuls Zähler direkt über RS232 auswerten gebracht. Dabei bin ich der Anleitung in dem grünen Kasten, der speziell für den Raspberry Pi gedacht ist, gefolgt. Also den GPIO Port auf die Alternative Funktion 3 umbiegen und dann die  stty  und strace Befehle. Leider hatte das nicht funktioniert. Und da ich nicht genügend Lust hatte, ewig weiter zu testen, habe ich eben weiter gegoogelt.

S0-Auswertung am Pi

Erfreulicherweise bin ich dann über den Artikel S0-Stromzähler am RaspberryPi gestoßen, welcher exakt das beschreibt, was ich vor hatte. Und das hat sogar ziemlich einfach funktioniert. Juchu! Also:

  1. S0+ und S0- an die richtigen Ports anschließen (gar nicht so einfach, da die Benennung der GPIO-Ports variiert und ungleich der Zählung der Anschlüsse auf dem Pi ist, sowie die Zählung der Ports für Wiring Pi noch mals verschieden ist). Bei mir ist es folgendermaßen: Stromzähler Pin 20 = S0+ (weißes Kabel) = GPIO 3 -> Pin 5, sowie: Stromzähler Pin 21 = S0- (gelbes Kabel) = GND -> Pin 6. Uff.
  2. Wiring Pi per git clonen.
  3. Die ISR.c Datei mit dem richtigen #define kompilieren. (Bei mir ist es #define BUTTON_PIN 9). Achtung: Nicht die isr.c Datei in dem Unterordner “examples” von Wiring Pi verwenden, sondern die, die hinter dem Link steckt. Ich habe meine Datei nachfolgend “stromzaehler.c” genannt.

Um aber den Zählerstand korrekt in eine Datei zu schreiben, muss die C Datei noch etwas angepasst werden (Link: Datei schreiben): Im main Bereich noch eine Variable deklarieren: FILE *datei; und dann anstelle der printf Ausgabe (kann man einfach auskommentieren) folgendes hinzufügen, damit der aktuelle Counter-Wert in die Datei geschrieben wird:

Das heißt, dass der “main” part der C Datei dann wie folgt aussieht (man beachte die beiden auskommentierten printfs und die drei zusätzlichen Zeilen):

 

Ich habe dann noch einen Ordner für die Logdatei erstellt: sudo mkdir /var/strom , das Programm kompiliert: gcc -lwiringPi -o stromzaehler stromzaehler.c  und verschoben: sudo mv stromzaehler /usr/local/bin/ . Per sudo stromzaehler  lief es dann. :)

Nun muss das Programm noch per Autostart beim Booten vom Pi ausgeführt werden (Link: Dienste). Dabei habe ich mich an diese Anleitung gehalten. Folgende Datei habe ich als “/etc/init.d/stromzahler” angelegt ( sudo nano /etc/init.d/stromzaehler ):

Und dann (wie in dem Link beschrieben) erst die Rechte auf die Datei korrekt vergeben, damit sie ausführbar ist: sudo chmod 755 stromzaehler, und den Runlevel für das automatische Ausführen beim Booten hinzufügen: sudo update-rc.d stromzaehler defaults . (Jetzt befindet sich unter anderem im Ordner /etc/rc2.d ein symbolischer Link mit dem Namen “S01stromzaehler” auf die eben erstellte stromzaehler Datei im init.d Ordner.)

Mit den folgenden Befehlen kann man nun den Service stoppen, starten, oder restarten (wobei das gar nicht nötig ist, da er ja beim Booten automatisch startet und immerzu laufen soll) [Außerdem stelle ich gerade fest, dass der “restart” gar nicht richtig funktioniert. Der Dienst wird zwar abgeschossen, aber nicht wieder gestartet. Hm. Egal, ich will ja nur, dass es beim Booten automatisch läuft]:

Den aktuellen Stromzählerwert (Erinnerung: 800 Impulse/kWh) bekommt man so:

LÄUFT! Juchu. ;)

(Wen es übrigens noch genauer interessiert: Ich finde den Unterschied der beiden von mir verlinkten Programme interessant: Während das erstere einfach Spannung an die S0-Schnittstelle anlegt und dann auf der anderen Leitung misst, wann Spannung ankam, verwendet das zweite Projekt einen Interrupt per Pull-Down. Sprich: Es liegt konstant Spannung an, und per S0-Schnittstelle wird diese Spannung auf 0 gezogen. Während bei erstem also der zweite Pin eine Spannung wahrnimmt, registriert der Pi bei zweiterem den Spannungsverlust am ersten Pin.)

Auslesen via SNMP

Um auf den Inhalt der Textdatei via SNMP zuzugreifen muss lediglich ein extended Skript in der snmpd.conf eingebunden werden. Dies hatte ich bei meinem Temperatursensor genau so schon mal gemacht. Also bitte dort für weitere Details nachlesen. Hier nur kurz die Anleitung:

Konfigurationsdatei auf dem Pi öffnen: sudo nano /etc/snmp/snmpd.conf und unter “EXTENDING THE AGENT” folgende Zeile hinzufügen:

Danach den snmpd service neustarten: sudo service snmpd restart. Unter welcher OID der Wert dann steht findet man z.B. mit snmpwalk oder dem von mir schon oft angepriesenen iReasoning MIB Browser heraus.

Einbinden in MRTG

Hier die Konfigurationszeilen für MRTG und Routers2.cgi. Als Farbe habe ich mich für ein sattes Schwarz entschieden. Dies hatte ich noch nirgends anders verwendet und irgendwie passt es auch zur Erzeugung des Stroms durch Kohle. :D

 

An dieser Stelle sei noch erwähnt, dass MRTG lediglich alle 5 Minuten per SNMP den Zählerstand vom Pi holt. Sprich: Es wird immer nur der Durchschnittswert der letzten 5 Minuten gespeichert. Ein ernsthafter Peak im Stromverbrauch von beispielsweise 5 kW über eine Minute würde doch nur als 1 kW über 5 Minuten angezeigt werden. Aber gut, damit kann ich leben.

Das Ergebnis

Hier ein paar Beispielgraphen von meinem Monitoring Server. Die ersten beiden in der “Daily” Ansicht und mit ein paar Infos zu den verwendeten Stromverbrauchern. Der dritte in der “Monthly” Ansicht mit der roten Kennlinie für die Peaks und dem schwarzen Block weiterhin für den Durchschnitt. Der letzte in der jährlichen Ansicht und gezoomt. So sieht man den Durchschnittsverbrauch übers Jahr schön als Kurve -> in den Wintermonaten war der Deckenfluter viel an was für mehr Stromverbrauch gesorgt hat:

Die Zukunft

Tja, also konsequent wäre es jetzt noch, die Wasserzähler auch gegen solche mit S0-Schnittstelle auszutauschen. Leider ist das alles andere als einfach. :( Entweder müsste man einen geeichten/offiziellen Zähler einbauen lassen (was teuer wäre), oder man müsste einen zusätzlichen Wasserzähler mit S0 einbauen (was ich nicht selber kann). Außerdem haben wir in unserer Mietwohnung insgesamt vier Wasserzähler (2x kalt, 2x warm, jeweils in Küche und Bad). Also wird das wohl nichts. Oder zumindest erst im Eigenheim. Aber das kann auch noch dauern. Dann aber auch bitte mit Temperatursensoren am Vor- und Rücklauf, usw. :)

Featured image “Stromkosten steigen!” by Tekke is licensed under CC BY-ND 2.0.

163 thoughts on “Stromzähler mit S0-Schnittstelle vom Raspberry Pi auswerten

  1. Nicht übel! Allerdings finde ich den Zähler doch noch recht teuer. Interessant fände ich kleine Zähler (<10€), die man an einzelner Verbraucher hängen UND remote auslesen kann. Das dann mit so einem großen Zähler kombinieren und man hätte wirklich schöne Infos. Kann ja noch kommen ;o)

    Wie viele PIs hast du denn mittlerweile laufen?

    1. Nur 2. Am einen hängt der Stromzähler und der Temperatursensor. Am anderen (bei meinen Eltern auf dem Dachboden) hängt der ADS-B Receiver.

      1. Hallo
        Könntest du mir bitte genauere Infos zu deiner Konstruktion mailen?
        apteich et gmail. com
        Ich habe div Zähler von Voltcraft DPM 1L 32-D mit S0 Klemme verbaut.
        Gibts die Möglichkeit über den Router die Verbräuche übers Internet auszulesen?
        vielen dank
        grüße von andreas

        1. Hi Andreas. Was genau willst du denn gemailt haben? Die Fotos hier im Artikel zeigen doch schon einigermaßen, wie ich es “gebaut” habe. Das Einbauen eines Zählers solltest du sowieso unbedingt einem Profi überlassen! Und die S0-Schnittstelle besteht einfach nur aus einem 2-Draht Kabel.

          Bzgl. Router: Wenn du eine MRTG/Routers2 Installation ähnlich der meinen hast, dann kannst du in deinem Router einfach ein Port-Forwarding auf deinen Server/RaspberryPi einrichten. Dazu musst du mal ein bisschen Googlen. Es gibt vielen Anleitungen dafür.
          Ciao,
          Johannes

    2. Ich habe einen Stromzähler von Eltako mit 2 Kanälen.
      Kann man auch 2 Kanäle mit dem RPI auswerten ?

      1. Ja, das sollte kein Problem sein. Es sind ja genügend GPIO Ports vorhanden. Wenn du mal diesem Link hier folgst (http://www.skrue.de/wp/?p=41). Dort ist zumindets von 2 Ports die Rede, die standardmäßig den Pullup-Widerstand anliegen haben. Welche Ports das jetzt genau sind, wirst du dann schon selber rausfinden können. ;)

  2. Hi,
    cooles Projekt :)
    Ich hätte noch nen Verbesserungsvorschlag:
    Da die Schreibzyklen einer SD-karte ja doch irgendwie endlich sind ist es sicherlich nicht gut 800x pro KWh den Wert jedesmal in auf die Karte zu schreiben…
    Ich würde dir Datei erstmal ins RAM schreiben (/tmp oder mit tmpfs anlegen), und dann per cronjob 1x/stunde oder 1x/tag auf die SD-Karte schreiben, damit die Statistik nicht bei jedem Stromausfall/reboot bei 0 anfängt

    1. Au, guter Hinweis. Vielen Dank! Da habe ich gar nicht dran gedacht. Habe jetzt mal ein bisschen gegoogelt: Anscheinend hat Raspbian standardmäßig gar kein /tmp welches als tmpfs angelegt ist. Ich muss also erst noch eines im fstab anlegen, richtig? (Auch ein standard Ubuntu scheint /tmp nicht als tmpfs anzulegen, sondern einfach nur als Ordner unter / zu haben. Dafür sind aber zB der /run Ordner als tmpfs angelegt. Könnte ich hierfür auch diesen verwenden?)
      Für die Statistik ist es übrigens wurscht, wenn der Counter immer mal bei 0 anfängt. MRTG speichert ja nur das Delta zwischen zwei Werten, standardmäßig alle 5 Minuten. Wenn der Pi dann mal rebootet und von vorne anfängt, ist maximal eine Abfrage futsch, nicht aber die gesamte Statistik. Also kann man das vernachlässigen.

  3. Hallo Johannes,

    ich habe Deinen Post mit Begeisterung gelesen. Besonders deswegen, weil ich ebenfalls an so einer Lösung arbeite. Bei mir stellt sich die Problematik ein wenig anders da. Ich habe einen Ferraris Zähler von Actaris, der über eine S0-Schnittstelle verfügt.

    Auf Anfrage beim lokalen Stromversorger (der zwar nicht mein Stromlieferant ist, aber das spielt hier weniger eine Rolle), kam ein sehr netter Techniker vorbei und hat mir die S0-Schnittstelle an ein (Cat5e) angeschlossen. Leider hatte ich keine passende “Telefonleitung”. Er hat weiß/grün (S0+) und weiß/orange (S0-) zusammengenommen um einen größeren Querschnitt zu erreichen. Ich habe das andere Ende des Kabels dann mit einem Female-Jumper-Kabel verlötet (natürlich mit Schrumpfschlauch drüber) und an meinem Raspberry Pi B angeschlossen. S0+ kam zunächst auf GND und S0- auf GPIO3. Das ist FALSCH herum, wie mir der Techniker dann bei einem zweiten Termin bestätigte (nachder er mir nicht mehr sagen konnte welche Doppelader an + und welche an – angeschlossen war, hat er kurzerhand nochmal nachgeschaut).

    Interessanter Weise konnte ich mit der verdrehten Anordnung der Kabel auf dem Pi Daten auslesen. Keine wirklich sinnvollen, denn ich habe immer mehrere kWh geloggt (ich habe rrdtool angehängt). Auch ein Versuch den Verbrauch mittels eines 2.2 kWh Föns zu erhöhen und einen Ausschlag des Graphen zu provozieren, brachte leider nichts. Ich kann leider nichts erkennen.

    Nun habe ich die Kabel (nachdem ich die richtige Belegung ja mittlerweile kenne) richtig herum gesteckt (also S0+ auf GPIO3 und S0- auf GND) und ließ das isr-Programm laufen. Zu meiner Überraschung kamen nun DEUTLICH seltener Signale an, was mich in Anbetracht der zuvor viel zu hohen Werte schonmal auf eine Lösung des Problems hoffen ließ.

    Nach knapp 2h war es dann vorbei mit den Signalen. Flatline. Nichts kam mehr an. Ein Durchstarten des Pi brachte nichts. Also tauschte ich die Kabel nochmal, um nun wieder mit massenhaft Daten beworfen zu werden, die allerdings nichts aussagen.

    Hast Du hierzu vielleicht eine Idee? Ich bastel seit über einer Woche an diesem Projekt herum und leider bin ich bisher der Lösung noch keinen Schritt auf die Spur gekommen :)

    Mein Actaris Zähler rechnet übrigens 1 kWh nach 300 Impulsen, ist also deutlich gröber als Dein Zähler.

    Wenn Du da einen Tipp hast, würde es mich freuen!

    Ciao
    Dennis

    1. Hi Dennis,

      hm, es klingt ja etwas danach, als ob der S0-Zähler nicht richtig funktioniert. Ich hatte beim Test meines Zählers einfach 3 V und eine LED in Reihe an die S0-Schnittstelle geschlossen und beobachtet, wie oft die LED blinkt. Das hat super funktioniert. (Wobei ich es mit dem Herd und nicht mit dem Fön getestet habe. ;)) Vielleicht liegt es bei dir ja am Zähler oder an der Verkabelung? Wie lang ist denn das Kabel vom Zähler bis zum Pi? Vielleicht gibt es da ein Problem?

      Das isr.c Programm läuft bei mir von Anfang an ohne irgendwelche Probleme. Also wenn du es ziemlich genau so wie ich gemachst hast, sollte es daran eigentlich nicht liegen.

      Viel Erfolg!
      Johannes

      1. Die Idee mit der LED ist echt nicht schlecht. Glaube das probiere ich mal aus (wo hab ich bloß eine? :)).

        Die Verkabelung KÖNNTE ein Problem sein. Das Kabel ist ~4m lang. Es wäre aber auch absolut kein Problem dieses zu kürzen und den Pi dann eben oben auf den Sicherungskasten zu legen/kleben. Aktuell ist der Pi im Nachbarraum (und eben durch ein Loch mit dem Stromzähler verbunden).

        Ich werde das mit der LED mal ausprobieren und mich dann nochmal melden :) Auf jeden Fall müssen S0+ & S0- wieder getauscht werden. So viel ist klar.

        PS. Guter Einwand bzw. /tmp. Alternativ kann ich einen SanDisk USB-Stick empfehlen. Die Speicherchips darin sind deutlich hochwertiger als in SD-Cards. So hat meine Wetterstation 2 1/2 Jahre lang zuverlässig im 5 Minuten-Takt auf einen solchen geschrieben – ohne Probleme.

  4. Ich habe einen Gaszähler mit einem Magnet Impulsgeber (vom Gasanbieter zur verfügung gestellt bekommen). Der Impulsgeber liefert angeblich bei 0,1 m³ einen Impuls. Ich habe mich genau an die Anleitung gehalten, leider zählt der RPI viel schneller hoch, teilweise 3-4 Werte pro Impuls. Wie könnte ich das bereinigen?

    Danke für Eure Hilfe!

    1. Hi Nobert,
      hm, spontan fällt mir auch nichts ein. Ich würde meinen Tipp an Dennis (siehe Kommentare weiter oben) lediglich wiederholen: Prüfe mal mit einer LED, ob die S0-Schnittstelle korrekt funktioniert. Falls ja, dann müsste es ja am Pi liegen. Das hier vorgestellte Skript läuft bei mir allerdings tadellose seit einigen Wochen. Dadurch habe ich eigentlich Vertrauen darin gewonnen. ;)

      Könnte es bei dir nur ein ungünstiger Wackelkontakt irgendwo am Kabel sein? Oder ist es konstant das Vierfache an Impulsen? Dann stimmt deine Umrechnung vielleicht doch nicht.

    2. Ist dir denn bekannt wie lange der Impuls dauert? Vermutlich ist deine delay time in dem Quellcode zum Pulsbreite zu gering. (100ms)

      1. Hallo zusammen,

        ich habe ein ähnliches Problem mit der Zählung der Impulse. Und zwar besitze ich einen SchellCount EEM12-25A (http://files.voelkner.de/125000-149999/125391-da-01-de-WECHSELSTR_ZAEHLER_230V_32A_geeicht.pdf). Mein Raspberry Pi scheint ab und zu “stolpern” und auch mehrere Impulse zu zählen. Kann das auch mit der Delaytime zusammenhängen, dass diese mit 100 ms zu kurz ist? Mein Zähler liefert 2000 Impulse / kWh, somit sollte der raspberry für 0,1 kwh 200 zählen, er liefert aber immer unterschiedlich mal 217 oder 235 usw.
        Die Impulsbreite ist mit >= 50ms angegeben. Kann es leider nicht nachvollziehen. Drum meine Frage ob die veränderung des Delays nun korrekte Werte liefert oder die 2000 Impulse zuviel für den Raspberry sind? in den Beispielen sind überall Zähler mit 800 bis 1000 Impulse im Einsatz.

        Danke für eure Ideen,

        Grüße Thilo

  5. @Norbert
    Du schreibst: Magnetimpulsgeber.
    Ich denke es ist ein Reed-Kontakt der von einem Magneten betätigt wird.
    Der Reed-Kontakt wird prellen, also nicht einmal sondern mehrmahls öffnen und schließen. Da Dein raspi recht schnell ist, wird er das Prellen als Impulse mitzählen.
    Entweder setzt du ein externes Zeitglied dazwischen oder du wertest das eingangssignal mehrmals innerhalb einer festgelegten Zeit aus. Eigentlich sollte es zum Reed-Kontakt auch Angaben über die Prellzeit beim Hersteller geben.

  6. Hallo Johannes,
    ich habe mir einen Stromzähler von B+G E-Tech gekauft, die bereits verkabelt ist.
    Für das Monitoring vom Stromverbrauch habe ich Deine Anleitung verfolgt, leider komme ich beim alle letzten Schritt nicht weiter. Ich weiss nämlich nicht welche OID ich dafür eintragen soll.
    Die Ausgabe von snmpwalk besteht aus über 1400 Zeilen !!
    Wonach soll ich dann suchen?
    Vielen Dank für Deine Hilfe im Voraus.
    Gruß Lion

  7. Hallo nochmal,
    ok jetzt habe ich snmpwalk nochmal laufen lassen und bekam diesmal tausende Einträge und mit dabei anscheinend auch der vom “stromcounter”
    1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1&PseudoZero:d83lykUUdiqhdz@192.168.86.5:::::2
    PseudoZero steht hier für Passwort?

    1. Hi Lion,
      also diese Zeile ist eigentlich für die MRTG/Routers2 Konfiguration. Falls du ein anderes Programm für die Auswertung verwendest, dann brauchst du das gar nicht.
      Der String teil sich wie folgt auf:
      1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1 = bei mir die OID für den Stromcounter
      & = Trennzeichen
      PseudoZero = Für MRTG nötig, weil der pro “Target” immer zwei Werte erwartet. Das ist aber wirklich speziell (!) für MRTG und hat nichts mit dem Stromcounter zu tun! Falls du nur die OID für den Stromcounter brauchst, kannst du es ignorieren!
      : = Trennzeichen
      d83lykUUdiqhdz = mein SNMP Passwort
      @192.168.86.5:::::2 : IP Adresse und SNMP-Option zur Abfrage. Die IP ist also von meiner Pi. Aber auch das ist MRTG-spezifisch.

      Ergo: Falls du MRTG/Routers2 genau so verwendest, wie ich es in einem anderen Post beschrieben habe, dann kannst du den Stromcounter genau so wie oben angegeben darin einbinden. Falls du irgendetwas anders zu Monitoren verwendest, brauchst du nur die OID. Herausfinden tust du die in der Tat durch ein bisschen Testen. ;) Evtl. mal einen Wert (12345) händisch in die Stromcounter-Datei schreiben, und dann beim snmp Output danach greppen (snmpwalk -v 2c -c PASSWORD IPADDRESS 1.3.6 | grep 12345).

  8. Hallo Johannes,

    vielen Dank für Deine schnelle Antwort.
    Jetzt habe ich 4 OID-Werte für den Counter gefunden:
    iso.3.6.1.4.1.8072.1.3.2.3.1.1.12.115.116.114.111.109.99.111.117.110.116.101.114
    iso.3.6.1.4.1.8072.1.3.2.3.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114
    iso.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1
    iso.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.130
    die ich alle ausprobiert habe, aber leider ohne Erfolg
    Der String schaut dann folgende Maßen aus:
    Target[strom-test]: 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1&PseudoZero:public@192.168.1.100:::::2
    Ich habe auch mit dem *localhost* -statt IP-Adresse- ausprobiert, aber leider auch hier keinen Erfolg gehabt! Es wird kein rrd-file erzeugt!!

    Error reading RRD database /var/www/mrtg/mtrg-test.rrd
    opening ‘/var/www/mrtg/mtrg-test.rrd’: No such file or directory
    Check that MRTG has run successfully on this device, and has created the RRD file.

  9. Hallo Johannes,

    ich bin jetzt ein stückchen weitergekommen, nachdem ich Raspi neu aufgesetzt und alle tools neu installiert habe.
    Der Fehler mit dem Erzeugen von DDR-File ist jetzt weg.
    Es wird jetzt zwar einen Grpahen erstellt (sieh hier: http://img1.bildupload.com/c2787c18b93763362f52cc6184fb15b9.jpg), aber leider noch leer ist! d.h. es wird keine Liestung angezeigt.
    Ich habe mit verschiedenen Werten zur Darstellungs des Graphens rumprobiert, aber es tut sich nix.

    Testweise habe ich das Monitoring vom CPU, Memory und Lan Traffic (was ich momentan gar nicht brauche)laufen lassen und es funktioniert problemlos.

    Hast Du vlcht. eine Idee woran es liegen könnte, dass keine Werte angezeigt werden?

    1. Hi Lion.
      Das sieht so aus, als ob einfach keine Daten gespeichert werden. Das könnte zwei Gründe haben:
      a) Dein MaxBytes stimmt nicht, also ist zu niedrig für das, was du speichern möchtest. Schau mal in die Log-Datei von MRTG unter “/var/log/mrtg/mrtg.log”. Eventuell steht da etwas bezüglich deines Targets.
      b) Die liest die falsche OID aus, die einfach nur 0 zurückliefert. Bist du sicher, dass du die richtige OID hast? Also wenn du per snmpget/snmpwalk dir den Wert anschaust, steht dann wirklich auch der aktuelle aus der stromcounter Datei drin?

      Und noch was: Betreibst du MRTG und den Stromzähler auf dem gleichen Pi? Dann müsstest du gar nicht den Umweg über SNMP gehen, sondern könntest die Abfrage der stromcounter Datei direkt in MRTG einbinden. Schau mal hier unter “External Monitoring Scripts”: http://oss.oetiker.ch/mrtg/doc/mrtg-reference.en.html . Es könnte also reichen, wenn die stromcounter Datei einfach 4 Zeilen beinhält, und du ein cat /var/strom/stromcounter als Target hast. (Man auch auf die Backticks.)

  10. Hallo Johannes,
    a-MaxBytes ist auf 10 gesetzt!
    in der mrtg-log ist nur einen Eintrag drin (der sich widerholt) : ” ERROR: I Quit! Another copy of mrtg seems to be running. Check /etc/mrtg.pid
    Daemonizing MRTG …”
    in der mrtg.pid ist “2245” drin.
    b- ja, Ich habe die richtige OID als Target >> http://img1.bildupload.com/d8032d727b604a797c8be97709070ca4.jpg

    Ja, alle Tools laufen auf dem selben RPi
    Das mit dem ““External Monitoring Scripts” muss ich noch probieren.
    mindenstens 4 Zeilen muss Die Counter-Datei haben? sie hat aber nur eine Zeile (letzte eingelesener Wert)!?

    1. Zu a) setze MaxBytes einfach testweise mal auf 10000. Dein Wert aus dem Screenshot sieht so hoch aus. Wie viele Impulse pro kWh macht denn dein Zähler?

      Zu dem Fehler im Log: Google ist dein Freund. :)

  11. 1000 Imp. pro 1 kwh.
    Zum Zeitpunkt der Aufnahme lag der Verbrauch bei ca. 170Watt

  12. Ist es irgendwie auch möglich die 3 Phasen einzeln zu messen? (also über die S0 Schnittstelle) bzw. kennst du einen Stromzähler der das kann (auch über eine andere Schnittstelle?)

    Wäre dir sehr dankbar über eine Antwort.

    1. Hi Matze,

      also über EINE S0-Schnittstelle wirst du das nicht erreichen können. Höchstens über DREI. Am einfachsten wäre es natürlich, anstatt einem 3-Phasen Zähler einfach 3x einephasige Zähler einzubauen und alle getrennt voneinander zu zählen. (Ich weiß gerade nicht auswendig, wie viele der GPIO Ports des Pis dafür verwendbar sind. Das müsstest du noch googeln.) Ob es einen 3-Phasen Zähler mit 3x S0-Schnittstelle gibt, weiß ich ebenfalls nicht. (Google?)

      Aus elektrotechnischer Sicht müsste man noch klären, ob es überhaupt möglich ist, 3 Phasen über 3 GETRENNTE Zähler laufen zu lassen. Also funktionieren wird es schon (das überhaupt Strom durchläuft), die Frage ist nur, ob man einen Verbraucher, der an allen drei Phasen gleichzeitig zieht, korrekt messen kann, da in einem solchen Fall ja KEIN Strom über den Nullleiter zurückläuft, sondern sich über die drei Phasen verteilt. Aber da müsstest du mal in einem geeigneten Forum nachfragen (und dann hier die Antwort posten). Wie dem auch sei, einen solchen Fall dürfte man im Privathaushalt kaum haben, da selbst Elektroherde zwar an drei Phasen angeschlossen sind, jedoch immer “zum Nullleiter hin” mit 230 V ziehen und nicht “zwischen den Phasen” mit 400 V.

  13. Pingback: Anonymous
  14. Hallo, also auf den null bezogen ist es egal ob du 1 Phasige oder mehr Phasige Verbraucher betreibst, da der Null nur als bezugspunkt für die Höhe der Spannung gebraucht wird.
    Die Leistung, also das was wir haben wollen, ergibt sich dann aus den Werten, da Phase zu Null immer 230V sein sollten.
    380V kommen nur zwischen den einzelnen Phasen zum Vorschein, und durch den Phasenversatz von 120 Grad, kommt dann im Kreisdiagramm das wort Drehstom zutage.

  15. Hallo Herr Weber,

    danke für die Rückinfo vorhin.
    Leider funktioniert bei mir gar nichts. Bisher habe ich die “isr.c” Datei in wiringPi/examples durch den Link “isr.c” ersetzt, BUTTON PIN auf 9 gesetzt. Nicht klar ist mir, an welche Stelle genau “FILE *datei” hingehört. Ich vermute weiter, weil die 1. Zeile der anderen 4 Teilen auskommentiert ist, dass diese auch dorthin gehören. Das Verzeichnis /var/strom wurde angelegt. Doch bei der Eingabe “gcc -lwiringPi -o stromzaehler stromzaehler.c” kommt die Fehlermeldung: Verzeichnis oder Datei nicht gefunden, sodass ich also bereits ab hier “festhänge”. Erwähnen sollte ich vielleicht noch: ich arbeite mit putty, habe die “isr.c” Datei mittels Kopierbefehl erstellt, also Originaldatei geleert, dann neu eingefügt. Hier ist mir aufgefallen, dass keine Einrückungen mehr vorhanden sind und grundsätzlich die letzte Klammer nicht mitkopiert wird (wurde selbst angehängt).
    Wäre schön, wenn ich Hilfe bekäme.

    Gruss

    Wilfried

    1. Hallo Wilfried,

      die Deklaration der Varialbe kannst du z.B. direkt hinter der geschweiften Klammer der main Funktion machen. Bei mir sehen die Zeilen so aus:
      —–
      int main (void)
      {
      int myCounter = 0 ;
      FILE *datei;
      —–

      Die anderen drei Zeilen (datei = fopen …, usw.) kommen hinter das printf, welches ich ja auskommentiert habe, siehe oben.

      Deine Fehlermeldung beim Aufruf von gcc deutet aber mehr auf eine “einfache” Sache hin. Hast du deine erstellte Quellcode-Datei auch korrekt “stromzaehler.c” benannt? (Sie sollte nicht mehr isr.c heißen! Sorry, das erwähne ich oben nicht so genau.) Rufst du gcc im gleichen Ordner auf, in welchem auf stromzaehler.c liegt?

      Viel Erfolg!

      1. Hallo Johannes,

        danke für deine Antwort.
        Da keiner in den Kommentaren die gleichen Fragen hatte wie ich, scheine ich grundsätzlich etwas falsch zu machen, nur was?
        Habe jetzt alles so gemacht, funktioniert trotzdem nicht! Habe auch mal den Beitrag von skrue verwendet und eingegeben: “gcc -lwiringPi -o isr isr.c” dann Enter, Antwort ist die gleiche: Verzeichnis oder Datei nicht gefunden. Habe nochmals kontrolliert: wiringPi und gcc sind installiert. Was bedeutet eigentlich “lwiringPi”und wo befindet sich diese Datei? In welches Verzeichnis gehört denn die Quelldatei “stromzaehler.c”? Vielleicht kannst du mir ja auch einfach mal deine Datei unter Angabe des Zielverzeichnisse mailen? Vielleicht habe ich dann ein Erfolgserlebnis.

        Gruß

        Wilfried

  16. Hallo Johannes,

    bevor du antwortest: “Rufst du gcc im gleichen Ordner auf, in welchem auch…..?
    Nein, habe ich bisher nicht getan und da liegt wohl auch mein Fehler! Habe jetzt nochmal den Beitrag von skrue genommen (weil er die isr.c Datei nimmt), habe den Pfad bis zur isr.c Datei geöffnet und hier gcc ausgeführt, dann Sudo ./isr.: Jetzt tut sich tatsächlich was, es wird angezeigt “wait”. Werde morgen mal die S0-Schnittstelle beschalten. Ich brauche also die Datei von dir nicht mehr. Es wäre trotzdem nett, wenn du mir noch mitteilen würdest, in welchem Verzeichnis die Datei “stromzaehler.c” angelegt werden muss und wie mit der Originaldatei “isr.c” in wiringPi zu verfahren ist.

    Gruß

    Wilfried

  17. Hallo Johannes,

    habe weiter experimentiert, Datei/en wohin ist jetzt klar, das Zählen wird ausgeführt, habe dazu schon wieder eine Frage: Wie ich bemerkt habe, ist der Zähleingang sehr “empfindlich”, zählt sehr schnell (zu schnell), deshalb wohl auch der Entstör-Kondensator. Offensichtlich hat das Programm (derzeit?) keine “Schutzfunktion”, kann scheinbar ein Prellen nicht von den tatsächlichen Impulsen unterscheiden, was (bei mir) zu Fehlzählungen führt. Die S0-Schnittstelle eines Zählers hat eine Impulslänge von ca 90 ms? Kann man im Programm die Impulslänge oder die Anzahl der Portabfragen pro Sekunde/Millisekunde entsprechend einstellen? Oder wie hast du das sichere Erfassen der Zählimpulse gelöst? Wenn das bis hierher funktionieren würde, käme ich erst einmal zu dem, was mich an diesem Programm eigentlich interessiert: Die Differenz aus der Einspeiseleistung meiner kleinen PV-Anlage und dem Verbrauch im Haushalt. Bei genügend Überschusses soll dann ein Verbraucher eingeschaltet werden. Könntest du mir Tipps geben, wie das mit dem Programm zu bewerkstelligen wäre? Bisher funktioniert sowas bei mir mittels einer Siemens Logo schon seit längerer Zeit. Dafür interessieren sich inzwischen auch meine Jungs. Aber Siemens hat Nachteile: Ist teuer und hat nicht den Funktionsumfang wie der Raspi (Funk, Emails versenden, usw.)

    Gruß

    Wilfried

    1. Hallo Wilfried,

      hm, ich kann dir bei beiden Problemen leider nicht adhoc helfen. Mit Prellen habe ich zum Glück keine Probleme. Wie man es per Software löst, weiß ich daher nicht.
      Auch das Agieren entsprechend von Messwerten habe ich bis jetzt noch nicht gemacht. Da man mit dem Raspberry Pi aber sehr viel steuern kann, wirst du im Internet bestimmt irgendwo anders Infos finden, wie man zum Beispiel Relais an- und ausschaltet.
      Ciao, Johannes

  18. Ich habs geschafft – mein Raspi liest meinen Stromzähler aus. Das Programm hab ich für meine Bedürfnisse etwas angepasst – hab meinen Code auf meinem Blog…

    Vielen Dank für deine Hilfe!

    Jonathan

  19. Hallo Johannes,

    ich habe den Stromcounter zum laufen bekommen, jedoch habe ich noch ein paar Probleme.

    – Nach dem Systemstart wird der Counter nicht automatisch gestartet (Nur Manuell wenn ich mich über SSH einzähle und ihn dann starte) und

    – Es wird nicht die Datei /var/strom/stromcounter angelegt… das Verzeichniss bleibt leer obwohl lese und schreibrechte für jeden user vorhanden sind.

    Hast Du eventuell einen Tip für mich ?

    Mfg
    Marco

    1. Hi Marco,

      hm, so direkt kann ich dir auch nicht helfen. Außer halt nachzufragen, ob du wirklich alle Schritte von oben exakt so gemacht hast? :) Also hast du das Start-Skript im init.d Ordner mit dem “update-rc.d stromzaehler defaults” Befehl aktiviert? (Dann sollte es auch beim Booten starten.)
      Oder ist in der C-Datei der richtige Pfad angeben?
      datei = fopen (“/var/strom/stromcounter”, “w”);

      1. Hallo Johannes,

        in der C-Datei steht folgendes:

        /*
        *********************************************************************************
        * main
        *********************************************************************************
        */

        int main (void)
        {
        int myCounter = 0 ;
        FILE *datei;

        if (wiringPiSetup () < 0)
        {
        // printf (" Done. counter: %5d\n", globalCounter) ;
        datei = fopen ("/var/strom/stromcounter", "w");
        fprintf (datei, "%d\n", globalCounter);
        fclose (datei);
        }

        if (wiringPiISR (BUTTON_PIN, INT_EDGE_FALLING, &myInterrupt) < 0)
        {
        fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ;
        return 1 ;
        }

        for (;;)
        {
        printf ("Waiting … ") ; fflush (stdout) ;

        while (myCounter == globalCounter)
        delay (100) ;

        printf (" Done. counter: %5d\n", globalCounter) ;
        myCounter = globalCounter ;
        }

        return 0 ;
        }

        Mfg
        Marco

        1. Hi Marco,

          ah, ich sehe den Fehler. Das Schreiben der Datei ist an einer falschen Stelle.
          Ich habe oben im Beitrag mal die komplette “main” Funktion der C Datei gepostet. Diese kannst du einfach komplett kopieren, bzw. du siehst, wo ich die Zeilen eingefügt habe.
          (Zugegeben war meine Beschreibung nicht ganz eindeutig gewesen…)

          Dann solltest du schon mal einen Schritt weiter sein. ;)
          Johannes

          1. Hi Johannes,

            jupp, das war genau der Fehler… nun klappt alles. Der fehlerfeufel steckt manchmal im Detail :)

            Nun muss ich mich nur noch um die Auswertung kümmern… Du hast die DB aber nicht auf dem Pi Laufen oder ?

          2. Richtig, ich habe einen weiteren Server, auf dem mein Monitoring läuft. (Wenn du den Blogpost genau durchliest, müsstest du das eigentlich sehen. ;) Siehe Skizze ganz oben.)
            Welche Art von Monitoring du verwendest, steht dir natürlich vollkommen frei. Es kann auch ein Cacti, Munin, Nagios, Icinga, oder sonst was sein. Ich habe halt (historisch gewachsen) ein MRTG mit Routers2: https://weberblog.net/mrtg-with-rrdtool-and-routers2-installation-from-scratch/

  20. Hallo habe alles so weit lauffähig. Ab Auslesen via SNMP und Einbinden in MRTG komme ich nicht weiter. Routers2 läuft. Wie und wo muss ich die Konfigurationszeilen für MRTG und Routers2.cgi einbinden?

    1. Ja, das ist nicht direkt so verständlich, das stimmt leider. Weil man sich ja noch voll in das Monitoring-System einarbeiten muss.
      Also wenn routers2 bereits läuft (schon mal sehr gut!), und du dich dabei an meine andere Anleitung zur Installation von MRTG/Routers2 gehalten hast, dann musst du jetzt nur eine weitere Datei im Ordner /etc/mrtg/ erzeugen. Diese kann zum Beispiel:
      strom.cfg
      heißen. Dort hinein kommen dann die Konfigurationszeilen für MRTG, wie oben im Post beschrieben. MRTG sollte nämlich alle *.cfg Dateien in diesem Ordner erkennen. Und Routers2 ebenfalls, so dass du direkt nach dem Speichern der Datei in Routers2 bereits einen entsprechenden Eintrag sehen solltest.
      Ciao,
      Johannes

      1. Hallo Johannes,
        danke habe ich gemacht. Jetzt habe ich mal eine leere Grafik.
        Ich erhalte aber noch Errors im mrtg.log.
        SNMPGET Problem for 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1 on d83lykUUdiqhdz@127.0.0.1

        Auch snmpwalk liefert komisches zeug. Finde die ID nicht.
        pi@raspberrypi /etc/mrtg $ snmpwalk -v 2c -c public 127.0.0.1 . 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1
        iso.3.6.1.2.1.1.1.0 = STRING: “Linux raspberrypi 4.1.7+ #817 PREEMPT Sat Sep 19 15:25:36 BST 2015 armv6l”
        iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.8072.3.2.10
        iso.3.6.1.2.1.1.3.0 = Timeticks: (226610) 0:37:46.10
        iso.3.6.1.2.1.1.4.0 = STRING: “Me ”
        iso.3.6.1.2.1.1.5.0 = STRING: “raspberrypi”
        iso.3.6.1.2.1.1.6.0 = STRING: “Sitting on the Dock of the Bay”
        iso.3.6.1.2.1.1.7.0 = INTEGER: 72
        iso.3.6.1.2.1.1.8.0 = Timeticks: (3) 0:00:00.03
        iso.3.6.1.2.1.1.9.1.2.1 = OID: iso.3.6.1.6.3.10.3.1.1
        iso.3.6.1.2.1.1.9.1.2.2 = OID: iso.3.6.1.6.3.11.3.1.1
        iso.3.6.1.2.1.1.9.1.2.3 = OID: iso.3.6.1.6.3.15.2.1.1
        iso.3.6.1.2.1.1.9.1.2.4 = OID: iso.3.6.1.6.3.1
        iso.3.6.1.2.1.1.9.1.2.5 = OID: iso.3.6.1.2.1.49
        iso.3.6.1.2.1.1.9.1.2.6 = OID: iso.3.6.1.2.1.4
        iso.3.6.1.2.1.1.9.1.2.7 = OID: iso.3.6.1.2.1.50
        iso.3.6.1.2.1.1.9.1.2.8 = OID: iso.3.6.1.6.3.16.2.2.1
        iso.3.6.1.2.1.1.9.1.3.1 = STRING: “The SNMP Management Architecture MIB.”
        iso.3.6.1.2.1.1.9.1.3.2 = STRING: “The MIB for Message Processing and Dispatching.”
        iso.3.6.1.2.1.1.9.1.3.3 = STRING: “The management information definitions for the SNMP User-based Security Model.”
        iso.3.6.1.2.1.1.9.1.3.4 = STRING: “The MIB module for SNMPv2 entities”
        iso.3.6.1.2.1.1.9.1.3.5 = STRING: “The MIB module for managing TCP implementations”
        iso.3.6.1.2.1.1.9.1.3.6 = STRING: “The MIB module for managing IP and ICMP implementations”
        iso.3.6.1.2.1.1.9.1.3.7 = STRING: “The MIB module for managing UDP implementations”
        iso.3.6.1.2.1.1.9.1.3.8 = STRING: “View-based Access Control Model for SNMP.”
        iso.3.6.1.2.1.1.9.1.4.1 = Timeticks: (2) 0:00:00.02
        iso.3.6.1.2.1.1.9.1.4.2 = Timeticks: (2) 0:00:00.02
        iso.3.6.1.2.1.1.9.1.4.3 = Timeticks: (2) 0:00:00.02
        iso.3.6.1.2.1.1.9.1.4.4 = Timeticks: (3) 0:00:00.03
        iso.3.6.1.2.1.1.9.1.4.5 = Timeticks: (3) 0:00:00.03
        iso.3.6.1.2.1.1.9.1.4.6 = Timeticks: (3) 0:00:00.03
        iso.3.6.1.2.1.1.9.1.4.7 = Timeticks: (3) 0:00:00.03
        iso.3.6.1.2.1.1.9.1.4.8 = Timeticks: (3) 0:00:00.03
        iso.3.6.1.2.1.25.1.1.0 = Timeticks: (373395) 1:02:13.95
        iso.3.6.1.2.1.25.1.2.0 = Hex-STRING: 07 DF 0A 15 14 00 1B 00 2B 02 00
        iso.3.6.1.2.1.25.1.3.0 = INTEGER: 1536
        iso.3.6.1.2.1.25.1.4.0 = STRING: “dma.dmachans=0x7f35 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2708.boardrev=0x100000e bcm2708.serial=0x678d33a9 smsc95xx”
        iso.3.6.1.2.1.25.1.5.0 = Gauge32: 1
        iso.3.6.1.2.1.25.1.6.0 = Gauge32: 74
        iso.3.6.1.2.1.25.1.7.0 = INTEGER: 0
        iso.3.6.1.2.1.25.1.7.0 = No more variables left in this MIB View (It is past the end of the MIB tree)

        1. Vielleicht hängt es auch beim
          ###############################################################################
          #
          # EXTENDING THE AGENT
          #
          extend-sh stromcounter cat /var/strom/stromcounter

        2. Ist das alles, was du beim snmpwalk bekommst? Dann wird es vermutlich an der “ACCESS CONTROL” innerhalb der snmpd.conf Datei liegen. Dort ist es standardmäßig so, dass man nur
          “rocommunity public default -V systemonly”
          stehen hat. Mach das mal so, dass du nur in etwa folgendes hast:
          “rocommunity THISISTHEKEY 192.168.0.0/16”
          Sprich: Aus diesem Netzwerk (halt entsprechend anpassen) kannst du danach auf ALLE OIDs zugreifen. Mach das mal und guck, ob du dann deinen Stromzählerwert findest.

  21. Ok habe ich gemacht. Jetzt kommt eine enorm lange Liste.
    Folgendes macht mir noch Probleme:
    Target[strom-fdorf]: 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1&PseudoZero:d83lykUUdiqhdz@192.168.86.5:::::2

    Daher das d83lykUUdiqhdz ist das Passwort für den Public SNMP.
    Das gebe ich dann so ein bei er snmp.config
    “rocommunity d83lykUUdiqhdz 192.168.0.0/16”

    Das Target finde ich aber nicht. Habe keine Chance in dieser langen Liste. MIB Brower zeigt nur sehr wenig an.

  22. Also das habe ich gemacht:

    sudo nano /etc/snmp/snmpd.conf
    #AGENT BEHAVIOUR
    agentAddress udp:161
    # ACCESS CONTROL
    rocommunity public localhost
    rocommunity d83lykUUdiqhdz 192.168.10.0/16

    dann

    snmpwalk -v 2c -c public 127.0.0.1 .1.3.6.1.4.1.8072
    gibt zurück:
    snmpwalk -v 2c -c public 127.0.0.1 .1.3.6.1.4.1.8072.1.3.2.2.1.3.12.115.116.114.111.109.99.111.117.110.116.101.114
    iso.3.6.1.4.1.8072.1.3.2.2.1.3.12.115.116.114.111.109.99.111.117.110.116.101.114 = STRING: “/var/strom/stromcounter”

    dann

    cd /etc/mrtg
    sudo nano s0.cfg

    routers.cgi*Icon: house-sm.gif
    routers.cgi*ShortDesc: Stromverbrauch

    #OID per snmpwalk herausgefunden
    Target[strom-fdorf]: 1.3.6.1.4.1.8072.1.3.2.2.1.3.12.115.116.114.111.109.99.111.117.110.116.101.114&PseudoZero:d83lykUUdiqhdz@192.168.10.29:::::2
    #800 Impulse pro kWh -> MaxBytes (pro Sekunde) auf 5 gesetzt = 3600*5/800 entspricht 22,5 kW (das sollte reichen ;))
    MaxBytes[strom-fdorf]: 5
    Title[strom-fdorf]: Stromverbrauch Home
    #Gespeichert wird in Raw, also 1000 Impulse pro kWh. Anzeige aber in Wh, daher mal 1 Somit entspricht einem faktorisiertem Impuls genau 1 Wh.
    Factor[strom-fdorf]: 1
    #Ausgabe aber immer in Leistung pro Stunde (und nicht pro Sekunde)
    Options[strom-fdorf]: perhour
    Colours[strom-fdorf]: BLACK#000000, YELLOW#FFD600, RED#FF0000, ORANGE#FC7C01
    YLegend[strom-fdorf]: Watt
    Legend1[strom-fdorf]: Leistung
    Legend3[strom-fdorf]: Peak Leistung
    LegendI[strom-fdorf]: Leistung:
    ShortLegend[strom-fdorf]: W
    routers.cgi*Options[strom-fdorf]: nomax noo
    routers.cgi*TotalLegend[strom-fdorf]: Wh
    routers.cgi*ShortDesc[strom-fdorf]: Fdorf
    #Kommentar unter jedem Graph, weil ich mir das sonst nicht merken kann:
    routers.cgi*Comment[strom-fdorf]: N.A.

  23. SNMPGET Problem for 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1 on d83lykUUdiqhdz@192.168.10.29:::::2:v4only
    at /usr/bin/mrtg line 2339
    2015-10-21 19:25:07: WARNING: skipping because at least the query for 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1 on 192.168.10.29 did not succeed
    2015-10-21 19:25:07: WARNING: no data for 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114&PseudoZero:d83lykUUdiqhdz@192.168.10.29. Skipping further queries for Host 192.168.10.29 in t$
    2015-10-21 19:25:17: ERROR: Target[strom-fdorf][_IN_] ‘ $target->[0]{$mode} ‘ did not eval into defined data
    2015-10-21 19:25:17: ERROR: Target[strom-fdorf][_OUT_] ‘ $target->[0]{$mode} ‘ did not eval into defined data
    SNMP Error:
    no response received
    SNMPv2c_Session (remote host: “192.168.10.29” [192.168.10.29].161)
    community: “d83lykUUdiqhdz”
    request ID: 688329894
    PDU bufsize: 8000 bytes
    timeout: 2s
    retries: 5
    backoff: 1)
    at /usr/share/perl5/SNMP_util.pm line 492

  24. So hat nun geklappt! Aber folgendermassen:

    sudo nano /etc/snmp/snmpd.conf
    # AGENT BEHAVIOUR
    agentAddress udp:127.0.0.1:161,udp:192.168.10.29:161
    # ACCESS CONTROL
    rocommunity public
    ________________________________________________
    sudo nano /etc/mrtg/s0.cfg
    Target[strom]: 1.3.6.1.4.1.8072.1.3.2.3.1.1.12.115.116.114.111.109.99.111.117.110.116.101.114&PseudoZero:public@192.168.10.29:::::2

  25. Erstmal danke für deinen Klasse Artikel!

    Ich habe bei mir das Problem, dass der Interrupt offensichtlich nicht korrekt aufgerufen wird. Wenn ich mir mit PISCOPE (http://abyz.co.uk/rpi/pigpio/piscope.html) die GPIO-Ports anschaue kommt in gleichmäßigen Abständen ein Pull-Down des SCL, der auch identisch zum Blinken der LED zum Zähler ist. Deine Modifizierte isr.c schreibt auch brav ihre Datei, allerdings erhöht sich der Zähler nicht um 1 pro Impuls sondern um mehrere Tausend (unterschiedliche höhe). Der Impuls ist laut Hersteller 70ms, was auch mit der Ausgabe von piscope übereinstimmt.

    Außerdem zieht die kompilierte Stromzähler 100% CPU wenn ich sie starte, was mich auch ein wenig irritiert.

    Für jedweden Tipp, was ich falsch mache, wäre ich sehr dankbar.

    1. Hi Jens,

      hm, also so richtig kann ich dir auch nicht helfen. Es klingt aber nach einem Prellen-Problem, oder so ähnlich. In der isr.c Datei ist ja ein “delay(100)” drin. Vielleicht könntest du mit dem Wert mal etwas rumtesten?
      Was die 100 % CPU Last betrifft, könnte das auch damit zusammen hängen. Hm…???

      Sorry,
      Johannes

    2. Hallo Jens,

      ich bin vorhin zufällig in das gleiche Problem gelaufen: Nach einem normalen Upgrade des Pis (sudo apt-get update, sudo apt-get dist-upgrade) lief auch mein Zähler vollkommen über. Ich habe daraufhin einfach noch mal die aktuelle Version von WiringPi von git geklont und die .c Datei noch mals damit kompiliert (und in den richtigen Pfad verschoben). Voilà, es läuft wieder. Uff! ;)
      Vermutlich wird das bei dir auch helfen?

  26. Moin Johannes,

    sehr Interessantes Projekt, genau so etwas will ich mir gerade ebenfalls basteln. Ich stehe noch vor der Entscheidung, das mit einem AVR oder mit einem Pi zu erledigen.
    Da ich mehrere Unterzähler für verschiedene Bereiche in meiner Umgebung gesetzt habe, würde ich natürlich mit möglichst vielen IOs arbeiten wollen, um alle Zähler mit einem Gerät zu erschlagen.
    Wie viele IO kann man beim Pi mit solchen countern belegen?

    Die andere Überlegung die ich habe ist, auf einem panel die momentane Last für alle Bereiche anzuzeigen. Das erfordert eine zeitmessung zwischen den einzelnen Impulsen. Ist so etwas mit einen Pi überhaupt out of the box möglich oder müsste ich mir dafür die I/O Treiber selbst schreiben?

    Auf AVR wäre das alles kein großes problem für mich, aber mit Pi habe ich bisher noch gar nichts gemacht (außer anschalten und per ssh drauf schauen). Ich tenriere allerdings dazu, den Pi zu verwenden, weil die restliche Verarbeitung der Daten (i.e. direktes Versenden über Netzwerk) dort deutlich schneller und schmerzfreier zu realisieren ist, als mit einem plain microcontroller, an den man erstmal mühsam ein ethernet Modul anflanschen und dann den ganzen code für das Auslesen und Senden generieren muss.

    1. Hi Bernd,

      wie viele solcher IOs für die S0-Schnittstelle geeignet sind weiß ich leider auch nicht direkt. Da müsstest du dich mal durch irgendwelche Datenblätter oder Links in meinem Post durchwühlen. Wenn du es dann herausgefunden hast, schreib es hier doch bitte noch. ;)

      Mit der Berechnung der momentanen Last sollte das theoretisch doch kein großes Problem sein. Du bekommst ja bereits jeden Impuls ausgewertet. (Lediglich ich frage mit meinem Monitoring-Server halt nur alle 5 Minuten ab.) Aber wenn du ein Programm auf dem Pi schreibst, welches den Zählerwert 1x pro Sekunde oder so abfragt, dann hast du ja quasi einen Momentan-Verbrauch.

      Viel Erfolg!

  27. Hi!
    Ich hab versucht das ganze nachzubauen, allerdings bekomme ich keine Werte,
    kann es sein dass die Kabellänge zwischen Stromzähler und Pi mit geschätzt 10m einfach zu lang ist? Mein Gedanke war dass der interne Pull-Up Widerstand kleiner ist als der Kabelwiderstand und dadurch der Pin nicht gegen GND gezogen wird?
    Was kann ich dagegen machen?
    lg Mike

  28. Hallo,

    Du schreibst, daß Wasserzähler schwerer auszulesen sind.

    Sie sind doch mechanisch – dort dreht sich ein Metallteil.

    Oft sind die Wasserzähler von Sensus (www. sensus.com) und es gibt für mittleres Geld ein Impulserzeuger, der durch das sich innen drehende “Rad” über einen Magneten ausgelöst wird.

    Man muß also nur Impulse zählen.

    Für mich klingt das zwar alles super – aber ist gar nicht so einfach nachzustellen. Das Montieren von o.g. Wasserzählermodul an einem Sensus-Zähler ist ja noch vergleichsweise einfach…

    Gruß Björn

  29. Sehr geehrter Herr Weber,
    ich habe mich mit Ihrem Projekt: Stromzähler/MRTG/Routers2 befasst.
    Habe alles soweit hinbekommen :-) Danke dafür.
    Das System läuft ausschliesslich auf dem PI, der Tipp mit dem -[Target] cat /var….. war sehr hilfreich.
    Durch mehrere Test`s, da mein Impuls =2000 / kWh, bleiben diese Werte mit gespeichert.
    Meine Frage; wie kann ich diese Testwerte wieder löschen? (Es verfälscht das Endergebnis)
    Bsp: 01.03.2016 getestet, Meßwert 20kW >ich habe falsch umgerechnet…(falscher Wert bei [Faktor] )
    ab 02.03.2016 bis jetzt, angepasst, alle Werte i.O. möchte jetzt die Werte vom 01.03.2016 löschen
    Wo finde ich die log-Datei, in der die Werte des stromcounter abgelegt werden?

    In der Routers2 Oberfläche gibt es den CSV-File Button>genau diese Einträge meine ich.
    Nach vielem suchen kommen ich nicht weiter. Würde mich über einen Tipp sehr freuen.

    Vielen Dank im Voraus !

    Daniel

    1. Hallo Daniel,

      um die Werte in einem rrd file nachträglich anzupassen kannst du das tool “rrdtool” verwenden. Dazu müsstest du mal googeln. Ist allerdings nicht ganz so einfach.

      Du könntest alternativ einfach die bisherige Datei komplett löschen. Dann fängst du quasi heute von 0 an. Wenn du MRTG/Routers2 genau wie nach meiner Anleitung installiert hast, dann müssten die rrd files unter /var/mrtg/ liegen. Dort einfach per sudo das entsprechende file löschen. Es wird beim nächsten Lauf von MRTG (standardmäßig alle 5 Minuten) dann neu erstellt.

      Ciao,
      Johannes

  30. Hallo

    ich habe dies ebenfalls versucht. Der Zähler: Eltako DSZ12D 3x65A

    soweit alles ok

    Ausgabe : raspi 1 ; er ist mit dem Zähler über S0 verbunden
    root@strompi:/var/strom# snmpget -v2c -c Passwd localhost 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1
    iso.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1 = STRING: “41”

    Ausgabe : zentralserver
    root@spy-raspi:/etc/mrtg# snmpget -v1 -c passwd 192.168.100.170 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1
    iso.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1 = STRING: “42”
    root@spy-raspi:/etc/mrtg#

    mrtg wie bei dir angepasst.

    #Target[192.168.100.170_3]: 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1&PseudoZero:passwd@192.168.100.170::::::2
    Target[192.168.100.170_3]: 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1&PseudoZero:Passwd@192.168.100.170
    MaxBytes[192.168.100.170_3]: 5
    Title[192.168.100.170_3]: Stromverbrauch
    Factor[192.168.100.170_3]: 1.25
    Options[192.168.100.170_3]: perhour

    Den Rest lasse ich mal weg.

    nun meine Frage , mrtg läuft aller 5 min.

    doch Ausgabe kommt keine im MRTG.

    Keine Fehlermeldung im syslog oder sonstigem.

    Was nun ?

    snmp geht ja richtig

    1. Hi Nils,

      hast du mal ins MRTG Log geschaut?
      tail -100 /var/log/mrtg/mrtg.log

      Hast du das Passwort richtig geschrieben? Bei der SNMP Abfrage hast du es kleingeschrieben, beim Target groß. Evtl. hast du es aber nur falsch für den Kommentar hier ersetzt…

      1. nur wegen hier ;)

        hier ein auszug des log
        1462945806 -1 -1
        1462945806 0 0 0 0
        1462945506 0 0 0 0
        1462945500 0 0 0 0
        1462945200 0 0 0 0
        1462944900 0 0 0 0
        1462944600 0 0 0 0
        1462944300 0 0 0 0
        1462944000 0 0 0 0
        1462943700 0 0 0 0

        Daten können per console aufgerufen werden.
        sei es local oder remote vom /icinga/mrtg/rrdtool raspi.

        oder es war zu wenig dran. (nur ein lüfter zum test)

        1. Hallo

          kann es sein das der Zähler ein
          DSZ12D-3x65A ist
          und 1000 Imp/kWh hat
          impluslänge 30ms

          anstt wie deiner DSZ12E-3x80A

          1. inzwoischen sieht es im logfile so aus

            1462963506 510 0
            1462963506 0 0 0 0
            1462963216 0 0 0 0
            1462963200 0 0 0 0
            1462962900 0 0 0 0
            1462962600 0 0 0 0
            1462962300 0 0 0 0

            dennoch keine Auswertung in den MRTG Grafiken, day usw

  31. Hallo
    letzter Eintrag

    selbst mit nachhilfe

    anstatt 1462963506 510 0
    das gemacht
    1462963506 1827373510 0

    keine auswertung

  32. Hallo

    inzwischen nach vielen test funktioniert es.

    hier meine Strompi.cfg

    ### Interface 2 >> Descr: ‘GPIO’ | Name: ‘PIN’ | Ip: ‘192.168.100.170’ | Eth: ‘b8-27-eb-35-4e-d7’ ###

    Target[192.168.100.170_3]:1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1&PseudoZero:public@192.168.100.170
    MaxBytes[192.168.100.170_3]: 5
    Title[192.168.100.170_3]: Stromverbrauch
    Factor[192.168.100.170_3]: 1
    Options[192.168.100.170_3]: perhour, avgpeak, absolute
    Colours[192.168.100.170_3]: GREEN#00eb0c, YELLOW#FFD600, RED#FF0000, ORANGE#FC7C01
    YLegend[192.168.100.170_3]: Watt
    Legend1[192.168.100.170_3]: Leistung
    Legend3[192.168.100.170_3]: Peak Leistung
    LegendI[192.168.100.170_3]: Leistung:
    ShortLegend[192.168.100.170_3]: W
    PageTop[192.168.100.170_3]: Analysis — strompi

    System:
    Strompi in Sitting on the Dock of the Bay

    Maintainer:
    Me <me@example.org>

    Description:
    Read GPIO 5 & 6

    Ip:
    192.168.100.170

    Kann jeder nutzen.

  33. Hallo

    hier meins

    MaxBytes[192.168.100.170_3]: 10000
    Title[192.168.100.170_3]: Stromverbrauch
    Factor[192.168.100.170_3]: 1.00
    Options[192.168.100.170_3]: perhour, gauge, avgpeak, nobanner

    Zähler : DSZ12D-3x65A
    1000 Impulse/kwp

    Dann wäre mein ja maxbytes & Factor richtig.

    ja oder falsch

  34. Hallo

    noch eines

    bei mir ist wPI 9 Pin 5 und und pin 6 VOlt
    Zeit war an aber keine Stromspitzen.

    selbst ein ausschlag von 1000 oder 2000 watt , glatte null Linie

    Max Average Current
    Leistung: 9783.0 W/h (97.8%) 2664.0 W/h (26.6%) 6024.0 W/h (60.2%)
    Average max 5 min values for `Daily’ Graph (5 Minute interval): Leistung: 2678.0 W/h (26.8%)

    Die grüne Linie bleibt beharrlich auf 6024 Watt , ausschlag null

    pi@strompi:/var/strom $ gpio readall
    +—–+—–+———+——+—+–B Plus–+—+——+———+—–+—–+
    | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
    +—–+—–+———+——+—+—-++—-+—+——+———+—–+—–+
    | | | 3.3v | | | 1 || 2 | | | 5v | | |
    | 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5V | | |
    | 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
    | 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 |
    | | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 |
    | 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
    | 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
    | 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
    | | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
    | 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
    | 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
    | 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
    | | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
    | 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
    | 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
    | 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
    | 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
    | 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
    | 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
    | | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
    +—–+—–+———+——+—+—-++—-+—+——+———+—–+—–+
    | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
    +—–+—–+———+——+—+–B Plus–+—+——+———+—–+—–+

    hat irgendeiner eine Idee

    Zugleich eine Frage: ein gesamt verbrauchs zähler ?

  35. Hallo,
    zunächst einmal: vielen, vielen Dank für diesen Beitrag. Genaus das, was ich gesucht habe.

    Ich habe aber Probleme: Zunächst die Geschichte mit der OID und snmbd.conf.

    Das ist leider viel zu knapp dargestellt. Mir haben die Tipps von Alian geholen, aber nur in einer Abwandlung:

    snmpd.conf

    #AGENT BEHAVIOUR
    agentAddress udp:161
    # ACCESS CONTROL
    rocommunity public

    extend-sh stromcounter /bin/cat /var/strom/stromcounter

    Nun konnte mein Server eine Verbindung zum Raspi herstellen. Meine Zeile in s0.cfg sieht nun so aus:

    Target[strom]:iso.3.6.1.4.1.8072.1.3.2.2.1.3.12.115.116.114.111.109.99.111.117.110.116.101.114&PseudoZero:public@192.168.1.31:::::2

    Was auch komisch war: Dieses 1.3.6 … habe ich nicht. Bei mir es iso.3.6…

    Nun zum aktuellen Hauptproblem:
    tail -f /var/log/mrtg/mrtg.log
    2016-08-18 21:25:02: WARNING: Expected a number but got ‘/var/strom/stromcounter’
    2016-08-18 21:25:02: ERROR: Target[strom][_IN_] ‘ $target->[0]{$mode} ‘ did not eval into defined data

    Was habe ich an: extend-sh stromcounter /bin/cat /var/strom/stromcounter
    falsch gemacht, dass er nun den Dateiname statt dem Inhalt sendet????

    Diese Datei ist vorhanden und enthält den Zähler.

    Ich hoffe, Du kannst mir helfen. Vielen Dank.

    Markus

  36. Hi,
    also dieses snmpd macht mich noch „irre“. Mir ist aufgefallen, dass ich auf dem Raspi jede Menge Fehler in Zusammenhang mit snmd habe:
    /etc/snmp/snmpd.conf: line 160: Error: unknown payload OID

    Danach gegoogelt:
    https://blog.tersmitten.nl/how-to-get-snmpv3-working-in-ubuntu-12-04.html

    In /etc/default/snmdp hatte ich noch gar nicht hinein gesehen.
    Nun habe ich das leere export auf
    export MIBS=UCD-SNMP-MIB
    geändert. Diese Fehlermeldungen sind nun weg. Allerdings verstehe ich nicht, was er in snmpd.conf macht.

    Könntest Du evtl. mal Deine /etc/default/snmpd und Deine snmpd.conf posten. Ich komme da einfach nicht weiter.

    Dann habe ich Deinen Tipp befolgt und mal in den Stromcounter 12345 geschrieben.
    Sieh selbst:

    pi@raspielektro /etc $ snmpwalk -v 2c -c public localhost |grep 12345
    iso.3.6.1.2.1.25.4.2.1.5.3779 = STRING: “–color=auto 12345”
    pi@raspielektro /etc $ snmpwalk -v 2c -c public localhost |grep 12345
    iso.3.6.1.2.1.25.4.2.1.5.3782 = STRING: “–color=auto 12345”

    Hast Du eine Idee. Wo da der Wurm liegt:
    Der einzige LichtblicK: Bei snmpwalk -v 2c -c public localhost kommen x Zeilen, die alle so aussehen:

    iso.3.6.1.2.1.25.3.2.1.6.1026 = Counter32: 0
    iso.3.6.1.2.1.25.3.3.1.1.768 = OID: ccitt.0
    iso.3.6.1.2.1.25.3.3.1.1.769 = OID: ccitt.0
    iso.3.6.1.2.1.25.3.3.1.1.770 = OID: ccitt.0
    iso.3.6.1.2.1.25.3.3.1.1.771 = OID: ccitt.0
    iso.3.6.1.2.1.25.3.3.1.2.768 = INTEGER: 1
    iso.3.6.1.2.1.25.3.3.1.2.769 = INTEGER: 1
    iso.3.6.1.2.1.25.3.3.1.2.770 = INTEGER: 0
    iso.3.6.1.2.1.25.3.3.1.2.771 = INTEGER: 1
    iso.3.6.1.2.1.25.3.4.1.1.1025 = INTEGER: 1
    iso.3.6.1.2.1.25.3.4.1.1.1026 = INTEGER: 2
    iso.3.6.1.2.1.25.3.8.1.1.1 = INTEGER: 1
    iso.3.6.1.2.1.25.3.8.1.1.2 = INTEGER: 2
    iso.3.6.1.2.1.25.3.8.1.1.3 = INTEGER: 3

  37. Ich habe jetzt noch einmal alles durchgearbeitet. Genau nach Anleitung: Auch mit dem Passwort in snmpd.conf

    Nun ist mir folgendes aufgefallen:
    Auf dem Raspi:
    snmpwalk -v 2c -c public localhost liefert 1630 Zeilen.
    snmpwalk -v 2c -c d83lykUUdiqhdz 192.168.1.31

    Liefert auch über 1600 Zeilen.

    Auf meinem Server liefert:

    snmpwalk -v 2c -c d83lykUUdiqhdz 192.16.1.31
    Timeout: No Response from 192.16.1.31

    Wie kann denn das sein. Auf dem Server steht doch im tail -f /var/log/mrtg/mrtg.log:
    2016-08-19 06:15:01: WARNING: Expected a number but got ‘/var/strom/stromcounter’
    2016-08-19 06:15:01: ERROR: Target[strom][_IN_] ‘ $target->[0]{$mode} ‘ did not eval into defined data

    Und auf dem Raspi:
    Aug 19 06:25:01 raspielektro snmpd[4328]: Connection from UDP: [192.168.1.1]:36369->[192.168.1.31]

    Da steht kein Fehler.

    Ich verstehe es nicht …

  38. Wieder einen Schritt weiter:
    Offensichtlich komme ich mit snmpdwalk nicht klar. Das liefert mir 1600 Zeilen die mit iso.3.6.1.2.1.25.4.2.1.5.2364 anfangen und nirgends ist mein Stromcounter. Nimmt man die Zeile von Dir, dann wird der Wert ausgelesen. Also:

    snmpget -v 2c -c d83lykUUdiqhdz 192.168.1.31 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1
    liefert:
    iso.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1 = STRING: “66”

    Also doch 1. statt iso.
    root@homeserver7:/etc# cat mrtg/s0.cfg
    routers.cgi*Icon: house-sm.gif
    routers.cgi*ShortDesc: Stromverbrauch

    #OID per snmpwalk herausgefunden
    Target[strom-rupp]:1.3.6.1.4.1.8072.1.3.2.2.1.3.12.115.116.114.111.109.99.111.117.110.116.101.114.1&PseudoZero:d83lykUUdiqhdz@192.168.1.31:::::2

    #800 Impulse pro kWh -> MaxBytes (pro Sekunde) auf 5 gesetzt = 3600*5/800 entspricht 22,5 kW (das sollte reichen ;))
    MaxBytes[strom-rupp]: 5
    Title[strom-rupp]: Stromverbrauch Home
    #Gespeichert wird in Raw, also 1000 Impulse pro kWh. Anzeige aber in Wh, daher mal 1 Somit entspricht einem faktorisiertem Impuls genau 1 Wh.
    Factor[strom-rupp]: 1.25
    #Ausgabe aber immer in Leistung pro Stunde (und nicht pro Sekunde)
    Options[strom-rupp]: perhour
    Colours[strom-rupp]: BLACK#000000, YELLOW#FFD600, RED#FF0000, ORANGE#FC7C01
    YLegend[strom-rupp]: Watt
    Legend1[strom-rupp]: Leistung
    Legend3[strom-rupp]: Peak Leistung
    LegendI[strom-rupp]: Leistung:
    ShortLegend[strom-rupp]: W
    routers.cgi*Options[strom-rupp]: nomax noo
    routers.cgi*TotalLegend[strom-rupp]: Wh
    routers.cgi*ShortDesc[strom-rupp]: Rupprecht
    #Kommentar unter jedem Graph, weil ich mir das sonst nicht merken kann:
    routers.cgi*Comment[strom-rupp]: N.A.

    Nun sieht mein tail -f /var/log/mrtg/mrtg.log so aus:

    2016-08-19 07:45:28: ERROR: Target[strom-rupp][_IN_] ‘ $target->[0]{$mode} ‘ did not eval into defined data

    Woran kann es jetzt noch liegen?

  39. Hallo,
    ich fasse nochmal zusammen:
    Auf dem Server:

    root@homeserver7:/etc/mrtg# snmpget -v 2c -c d83lykUUdiqhdz 192.168.1.31 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1
    iso.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1 = STRING: “1327”

    Man beachte: Beim Befehl stehr 1.3.6…. Der Befehl liefert: iso.3.6….

    Die Zahl 1327 ist korrekt.

    Mrtg liefert mit ein paar log-Optionen:
    –tarp: Starting strom-rupp -> 1.3.6.1.4.1.8072.1.3.2.2.1.3.12.115.116.114.111.109.99.111.117.110.116.101.114.1&PseudoZero:d83lykUUdiqhdz@192.168.1.31:::::2
    –tarp: &targparser external done: ‘1.3.6.1.4.1.8072.1.3.2.2.1.3.12.115.116.114.111.109.99.111.117.110.116.101.114.1&PseudoZero:d83lykUUdiqhdz@192.168.1.31:::::2’
    –tarp: New complex target [0] ‘1.3.6.1.4.1.8072.1.3.2.2.1.3.12.115.116.114.111.109.99.111.117.110.116.101.114.1&PseudoZero:d83lykUUdiqhdz@192.168.1.31:::::2’:
    Comu: d83lykUUdiqhdz, Host: 192.168.1.31
    Opt: :::::2, IPv4: 1
    Conv:
    OID: 1.3.6.1.4.1.8072.1.3.2.2.1.3.12.115.116.114.111.109.99.111.117.110.116.101.114, PseudoZero
    IfSel: If, None
    Key: 1,
    –tarp: &targparser complex done: ‘ $target->[0]{$mode} ‘
    –tarp: &targparser simple done: ‘ $target->[0]{$mode} ‘
    –tarp: &targparser returning: unique = 0
    –snpo: run snmpget from 1.3.6.1.4.1.8072.1.3.2.2.1.3.12.115.116.114.111.109.99.111.117.110.116.101.114&PseudoZero:d83lykUUdiqhdz@192.168.1.31
    –snpo: simple If: .1
    –snpo: SNMPGet from d83lykUUdiqhdz@192.168.1.31:::::2 — 1.3.6.1.4.1.8072.1.3.2.2.1.3.12.115.116.114.111.109.99.111.117.110.116.101.114.1,PseudoZero
    –snpo: SNMPfound — ‘undef’, ‘undef’
    2016-08-19 10:25:19: ERROR: Target[strom-rupp][_IN_] ‘ $target->[0]{$mode} ‘ did not eval into defined data

    Da komme ich nicht mehr weiter. Hast Du einen Tipp????

    1. Mahlzeit. Viel Text, der Herr. ;)
      Also gut auf jeden Fall, dass du schon ein paar Sachen lösen konntest. So wie ich das sehe kannst du ja per SNMP bereits den Counter auslesen, was schon mal sehr gut ist! Das die .1 manchmal als .iso ist irgendwie so. In MRTG brauchst du halt die 1, während snmpwalk die Namen das SNMP-Baumes verwendet.

      Nun zu deinem Problem. Puh, ich weiß es auch nicht direkt. Läuft denn dein MRTG und Routers2 schon mal generell? Könntest du testweise mal einen anderen Host dort einbinden um zu sehen, ob es überhaupt geht? Ich habe auf meinem Blog einen Artikel, wie man einen Linux-PC einbindet. Wenn du dort einfach “localhost” als IP Adresse verwendest, sollte es relativ einfach gehen.

      Vielleicht ist auch die RRD Datei für deinen Counter mal falsch angelegt worden. Lösche sie einfach mal. Vermutlich liegt sie unter /var/mrtg/. Beim nächsten Run von MRTG (alle 5 Min.) wird sie dann neu angelegt.
      Der Hinweis “did not eval” bedeutet eigentlich, dass die Zahl zu groß oder flasch ist für den verwendeten Typ.
      Mit den anderen Fehlermeldungen von MRTG kann ich gerade auhc nicht so viel anfangen. Solange du händisch prüfen kannst, dass die OID wirklich die richtige ist, bist du auf jeden Fall schon ziemlich nah am Ziel.

  40. Hallo,
    ich habe jetzt bei mrtg das Handtuch geschmissen. Ich habe mein Problem nochmal in der Maillingliste von mrtg beschrieben. Da wird der post aber nicht freigeschaltet.
    Auch wenn ich in den code von mrtg sehe, ich werde da nicht schlau draus.

    Weil ich zu Resultaten kommen wollte, habe ich selbst programmiert: Dein Skript schreibt in eine mysql Datenbank auf dem Server.

    Einmal am Tag wird die ausgelesen und mit gnuplot ein Bild gemalt und abgespeichert.

    Momentan sehe ich aber noch ein anderes Problem: Ab und zu “stolpert” der Zaehler. globalcounter zählt 1, 2 3, 4, 24. oder 4, 5, 6, 7, 9, 10, …Das passiert aber nur ein paar mal am Tag.

    Was da wohl das Problem ist? Habe leider kein Oszi zur Hand.

  41. Hallo,

    vielen Dank für diese tolle Ausarbeitung!
    Funktioniert das auch mit einem optischen Leser? Mein Zähler hat keinen S0 Ausgang, zeigt aber die Impulse als kurzes Licht an.

    Hast Du schonmal einen 2 Tarifzähler angeschlossen? Wäre das prinzipiell auch möglich?

    DANKE!

    Martin

    1. Hi Martin,
      ich habe es zwar selber noch nicht mit einem optischen Leser gebaut, weiß aber, dass das gehen soll. Einfach mal weiter googlen oder selber probieren. ;)
      Ein Zwei-Tarifzähler ist ja nichts anderes als zwei eigenständige Zähler, oder? Also wenn du zwei S0-Schnittstellen hast, kannst du einfach zwei Ports am Pi nehmen und die entsprechend auswerten. Du bekommst zunächst dann halt zwei Graphen, bzw. zwei Linien, die du ja in einer gemeinsamen Grafik anzeigen lassen kannst. Dann hast du auch gleich die Summe. Sollte also kein Problem sein.

  42. Bei mir will das einfach nicht funktionieren.
    Gibt es eine einfache Möglichkeit den S0 Ausgang des Zählers zu prüfen ob er eh funktioniert?

    1. Hi Chris,
      ja, du kannst einfach 3V Spannung (2x Mignon) nehmen und eine LED an die S0 Schnittstelle anschließen. Also einmal im Kreis, so dass die S0-Schnittstelle als Schalter fungiert. Außerdem auf die Polung der LED achten, so dass sie leuchten kann. Pro Impuls sollte die LED dann kurz aufblinken. Bei mir hatte damals dieser Test funktioniert.

      1. Danke, habe es wie folgt getesetet:
        Raspberry 3,3V zu S0- zu S0+ zu Raspberry Ground
        Die LED leuchtet dabei immer ganz leicht und bei jedem Impuls flackert sie etwas heller auf (aber nicht so hell wie wenn ich sie ohne S0 direkt auf 3,3V hänge.
        Ich hoffe das passt soweit.

        Das script funktioniert leider nach wie vor nicht.
        Du hast ja einen Pi 1B verwendet und denn habe ich auch im Einsatz und daher konnte ich das genauso wie du machen (also PIN5 + 6 verwendet, im Skript BUTTON 9).
        Trotzdem gibt das Script keine Impulse aus. Nur wenn ich während das script läuft am Raspberry herumfummle scheint es Impulse zu erkennen.
        Ich habe jetzt auch noch die LED in Serie gehängt und sehe das gleich wie schon oben beschrieben (also wie wenn es auf 3,3V hängen würde).

        1. Wäre interessant ob du noch eine Idee dazu hast.
          Kann es vielleicht am ca. 10m langen (CAT5 LAN) Kabel hängen zwischen S0 und Raspberry?
          Und wie kommst du eigentlich auf GPIO 3 -> Pin 5 und weiter auf BUTTON 9?
          Ich kann das trotz der obigen Links nicht wirklich nachvollziehen.
          Du hast doch einen PI 1B (Revision2 – 512MB RAM) verwendet?

          Danke
          lg
          Chris

          1. Hi Chris,

            Haha, ja, wie ich von GPIO 3 auf Pin 5 auf BUTTON 9 komme weiß ich auch nicht mehr. Es ist zu lange her. ;) Aber irgendwie hatte ich es damals herausgefunden. Also viel Erfolg. :D

            Ja, ich habe einen Pi 1B. Mit dem “Revision 2” weiß ich nicht. Er hat abre 512 MB RAM.

            Was du noch testen könntest: Die S0-Schnittstelle ist ja nichts weiter als ein Schalter. Wenn du also die beiden Pins die du am Pi hast einfach mal kurzschließt (so als ob der Zähler in der S0-Schnittstelle schließt), dann müsste das Skript ebenfalls funktionieren und +1 hochzählen. Falls nicht gibt es wohl ein Problem mit dem Skript oder den Pins. Falls ja, dann *könnte* es in der Tat an dem langen Kabel liegen. Aber das kannst du ja selber herausfinden, wenn du den Pi mal direkt an den Zähler hängst. (PS: Ich verwende ein ganz simples 2-Draht Kabel, welches auch ca. 6-7 Meter lang ist, und ich habe keinerlei Probleme.)

            Sorry, mehr weiß ich auch nicht.
            Ciao,
            Johannes

        2. Keine Ahnung wieso, aber nachdem ich nochmal alles zerlegt und neu zusammengebaut habe funktioniert es jetzt (ich habe das aber vorher schon einige Male gemacht).

  43. Super Anleitung. Der restart funktioniert mit

    killall /usr/local/bin/stromzaehler :)

    Wie siehts bei dir mit Anzahl der Zeilen in der Datei aus? Mein Zahler macht 1000 Impulse/KWH. Zähler misst eine Wärmepumpe, wo schon mal 20KWH im Winter pro Tag zusammen kommen. Macht dann pro Tag 20.000 Zeilen mehr. Habe vorsichtshalber das C-Programm erweitert, dass die Datei mit dem aktuellen Zeitstempel verschoben wird. Dann einmal am Tag nen restart(!) und es sollte keine Probleme geben :)

    Morgen wird der Zähler per S0 angeklemmt. Bin gespannt ^^

    1. Hi Stefan,
      ich ÜBERschreibe den Wert ja nur. Die Datei hat also immer nur eine Zeile. ;)
      (Allerdings hatte schon jemand anderes mal darauf hingewiesen, dass es für die SD-Karte sehr schlecht ist, wenn so oft ein Wert geschrieben und gelesen wird. Evtl. müsste man das mal in eine RAM-Disk legen. Bis jetzt, bei über 2 Jahren Laufzeit, hatte ich allerdings noch keine Probleme.)

  44. Ich bin zufällig über deine Homepage gestolpert und habe ein ähnliches Projekt gebaut, jedoch nutze ich die RRD Tools zur Visualisierung.
    Mein PI bekommt 1000 Impulse von einer S0 Schnittstelle pro Kw … soweit so gut. Diese kann ich auch mit einem RRD:COUNTER Wert in RRD anzeigen … Ich habe jetzt eine Graphen Anzeigen, die eine Kurve zwischen 30 und 100 zeichnen… aber was hat das mit dem Verbrauch zu tun, so wie du es in deinen Graphen anzeigen lässt?

    1. Hi Jan,

      ich vermute, dass du rauskriegen musst, was *genau* du mit dem rrdtool zeichnest. Mein Monitoring-Server zeichnet zB “Impulse pro 5 Minuten” mit den rrdtools, bzw. speichert in den rrd Dateien das Intervall von 5 Minuten. Da ich aber 800 Impulse pro kWh bekomme habe ich noch einen Faktor von 1,25 eingebaut, damit somit alle 800 Impulse nun 1 kW angezeigt werden. In jedem Fall habe ich immer den Durchschnittswert der letzten 5 Minuten.

      Speicherst du in deine rrd Dateien vielleicht jede Minute? Dann könnte es bedeuten, dass du jeweils in der letzten Minute zwischen 30 und 100 Watt verbraucht hast, was entsprechend zwischen 1,8 und 6 kW pro Stunde wäre. Das könnte also durchaus sein, wenn beispielsweise im Peak eine Wasch-/Spülmaschine läuft. Die zieht ja gerne mal 2 kW.

      Ciao,
      Johannes

  45. Hallo Johannes,
    Toller Artikel macht mir Lust auch soetwas umzusetzen.
    wie viele dieser Zähler DSZ12E-3x80A, kann man den an den Pi anklemmen geht da nur einer pro Pi oder verfügt der Pi über mehrere Eingänge so das auch mehrere Zähnler angeschloßen werden können?

    Schöne Grüße
    Paulo

    1. Hi Paulo, also der Pi den ich gerade ans Laufen gebracht habe hat 8 freie GPIO Pins, die alle auf Interrupt geschaltet werden können, damit kann ich also bis zu 8 Zähler parallel abfragen.
      Es kann sein, dass die neueren Modelle noch mehr Pins nach außen geführt haben, sodass man noch mehr Zähler bedienen kann.
      Ich denke ich werde meinen code mal auf Github schieben, damit sich jeder daran bedienen kann.

  46. hi Johannes,

    Was lange währt wird endlich gut :D

    Habe jetzt endlich nach langer langer Zeit (siehe posts von 2016-02 :D), die ich mit anderen Projekten vollgestopft war, die Muße gefunden und meinen Pi ans laufen gebracht. In meinem Projekt sind alle 8 GPIOs für den S0 input ausgelegt. Das Ganze ist per simpler Konfigurationsdatei auf das pin-routing und die Impulszahl des jeweiligen S0 output anpassbar. Somit muss man das Projekt nur 1x compilieren und kann es danach beliebig auf den jeweiligen Pi und S0 anpassen.
    Die aktuellen Daten eines Pin werden bei jedem Impuls per UDP broadcast ins lokale Netz gesendet.
    SNMP werde ich vermutlich auch noch dazu bauen, das scheint ja anhand Deiner Anleitung auch recht simpel zu funktionieren. Dann kann ich das Ganze in cacti einbinden.

    Bei Interesse kann ich auch gern noch ein github Projekt daraus machen, mit allem was dazu gehört.
    Bisher ist zwar nur die Zähler-Seite fertig, aber ich möchte die Daten serverseitig auch noch über verschiedenen Methoden irgendwo einpflegen (rrdtool, cacti, graphana, … mal schauen).

    1. Hallo Bernd,
      bist du schon dazu gekommen?
      Hätte großes Interesse genau an deiner Lösung :)

      Grüße

        1. hupps, das war mein anderes E-Zähler Projekt :D
          sorry … das S0 Pi hab ich noch nicht offiziell auf github.
          Aber unte dem user wird es dann folgen :)

  47. Hallo,

    wäre es möglich anstelle den Counter in das file zu schreiben eine Webseite aufzurufen?
    Z.B. http://localhost/counter.php?counter=12

    Dann könnte man den Wert direkt in eine Datenbank schreiben und immer die differenz auswerten.

    Wenn ja wie würde so ein C code aussehen? Kenne mich da leider nicht aus mit c

    1. Hi Guido,
      ja, so was wäre auf jeden Fall möglich. Ich habe halt die Variante mit dem Schreiben in eine Datei zusammengefrickelt, weil das zum damaligen Zeitpunkt für mich am besten gepasst hat.
      Wie du einen HTTPS Aufruf aus C heraus machst darfst du aber selber googeln. ;)

  48. Hallo,
    mal eine andere Frage zu diesem Thema:
    Ist es möglich von einer S0-Schnittstelle die Daten mehrfach abzugreifen?
    Ganz konkret: Wir haben einen Zähler der mit dem SolarLog spricht. Kann ich die Daten auch nochmal für mein PI abgreifen?

    1. Da die S0 Schnittstelle im Grunde nur eine Art Impuls-Ausgang ist, sollte das kein Problem darstellen.
      Du solltest nur darauf achten, dass Du mit nur _einer_ zentralen Spannungsversorgung arbeitest, und die Impulse dann zB mit kleinen Transistoren auf den jeweiligen Eingang des Empfängergerätes gibtst.
      Wenn alle Geräte Spannung liefern, kann es zu unerwünschten Nebeneffekten kommen, die von “kein Gerät zählt” bis zu “Das Gerät mit der geringsten Spannung geht kaputt” reichen. :)

  49. Ich habe das ganze mal mit einem Orange Pi zero probiert, klappt super!
    danke dafür.
    Nun habe ich aber ein Problem mit snmp. Ich habe es unter “EXTENDING THE AGENT”
    eingegeben aber ohne Erfolg. Auch die Besp. aus der snmpd.conf werden mir nicht angezeigt… woran kann das liegen? alle anderen Daten kann ich Abrufen.

  50. Hallo Johannes

    vor zwei Jahren suchte ich nach einer einfachen Loesung fuer einen Datenlogger, um den Stromverbrauch aufzuzeichnen. Zu dem Zeitpunkt arbeitete ich fuer
    eine Hilfsorganisation, wir bauten die Stromversorgung in verschiedenen Projektstandorten auf und brauchten realistische Verbrauchsdaten um Generatoren und Installationen effizient zu planen.
    Als ich auf Deine Beschreibung fuer einen Stromzaehler mit S0-Schnittstelle stiess, da hatte ich das Richtige gefunden. Der Nachbau gestaltete sich erfreulich
    komplikationslos und seither habe ich den ‘Energy-Monitor’ bei allen Einsaetzen in meinem Gepaeck. Insbesondere die Aufzeichnung des Verbrauchsprofils ueber
    einen laengeren Zeitraum und die uebersichtliche graphische Darstellung hat sich als ueberaus nuetzlich erwiesen. Somit vielen Dank fuer dieses Projekt.

    Nachdem ich in unseren Projekten reichlich Nutzen aus dem Stromzaehler gezogen habe, moechte ich mal etwas Feedback geben und einige Vorschlaege fuer
    Erweiterungen machen, welche ich in der Zwischenzeit ergaenzt und ausprobiert habe. Vielleicht ist es ja fuer den einen oder anderen interessant.

    Eine erste Ergaenzung war, dass ich dem Raspi ein Gehaeuse mit Halterung fuer die DIN-Schiene spendiert habe. Damit laesst er sich in Verteilerkaesten einfach
    auf der Schiene einrasten und haengt nicht wild herum. Entsprechende Gehaeuse findet man bei RS-Components oder auch im AVC-Shop in Berlin fuer rund 10Euro.
    Ebenso beschaffte ich mir den eigentlichen Stromzaehler deutlich guenstiger ueber Ebay. Ich habe sowohl einphasige also auch dreiphasige Stromzaehler von der
    Firma ‘B+G E-Tech’ gefunden, die fuer den halben Preis einwandfrei ihren Dienst verrichten.

    Eine andere Erweiterung betrifft den Einsatz in Inselanlagen oder an Generatoren, die nicht 24h am Tag laufen. Hat der RasPi zeitweise keine Stromversorgung und
    ist er nicht am Internet angeschlossen, so ‘verliert’ er die richtige Zeit und man wundert sich ueber Diagramme, die die Hauptverbrauchszeit um Mitternacht
    anzeigen.
    Fuer die Verbrauchsaufzeichnung in Verbindung mit Generatoren habe ich dem RasPi eine kleine UPS-Platine (StromPi von Joy-IT, ca. 25Euro) aufgesteckt. Mit dieser
    Extra-Stromversorgung kann ich den RasPi aus einer regulaeren 12V-Batterie betreiben. Klemme ihn dazu direkt an die Starterbatterie des Generators und dann
    werden auch die Perioden der Unterbrechung der Stromversorgung korrekt aufgezeichnet, wobei die richtige Zeit erhalten bleibt.
    Dennoch blieb die Tatsache, dass der RasPi keine eigene RTC (Echtzeit) hat, stoerend. So habe ich ein wenig gesucht und ein RTC-Modul mit DS3231 gefunden, welches
    sich auch direkt auf die RasPi-Platine aufstecken laesst. Kostenpunkt war unter 5Euro, man findet diese Module auf Ebay oder in Raspi-Foren. Seither ‘vergisst’
    mein Stromzaehler nun endgueltig nicht mehr die korrekte Zeit.

    Andere Ergaenzungen waren etwas aufwendiger. Wie schon angedeutet, habe ich den Stromzaehler immer wieder in verschiedenste Projekte mitgenommen und jeweils
    temporaer installiert. Der RasPi stellt die Diagramme mit den Verbrauchsverlaeufen per Web-Server bereit und ich habe die Daten auf meinem Laptop abgefragt. Da
    hierfuer meist keine Netzwerkverbindung bestand, bin ich stets mit einem Netzwerkkabel herumgelaufen und musste mich dauernd an- und ab-stoepseln. Das stoerte allmaehlich.
    Somit habe ich mich nach einer drahtlosen Alternative mit Wifi umgesehen. In den verschiedenen RasPi-Foren findet man Projektbeschreibungen wie man mit einem
    kleinen Wifi-Dongle einen Access-point einrichten kann. Also, einen (Access-point geeigneten) Wifi-Dongle gekauft und ein eigenes Wifi-Netzwerk eingerichtet.
    Die Konfiguration, insbesondere der hostapd.conf, kann etwas muehsam sein, aber am Ende hat es geklappt. Seither stelle ich mich mit dem Laptop nur noch in die
    Naehe des Stromzaehlers, verbinde mich ueber Wifi und bekomme meine Verbrauchsdiagramme. Hat sich als sehr angenehm und nuetzlich erwiesen, insbesondere wenn man die Datenabfrage an weniger-qualifizierte Kollegen uebertragen will, die nicht unbedingt die elektrischen Betriebsraeume betreten sollen.

    Einen Schritt weiter bin ich mit der Ergaenzung des Stromzaehler durch Installation des Softwarepackage ‘ssmtp’ gegangen. Ssmtp ist ein simpler Mail-Agent,
    der es erlaubt automatisch EMails an eine vordefinierte Adresse zu verschicken. Vorausgesetzt man hat eine Internetverbindung verfuegbar, so lassen sich damit
    verschiedene Aufgaben automatisieren.
    So laesst sich konfigurieren, dass der RasPi einmal pro Tag den Gesamtverbrauch eines Standortes per Mail an mich schickt. Einfacher und guenstiger kann man
    ein Remote-Monitoring kaum realisieren. Eine andere Option ist es, Alarmzustaende zu definieren und bei Ueberschreiten von Maximalleistung oder Stromunterbrechung sich eine Mail mit einer Warnung schicken zu lassen. Dies plane ich demnaechst zur Ueberwachung meiner Solaranlage zu installieren.

    Well, das sind soweit eine Reihe von Erweiterungen, die ich mit dem urspruenglichen Stromzaehler bereits erprobt habe. Vielleicht erweist sich manches davon auch fuer andere als nuetzlich.
    Eine letzte Idee, an der ich noch arbeite, ist, den Stromzaehler mit S0-Schnittstelle durch ein leistungsfaehigeres Geraet zu ersetzen. Der ‘Verbrauchsmesser und Leistungsanalysator EM24’ von Carlo Gavazzi (oder ESKAP GmbH) erfasst neben Leistung und Gesamtverbrauch auch alle einzelnen Spannungen, Stroeme und Leistungen separat fuer jede Phase und liefert optional jede Menge weiterer Daten. Damit geht er weit ueber eine reine Verbrauchsmessung hinaus.
    Kommunikation findet ueber ModBus-Protokoll statt, die Zweidrahtleitung fuer die S0-Schnittstelle wird also durch ein RS485-Interface ersetzt. Und das kleine C-Programm ‘stromzaehler.c’ ist durch ein aehnliches Prograemmchen zur direkten Abfrage von Leistung oder kWh per ModBus zu ersetzen. Bei Bedarf kann ich so ein Programmbeispiel zur Verfuegung stellen.

    So, das soll’s jetzt aber gewesen sein. Nochmals vielen Dank fuer die urspruengliche Projektidee,
    Gruesse Ingo

    1. Wow, danke dir für die vielen Infos. Klingt allesamt sehr interessant.

      Mit einer RTC für den Pi experimentiere ich aktuell übrigens auch. Allerdings mehr im Zusammenhang mit dem Nutzen als NTP Server, wo die exakte Uhrzeit ja noch wichtiger ist.

      Freut mich, dass dir der Blog einen guten Startschuss gegeben hat. ;)

      1. Hallo Johannes,

        ich habe mehrere Varianten von RTC-Modulen probiert. Am Ende funktionierte die simpelste Variante am besten. Schau mal auf folgenden Link:
        https://www.raspberrypi.org/forums/viewtopic.php?t=161133
        Da gibt es am Ende auch ein Foto von dem Modul. Kann einfach auf die zweireihige Steckleiste aufgesteckt werden, Reihenfolge der Pins passt fuer RasPi-Platine.
        Einzige notwendige Aenderung am Stromzaehler war, dass man den Zaehlereingang umlegen muss, um den I2C-Bus fuer den RTC freizubekommen.
        Gruesse
        Ingo

    2. hi Ingo, zum Thema Verbrauchs- und Leistungs-Analysator, schau Dir mal den SDM630 an, das ist ein 3-Phasiger Zähler, der auch alle Spannungen und Ströme sowie Blind und Scheinleistung über ModBus ausgibt. Er zeigt auch die Energie-Flussrichtung an (interessant für temporär einspeisende Anlagen).

      Ich habe den Zähler bei mir im Einsatz und bin begeistert. Dazu gibt es auch Projekte zum Auslesen des Gerätes, meines (mit RRDtool) findest Du unter: https://github.com/bernisys/sdm630

      1. Hallo Bernd,

        danke fuer den Hinweis mit dem SDM360. Sieht gut aus, Funktionalitaet ist aehnlich dem EM24, den ich derzeit verwende. Allerdings scheint der SDM360 guenstiger zu sein.
        Was mir bei dem Modbus-Zaehler wichtig war: dass ich aehnlich dem originalen Projekt mit einem kleinen, kaum mehr als 20 Zeilen langen C-Programm auskomme um die Daten auszulesen.

        Ingo

  51. Hallo Johannes
    Ich würde sehr gern meine Stromzähler auslesen, habe aber wenig PC Kenntnisse !
    Ist es möglich, alles zusammenzubauen mir zu schicken und ich baue die programmierten Teile ein.
    Welche Möglichkeiten gibt es für solche wie mich
    Gruß Karl

    1. Hallo Karl-Josef,

      ich verstehe dein Anliegen, kann dir konkret aber nicht weiterhelfen. Meine Lösung ist wirklich eine Bastellösung. Du würdest damit längerfristig nicht glücklich werden, weil man immer noch mal irgendwo nacharbeiten muss.

      Hast du mal bei http://volkszaehler.org/ geschaut? Vielleicht haben die einfachere Möglichkeiten?

      Falls es nur um das Auslesen einzelner Steckdosen geht könntest du dir mal die Powerline 546E von AVM (Hersteller der FRITZ!Box Router) angucken. Dort kannst du über eine HTTPS Seite den Stromverbrauch als Grafik dir anzeigen lassen. Das lässt sich zwar nicht irgendwo anders einbinden, gibt aber sehr einfach die Werte aus.

      Ähnliche Steckdosen mit Strommessfunktionen dürfte es auch sonst am Markt geben.

      Sorry,
      Johannes

  52. Hallo Johannes,

    besteht die Möglichkeit, das der Impuls einfach weiter gegeben wird? Ich habe ioBroker für mein Haus im Einsatz. Mir würde es reichen, wenn der pi3 den “Zählwert” einfach an ioBroker weiter gibt.

    Geht das?

    Grüße
    Manfred

    1. Hallo Manfred.

      Mir sagt ioBroker leider gar nichts. Wie betreibst du das denn? Auf welchem Gerät läuft das? Kannst du die S0-Schnitstelle nicht direkt daran anflanshen? Wenn nein, wie willst du den Impuls denn weitergeben? Netzwerktechnisch? Also über ein Netzwerkprotokoll wie SNMP oder änlich?

      Vermutlich kannst du deine Frage in einem ioBroker Forum besser platzieren. Sorry. ;(

      Johannes

    2. Hi Manfred,

      hast du eine Lösung gefunden? Ich hab folgende Situation:

      4 Stromzwischenzähler (UG, EG, OG, DG) mit S0-Ausgang und zähle mit einem Raspberry Pi die Impulse via GPIO. Bisher war es so, dass MRTG die Werte per SNMP ausgelesen und weiterverarbeitet hat. Alle 5 Minuten wurde dann das Delta zwischen den Counts grafisch in Watt darstellt hat. Das soll nun im IoBroker passieren, am Besten aktuell.

      Per SNMP-Adapter bekomme ich die aktuellen Counts für die Zähler schon mal vom RPi angezeigt. Je nach Verbrauch (100 Impulse 1kWh) zählt der Counter immer +1. Mit diesen hochgezählten Werten müsste ich nun weiter rechnen.
      Jemand eine Idee, was ich nun damit anstellen könnte? Nach meinem Verständnis bräuchte ich nun ein Skript, welches von den Counts weiterrechnet (also alle 100 = 1kwh) und mir die Watt aktuell ausgibt. Oder?

      Hast du da was hinbekommen? Wenn ja, wie?

    3. Hi Johannes,

      hast du da eine Lösung gefunden? Wenn ja, wie sieht diese aus?

      Gruß und Danke!

  53. Hallo Johannes,

    Ich bin ein verdammter Linux-Neuling und möchte aber für meinen Vater diesen Stromzähler Nachbauen. Ich bin was Technik angeht nicht blöd, aber auf Linux-Ebene halt sehr unerfahren. Wir haben auch ein RasPi Model B und ein Stromzähler mit 1000 Ticks (was den Faktor von 1.25, den du benutzt hast auf 1 setzt). Deine Anleitung ist sehr gut nur habe ich das Problem, dass ich ziemlich am Anfang schon aus dem Konzept gebracht werde (eben wegen der fehlenden Kenntnisse).
    Es geht an der Stelle los, wo ich WiringPi über Git geklont habe, das ging noch. Dann nehme ich die ISR.C von deinem Link und setze dort den PIN auf “9” und ändere den main-Part so um wie du und benenne die Datei um. Aber wo speichere ich Datei ab? Dann geht es weiter mit den Log-Dateien. Gut der Ordner ist erstellt und dann?
    Als nächstes habe ich versucht mit gcc zu compiliren, aber das hat nicht funktioniert….Muss ich noch irgendwie das Wiring pi einbinden?
    Weiter bin ich durch die Hürden, die ich noch habe, leider nicht gekommen. Ich hoffe du kannst mir da klarheit geben.

    MfG

    Sebastian

    1. Hey Sebastian,

      puh, ich kann dir leider nicht detaillierter helfen. Dazu musst du dich selber mal durchgoogeln oder irgendwelche Einführungs-Blogposts oder so bzgl. Linux suchen.

      Meine Installationsanleitung ist nun auch schon ein paar Jahre alt und potentiell veraltet. Es kann gut sein, dass die ein oder andere Linux Version/Skript/Tool mitlerweile andere Optionen hat. Auch ist meine Herangehensweise mit MRTG/Routers2/RRDtool nicht gerade mehr state-of-the-art. Also evtl. müsstest du dich mal umgucken, ob es nicht einfachere Möglichkeiten gibt, einen Stromzähler auszuwerten.

      Sorry. ;(
      Johannes

      1. ok, aber eine frage habe ich noch … warum zeigt mir der compiler folgende fehlermeldung an:
        osboxes@osboxes:~/WiringPi/wiringPi$ gcc -lwiringPi -o stromzaehler stromzaehler.c
        /tmp/ccb8SEyP.o: In Funktion main':
        stromzaehler.c:(.text+0x26): Nicht definierter Verweis auf
        wiringPiSetup’
        stromzaehler.c:(.text+0x72): Nicht definierter Verweis auf wiringPiISR'
        stromzaehler.c:(.text+0xb3): Nicht definierter Verweis auf
        delay’
        collect2: error: ld returned 1 exit status
        osboxes@osboxes:

        Ich muss dazu sagen, dass ich das gerade auf einer Ubuntuversion in einer VM teste (vllt ist das ja das Problem).

        MfG

        Sebastian

        1. Ich weiß es wirklich nicht. Bin leider auch kein Compiler Profi noch Programmierer. ;( Dass die Verweise fehlen besagt ja schon die Fehlermeldung. Warum das der Fall ist, weiß ich in deinem konkreten Fall auch nicht. Sorry.

          1. Hallo johannes,

            Ich bin es nochmal. Also ich bin dann irgendwie durch google und co weiterr gekommen:). Ich bin sogar relativ am Ende und es hängt jetzt daran, dass der Routers2 die ganzen bilddateien nicht findet obwohl ich den pfad in der routers.conf angegeben habe. Wollte nur mal wissen welche Pfade du benutzt und ob ich irgendwas falsch gemacht habe.

            Meine RRDICONS sind angegen mit der URL: /rrdicons/ und meine graphs mit: /var/www/graphs.

            Ich bin langsam am ende mit meinem Latein.

            1. Hey Sebastian.
              Liegt es wirklich nur an den Icons? Ich habe in der routers2.conf Datei ebenfalls den Pfad auf “/rrdicons/”, welcher im Endeffekt bei mir in /var/www/rrdicons/ liegt. (Weil ich es so eingerichtet habe, dass mein Root Verzeichnis für den Apache Webserver unter /var/www/ liegt. Daher der relative Pfad zu “/rrdicons/”. Das wird glaube ich irgendwo in meiner Anleitung zu Routers/MRTG beschrieben: https://weberblog.net/mrtg-with-rrdtool-and-routers2-installation-from-scratch/ )

              Funktioniert denn dein Stromzähler Skript? Und SNMP? Und erstellt MRTG bereits die rrd Dateien?

              By the way: Der Ersteller von routers2.cgi hat ein eigenes Forum. Dort ist zwar faktisch nichts mehr los (weil heute keiner mehr routers2.cgi verwenden sollte), aber dennoch könntest du da auch dein Glück probieren: http://www.steveshipway.org/forum/ .

              1. ok ich bin gerade nochmal alles durchgegangen und habe festgestellt, dass in meiner mrtg.cfg nur folgendes drin steht:
                #Directory in which the RRD files will be stored
                WorkDir: /var/mrtg
                #Tells MRTG to use RRD instead of its own log format
                LogFormat: rrdtool
                #To have multiple instances of MRTG running to immediately pass through all targets
                Forks: 4
                #Use the configs in the mrtg subfolder (/etc/mrtg)
                Include: mrtg/*.cfg

                Ist das nicht ein bisschen Wenig? Was steht bei dir in der MrtG.cfg?

                1. Ja, in der mrtg.conf steht nicht viel mehr drin. Das könnte schon passen.

                  Die ganzen Details für die Weboberfläche von routers2.cgi ist in der Konfigdatein von ebem diesem routers2.cgi Teil. Bei mir liegt die in “/var/mrtg/routers2.conf”. Das musste man bei dem Installationsskript von routers2 angeben. (Siehe mein Tutorial.)

  54. Ja ich bin über Steve schon gegangen . Ich könnte höchstens mal schauen ob mein Root Verzeichnis von Apache auch liegt. Mein Zähler funktioniert und ich kann die Änderungen auch im mib Browser sehen …. ich kann dir später auch nochmal meine snmpd conf schicken, aber alle icons sind nicht zu sehen bei http://meineip/cgi-bin/routers2.cgi. Auch nicht die roten Banner, die in den Ecken auf der Seite sein sollten

  55. Moin Johannes,

    vielen Dank für die super Anleitung. Ich bin zwar in Linux und C ein totaler Anfänger, es hat trotzdem alles auf Anhieb geklappt. Da ich die Datenaufzeichnung allerdings minütlich haben wollte, habe ich auf das C Programm von Langhaarschneider (https://langhaarschneider.net/2015/04/16/stromzaehler-per-s0-schnittstelle-mit-raspberrypi-auslesen/) zurückgegriffen.

    Zu bereits vorher gestellten Fragen und Kommentaren möchte ich noch über meine Erfahrungen berichten:

    Ich hatte bereits vor diesem Projekt 2 Zähler mit S0-Schnittstelle eingebaut. Es sind zwar beides Zweirichtungszähler mit einer Impulsdauer von 30 ms und 1000 Impulsen pro kWh, aber ich werte jeweils nur eine Richtung aus. Der erste Zähler erfasst die erzeugten kWh aus meiner Photovoltaikanlage, der zweite Zähler die eingespeisten kWh ins öffentliche Netz.

    Ich habe dafür die GPIO2 + 4 benutzt, weil ich den GPIO3 wegen meines shutdown-Tasters nicht benutzen wollte. Das C Programm von Langhaarschneider habe ich für die geänderten GPIO entsprechend angepasst.

    Vom RaspberryPi bis zu den Zählern habe ich ein Cat5-Kabel (ca 15m) sowie ein abgeschirmtes Telefonkabel (ca 20m). Das ganze betreibe ich mit den 3,3V vom RaspberryPi und habe sogar noch einen 100 Ohm Widerstand in die Leitung geschaltet.

    Falls also Probleme mit den Impulsen bestehen, liegt es mit grösster Wahrscheinlichkeit nicht an der Kabellänge, sondern eher an einer Vertauschung von S0+ und S0-. Ungeschirmte Leitungen sollten allerdings auch nicht neben Stromkabeln verlegt werden.

    Ich hoffe, dass ich mit diesen Hinweisen eine mögliche Fehlersuche erleichtern kann.

    1. Servus Tsunami,

      Wäre es möglich, dass du irgendwie eine Anleitung dazu machst, weil es bei mir nict so gut funktioniert hat und ich auch nicht herausfinden kann wo der fehler ist.

      MfG

      Sebastian

  56. Moin Sebastian,

    die Anleitungen sind hier bzw. bei langhaarschneider komplett vorhanden, sowohl Hardware als auch Software. Mit der Aussage, dass es irgendwie nicht so gut funktioniert, lässt sich leider kein Fehler eingrenzen.
    Du solltest zumindest mitteilen, was du bisher gemacht hast und bis zu welchem Ergebnis du gekommen bist.

    1. ja das steht ja schon weiter oben in den Kommentaren. :)

      Also wie gesagt der erste fehler war dass ich beim aufrufen der routers2.cgi in browser einen internal server error hatte und dann später als das weg war hatte ich keine graphen, obwohl die pfade korrekt angegeben waren.

      Was für mich gerade wichtig ist: Welche Programme bzw Pakete muss man haben, weil die Pakete, die in den Weiterführenden Anleitungen zu Mrtg und Routers2.cgi aufgeführt sind, scheinen nicht alle zu sein.

      Ich hoffe echt dass du mir helfen kannst. :)

      MfG

      Sebastian

      P.S.: Ich bin hardcore Linux anfänger muss ich dazu sagen

  57. Moin Sebastian,

    leider kann ich dir nicht weiter helfen.
    Wie ich bereits in meinem ersten Beitrag schrieb, habe ich die Variante von langhaarschneider benutzt. Dort werden die Werte minütlich in einer Datei gespeichert.
    Ich habe somit keine grafische Auswertung und als Linux-Anfänger auch keine Erfahrung damit.

    Ich wünsche dir aber weiterhin Erfolg.

  58. Habt ihr eigentlich schon mal die Werte zwischen Zählerdisplay und Raspberry-Auswertung kontrolliert?
    Bei mir kommt da leider was anderes raus.
    z.B. über einen Zeitraum von 3 Tagen laut Display des Zählers 55kWh. Laut Auswertung vom Raspberry 56kWh also ca. 1kWh mehr.

    An was kann das liegen?

  59. Hallo Johannes,

    ich versuch einfach mal mein Glück, und wenn du nur nen Hinweis hast dann bin ich schon froh.

    Ich bin Sascha, Netzwerker und beschäftige mich immer mehr mit Raspi’s.
    Derzeit baue ich an meiner Guerilla Solar Anlage, und da habe ich einen Stromzähler verbaut damit ich auch weiß was die Anlage leistet.

    Dabei bin ich auf deine Anleitung gestoßen.
    Mein Programm zählt auch schon brav die Impulse.
    pi@jumpi:~/HID-TEMPerHUM $ tail /media/32gb_stick/stromzaehler/stromzaehler
    2568

    Aber nun komm ich nicht weiter. Du verwaist auf das Temperatur Sensor Projekt und da stocke ich dann wieder.
    Ich kann zwar ganz tolle komplexe Netzwerke bauen aber programmieren ist so gar nicht meins.

    Das ist der Part den ich nicht auf den Stromzähler gemünzt bekomme:
    after a download of the HID-TEMPerHUM driver ( git clone https://github.com/jeixav/HID-TEMPerHUM ) and a cd into the directory ( cd HID-TEMPerHUM/ ) it must be built with make , made executable with sudo chmod u+xtemper and should be moved to the following folder: sudo mv temper/usr/local/bin/. The driver needs root privileges. An example call looks like that:
    1
    2 pi@jw-pi01 ~ $ sudo temper
    8.50 67.45
    The first value is the temperature while the second one is the humidity.
    Two improvements of this procedure are: Change the ownership of the program with sudo chown root /usr/local/bin/temper and set the setuid bit so that every user can run this executable with the rights of the owner: sudo chmod +s/usr/local/bin/temper

    Kannst du mir den Inahlt deines Stromzähler Scripts zeigen ?

    Konfigurationsdatei auf dem Pi öffnen: sudo nano /etc/snmp/snmpd.conf und unter “EXTENDING THE AGENT” folgende Zeile hinzufügen:
    1 extend-sh stromcounter cat /var/strom/stromcounter
    Denke den Rest bekomme ich dann wieder hin auch wenn ich wahrscheinlich nen PRTG als Monitoring nutzen werde.

    Vielen Dank und viele Grüße
    Sascha

    1. Hey Sascha,

      ja, das mit dem setuid bit verwirrt an der Stelle. Das brauchst du für den Stromzähler auch gar nicht! (Der Hintergrund ist der, dass man für das Temperatur-Programm “sudo” Rechte braucht, die aber der SNMP daemon nicht hat. Dafür bedient man sich dieses setuid bit. Für das “cat /var/strom/stromcounter” reichen aber einfache Rechte. Jedenfalls vermute ich das. Ich habe mein System aktuell nicht am laufen.)

      Hast du den snmpd schon installiert? Läuft der? Bekommst du von PRTG die Interface Stats und so rein? Wenn ja, dann müsstest du in der snmpd.conf Datei wie beschrieben dieses extend-Zeugs einbinden.
      extend-sh stromcounter cat /var/strom/stromcounter

      Und den snmpd neustarten. Dann müsstest du per SNMP ein paar neue OIDs haben, die dann das “cat /var/strom/stromcounter” ausführen und die Werte übermitteln.

      Hm, hilft dir das weiter?

      Good luck ;)

      Johannes

      1. Hey Johannes,
        snmp läuft so weit gut mit dem PRTG, ich bekomme 67 Sensoren angezeigt.
        Aber der Stromzaehler ist leider nicht dabei. Auch nach mehreren Versuchen.

        Wenn ich das Programm so aufrufe, funkioniert es:
        pi@jumpi:~ $ stromzaehler cat /media/32gb_stick/stromzaehler/stromzaehler
        Waiting … Done. counter: 1
        Waiting …

        In der snmpd.conf steht es so drin:
        extend-sh stromzaehler cat /media/32gb_stick/stromzaehler/stromzaehler

        Und das bekomme ich bei einem SNMPWalk raus:
        pi@jumpi:~ $ snmpwalk -v1 -c xxx -On localhost .1.3.6.1.2.1.1
        .1.3.6.1.2.1.1.1.0 = STRING: “Linux jumpi 4.14.30-v7+ #1102 SMP Mon Mar 26 16:45:49 BST 2018 armv7l”
        .1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.8072.3.2.10
        .1.3.6.1.2.1.1.3.0 = Timeticks: (2141431) 5:56:54.31
        .1.3.6.1.2.1.1.4.0 = STRING: “Me ”
        .1.3.6.1.2.1.1.5.0 = STRING: “jumpi”
        .1.3.6.1.2.1.1.6.0 = STRING: “XXX Keller”
        .1.3.6.1.2.1.1.7.0 = INTEGER: 72
        .1.3.6.1.2.1.1.8.0 = Timeticks: (1) 0:00:00.01
        .1.3.6.1.2.1.1.9.1.2.1 = OID: .1.3.6.1.6.3.11.3.1.1
        .1.3.6.1.2.1.1.9.1.2.2 = OID: .1.3.6.1.6.3.15.2.1.1
        .1.3.6.1.2.1.1.9.1.2.3 = OID: .1.3.6.1.6.3.10.3.1.1
        .1.3.6.1.2.1.1.9.1.2.4 = OID: .1.3.6.1.6.3.1
        .1.3.6.1.2.1.1.9.1.2.5 = OID: .1.3.6.1.6.3.16.2.2.1
        .1.3.6.1.2.1.1.9.1.2.6 = OID: .1.3.6.1.2.1.49
        .1.3.6.1.2.1.1.9.1.2.7 = OID: .1.3.6.1.2.1.4
        .1.3.6.1.2.1.1.9.1.2.8 = OID: .1.3.6.1.2.1.50
        .1.3.6.1.2.1.1.9.1.2.9 = OID: .1.3.6.1.6.3.13.3.1.3
        .1.3.6.1.2.1.1.9.1.2.10 = OID: .1.3.6.1.2.1.92
        .1.3.6.1.2.1.1.9.1.3.1 = STRING: “The MIB for Message Processing and Dispatching.”
        .1.3.6.1.2.1.1.9.1.3.2 = STRING: “The management information definitions for the SNMP User-based Security Model.”
        .1.3.6.1.2.1.1.9.1.3.3 = STRING: “The SNMP Management Architecture MIB.”
        .1.3.6.1.2.1.1.9.1.3.4 = STRING: “The MIB module for SNMPv2 entities”
        .1.3.6.1.2.1.1.9.1.3.5 = STRING: “View-based Access Control Model for SNMP.”
        .1.3.6.1.2.1.1.9.1.3.6 = STRING: “The MIB module for managing TCP implementations”
        .1.3.6.1.2.1.1.9.1.3.7 = STRING: “The MIB module for managing IP and ICMP implementations”
        .1.3.6.1.2.1.1.9.1.3.8 = STRING: “The MIB module for managing UDP implementations”
        .1.3.6.1.2.1.1.9.1.3.9 = STRING: “The MIB modules for managing SNMP Notification, plus filtering.”
        .1.3.6.1.2.1.1.9.1.3.10 = STRING: “The MIB module for logging SNMP Notifications.”
        .1.3.6.1.2.1.1.9.1.4.1 = Timeticks: (0) 0:00:00.00
        .1.3.6.1.2.1.1.9.1.4.2 = Timeticks: (0) 0:00:00.00
        .1.3.6.1.2.1.1.9.1.4.3 = Timeticks: (0) 0:00:00.00
        .1.3.6.1.2.1.1.9.1.4.4 = Timeticks: (0) 0:00:00.00
        .1.3.6.1.2.1.1.9.1.4.5 = Timeticks: (0) 0:00:00.00
        .1.3.6.1.2.1.1.9.1.4.6 = Timeticks: (1) 0:00:00.01
        .1.3.6.1.2.1.1.9.1.4.7 = Timeticks: (1) 0:00:00.01
        .1.3.6.1.2.1.1.9.1.4.8 = Timeticks: (1) 0:00:00.01
        .1.3.6.1.2.1.1.9.1.4.9 = Timeticks: (1) 0:00:00.01
        .1.3.6.1.2.1.1.9.1.4.10 = Timeticks: (1) 0:00:00.01

        Wie finde ich jetzt den Sensor den ich suche??
        Vielen Dank für deine Hilfe.
        Sascha

        1. Ja, das ist in der Tat nicht ganz offensichtlich. PRTG wird ihn vermutlich gar nicht automatisch finden, weil es ebenfalls nicht weiß, dass es danach suchen soll.

          Diese extend-sh Erweiterungen liegen viel tiefer im snmpwalk als das von dir gepostete. Meiner lag ja bei 1.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.99.111.117.110.116.101.114.1. Du kannst zB folgendes tun: Schreib dir mal auf, wie ungefähr der Zählerstand ist, und dann geh per snmpwalk und grep den ganzen SNMP Baum durch und suche danach. Zum Beispiel so:
          snmpwalk -v 2c -c THISISTHEKEY 192.168.178.10 .1.3.6 | grep UNGEFÄHRER-ZÄHLERSTAND

          Dann müsstest du die OID herausfinden können. Bitte beachte, dass du im snmpd.conf noch eingestellt haben musst, dass du den kompletten Baum überhaupt abfragen darfst. Schlagwörter sind agentAddress und rocommunity. Details kannst du hier nachlesen: https://weberblog.net/mrtgrouters2-adding-a-linux-host/

          Viel Erfolg!

          1. Hey,
            hab auch nen bisschen gegoogled aber erst später.
            Folgende Strings habe ich gefunden:
            pi@jumpi:~ $ snmpwalk -v2c -c public 127.0.0.1 .1.3.6.1.4.1.8072

            iso.3.6.1.4.1.8072.1.3.2.2.1.3.12.115.116.114.111.109.122.97.101.104.108.101.114 = STRING: “/media/32gb_stick/stromzaehler/stromzaehler”
            iso.3.6.1.4.1.8072.1.3.2.2.1.4.12.115.116.114.111.109.122.97.101.104.108.101.114 = “”
            iso.3.6.1.4.1.8072.1.3.2.2.1.5.12.115.116.114.111.109.122.97.101.104.108.101.114 = INTEGER: 5
            iso.3.6.1.4.1.8072.1.3.2.2.1.6.12.115.116.114.111.109.122.97.101.104.108.101.114 = INTEGER: 2
            iso.3.6.1.4.1.8072.1.3.2.2.1.7.12.115.116.114.111.109.122.97.101.104.108.101.114 = INTEGER: 1
            iso.3.6.1.4.1.8072.1.3.2.2.1.20.12.115.116.114.111.109.122.97.101.104.108.101.114 = INTEGER: 4
            iso.3.6.1.4.1.8072.1.3.2.2.1.21.12.115.116.114.111.109.122.97.101.104.108.101.114 = INTEGER: 1
            iso.3.6.1.4.1.8072.1.3.2.3.1.1.12.115.116.114.111.109.122.97.101.104.108.101.114 = STRING: “3851”
            iso.3.6.1.4.1.8072.1.3.2.3.1.2.12.115.116.114.111.109.122.97.101.104.108.101.114 = STRING: “3851”
            iso.3.6.1.4.1.8072.1.3.2.3.1.3.12.115.116.114.111.109.122.97.101.104.108.101.114 = INTEGER: 1
            iso.3.6.1.4.1.8072.1.3.2.3.1.4.12.115.116.114.111.109.122.97.101.104.108.101.114 = INTEGER: 0
            iso.3.6.1.4.1.8072.1.3.2.4.1.2.12.115.116.114.111.109.122.97.101.104.108.101.114.1 = STRING: “3851”

            Also ausgeben macht er schon mal.
            Jetzt noch das ganze ins PRTG fummeln. Dazu werde ich morgen mal meinen PRTG Fachmann interviewen.

            Gruß
            Sascha

          2. Eigentlich hatte ich gestern noch mal geantwortet. Ist aber irgendwie weg.
            Mein Prtg Experte hat es hinbekommen.
            Ich kann nun die Werte hochzählen.
            Muss noch testen was passiert wenn die “Datei” wieder bei Null startet aber ich bin erstmal zufrieden.

            Vielen Dank soweit.
            Gruß
            Sascha

  60. Hi, tolles Projekt!

    Ich bin grad ebenfalls dran, dies umzusetzen. Frage noch: Kann der Code einfach erweitert werden, damit ich noch 2 weitere S0 Schnittstellen auswerten kann? Mir geht es primär um die Erfassung der Impulse.

    Liebe Grüsse
    Martin

    1. Hey Martin. Die Frage wurde hier glaube ich schon mal irgendwo gestellt. Du solltest einfach irgendwelche anderen I/O Ports zusätzlich für S0 verwenden können. Musst halt nur entsprechend den Code erweitern, wie du ja schon selber gesagt hast.

      Viel Erfolg!
      Johannes

    2. Hi, hast du deine Zähler erweitert bekommen und wenn ja welche PINs, etc. hast du genutzt?!

  61. Hi,

    super Anleitung! Habe in den vergangenen Tagen deiner Anleitung folgend einen Zähler eingebunden.
    Ich erhalte mit dem gezeigtem Skript jedoch nur ganzzahlige Werte, bedeutet natürlich, dass der Zähler, wenn er mit 0,7 kWh anzeigt per S0 nur 1 kWh ausgibt. Mir fehlen also die Nachkommastellen.

    Hat das schon jemand von euch lösen können?

    Grüße und Danke
    Daniel

    1. Hey Daniel,

      evtl. liegt hier ein Denkfehler vor. Das Skript von oben schreibt ja die Impulse der S0-Schnittstelle weg. Bei meinem Zähler waren es 800 Impulse/kWh. Diese Impulse sind natürlich ganzzahlig und ohne Nachkommastelle. ;) Das ist das, was in diese Datei “stromcounter” geschrieben wird.

      Die Umrechnung in kWh erfolgt bei mir dann erst in MRTG. Dort gibt es diese Zeile “Factor[strom-fdorf]: 1.25”, welche von den 800 Impulse/kWh dann erst in kWh umrechnet. Dort kommen dann auch die Nachkommastellen her. Da ein Impuls rechnerisch 1,25 Wh bzw. 0,00125 kWh entspricht, gibt es hinreichend viele Nachkommastellen bei kWh.

      Hilft das?
      Ciao
      Johannes

      1. Hi Johannes,

        das erklärt auf jeden Fall die Ganzzahlen.
        Mein Zähler macht nur 100 Imp/kWh – was wäre der Umrechnungsfaktor?

        Grüße,
        Daniel

  62. Hi Johannes,

    wie genau bekommst du die Config für routers2 hin? Mir ist unklar, wie die Eintragung für die Zähler-spezifische in MRTG/routers2 kommt.
    Durch den cfgmaker bekomme ich die OID von dem Zähler nicht mit rein.

    Grüße,
    Daniel

    1. Korrekt, das ist in meinem Post etwas versteckt: “#OID per snmpwalk herausgefunden”. Sprich: Du musst alle OIDs per snmpwalk abfragen und nach dem richtigen suchen. In den OIDs davor (oder danach?) ist auch der Pfad dieses EXTENDED Skripts geliefert. Daran kann man sich orientieren. Oder du merkst dir halt den aktuellen Wert des stromcounters und suchst danach. Also so nach dem Motto: “snmpwalk … | grep 1173”.

      1. Ja, der Teil war an Hand deiner Anleitung nachvollziehbar und praktikabel. Was mir fehlt ist die Stelle, wie du die OID in die routers2.cgi bekommst. Du zeigst zwar ein Configfile (Absatz “Einbinden in MRTG”) aber wenn ich den Teil mit meiner OID in der routers2.cgi einfüge, sehe ich auf der Website vom routers2 davon nichts.
        Versucht habe ich es mit:
        cfgmaker –output=/etc/mrtg/home-pi-2.cfg .1.3.6.1.4.1.8072.1.3.2.3.1.1.12.115.116.114.111.109.99.111.117.110.116.101.114:public@raspberry

        Kannst du mir nochmal Starthilfe geben?

  63. Appendix:
    Ich sehe dann auf meiner routers-Seite nur die Interfaces aber keinen Stromzähler

    1. Ah okay. Du musst in dem Verzeichnis, in dem die ganzen *.cfg Dateien von MRTG sind, also beispielsweise /etc/mrtg/, eine weitere Datei anlegen, zB “strom.cfg”. Dort kopierst du dann meinen Code-Schnipsel aus dem Part “Einbinden in MRTG” rein. Dann wird dir in routers2.cgi ein neues Gerät angezeigt, welches dann diesen Stromzähler enthält.

  64. Das ist so betrachtet ein Riesenfortschritt, nur fehlen die rrds…
    Error reading RRD database /var/mrtg/strom.rrd
    opening ‘/var/mrtg/strom.rrd’: No such file or directory
    Check that MRTG has run successfully on this device, and has created the RRD file.

    Danke für die bisherige Hilfe aber hast du dazu auch noch einen Tip? Bin von der Config her nach der Anleitung vorgegangen.

      1. Hi Johannes, keine Chance. Die Berechtigungen sind wie in deinem Post. Habe es mal zum Test auf 777 geändert, was aber auch nichts verändert hat. In der /etc/mrtg.cfg steht WorkDir: /var/mrtg drin.

  65. Hallo Johannes,

    läuft jetzt. Ich habs vermutlich überlesen aber nach Installation von:

    apt install libcgi-pm-perl

    werden mir die Graphen erstellt bzw. angezeigt.

    Grüße und Dank,
    Daniel

  66. Hallo Johannes,

    hast du das Setup noch immer im Einsatz? Läuft das noch problemlos?

    Ich habe den gleichen Stromzähler und das Ganze mal per NodeMCU und ESP Easy probiert. Da bekomme ich allerdings keine vernünftigen Daten raus, egal was ich einstelle. Ich fand den Ansatz halt smart , da ich die Daten per mqtt gleich an das Ziel-System (ioBroker) schicken kann.

    Hast du einen ESP auch schon mal getestet?

    Gruß
    Chris

    1. Hey Chris. Mir sagen seine Tools leider alle nichts. Aber danke für die Hinweise. Ich werde sie mir mal angucken.
      Mein Setup lief mehrere Jahre konstant und ohne Probleme. Auf Grund eines Umzugs ist es derzeit noch “on hold”. Mein Plan ist aber, es mehr oder weniger genau so wieder in Betrieb zu nehmen. Zumindest der Zähler ist schon mal in der Unterverteilung eingebaut. ;)

  67. Hallo Johnannes,

    danke für die Anregungen hier. Ich habe das Projekt nachgebaut, um meine selbst erzeugte Solarenergie ein wenig im Überblick zu haben. Am Ende erhalte ich ein per Gnuplot erzeugtes Flächendiagramm, welches die erzeugte PV-Leistung im Tagesverlauf ausgibt. Als absoluter C- und Gnuplot-Laie hat mich das einige Stunden Arbeit und ein paar graue Haare mehr gekostet :-) .

    Beste Grüße
    Heiko

  68. Hallo zusammen,

    erstmal danke für die tolle Anleitung, auch wenn ich lange gebraucht habe…. ES KLAPPT endlich! :-) Ich habe einen Zwischenzähler an den Raspberry Pi 4 gekoppelt (PIN 5 + 6) und per SMTP frägt mrtg nun die Werte korrekt ab und stellt sie dar.

    Nun habe ich noch 3 weitere Zwischenzähler. Ground-Pins hätte ich noch genug auf dem Rpi4, wobei ich die sicherlich auch alle zusammenklemmen könnte…, aber ich bin mir unschlüssig wo ich die anderen 3 Zähler auflegen kann. Pin 5 (GPIO3 SCL1) ist ja der einzigste so seiner Art. In WiringPi sind ja auch nicht alle PINs definiert.

    Muss ich einen Widerstand, wenn ja welchen, irgendwo dazwischen hängen, damit ich einen beliebigen PIN verwenden kann!? Kann mir da jemand helfen?

    Vielen Dank und herzlichen Grüße
    Michael

    1. Hi Michael,

      die Frage, wie man mehrere Zähler anschließen kann, kam ja schon ein paar Mal. Ich habe es selbst noch nie getestet. In dem verlinkten Artikel oben im Post steht: “[…] 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.” –> Also zumindest 2x Zähler wird man damit verwenden können. Bei weiteren weiß ich es auch nicht. Einen Widerstand als Pull-Up zu verwenden sollte jetzt ja keine Kunst sein. Obwohl ich halt auch nicht weiß, was man dann noch wo wie einstellen muss. Hm.

      Aber vielleicht konntest du in der Zwischenzeit auch schon woanders was ergoogeln?

      Ciao
      Johannes

  69. Hallo
    Ich möchte auch mein S0 im volkzähler erfassen. Leider gibt es wiringpi von Gordon so nicht mehr. Im inoffiziellen fork ist die irs.c anders aufgebaut.
    Wie bekomme ich die Impulse in den volkszaeher?

    1. Hallo,

      ich heiße zufällig auch René und stehe vor demselben Problem. Was hier beschrieben ist passt so nicht mehr. WiringPi ist mittlerweile wohl vorinstalliert. Ich finde auch kein Directory mit den C Dateien und den Libraries. Hast du eine Lösung gefunden?

Leave a Reply to Wilfried Lindner Cancel reply

Your email address will not be published. Required fields are marked *