regelmässiges DataLogging und DB-Speicherung in Flask

Django, Flask, Bottle, WSGI, CGI…
Antworten
etzeste13
User
Beiträge: 4
Registriert: Samstag 13. Juli 2019, 14:53

Hallo,
ich bin Basis-Anwender von Python und habe mir alles bisherige selbst beigebracht. Der aktuelle Stand meines Projekts ist, das ich eine Flask-Homepage auf einem RasPi laufen habe die über über das MinimalModbus-Modul Sensoren abfragt und die Ergebnisse verlässlich im Browser darzustellt. Sofern ich mich als admin auf der Hompage registriere kann auch diverse Parameter an den Sensoren über die Benutzeroberfläche an den Sensoren verändern und dort speichern.
Die Benutzerautentifizierung erledige ich über eine MySQL Datenbank.

Soweit so gut, aber nun komme ich nicht weiter:

Ich möchte das Ganze erweitern und eine DataLogging Funktion einbauen bei der die Sensoren alle 2-5 Minuten abgefragt werden und in der Datenbank gespeichert werden. Ich weiß nur nicht wie ich die Regelmässigkeit in den Code integrieren kann.
Eine Flask Routine

( z.B.: @app.route('/')
def homepage():
der jeweilige CODE... )


wird ja nur dann abgearbeitet wenn über den Browser eine Anfrage gestellt wird. Deshalb weiß ich nicht wie und wo ich das Module des Dattaloggings aufrufen kann, damit es verlässlich abgefragt und in der Datenbank abgespeichert wird.

Eine Idee wäre ein 2tes Script in der Definition des 1ten Flask scripts aufzurufen das eben diese Abfragen macht und in die DB schreibt, aber ich bin nicht sicher ob und wie das möglich ist.

Wäre schön wenn mich hier wer mit einer Idee bzw einen Codebeispiel unterstützen könnte.

Dankeschön und beste Grüße,
etze
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das hat grundsätzlich nichts mit Flask zu tun, weil du das Logging ja ohne Flask machen solltest (macht jedenfalls Sinn).
Dazu musst du deinen Code sinnvoll aufteilen. Im gegebenen Fall z.B, in dem du eine Funktion oder Methode einer Klasse hast, die die Daten ausliest, eine, die die Daten in eine DB schreibt, ein die (was auch immer noch notwendig ist).
Das kannst du dann aus Flask heraus aufrufen oder halt periodisch von außerhalb, wie mit dem von __deets__ gezeigten Modul oder einer systemd Timer Unit oder ...

Gruß, noisefloor
etzeste13
User
Beiträge: 4
Registriert: Samstag 13. Juli 2019, 14:53

Hallo noisefloor,

vielen Dank für deine Antwort. Mir ist grundsätzlich klar, dass ich das Datenlogging von Flask trennen sollte.

Also dein Vorschlag wäre hier ein 2tes Script zu schreiben und das dann von dem ersten " Flask" Script aus zu starten?
Das würde mir passen, die Frage ist nur wie das geht? Das habe ich leider noch nicht herrausgefunden...

Dieses 2te Modul oder Script wäre ja auch nicht sonderlich aufwendig, lediglich eine Schleife die über die time function alle 300sec alle Regler abfragt und die Werte in die gleiche DB schreiben.

Meine Frage ist nur wie integriere ich das am Besten in den bestehenden Code?

glg etze
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@etzeste13: Gar nicht. Das sind doch zwei völlig unabhängige Dinge. Da sollte auch nicht das eine Programm das andere starten.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
etzeste13
User
Beiträge: 4
Registriert: Samstag 13. Juli 2019, 14:53

OK, das heißt einfach 2 Scripts machen und beiden am Raspi unabhängig starten und laufen lassen!? Wenns wirklich so einfach ist, muss ich das gleich ausprobieren...:-)
Danke euch und beste Grüße
etze:
PS Manchmal sieht man den Wald vor lauter Bäumen nicht.... :roll:
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn der modbus den konkurrierenden Zugriff auch erlaubt. Wenn nicht, musst du die Zugriffe darauf abstimmen, zb. mit einem exklusiven file lock.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

genau. Und den Code sinnvoll aufteilen, z.B.

sensor.py:

Code: Alles auswählen

...
def read_sensor_data():
    data = #Code zum Sensor auslesen
    return data
database.py:

Code: Alles auswählen

...
def write_to_db(data):
    #Code zum Schreiben in die DB
web_app.py:

Code: Alles auswählen

from flask import ...
...
import sensor
...
@app.route('/')
def index():
    data = sensor.read_sensor_data()
    return render_template('index.html', data=data)
logger.py:

Code: Alles auswählen

import sensor
import database
data = sensor.read_sensor_data()
database.write_to_db(data)
Deine Flask-App `web_app.py` startest du wie immer, `logger.py` führst du z.B. alle 5 Minuten via systemd Timer Unit aus.

Wie die Aufteilung am besten ist, ob irgendwo eine Klasse statt nur einer Funktion sinnvoll ist hängt dann von deinem konkreten Code ab.

Gruß, noisefloor
etzeste13
User
Beiträge: 4
Registriert: Samstag 13. Juli 2019, 14:53

Hallo und danke für Eure Unterstützung und die guten Ideen... Ich werde das Projekt versuchen so umzusetzen. Ich melde mich wieder sollte ich bei der Umsetzung an meine Grenzen stoßen.. :wink:

Danke nochmals und beste Grüße,
Etze
Antworten