Problem mit dem Modul schedule

  • Hallo Experten,

    im Zug des "Wiederbelebens" eines alten Projektes, eine Überwachungseinheit aus PIR, PiCamera mit

    2 Infrarotstrahlern und RPi ZeroW zu bauen habe ich das folgende Script mit schedule (am Ende des Scripts)

    ergänzt, um neben der permanenten Überwachung jeden Tag ein Foto als Funktionskontrolle zu erhalten:

    Das funktioniert bis das Foto etc. von schedule ausgelöst wird, danach aber reagiert der PIR nicht mehr.

    Ich nehme an, weil schedule dann permanent auf den nächsten Zeit Trigger wartet und so den "Rest"

    des Scripts blockiert. Wie sollte ich das richtig machen ? Mit 2 threads ?

  • When not to use Schedule

    Let’s be honest, Schedule is not a ‘one size fits all’ scheduling library. This library is designed to be a simple solution for simple scheduling problems. You should probably look somewhere else if you need:

    • Job persistence (remember schedule between restarts)
    • Exact timing (sub-second precision execution)
    • Concurrent execution (multiple threads)
    • Localization (workdays or holidays)
  • Hallo,

    Das funktioniert bis das Foto etc. von schedule ausgelöst wird

    Es wird doch nur "send_email" um 14.30 Uhr von 'schedule' ausgelöst?

    Gibts denn überhaupt Bilder in dem Ordner? So wie dein Skript da steht, werden nämlich nie Bilder gemacht.

    Werf mal die nichtssagenden "Error"-Meldungen raus und schau mal was das Skript für Fehlermeldungen ausgibt.

    Grüße

    Dennis

    🎧 Strahlend soll die Zukunft sein, gut wir werden seh'n, ob wir wie ein Strahlemann lächelnd untergeh'n.  🎧

  • Vielen Dank für Eure prompten Hinweise !

    Einigermassen überraschenderweise funktioniert meine Script mit schedule in einem

    erneuten Test, Bilder und SMS werden zu eingestellten Zeit und bei Aktivierung des

    PIR gesendet, ich muss mich entschuldigen:

    Wahrscheinlich weil ich die entsprechende service unit nochmals neu - und diesmal richtig -

    eingerichtet habe:

    Möglicherweise war die Vorangegangene fehlerhaft.

    Und auch in my_log.log sind alle loggimg Info's korrekt aufgeführt.

    Offenbar fällt der Einsatz von schedule in meinem Script nicht unter die von simonz in #2

    rot gekennzeichnete Kategorie.

    Über meine Erfahrungen mit falschen PIR Aktivierungen berichte ich in einem neuen Beitrag.

  • Hallo,

    die `After` Direktive ist Quatsch - wo hast du die her? So rein von der Logik her: wenn deine Unit `WantedBy=multi-user.target` ist - was ziemlich gängig und hier auch OK ist - dann kann sie wohl schlecht `After=multi-user.target` sein. Schließt sich aus.

    Da dein Skript eine Netzwerkverbindung braucht wäre `After=network-online.target` zum Beispiel sinnvoll.

    Gruß, noisefloor

  • Da muss irgendwo eine Fehlermeldung kommen. Vllt postest du den Logeintrag mal und außerdem fehlt da

    Python
    def task():
        relais.on()
        sleep(1)
        get_picture
        relais.off()
        send_email()
        send_sms()

    ne Klammer bei get_picture.

    Ansonsten

    Code
    systemctl status name_deines_services.service

    und/oder

    Code
    journalctl -u name_deines_service.service

    Ohne Fehlermeldung wirds schwierig.

    Das müsstest du aber langsam wissen. :D

  • nochmals vielen Dank ! Eins nach dem anderen:

    1. Die fehlenden Klammern habe ich deshalb nicht bemerkt, weil ich bei jeder PIR

    Auslösung ein "altes" Bild von einem früheren Programm Durchlauf aus

    /home/pi/bild1.jpg erhielt. Ist inzwischen inkl. einem neuen Bildpfad
    korrigiert und funktioniert.

    Demzufolge ergibt journalctl -u onMotion.service keine Fehlermeldungen mehr:

    -- Logs begin at Mon 2023-11-20 15:17:02 CET, end at Mon 2023-11-20 16:58:03 CET

    Nov 20 16:24:18 raspberrypiZeroBonda systemd[1]: Started onMotion Service.

    lines 1-2/2 (END)...skipping...

    -- Logs begin at Mon 2023-11-20 15:17:02 CET, end at Mon 2023-11-20 16:58:03 CET

    Nov 20 16:24:18 raspberrypiZeroBonda systemd[1]: Started onMotion Service.

    ~

    _

    ~

    lines 1-2/2 (END)...skipping...

    -- Logs begin at Mon 2023-11-20 15:17:02 CET, end at Mon 2023-11-20 16:58:03 CET

    Nov 20 16:24:18 raspberrypiZeroBonda systemd[1]: Started onMotion Service.

    2. Die Einträge in meine service unit sind halt nicht auf meinem Mist gewachsen.

    Trotz des von noisefloor in # monierten Fehlers hat sie funktioniert.

    Aber seine Argumentation leuchtet mir ein und jetzt heissts:

    3. Nur aus der Dokumentation für die letzte [Service] Zeile bin ich noch nie ganz
    schlau geworden. Whs. müsste sie heissen: Restart=on-failure ???

    4. Eine letzte Frage: Muss ich vor einer Scriptänderung die service unit über

    systemctl zuerst stoppen und disabeln und nachher wieder neu starten ??

  • Trotz des von noisefloor in # monierten Fehlers hat sie funktioniert.

    Das ist kein Fehler, im Sinne von, dass der Start der Unit verhindert wird. Es macht nur keinen Sinn. Wie genau systemd das im Hintergrund regelt kann ich dir nicht sagen.


    Nur aus der Dokumentation für die letzte [Service] Zeile bin ich noch nie ganz
    schlau geworden. Whs. müsste sie heissen: Restart=on-failure ???

    Es gibt verschieden Abstufung, wann eine Unit neu gestartet werden soll, siehe https://www.freedesktop.org/software/syste…e.html#Restart=. Da musst du dir dann den passenden Wert für die Direktive `Restart=` raussuchen. Für Services, die dauerhaft laufen sollen, macht i.d.R. `always` oder `on-failure` Sinn.


    Eine letzte Frage: Muss ich vor einer Scriptänderung die service unit über

    systemctl zuerst stoppen und disabeln und nachher wieder neu starten ??

    Nein, ohne disable. Stoppen und starten reicht, wenn du Änderungen am Skript hast.

    Gruß, noisefloor

  • ja, das Script läuft:

    :) :danke_ATDE:

  • Ich hab das mal aufgeräumt. Ungetestet.

  • habe das Script getested. Bekomme unter zeitgesteuerter Aufrufen

    der Funktionen unter schedule:

    onMotion_3.py gestarted

    Foto gemacht

    Traceback (most recent call last):

    File "/home/pi/motion.py", line 107, in <module>

    main()

    File "/home/pi/motion.py", line 103, in main

    schedule.run_pending()

    File "/usr/local/lib/python3.9/dist-packages/schedule/__init__.py", line 822, in run_pending

    default_scheduler.run_pending()

    File "/usr/local/lib/python3.9/dist-packages/schedule/__init__.py", line 100, in run_pending

    self._run_job(job)

    File "/usr/local/lib/python3.9/dist-packages/schedule/__init__.py", line 172, in _run_job

    ret = job.run()

    File "/usr/local/lib/python3.9/dist-packages/schedule/__init__.py", line 693, in run

    ret = self.job_func()

    File "/home/pi/motion.py", line 82, in task

    send_email(mime)

    File "/home/pi/motion.py", line 55, in send_email

    img = MIMEImage(file.read())

    File "/usr/lib/python3.9/codecs.py", line 322, in decode

    (result, consumed) = self._buffer_decode(data, self.errors, final)

    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

    Habe dann ein snippet von einer älteren Version eingesetzt, dann ging's:

    werde nicht schlau, warum die 'utf-8' Codierung nicht akzeptiert wird

  • Weil ein Bild kein Text ist sondern Binärdaten. Der Anhang muss entsprechend kodiert werden, beispielsweise als Base64. Das `email`-Package hat da irgendwo eine Funktion für.

    `close()` sollte man auch *aufrufen* beziehungsweise ``with`` verwenden wie im auskommentierten Code.

    “For every complex problem, there is a solution that is simple, neat, and wrong.” — H. L. Mencken

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!