nohup

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

  • Hallo,

    'wait_for_motion' funktioniert so nicht. In der Doku steht dazu:

    Zitat

    Pause the script until the device is activated, or the timeout is
    reached.

    https://gpiozero.readthedocs.io/en/stable/api_…ensor-d-sun-pir

    Dein Programm wird solange angehalten, bis eine Bewegung erkannt wird. Du musst dann die Funktion 'on_moition' danach aufrufen, wenn das Programm fortgesetzt wird. Wenn du das so verwenden willst, dann muss das in eine Schleife, damit das Programm danach wieder wartet.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • hatte initial keine while Schleife, dann passierte gar nichts. Erst nach Einfügen der

    Schleife funktionierts.

    In dieser vergangenen Themenfolge habe ich auf diesem ausgezeichneten Forum

    viel gelernt und begriffen, anfänglich hatte ich nur Code abgeschrieben/kopiert.

    Habe erkennen müssen, dass mein aktuelles Script mit pir.when_pressed() und

    pir.when_released() mein Ziel doch nicht erfüllt. Ich brauche pir.when_held

    um mit einer hold_time von einigen Sekunden, die von der PIR-Haltezeit immer

    übertroffen wird, die viel kürzeren Störimpulse zu unterdrücken.

    Nur schaffe ich das noch nicht, folgendes Testscript, aus einem anderen Projekt übernommen

    zeigt keine Reaktion:

  • Hallo,

    'Button' hat gar kein 'was_held' :

    https://gpiozero.readthedocs.io/en/stable/api_input.html#button

    Du solltest nicht irgendwas an der 'Button'-Klasse hinzufügen oder überschreiben.

    Du benötigst das auch nicht, weil du einfach 'value' abfragen kannst, da bekommst du je nach gedrückt oder nicht eine 1 oder eine 0 ausgegeben.

    Was passiert, wenn du den Button jetzt 2 Sekunden gedrückt hälst?

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Um das nicht liegen zu lassen.

    Das muss so laufen. hat ja vorher auch funktioniert. Die while - Schleife ist da tatsächlich überflüssig.

  • Dennis89:

    ja, das funktioniert im Prinzip: Die Funktion test_on(button)

    wird aufgerufen, aber erst nach Ablauf der Haltezeit des PIR, ich hatte

    erwartet nach Ablauf der hold_time bzw. nach 2 Sekunden.

    Aber die Idee zur Unterdrückung von Störimpulsen scheint trotzdem

    zu funktionieren: Habe die hold_time auf 65 sec gesetzt, 5 sec länger

    als die PIR-Haltezeit (z. Z. 60 sec) um so einen Störimpuls zu simulieren

    und die Funktion wird nicht aufgerufen.

    Das heisst aber, dass in meiner definitiven Installation eine (unbefugte)

    Bewegung erst nach Ablauf der PIR-Haltezeit die verschiedenen

    Funktionen, Foto, SMS etc. erfolgen. Die PIR Haltezeit ist verkürzbar.

    keepfear:

    Habe mittlerweile von MotionSensor auf Button gewechselt. S.O.

  • ich sags jetzt zum x-ten Mal: Wenn ich die while Schleife weglasse passiert

    nach einer Bewegung am PIR nichts...

    Dann noch mein letzter Punkt, ein 2. thread zur Aufnahme und e-mail Versenden

    eines Fotos täglich/nächtlich zu vorgegebener Zeit:

    Habe den def main()  Block in Anlehnung an eine andere Installation ergänzt

    nach import von schedule und threading:

    erstaunlicherweise werden beide Funktionen get_picture(ir_light, camera und

    send_mail() unmittelbar nach Aktivierung des Scripts ausgeführt, unabhängig

    von der eingegebenen Zeit und das Script bricht ab mit:

    root@raspberrypiZeroHome1:/home/pi# python3 onMotion_v0.py

    2023-05-19 21:52:14,563 - root - INFO - Foto aufgenommen

    2023-05-19 21:52:14,674 - root - INFO - Foto angehaengt

    2023-05-19 21:52:15,357 - root - INFO - e-mail gesendet

    Traceback (most recent call last):

    File "/home/pi/onMotion_v0.py", line 111, in <module>

    main()

    File "/home/pi/onMotion_v0.py", line 100, in main

    schedule.every().day.at("21:54").do(get_picture(ir_light,camera), send_mail())

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

    self.job_func = functools.partial(job_func, *args, **kwargs)

    TypeError: the first argument must be callable

    Möglicherweise ist in der schedule Methode in Argument zuviel ?

  • ich sags jetzt zum x-ten Mal: Wenn ich die while Schleife weglasse passiert

    nach einer Bewegung am PIR nichts...

    Dann hast Du was falsch gemacht! Und jetzt hast Du auch noch das Signal pause() in der Schleife. :S

    Btw. Die hold_time muss kürzer eingestellt sein als die Dauer der Flanke des PIR, sonst löst pir.when_held nie aus.

  • erstaunlicherweise werden beide Funktionen get_picture(ir_light, camera und

    send_mail() unmittelbar nach Aktivierung des Scripts ausgeführt, unabhängig

    von der eingegebenen Zeit und das Script bricht ab mit:

    Das ist nicht erstaunlich, sondern das ist genau das was du programmiert hast. Wenn der Interpreter das erste mal deinen Code durchgeht, dann sieht er einen Funktionsaufruf und ruft die Funktion auf. Ein Klammerpaar nach einem Funktionsname bedeutet, dass die Funktion aufgerufen werden soll.

    Stichwort: 'partial', falls 'sheudel da nicht was anbietet um Argumente mit zu übergeben. Schau mal in die Doku dazu.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Versuch mal das:

  • ich sags jetzt zum x-ten Mal: Wenn ich die while Schleife weglasse passiert

    nach einer Bewegung am PIR nichts...

    Wenn dir mehrere Leute über 2 Threads sagen, das die while-Schleife Unsinn ist, dann ist da sicher etwas dran.

    Da solltest du mal schauen was an deinem Programmaufbau nicht stimmt. Die sagen das nicht um dich zu ärgern.

    Vllt wäre es hilfreich, wenn du dir den Unterschied von:

    Python
    button.when_pressed = funktion 
    button.when_released = funktion 
    
    button.when_held = funktion 
    
    pause()

    und

    Python
    while True:
        button.wait_for_press() # pausiere bis Input
        #mach was
        if anderer_button.is_pressed:
            #mach was mit anderen Button
        elif:
            #andere_button wurde nicht gedrückt
        

    nochmal anschaust.

    Schedule bietet auch decoratoren. Ob das wie folgt funktioniert weiß ich nicht. Du solltest aber überlegen ob Foto schießen und gleichzeitig senden sinnvoll ist oder ob das nicht zeitlich etwas versetzt passieren sollte.

    Alternative:

    Die Decoratoren wieder entfernen (@repeat(every().day.at()) und die main() ändern.

    Mit Thread:

    Wobei ich nicht glaube das du hier unbedingt einen Thread brauchst.

Jetzt mitmachen!

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