Python Rechnen in Abhängigkeit von der Uhrzeit.

brenner

Commander
Registriert
Apr. 2002
Beiträge
3.037
Hallo,

momentan habe ich ein Pythonscript (unter Debian) laufen welches durch ein Shellscript alle 5 Sekunden ausgeführt.
Es liest mittels Modbus einen Stromzähler aus und schreibt die Daten weg.


Einer der ausgelesenen Werte ist der aktuelle Zählerstand mit drei Nachkommastellen, also z.B. 290.483 (kWh).
Leider kennt der Zähler keine Uhrzeit und kann daher auch keine Tagesverbräuche ausgeben. Das möchte ich nun gerne selber nachscripten.

Das Ganze stelle ich mir so vor. Zu einer definierten Zeit, z.B. 00:00Uhr wird der aktuelle Zählerstand ermittelt und "gespeichert".

Ausgehend von diesem Zählerstand bilde ich die Differenz zum aktuellen Zählerstand und gebe das Ganze als "Verbrauch seit 00:00Uhr" bzw. "Tagesverbrauch" aus. Um 24:00Uhr wird der gespeicherteZählerstand vom Vortag überschrieben und das Ganze beginnt von vorne.

Meine Kentnisse reichen inzwischen soweit das ich eine Wert z.B. in eine Datei schreibe und auslesen kann. Auch die Subtraktion des IST 0Uhr und IST Aktuell Wertes bekomme ich sicher hin, ABER wie schaffe ich das Zeitabhängig zu Mitternacht auszuführen/speichern?



edit:
Mir fiel spontan folgendes ein. Einfach ein zweites Pythonscript schreiben welches nur den Zählerstand ermittelt und in eine Datei wegspeichert. Dieses Script wird via crontab um 24Uhr einmal ausgeführt.

Das auslesen der Datei und die Berechnung erfolgt dann im 5Sekundentakt im "Hauptscript".

Zu umständlich?
 
Zuletzt bearbeitet: (Idee)
brenner schrieb:
Fullquote entfernt

Die Zeit wird in Sekunden seit dem 1.1.1970 dargestellt. Damit gilt für Mitternacht: time modulo (60*60*24) == 0;

Got it?

BTW: Der Avatar ist eklig.
 
Zuletzt bearbeitet von einem Moderator:
Aber das Script wird alle 5 Sekunden ausgeführt, d.h. keine Garantie das es auch genau um Mitternacht läuft.

PS1: Wieso zitierst du den gesamten Text?
PS2: Der Avatar steht seit 12,5 Jahren da.
 
Alternative:
warum speicherst du den zum zählerstand nicht auch die Uhrzeit dazu?

dann kannst nachträglich ein Skript machen um die genau Uhrzeit rauszusuchen

auserdem, ich weis nicht was du vermisst, aber wenn du 5 sek daneben liegst bei einem Tagesverbrauch wird das wohl egal sein
ob der Tag jetzt 23:59:55 gedauert hat oder exakt 24h
 
the_nobs schrieb:
Fullquote entfernt


Ja, das ist natürlich irrelevant, meinte das aber auch anders! Egal.

Das nachträgliche Script ist auch ein Idee.
 
Zuletzt bearbeitet von einem Moderator:
the_nobs schrieb:

Das Problem der Formulierung einer entsprechenden Bedingung mit Toleranz bleibt dabei bestehen.
 
Zuletzt bearbeitet von einem Moderator:
Anderer Aspekt: Warum in eine Datei speichern? Schreib das Log doch in eine SQL DB. Muss ja nix komplexes sein, einfach ne Tabelle mit 2 Spalten für Timestamp und den Wert.
Der Vorteil ist, dass du gegenüber einer SQL DB deutlich leichter komplexere Ausgaben formulieren kannst. Du willst den Tagesverbrauch von gestern? Selektiere alle Zeilen, deren tstamp > "gestern Mitternacht" und <= "heute Mitternacht" sind und subtrahiere das Minimum dieses Wertebereichs vom Maximum.

Da kannst du dann auch mehrere individuelle Crons schreiben, einen der alle 5 Min tickt und ein anderer, der (möglichst) genau 00:00 anspringt. Aber andererseits... Was als "alle 5 Minuten" in der Crontab steht, wird eh zur vollen fünften Minute jeder Stunde ausgeführt, also auch 00:00.
 
Daaron schrieb:
Anderer Aspekt: Warum in eine Datei speichern? Schreib das Log doch in eine SQL DB. Muss ja nix komplexes sein, einfach ne Tabelle mit 2 Spalten für Timestamp und den Wert.

An das habe ich gar nicht gedacht
eine primitive SQLLite datenbank reicht da locker, gibts ja direkte SQLLite Bindings für Python sollte also programmiertechnisch kaum ein Aufwand sein.
 
Na ja, bei SQLite dürftest du Probleme kriegen, wenn du wirklich 2 Scripte laufen lassen willst (1 für "alle 5 Min" und 1 für "immer 00:00"). Kann mich düster dran erinnern, dass du SQLite-Files nur 1x öffnen kannst.
Dann doch lieber n großes RDBMS. MariaDB/MySQL braucht nicht viel an Ressourcen, wenn man nicht gerade monströse InnoDB-Tabellen hat.
 
Hallo brenner,

ich hab ein ähnliches Projekt am laufen und schreibe meinen Zählerstand mit Timestamp direkt in ne MySQL DB. Bei mir aber alle Minute. Das tolle daran ist das man dadurch dann auch die mittlere Leistung über die letzte Minute ausrechnen kann.

Mein Plan ist aber das ganze auf RRDTool umzubauen, das würd ich mir an deiner Stelle auch mal anschauen. Ist wohl genau das richtige um historische Daten zyklisch abzuspeichern.

Gruß Tek
 
Zurück
Oben