Wie lege ich am besten eine Zeitspanne für eine bestimmte Funktion fest

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Zusammen,

    bin ja jetzt schon mittendrin mit meinem python2-Script, dass mir die s0-Impulse meines Stromzählers in eine rrd schreiben soll.

    Wie kann ich denn nun am besten in python festlegen, dass mir das Scrippt z. B. alle 5 Minuten einen bestimmten Wert in die Datenbank schreibt?
    Geht das so ähnlich wie "wenn Zeit-Jetzt minus Zeit-Letzer-DB-Zugriff > 5 Sekunden, dann mach des"?

    Oder geht das anders sinnvoller?

    Dank Euch sche
    Andi

  • Wie lege ich am besten eine Zeitspanne für eine bestimmte Funktion fest? Schau mal ob du hier fündig wirst!

  • Da ich aus dem anderen Thread weiß, worum es geht: Warum möchtest Du denn alle 5 Minuten in die Datenbank schreiben bzw. wie erfasst Du Deine Meßwerte? Kannst Du nicht einfach jeden neuen Meßwert in die Datenbank schreiben? RRD konsolidiert doch ohnehin auf das von Dir eingestellte Intervall.

  • Also im Endeffekt bekomme ich keine Messwerte.
    Der Stromzähler gibt mir ständig Impulse aus (1000 pro KWh). Jeder Impuls zieht mir einen GPIO-Input-Pin auf Ground.
    Diese Impulse zähle ich permanent. Nach einem Zeitintervall (5Minuten) schreibe ich die Anzahl der Impulse (evtl noch /1000) in meine rrd und setze diese auf 0 zurück.
    Und so weiter und so fort.

    Zur rrd ist mir zwar bekannt, dass diese nach einem festgelegten Timer Daten erwartet. Aber die rrd wartet doch dann auf die Daten, oder wie soll sie sich denn die selber holen?

    Pfürtü


  • Da ich aus dem anderen Thread weiß, worum es geht: Warum möchtest Du denn alle 5 Minuten in die Datenbank schreiben bzw. wie erfasst Du Deine Meßwerte? Kannst Du nicht einfach jeden neuen Meßwert in die Datenbank schreiben? RRD konsolidiert doch ohnehin auf das von Dir eingestellte Intervall.

    Das könnte bei höherem Stromverbrauch dazu führen, dass das schreiben in die DB so lange dauert, dass Impulse nicht registriert werden.

    Ich würde das "simpel" lösen:
    Eine Main-Loop, welche so wie du im 1. Beitrag beschrieben hast, die aktuelle Zeit mit einer definierten DB-Screibzeit vergleicht und dann den Wert des Zählers in die rrd pumpt (da kannst du locker ein delay von 1s einbauen, das senkt die CPU-Last auf ein Minimum).
    Der Zähler wird dann zurück auf 0 gesetzt.

    Weiterhin definierst du eine Routine, welche durch den GPIO-Impuls (auf oder absteigende Flanke) getriggert wird und simpel die (volatile) Zähl-Variable incrementiert.

  • Ahhh, des hört sich gut an.
    Aber wenn ich einen Delay von 1 Sekunde Einbau, kann mir doch genau das mit den verlorenen Impulsen passieren, oder?
    Automatisch zusammengefügt:
    Übrigens hab ich den Input-gpio eh so festgelegt, dass das komplette Programm stoppt, bis eine Flanke kommt. So hoffe ich die Last generell niedrig zu halten.

    Einmal editiert, zuletzt von Tecci (30. Januar 2017 um 18:48)

  • Nein, weil du einen add_event_detect (oder ähnlichen) Trigger einbauen sollst, der *immer* zählt (weil in einem anderen Thread). Dadurch akkumuliert der auch wenn du im Hauptthread mal gerade pennst.

  • Au ja. Hab ich gecheckt und mach das dann auch so.
    Dann iss klar, dass ich ne Sekunde Pause einbauen kann.

    Muss ich eigentlich die Dauer des Impulses von der s0-Schnittstelle irgendwie beachten?
    die beträgt 20ms.

  • Was auch immer die Punkte uns sagen sollen - die 20ms sind kein Problem, und gezählt wird eh nvr bei Flankenwechsel

  • Also sowas.
    Jezt ist das Script schon einwandfrei geloffen.
    Doch wegen einer kleinen Anpassung habe ich auch gleich die ganzen Einrückungen genau untereinandergestellt, da ich dann nen Fehler hatte.
    Gestartet habe ich es immer mit F5 aus der Entwicklungsumgebung.

    Jetzt im Echtbetrieb habe ich das Script mit chmod a+x ausführbar gemacht und mit sudo ./blabla.py gestartet.
    Es läuft auch einwandfrei, aber die Grafen sind jetzt leer.
    Die csv wird richtig geschrieben.

    Kann das was mit dem anderen Start zu tun haben, oder habe ich die Einrückungen falsch gemacht.
    Ich habe dabei immer 4 Leerzeichen beachtet, da ich das wo gelesen habe.

    Verzeichnis ist alles wie vorher.

    Hmmmm....

  • Obwohl du am Anfang einen absoluten Pfad verwendest um auf die test.rrd Datei zuzugreifen, verwendest du weiter unten keinen absoluten Pfade mehr - wieso?
    Wo denkst du oder hat, wird er nun die *.csv und *.png Dateien ablegen/erzeugen?

    Und wieso machst du
    from time import *
    from time import sleep
    :-/

    import * sollte man sowieso vermeiden, aber beide Zeilen zu haben macht so oder so kein Sinn, insbesondere weil du weiter oben auch noch "import time" machst, was das Chaos komplettiert...

    Ein print in der Interrupt Callback bremst aus - brauchst du das wirklich?

  • Das mit dem Pfad ist nur reine Schlamperei, die durchs Rumprobieren entstanden ist. Aber die Dateien liegen alle und werde alle erzeugt in Home/pi/.
    Die Imports sind auch nur durch die vielen Anleitungen und Beispiele im www entstanden. Wenn was mit der Zeit nicht ging, habe ich es einfach wie im Bespiel im Web erweitert.
    Ohne from Time Import sleep gibt er mir bei dem sleep-Befehl einen Fehler aus.

    Der Print war nur zum Testen, ob der Impuls erkannt wurde. ist jetzt eh draußen.

  • Naja, wenn du dich aktuell in dem Pfad befindest wo auch das Script liegt werden die Dateien mit relativem Pfad auch dort erzeugt, ja. Aber wenn du es ausserhalb dessen startest zum Beispiel weil du es automatisch starten möchtest, dann werden die Dateien nicht mehr in /home/pi/ erzeugt - deshalb: Immer absolute Pfade verwenden!
    Wir haben hier jede Woche mindestens eine Problembehandlung die von relativen statt absoluten Pfaden verursacht wird.

    Einer der Imports bezüglich "time" brauchst du - klar. Wenn du beide entfernst kannst du keine Funktion aus dem Module nutzen.... Du benötigst aber nur eine von beiden, je nachdem wie deine Funktionsaufrufe aussehen.

  • Hier mal mein Skript was ich getippt habe letztes Jahr, das läuft seit ein Jahr sehr gut ;)


    Die Datei Auswertung musst du Starten und dann Speichert das System alle 15 Minuten den Verbrauch, Ausgewertet wird es dann wenn du PHP und Apache Installiert hast mit der Datei Stromdetail.php

    Stromzaehler.zip

  • Sodale.
    Erst mal Danke nochmal an alle und auch an blueberlin für die Datei.

    Habe mittlerweile noch sehr viel ausprobiert.
    Also die genauen Pfade verwendet, auf Einrückungen geachtet und und und.
    Am Ende habe ich auch noch die parameter der rrd geändert, da diese total falsch waren.

    Und jetzt läuft es einwandfrei. Bin happy.
    Jetzt gehe ich ans Werk apache zu installieren, damit ich nicht immer per vnc die Grafiken anschauen muss.

    Und dann hab ich noch eine andere Idee, die ich aber extra poste.

    Danke nochmal
    Andi

  • Wenn du bereits Python verwendest könntest du auch auf apache2 verzichten und den Webserver ebenfalls in Python umsetzen. Siehe dazu FAQ => Nützliche Links / Linksammlung => [Python] Webserver, Websocket und ein bisschen AJAX

    Eine Alternative zum eher oldschool RRD wäre evtl. auch FAQ => Nützliche Links / Linksammlung => HighCharts
    Auch davon/für hab ich eine Python Version entwickelt wo der erste Link bereits enthalten ist.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!