Taster und Timer in einer Schleife

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

    seit einigen Tagen habe ich einen Raspberry Pi 3 und versuche mich in der Programmierung mit Python3. Die Home-Automatisation plane ich erst einmal in einer "Experimentier-Umgebung" (kleine Taster und LEDs), bevor es an die Umsetzung geht. Ich habe direkt 2 Probleme.:wallbash:

    1. Wird hier ein Taster gedrückt und festgehalten, blinkt die LED, weil die Schleife ja weiter läuft. Wie mache ich das, damit ein Tastendruck immer nur ein einziges mal erkannt wird, für den Fall, das der Taster lange gedrückt bleibt? (Weiteres Problem: Das Licht soll automatisch nach x Sekunden wieder aus gehen, wenn es keiner per Taster aus macht)
    2. Die Bewegung soll durch einen Bewegungsmelder erfasst werden. Das Licht soll dann nach x Sekunden wieder aus gehen. Das kann ich meiner Meinung nach in der Schleife nicht realisieren und bräuchte für diesen Fall ein weiteres Skript ohne Schleife, welches parallel zu dem Skript mit der Schleife für die Taster läuft.

    Ist der Ansatz der Steuerung richtig bzw. sinnvoll? Gibt es Verbesserungsvorschläge? Ich bin um jeden Rat dankbar :)

    Vielen Dank schon einmal im Voraus!

    Mfg berryfox

  • Und du willst die Hausautomatisationisierung in PHP selbst programmieren? Das ist allerdings seeeehr klassisch!

    Hast du dich mal mit bestehenden Lösungen dazu befasst - FHEM und sowas?

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

  • Hallo,


    Gnom: nee, Python 3 - so steht's im 1. Post.

    berryfox: welche Bibliothek verwendest du, um die GPIO-Pins anzusprechen? Vermutlich RPi.GPIO? Dann wechsele auf gpiozero, dass ist a) besser, schöner, moderner und b) und kennt auch Methoden / Events, die z.B. für die Dauer eines Tastendrucks gelten.

    Zum deinem Problem: entweder programmierst du Event-getrieben, nebenläufig oder parallel (oder eine Mischung daraus) - kommt drauf an, was am Ende alles gemacht werden soll. Alles in einer while-Schleife packen, die linear durchläuft wird nicht funktionieren.

    Mehr kann man (ich) im Moment nicht sagen, weil deine Problembeschreibung ein wenig "diffus" ist...

    Gruß, noisefloor

  • Python meinte ich doch. Wer kommt denn auf die Idee, eine Hausautomation in Python selbst zu programmieren?

    Noisefloor, dir ist schon klar, dass jemand, der Schwierigkeiten hat, einen Tastendruck abzufragen und ein Lämpchen zu schalten, mit deinen Fachbegriffen überfordert sein dürfte?

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

  • Python meinte ich doch. Wer kommt denn auf die Idee, eine Hausautomation in Python selbst zu programmieren?

    Kein Ahnung. Grundsätzlich möglich ist es ja.

    Noisefloor, dir ist schon klar, dass jemand, der Schwierigkeiten hat, einen Tastendruck abzufragen und ein Lämpchen zu schalten, mit deinen Fachbegriffen überfordert sein dürfte?

    a) fängt jeder mal klein an und b) sind das nun mal die passenden Begriffe hier. Wenn das jemand (wie z.B. der TE) nicht versteht, also was gemeint ist, dann sind wir der Erkenntnis, dass das Projekt zum aktuellen Zeitpunkt überambitioniert ist, schon mal einen Schritt näher gekommen ;)

    Gruß, noisefloor

    • Offizieller Beitrag

    Hallo berryfox,

    ich versuche auch mal etwas konstruktives zu schreiben und verlinke einfach zu den entsprechenden Seiten von gpiozero. ;)

    https://gpiozero.readthedocs.io/en/stable/reci…-controlled-led

    https://gpiozero.readthedocs.io/en/stable/reci…l#motion-sensor

  • Hallo zusammen,

    1. Wird hier ein Taster gedrückt und festgehalten, blinkt die LED, weil die Schleife ja weiter läuft. Wie mache ich das, damit ein Tastendruck immer nur ein einziges mal erkannt wird, für den Fall, das der Taster lange gedrückt bleibt? (Weiteres Problem: Das Licht soll automatisch nach x Sekunden wieder aus gehen, wenn es keiner per Taster aus macht)
    2. Die Bewegung soll durch einen Bewegungsmelder erfasst werden. Das Licht soll dann nach x Sekunden wieder aus gehen. Das kann ich meiner Meinung nach in der Schleife nicht realisieren und bräuchte für diesen Fall ein weiteres Skript ohne Schleife, welches parallel zu dem Skript mit der Schleife für die Taster läuft.

    Hi berryfox, ich habe auch solch Ideen und kämpfe mit der Umsetzung.

    Wenn ich das richtig verstehe, hast du Taster und Bewegungsmelder die was schalten und das auch automatisch, wenn es nicht ausgeschalten wird, wieder nach bestimmter Zeit ausgehen soll.

    Sicher gibt es fertige Lösungen, aber die kann man auch nutzen, wenn man es selbst probiert hat.

    Ich hatte das mal mit Windows und einer 4 Fach Relaiskarte gemacht fürs Hoflicht.

    Ich würde es so machen, dass jeder Akteur (Taster, Bewegungsmelder oder Button der Homepage)

    - einen Wert 1 in eine Datei schreibt, wenn er das Gerät einschaltet und

    - einen Wert 0, wenn er es ausschaltet.

    Wenn es 2 Geräte/ Lampe sind, dann halt 2 Dateien, die den Zustand wieder geben, ob gerade "ein" oder "aus" ist.

    Du brauchst dann nur deine Schleife, um zu schauen, was gerade in den Dateien los ist.

    Wenn "eingeschalten" ist und deine eingestellte Zeit überschritten wurde (Uhrzeit - Dateiattribut-letzte Änderung)

    - diesen Wert durch die Schleife mit Schaltvorgang auf Wert auf 0 setzen und das Relais bedienen, was das Gerät schaltet.

    Der Vorteil ist, du kannst über verschiede Wege schalten und die Schleife prüft nur.

    Das umsetzen geht auch mit anderen Programmen, es muss nicht Python sein. Aber Klasse Idee:thumbup:

    Gruß Guido

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

  • Danke für die vielen Hilfreichen antworten. Die gehässigen kann ich sehr gut ausblenden!

    Gnom Mit FHEM habe ich mich noch nicht sehr viel beschäftigt, das werde ich nun aber mal tun. Da ich alles über Relais schalten möchte, werde ich keine Funksteckdosen etc. nutzen wollen (Ich glaube, in FHEM geht es genau darum?).

    noisefloor Ja, bisher RPi.GPIO, ich werden mir aber mal gpiozero anschauen. OK, dann liege ich mit meinen Überlegungen ja schon einmal richtig.

    Guido64 Das mit den Dateien scheint mir programmiertechnisch leider nicht so schön zu sein.


    Ja, das hier ist mein erstes Projekt und daher teste ich erst einmal alle Möglichkeiten auf dem Breadboard um festzustellen, ob ich das überhaupt leisten kann und ob ich mit der Thematik zurecht komme. Das es sehr ambitioniert ist, ist mir klar.

  • berryfox man wächst an seinen Herausforderungen, von daher ok.

    Die Sache mit den Dateien schafft Persistenz, d.h. die Schaltzustände können einen reboot oder Stromausfall überdauern. Aber nur wenn das auch vom Programm beim Start behandelt wird.

    Viel Spaß und Erfolg!

    VG

    Leroy

    Optimismus ist nur ein Mangel an Informationen?

  • Hallo,

    Ich würde es so machen, dass jeder Akteur (Taster, Bewegungsmelder oder Button der Homepage)


    - einen Wert 1 in eine Datei schreibt, wenn er das Gerät einschaltet und

    - einen Wert 0, wenn er es ausschaltet.

    Wenn es 2 Geräte/ Lampe sind, dann halt 2 Dateien, die den Zustand wieder geben, ob gerade "ein" oder "aus" ist.


    Du brauchst dann nur deine Schleife, um zu schauen, was gerade in den Dateien los ist.

    Der Ansatz mit den Dateien macht aber nur Sinn, wenn man die Persistenz des Zustands auch über einen Reboot des Systems braucht oder das Skript nicht dauerhaft läuft. Wenn das Skript durch läuft ist der Zustand im Skript so wie so bekannt.

    Ein einfache Datei halte ich auch für einen suboptimalen Ansatz und eine Datei pro Geräte würde ich schon als "broken by design" bezeichnen. Für so was ist es einfacher (und besser), wenn man ein einfaches Key-Value Store nimmt. Davon hat Python standardmäßig ein paar an Bord. Oder, wenn man wirklich nur `True` und `False` speichern braucht, dann geht das mit dem shelve-Modul.

    berryfox: mit dem gpiozero-Modul sollte sich in der Tat ein Teil deiner Probleme lösen lassen.

    Gruß, noisefloor

  • Ich habe zu der Zeit mit der USB Relaiskarte:

    https://www.conrad.de/de/relaiskarte…vdc-393905.html

    über Windows 7 meine Stromstoßschalter:

    Stromstoß-Schalter Hutschiene 1 St. Eltako ES12DX-UC 1 Schließer 230 V/DC, 230 V/AC 16 A 2000 W

    in der E-Verteilung bedient. Der originale Taster kam ab und die Relaiskarte hatte mit Impulse die Funktion übernommen. Mit der Beere gibt es sicher bessere Lösungen, aber mir blieb keine andere Wahl, als das einzuschreiben, um nach dem Neustart zu wissen, ob an oder aus ist.

    Da könnte man selbst den originalen Taster wieder nutzen und den Impulse über GPIO mit erfassen...

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

Jetzt mitmachen!

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