RASPI + Bewegungsmelder > Wiedergabe Audiodatei VLC Player

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo zusammen,


    eines vorweg ich bin blutiger Anfänger und benötige deswegen etwas Hilfe bei folgendem Projekt.


    Hardware:

    Umsetzung auf dem Raspberry Pi 3 mit RPI HC-SR501 Sensor


    Szene:

    Beim betreten eines Raumes, soll per PIR die Wiedergabe einer Audiodatei (bspw. Hörbuch etc.) für X Minuten ausgelöst werden.

    Die Wiedergabe soll bei späterem Betreten des Raumes fortgesetzt werden.



    Folgende Code habe ich aktuell:



    Soweit , so gut... Es wird bei einer Bewegung also eine Datei wiedergegeben. Damit das Script aber fehlerfrei und in vollem Umfang läuft bräuchte ich bei den folgenden Punkten Hilfe:




    1. Jedes mal wenn der Sensor eine weitere Bewegung registriert, wird scheinbar eine zusätzliche Instanz des Players geöffnet und die Datei wird parallel erneut abgespielt, läuft dann also doppelt, dreifach etc. im Kanon

    Es wäre gut, wenn Bewegungen während der Wiedergabe ignoriert werden würden. Sodass nur eine Instanz des Players läuft



    2. Wenn die Wiedergabe nach Ablauf der Zeit pausiert, soll die sie bei einer späteren Bewegung fortgesetzt werden.



    Ich hoffe das ist machbar, und dass ihr mir helfen könnt <3

  • Go to Best Answer
  • Du musst erstmals die Einstellungen des VLC auf

    - nur eine Instanz erlauben

    - Play and Exit

    - [Video Off]

    abändern.



    Servus !

    RTFM = Read The Factory Manual, oder so

  • Nur so ein Gedanke... Erstelle das player Objekt mal ausserhalb der Funktion Play(). player musst Du dann natürlich der Funktion übergeben. Was sagt dann in der Funktion in der ersten Zeile print(player.get_state())?


    Evtl. kann man damit den Status von player abfragen und entsprechend starten oder eben nicht.


    Ich kann es leider gerade nicht selber testen.

    • Best Answer

    Hallo,

    Sodass nur eine Instanz des Players läuft

    dann solltest du, wie schon erwähnt, auch nur eine Instanz des Players erstellen. Du erstellst aber mit jeder erkannten Beweung eine neue Instanz -> Zeile 11.

    Mit 'set_pause' kannst du pausieren (1) oder die Wiedergabe wieder fortzsetzen mit (0). Ich würde hier das "normale" 'pause' verwenden oder einheiltich mit 'set_pause' die Wiedergabe starten, pausieren und wieder starten.


    Im Allgemeinen würde es sich anbieten anstatt 'GPIO' gpiozero zu benutzen. Damit schreibst du viel lesbareren Code und die haben schon viel Code vorbereitet. Es gibt Klassen zu Buttons, LED's, Bewegungsmelder etc. die man nur noch benutzen muss.


    'as' ist zum umbennenen da, du nennst GPIO in GPIO um. Besser wäre from RPi import GPIO


    'setmode', 'setup' so wie der try/except Code gehört in eine Funktion. Der darf nicht auf Modulebene (der Code ohne Einrückungen) stehen, denn das ist ausführbarere Code und der soll/darf keinen globalen Zustand haben.

    Auf Modulebene werden nur Klassen, Funktionen, Konstanten (Wi dein 'SENSOR_PIN') und der Einstiegspunkt in die 'main'-Funktion definiert. Hier gehört auch dein Code rein.

    Die Dauerschleife, die gar nichts macht und nur ununterbrochen durchrennt könnte man mit signal.pause() ersetzen. Dann wartet das Programm einfach bis was passiert. Oder du benutzt 'wait_for_'-Funktion der jeweiligen gpiozero-Klasse.

    'GPIO.cleanup' sollte auch aufgerufen werden, wenn dein Skript beendet wird, dazu gibt es 'finally'. Auch das wird bei 'gpiozero' nicht benötigt, bzw. wird intern erledigt.

    Funktionen werden nach ihrer Tätigkeit benannt und die Namen schreibt man klein_mi_unterstrich.

    Der Pfad wäre auch ein Kandidat für eine Konstante und Pfade gibt man üblicherweise nicht als String an, da sie andere Eigenschaften wie Strings haben. Dafür gibt es das 'pathlib'-Modul. Wichtig ist das, wenn du mit Pfade arbeitest.

    Die letzte 'print'-Ausgabe macht nicht viel Sinn, du hast keine Zeitmessung, die misst, wielange keine Bewegung mehr erkannt wurde. Wenn du die hättest gehört die auch nicht in die Funktion. Sonst würde die Funktion heißen 'play_media_and_after_that_do_meassurmet_time_until_next_detection' oder so ähnlich. Funktionen konzentrieren sich auf eine Aufgabe und werden so geschrieben, das man die eine Aufgabe auch unabhängig von all dem anderen Code testen kann.


    Ungetestet:

    Grüße

    Dennis


    P.S. Wenn es zu Problemen mit dem Sonsor kommt, achte auf die Parameter die man bei 'MotionSensor' noch angeben kann. Und schau ob du damit dein Problem in den Griff bekommst. Aktuell ist alles auf den default-Werten.

    🎧 Mein Auto springt, mein Toaster kocht, es zwickt mich im Genick. Meine Frau ist eingelocht, die Spülmaschine tickt. Meine Telefonapperat brüllt mich seit Tagen an, er ist schon lange abgestellt im Bett liegt Peter Pan. Die Uhr geht falsch, die Haustür singt, mein Spiegel schlägt zurück - Ich werde noch verrückt, was solls ich bin entzückt. Die Badewanne zieht nicht ab ihr glaubt nicht was ich seh' - Sie ist voll Himbeerengelee 🎧

  • Wow, der Code funktioniert einwandfrei :danke_ATDE:


    Vielen Dank, dass du dir die Zeit genommen hast mir alles so ausführlich zu erklären, jetzt ist mir alles etwas klarer... aber ich muss wohl noch sehr viel lernen

  • Das freut mich.


    aber ich muss wohl noch sehr viel lernen

    Python hat ein offizielles Tutorial, es hilft wenn man das mal durchgearbeitet hat:

    https://docs.python.org/3/tutorial/


    Grüße

    Dennis

    🎧 Mein Auto springt, mein Toaster kocht, es zwickt mich im Genick. Meine Frau ist eingelocht, die Spülmaschine tickt. Meine Telefonapperat brüllt mich seit Tagen an, er ist schon lange abgestellt im Bett liegt Peter Pan. Die Uhr geht falsch, die Haustür singt, mein Spiegel schlägt zurück - Ich werde noch verrückt, was solls ich bin entzückt. Die Badewanne zieht nicht ab ihr glaubt nicht was ich seh' - Sie ist voll Himbeerengelee 🎧

  • Ich muss mich hier leider doch nochmal um -Hilfe bitten.

    Ich habe schon vor einiger Zeit festgestellt, dass das Script zwar eigentlich richtig funktioniert, wenn allerdings das Ende des Liedes erreicht ist, wird die Wiedergabe bei erneuter registrierter Bewegung aber nicht einfach wieder vom Anfang gestartet. Stattdessen bleibt der Raspi stumm. Die Bewegungen werden weiterhin registriert, also hat sich das Script schonmal nicht aufgehängt.

    Ich bekomme das leider nicht selbständig in den Griff :(

  • Die normale MediaPlayer-Instanz fängt nicht wieder automatisch beim ersten Track an, wenn das Ende erreicht ist.
    Ich habe es hier mal als Klasse implementiert. Der Code ist nicht komplett getestet.


    Verwende zum Testen am besten eine sehr kurze Audiodatei. 10 Sekunden sind schon genug zum Testen.

  • Muchas gracias :love: . Die ersten Tests waren erfolgreich.

    Ich teste mal etwas längere Tracks und schau mal ob es stabil läuft... Ihr seid meine Helden