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.

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

 

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

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

  12. Pingback: Anonymous
  13. 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.

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

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

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

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

  18. 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://blog.webernetz.net/2014/01/06/mrtg-with-rrdtool-and-routers2-installation-from-scratch/

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

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

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

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

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

  24. 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?

  25. 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!

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

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

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

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

  30. Hallo
    letzter Eintrag

    selbst mit nachhilfe

    anstatt 1462963506 510 0
    das gemacht
    1462963506 1827373510 0

    keine auswertung

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

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

  33. 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 ?

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

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

  36. 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 …

  37. 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?

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

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

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

  41. 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. 😀

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

  42. 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.)

Leave a Reply

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