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!
schau doch mal bei volkszaehler.org vorbei, die haben einiges in die Richtung gebastelt
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."
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
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 ;)
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...
Du kannst auch einen 2313 nehmen der hat auch Hardware-UART und kann ganz bequem jede Minute mal die Zähler rüberschicken. Sascha
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.