Forum: Haus & Smart Home Stromzähler loggen


von Manuel K. (iagmanu)


Lesenswert?

Hallo,

ich habe seit geraumer Zeit einen Logger im Haus laufen, der (u.a.) die 
Stromzähler (Verbrauch und Fotovoltaik) per IR-Schnittstelle ausliest. 
Allerdings habe ich schon länger festgestellt, dass mich die beiden 
Landis+Gyr E350EDL21 "anlügen" in dem Sinne, dass die Phasenströme 
(31.7, 51.7, 71.7) über die Zeit integriert nicht der tatsächlichen 
Wirkleistung entsprechen, obwohl ich mich zu erinnern glaube, mal 
gelesen zu haben, dass diese Kennzahlen Wirkströme sind (kann ich im 
Moment leider nicht direkt verifizieren). Beispielsweise zieht die PV 
nachts offenbar 0,14 A auf allen Phasen (?), und der Verbrauchszähler 
zeigt auch kein Vorzeichen (Einspeisung oder Verbrauch).

Wie dem auch sei, habe ich jetzt endlich einen Fototransistor auf die 
1000 Imp/kWh-LED gestrickt und lese diesen via Raspi (genaugenommen im 
Moment ein Banana Pi) aus, so dass ich über den Zeitabstand eine saubere 
Leistung bestimmen kann. Habe dazu ein kurzes C-Programm, das dauernd 
die dem Pin entsprechende Datei liest und die Flanken mitzählt. 
Funktioniert, zieht aber CPU-Last auf dem Pi - insbesondere da ich drei 
davon habe.

Von daher jetzt nach langer Vorrede meine Frage: Der Pi könnte ja bei 
Pegelwechseln einen Interrupt erzeugen, der dann einen Zähler 
weiterrückt und irgendwie verfügbar macht. Meines Wissens bräuchte man 
für den Interrupt einen Kerneltreiber. Bevor ich mich selbst daran 
mache, einen solchen zu stricken, wollte ich fragen, ob jemand so was 
ähnliches (betrifft ja auch Wasser- oder Gaszähler, S0-Schnittstellen 
u.ä. wo Impulse zu zählen sind, die asynchron eintreffen können) gemacht 
hat oder ob allen eine CPU-Last von >30% durch das dauernde Polling egal 
ist.

Vielen Dank für eure Tipps!

Ciao,

     Manuel


PS: Die Fototransistoren haben mich zahlreiche Stunden gekostet, bis ich 
sie endlich in Betrieb hatte. Erst war der Signalhub zu klein, und ein 
Vergrößern des Vorwiderstandes (>5 MOhm!) hat nur begrenzt geholfen, 
wobei ich doch zahlreiche Beiträge (auch hier) gefunden hatte, die mit 
10k oder allenfalls 100k problemlos auskamen. Signal war auf dem Oszi 
erkennbar, aber eben zu klein. Am Ende dann die Erleuchtung: Anschlüsse 
(E+C) am Fototransistor vertauscht (die alte Regel, kurz=Kathode also an 
Minus war hier leider gerade falsch), und richtig herum funzt es prima. 
Interessanterweise war trotz Falschpolung ein Signal erkennbar, und mit 
viel Licht (Taschenlampe) konnte ich sogar voll durchsteuern - sonst 
hätte ich wahrscheinlich schon früher mal nicht nur bei den Kenndaten, 
sondern auch für die Anschlussbelegung ins Datenblatt geschaut. Man 
kommt sich dann unglaublich dämlich vor...

Merke: RTFM hilft!

von Klaus (Gast)


Lesenswert?

schau doch mal bei volkszaehler.org vorbei, die haben einiges in die 
Richtung gebastelt

von Axel (Gast)


Lesenswert?

wiringpi.com

Opensource GPIO Lib


int wiringPiISR (int pin, int edgeType,  void (*function)(void)) ;

"This function registers a function to received interrupts on the 
specified pin. The edgeType parameter is either INT_EDGE_FALLING, 
INT_EDGE_RISING, INT_EDGE_BOTH or INT_EDGE_SETUP."

von Manuel K. (iagmanu)


Lesenswert?

Hallo,

(sorry, erst jetzt nach dem langen Osterwochenende), vielen Dank für die 
Tipps. Von volkszaehler hatte ich ursprünglich die Stromzähler-Leseköpfe 
(vielen Dank an Udo für den Lötservice!), aber (zumindest damals) nichts 
zum Impulszählen über Interrupts gefunden. WiringPi kenne ich natürlich, 
hatte aber zumindest ursprünglich mal die Info gefunden, dass intern 
dann doch (relativ hochfrequent) gepollt wird, was nicht unbedingt in 
meinem Sinne wäre. Das kann aber mittlerweile natürlich anders sein, da 
werde ich einfach nochmal in den aktuellen Source schauen müssen, um zu 
sehen, was tatsächlich genau passiert. Und ausprobieren, wie das mit 
meinem alten Kernel (3.4.103, glaube ich) aus openSUSE for BananaPi 
1.1.1 zusammenpasst. Notfalls wäre das auch eine Motivationshilfe, auf 
ein aktuelles Bananian umzusteigen, aber bekanntlich gilt ja "never 
change a running system".

Dabei geht es mir nicht nur um die Systemlast, sondern auch um die 
Gefahr, einen Impuls mal zu verpassen, wenn ich vom Userspace aus polle 
und er - beispielsweise, weil ich gerade etwas anderes drauf mache - zu 
swappen anfängt und deshalb für einige Sekunden steht. Das ist bei den 
Stromzählern mit < 4 Hz (bei 1000 Imp/kWh) und ca. 12 ms Impulsbreite 
vielleicht noch verkraftbar, an einem anderen Pi habe ich den 
Wasserzähler mit 1000 Impulse/Liter an die Zisternenpumpe angeschlossen 
und komme da dann auch schon mal auf 500 Hz. Das könnte schon ziemlich 
eng werden. Aber Versuch macht kluch...

Ciao,
    Manuel

von TestX (Gast)


Lesenswert?

Ich würde einen kleinen ATTiny nehmen und darüber die Zähler 
realisieren. Das Ding dann per I2C an den Raspberry dran und du kannst 
jederzeit die Zählersstände bequem auslesen. Wirklich Strom kostet das 
dann auch nicht ;)

von Manuel K. (iagmanu)


Lesenswert?

Hallo,

danke, das ist eine ganz gute Idee. Dann müsste ich zwar eine Firmware 
dafür stricken, aber für I2C (wohl mit Bit-Banging beim Tiny) findet 
sich sicher was im Netz und das würde mir auch bei zwei bis drei anderen 
Problemen vielleicht helfen. Wäre wahrscheinlich auch nicht wesentlich 
aufwändiger als ein Kerneltreiber...

von Sascha W. (sascha-w)


Lesenswert?

Du kannst auch einen 2313 nehmen der hat auch Hardware-UART und kann 
ganz bequem jede Minute mal die Zähler rüberschicken.

Sascha

von Manuel K. (iagmanu)


Lesenswert?

Oder der Tiny85, den ich hier noch rumliegen habe, der kann TWI (=I²C) 
mit seinem USI (fast) in Hardware. Bei dem Projekt mit dem Wasserzähler 
brauche ich I²C beim Raspi sowieso, und für eine Erweiterung auch noch. 
Klingt verlockend...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.