Zeitgeschalteter Code

  • Hallo zusammen!

    Vor einiger Zeit habe ich ein kleines Projekt mit dem Raspi 3+ realisiert: Der Pi gibt über eine angeschlossene Aktivbox zufallsbasiert Audiodateien aus. Ein verschalteter PIR-Sensor wird bei Bewegung getriggert und startet im Sketch einen Programmteil, welcher eine Audioausgabe bewirkt. Das Setup ist 24/7 am Strom und im WLAN.

    Nun möchte ich meinen Sketch um eine Zeitschaltuhr erweitern. Die Idee dahinter ist, dass der Pi über Nacht (22:00-08:00) keine Audioausgabe tätigt. Hat jemand eine Idee zur Umsetzung, ein Modul welches mir hilft oder andere Ideen? Den bisherigen Sketch linke ich unten. Er funktioniert fehlerfrei. Besten Dank im Voraus! :shy:


    Edited once, last by LaZZeR ().

  • LaZZeR

    Changed the title of the thread from “Zeitgeschalteter Sketch” to “Zeitgeschalteter Code”.
  • Post by SteepBrook64153 ().

    The post was deleted, no further information is available.
  • Du musst noch schedule und GpioZero installieren wenn noch nicht vorhanden.


    Code
    pip3 install schedule
    Code
    pip3 install gpiozero


    Teste das Script aber nicht steinigen. Hab's gerade mühevoll mit dem Telefon zusammen geklöppelt.


    Brauchst du os und subprocess für den Player?

    Edited once, last by keepfear ().

  • Hallo,

    aber nicht steinigen.

    Pssst: Da fehlt der Aufruf der 'main'-Funktion. (*ganz klein laut*)


    'os' wurde durch 'pathlib' ersetzt, das steht auch in der Dokumentation. Dann kann man damit gleich die Pfadangabe des Musik-Ordners als Konstante 'PLAYLIST_PATH' definieren.

    Ob ein Sensor eine Konstante ist, ist vielleicht auch Geschmackssache, ich persönlich hätte den Pin als Konstante definiert und den Sensor dann in der 'main' an einen Namen gebunden.

    Strings bastelt man nicht mit '+' zusammen, das kann man mit f-Strings machen oder in dem Fall gleich das importierte 'pathlib' nutzen.

    Die zufällige Auswahl fand ich mit 'os' zwar schöner, aber vielleicht habe ich die richtige Funktion von 'pathlib' nur nicht gefunden.

    Hier meine Version, ungetestet:


    Am Laptop bestimmt wesentlich einfach, als am Handy, dort hätte ich nicht den Nerv dazu gehabt ^^


    Grüße

    Dennis

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

    Edited once, last by Dennis89: Code angepasst, Danke hyle ().

  • Danke für eure Antworten und die Mühe, den ein oder anderen Code zu schreiben (egal ob übers Handy oder Laptop ;) )
    Dennis89 dein Code ist sehr viel sauberer als meiner, daher hab ich ihn einfach mal übernommen und getestet. Einiges hat schon geklappt, ich bin aber noch nicht am Ziel.

    1. Das gpiozero Interface ist installiert und arbeitet wie ich es beurteilen kann korrekt (Habe mir einen Trigger über eine Print-Ausgabe in der Main ausgeben lassen)
    2. Auch die schedule library ist installiert und funktioniert

    Nun zu meinen Problemen:

    1. Ein Trigger wird zwar erkannt und ausgegeben, es wird jedoch kein Song abgespielt (hier weiß ich nicht, ob es an der Übergabe der Methoden scheitert, oder die play_song() Methode selbst probleme bereitet).
    2. Über die schedule Funktion ist es mir bislang nicht gelungen, eine dauerhafte Triggerabfrage zu coden. Innerhalb der definierten Zeit (08-22 Uhr) funktioniert der Trigger also nur einmal, anstatt - wie in meinem alten Code - nach jedem abgespielten Song (+180s Delay) einen neuen Trigger zu erwarten.

    Habt ihr Ideen zu verbesserung? Unten wie immer der Code, mit dem ich aktuell arbeite. Danke euch!


  • Hallo,


    was ich an deinem Code nicht verstehe, wieso änderst du die Konstante 'MOTION_PIN' in 'pirPin'? Das stimmt zum einen vom Namen her nicht, weil du damit keinen Pin zuweist und Zeile 29 ist überflüssig, da du den Sensor ja mit 'pirPin' als Konstante definiert hast. An der Stelle, Konstanten schreibt man in Python GANZ_GROSS, Klassen in CamelCase-Schreibweise und den Rest klein_mit_unterstrich.

    In Zeile 16 sollte choosen_song = choice(playlist) stehen, da wir das ja direkt importiert haben und nicht extra über 'random' ansprechen müssen. Da hättest du eine Fehlermeldung bekommen müssen(?).

    Mit Zeile 30 wartet dein Code bis eine Bewegung erkannt wird, bevor 'schedule' definiert wird. Das macht so nicht viel Sinn.

    In der Dauerschleife (while True) wird dann ja nach schedule-Einstellung die entsprechende Funktion aufgerufen.

    Dass das nur ein mal funktioniert liegt an dem 'day.at("08:00")'.

    Du brauchst etwas das einen Zeitraum definiert.

    Schau mal hier unter 'Run a job until a certain time'.


    Grüße

    Dennis

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

  • Ich hab das ganze jetzt mal mit meinem Script aus Post 4 nachgebaut.


    Immer wenn ein Song ausgewählt wird dauert es so ca. 1-2 min. bis der Player läuft.


    Ich dachte mir jetzt vllt blockiert da irgendwas (eventuell der Player).

    Daraufhin hab ich das Schedule-Zeugs und den Player in einen eigenen Thread gepackt.

    Läuft aber auch nicht viel schneller. :lol::lol::lol:


    Zwischenstand:


    Wenn du das Script startest läuft der Player sofort, wenn du das nicht möchtest musst du die Zeile mit pir.when_motion = play_song in der Main-Funktion auskommentieren aber grundsätzlich läuft das Script. Musst halt nur ewig warten bis der Player läuft. Wie gesagt ca. 1-2 min. warten und es geht weiter. Keine Ahnung woran das liegt. :no_sad:


    Ich hab jetzt keine Zeit mehr um das Script von Dennis89 zu testen aber vllt macht das ja auch der Dennis für mich. ^^

    Geht sicher auch schöner, muss erstmal los.

    Edited once, last by keepfear ().

  • Hier, rennt wie Hanne.


    Wenn du das Script startest wird aufjedenfall ein Lied spielen. Da der Thread dann angeschmissen wird.


    Es könnte durchaus passieren das wenn ein Lied läuft und der Pir während dessen eine Bewegung erkennt ein weiteres Lied startet. Gibt gutes Kauderwelsch in den Ohren.

    Entweder du schraubst die Wartezeit am Pir bis auf Anschlag hoch, spielst mit der Wartezeit im Script rum oder erstellst noch eine Bedingung das der Player erst wieder starten darf wenn das Lied zu ende ist.

    Ansonsten lief das jetzt alles recht flüssig.

    Ausgabe:


    Dass das nur ein mal funktioniert liegt an dem 'day.at("08:00")'.

    Du brauchst etwas das einen Zeitraum definiert.

    Ich weiß gerade nicht so ganz wie du das meinst aber ab 8 Uhr wird ja die Funktion bewegung_erkennen_einschalten augerufen und der Callback zur Funktion play_song gesetzt. Der Pir reagiert dann so lange bis der Callback auf None gesetzt wird, also ab 23:45 Uhr. Danach ist ruhe.

    Von 8:00 - 23:45 Uhr wäre dann dein Zeitraum für an und danach für aus.


  • Hallo,


    keepfear das mit dem Zeitraum habe ich falsch interpretiert. Danke für die Info.

    Ich wäre deiner Bitte auch gerne nachgekommen meinen Code zu testen, habe leider keinen passenden Sensor hier liegen.


    Aber schön dass dein Code funktioniert, einer sollte ja reichen ^^


    Grüße

    Dennis

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

  • Hallo,


    aber vllt macht das ja auch der Dennis für mich

    habe das jetzt mal gemacht. Da ich keinen Sensor habe, hatte ich Ihn simuliert (die entsprechenden Zeilen sind kommentiert).

    Mir hat der verwendete Player aber nur Ärger bereitet und auch das Problem mit der Überschneidung, die du angesprochen hast, hat mich gestört.

    Daher bin ich auf den vlc-Player umgestiegen und habe eine Abfrage eingebaut, damit immer nur ein Lied abgespielt wird. Ich weis ja nicht was da für Musik kommt, ich bin jetzt einfach mal davon ausgegangen, dass nur ein paar Sekunden ein Sound abgespielt werden soll.


    Dabei ist folgendes Skript entstanden:

    Wenn das Jetzt natürlich nach 8 Uhr gestartet wird, dann läuft an diesem Tag kein Sound. Das muss beachtet oder geändert werden.


    Grüße

    Dennis

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