pir.Bewegungsmelder schaltet Relais, aber wie geht der "Retrigger"...?!

  • Ich möchte per pir.MotionSensor Relais schalten. Das funktioniert auch mit diesem Code:


    Jetzt wäre es toll, wenn die Relais eine zeitlang anblieben, und wenn keine motion mehr detected wird, kann er die Relais ausschalten, aber wenn jemand im Raum ist, und sich hier und dahin bewegt, sollen sie angehen und die ganze Zeit anbleiben. Dafür müsste man einen Timer so einstellen können, dass der bei erneuter Motion Vor Ablauf der Zeit eben Retriggert, und die Zeit zurücksetzt?


    Wie erstelle ich einen in meinen Augen doch sehr alltäglichen Bewegungsmelder?


    Meine If/while usw-Schleifen funzen nicht, ich finde keine gute Übersicht für meine Problemlage, und nach einem durchlöteten und durchprogrammierten Wochenende find ich, darf ich hier noch einmal fragen. Auch wer mir die richtigen Suchbegriffe verrät, ist gern gesehen. Dankeeeee!


    Bambo

  • Hinter Zeile 22 (noch im If-Teil) müsstest du dir die Zeit + einige Sekunden in einer Variablen merken.

    abschaltzeit = time.time()


    Den Aufruf von stille() in Zeile 24 müsstest du davon abhängig machen, ob die Zeit überschritten ist.

    If time.time() > abschaltzeit: stille()


    Und du musst die time-Lib importieren

    import time


    So ähnlich jedenfalls könnte es gehen.



    Alernativ könntest du auch im If-Teil eine Variable auf sagen wir 600 setzen. Im Else Teil rechnest du bei jedem Durchlauf Minus eins. stille() rufst du nur auf, wenn die Variable null ist.

    In der Schleife brauchst du dann noch ein Sleep mit 0,1 Sekunden. Dann wird bei jeder Bewegung die Variable wieder auf 600 gesetzt. Und ausgeschaltet wird erst, wenn 600 mal 0,1 Sekunden vergangen sind - also nach einer Minute.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited once, last by Gnom ().

  • Gnom, du hast mich auf die richtige Fährte gebracht, und mein Problem gelöst! Vielen Dank dafür.

    FALLS ich doch so geschrieben habe, dass sich jemand auf diesen Thread verirrt mit einem ähnlichen (ähnlich einfachem) Problem, hier noch einmal der Code, der immerhin gerade eben wie gewünscht funktionierte!


  • Bamboleate: Variablen und Hauptprogramm gehören in eine eigene Funktion, nicht auf Modulebene. Alles was Funktionen (und Methoden) ausser Konstanten benötigen, bekommen sie als Argument(e) übergeben.


    Die beiden Relaisgruppen könnte man zu einem `CompositeOutputDevice` zusammenfassen, damit man sie nicht einzeln übergeben muss.


    Für Zeitmessungen sollte man `time.monotonic()` verwenden.


    `abschaltzeit` ist undefiniert wenn im ersten Schleifendurchlauf die ``if``-Bedingung nicht zutrifft.


    Zwischenstand (ungetestet):

    Der Code ist so aber nicht gut weil der insbesondere wenn Bewegung erkannt wird den Prozessor wie blöde mit der Hauptschleife beschäftigt, die so schnell wie der Rechner es hergibt die Relais immer wieder anschaltet.

    “I will not sell my kidney on eBay

    I will not sell my kidney on eBay

    I will not sell my kidney on eBay …” — Bart Simpson

  • Dennis89 Was bei gpiozero irgendwo fehlt ist das zeitverzögert etwas gemacht wird. Die Lösungen die man da im Netz findet laufen dann doch wieder auf „busy waiting“ hinaus und sind teilweise IMHO komplizierter als sich mit OOP und Threads auseinander zu setzen.

    “I will not sell my kidney on eBay

    I will not sell my kidney on eBay

    I will not sell my kidney on eBay …” — Bart Simpson

  • Ja, __blackjack__ , dein Code sieht aufgeräumter aus.

    Ich habe eben einfach drauflos gemacht (programmieren brauch ichs nicht nennen, ha ha), und im Moment ist das (fast) das Einzige, was auf dem PiZero läuft - der langweilt sich doch sonst (so wahrscheinlich auch). Aber Spaß beiseite...


    Da ich im Moment sowieso die Abschaltzeit WEIT länger gewählt habe (also etwa 10 Minuten), wäre es für mich ein Leichtes, zB einen sleep(10) einzufügen, während das Relais an ist - Elegant ist das aber auch nicht, was?


    Da ich aber schon bei

    Quote

    Variablen und Hauptprogramm gehören in eine eigene Funktion, nicht auf Modulebene. Alles was Funktionen (und Methoden) ausser Konstanten benötigen, bekommen sie als Argument(e) übergeben.

    passen muss, und die nächsten wahrscheinlich Stunden zubringen werde, herauszufinden, was du damit meinst, bin ich leiiider hier überfragt. Schade.


    Ich danke dir wirklich sehr fürs Aufräumen des Codes! Den probiere ich gleich einmal aus.. Und noch ein Dankeschön für die vielen Stichworte, die mich sicher weiterbringen, wenn ich mich etwas einlese.

    Da dies der Grundstein für weitere Automationen ist, bin ich sehr interessiert an der weiteren Entwicklung. Leider kann ich wohl außer bewundernden Rufen nicht viel beisteuern..

    Dennis89 Ich freue mich wirklich über das gemeinsame Rätselraten, vielen Dank!

  • Hallo,

    Leider kann ich wohl außer bewundernden Rufen nicht viel beisteuern..

    Da es mir so vorkommt, als wenn du auch gerne Python lernen willst, kannst du mit dem offiziellen Python-Tutorial mal anfangen.


    Weiterhin viel Erfolg.


    Grüße

    Dennis


    Edit: Link angepasst. Danke Bamboleate

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

    Edited once, last by Dennis89 ().