Struktur für zeitabhängige Aufgaben in Python

  • Hallo zusammen,


    ich möchte gerne in Python in einer zeitlichen Abfolge gewisse Aufgaben erledigen. So soll in einem Pythonprogramm z.B. jede Stunde die Temperatur gemessen werden, 4 mal am Tag die Wasserhöhe in der Zisterne gemessen werden und morgens um 7:00 Uhr soll die Relais für die Zirkulationspumpe für 5 Minuten eingeschaltet werden.


    Die einzelnen Aufgaben sollen in zeitlicher Abfolge oder zur bestimmten Uhrzeit passieren.


    Wie kann ich so eine Struktur in Python aufbauen?


    Vielen Dank und einen sonnigen Nachmittag.


    whitechristmas

    • Official Post

    Das schreit doch eher nach cron jobs und einzelnen Scripten. ;). Muss es wirklich ein riesiges endlos Script sein?

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • Hallo zusammen,


    ich habe nur sehr begrenzte bzw. rudimentäre Kenntnisse in Python. Die einfachste Lösung wäre mir am liebsten.
    Ich habe aber wirklich so gar keine Ahnung wie das gehen soll.


    Vielen Dank.


    whitechristmas

  • Man kann das mittels Queues lösen. Das Programm organisiert sich die Aufrufe zeitlich und reagiert beim eintreffen des Callbacks.
    hier als Beispiel heisst die Queue MQueue (mainqueue) und der Eintrag in die Queue ist CB@ für callback, da kann natürlich auch mehr stehen wenn notwendig. der Timer wurde hier auf 2s gestellt, das kann auch eine real Zahl sein. Also alle 2 Sekunden bekommt man einen call back mit dem Eintrag


    Softwarefehler suchen ist wie Pilze suchen. Wenn man erst einen gefunden hat, findet man meist mehrere.


    Bei Hardware ist es schlimmer, da findet man bereits Fehler wenn man gar keine sucht!

    Edited once, last by Wolfgang Glück ().

  • Hallo Wolfgang,


    vielen Dank für Deine Antwort. Deinen Vorschlag werde ich ausprobieren.


    Einen schönen, hoffentlich sonnigen Tag.


    whitechristmas

  • MQueue muss natürlich noch als Objekt instanziert werden. je nachdem welches Modul du einsetzt kann das verschieden aussehen


    ich verwende multitprocessing und da ist Queue auch schon dabei
    import multiprocessing as mp
    MQueue = mp.Queue()

    Softwarefehler suchen ist wie Pilze suchen. Wenn man erst einen gefunden hat, findet man meist mehrere.


    Bei Hardware ist es schlimmer, da findet man bereits Fehler wenn man gar keine sucht!

  • Hallo,


    schreib' für jede Aufgabe ein Skript und lasse es zur gewünschten Zeit per systemd Timer Unit (oder Cron) ausführen. Das ist am einfachsten und hat noch zwei Vorteile: a) laufen die Skripte unabhängig, d.h. wenn z.B. die Temperaturmessung abstürzt, werden die anderen Skripte trotzdem ausgeführt. b) wenn du das als systemd Timer Unit ausführst, bekommst du das Logging, also dass das Skript gelaufen ist, direkt gratis mitgeliefert.


    Gruß, noisefloor

  • Evtl. hilft das: Eigene zyklische Abfrage in Python


    Die einfachste Möglichkeit wäre aber wirklich über crontab - allerdings würde ich nur ein Script verwenden und daran beim Aufruf ein entsprechendes Parameter übergeben :fies:

  • Hallo zusammen,


    an der Lösung von Wolfgang bin ich noch am arbeiten.
    Mit Cron ist es mir gelungen. Allerdings weiß ich nicht, wie man das mit systemd macht?
    Kann ich da einen Tipp haben?


    Vielen Dank.


    whitechristmas

  • es kommt immer darauf wo man herkommt von der Unix Seite oder von der Applikationsseite. Für den einen ist der Umgang mit dem Betriebssystem (Crone) einfacher, für den anderen eben die Programmiersprache.
    Es gibt auch die Variante, dass man von beidem wenig Ahnung hat. Irgendeinen Tod muss man halt sterben.


    Die apllikatorische Lösung hat den Vorteil, dass man auf Windows alles testen kann ohne schon auf den RASPBY zu installieren, mit allen Tücken.

    Softwarefehler suchen ist wie Pilze suchen. Wenn man erst einen gefunden hat, findet man meist mehrere.


    Bei Hardware ist es schlimmer, da findet man bereits Fehler wenn man gar keine sucht!

    Edited once, last by Wolfgang Glück ().

  • Hallo,


    Quote

    Allerdings weiß ich nicht, wie man das mit systemd macht? Kann ich da einen Tipp haben?


    Ja - einfach mal mit systemd beschäftigen ;)


    Im Wiki von ubuntuusers.de sind Timer Units IMHO gut erklärt: https://wiki.ubuntuusers.de/systemd/Timer%20Units/. Funktioniert unter Raspbian Jessie genau so.
    Kurzfassung: du schreibst und aktivierst eine Timer Unit, die dann periodisch eine Service Unit startet. Die Service Unit führt dann dein Python-Skript aus. Klingt vielleicht im ersten Moment kompliziert - ist es aber nicht :)


    Cron funktioniert natürlich auch, systemd ist aber der "modernere" Ansatz.


    Gruß, noisefloor