Kodi mit Bewegungsmelder ansteuern

  • Auch wenn niemand schreibt:


    Habe es jetzt mit einem kodi addon versucht. Als servic.script definiert, läuft. Nur dass die Bewegungserkennung nicht auslöst. Der add_event_detect wird offensichtlich ausgeführt, jedoch kommt es nie zur Ausführung des in der callback Methode definierten codes. Verdammt, schon wieder klappt es nur fast;-((


    Mein script:

    <<

    import xbmc

    import xbmcaddon


    import RPi.GPIO as GPIO

    import time

    import keyboard


    SENSOR_PIN = 23


    GPIO.setmode(GPIO.BCM)

    GPIO.setup(SENSOR_PIN, GPIO.IN)


    def mein_callback(channel):

    ...print('=============================================================================')

    ...print('===========================Es gab eine Bewegung!==============================')

    ...print('=============================================================================')

    ...keyboard.press_and_release(77) #Pfeil rechts x'4d' = 77



    GPIO.add_event_detect(SENSOR_PIN , GPIO.RISING, callback=mein_callback)


    try:

    ...while True:

    ......# print(time.time())

    ......time.sleep(1)

    except KeyboardInterrupt:

    ...print("Beende...")


    GPIO.cleanup()

    >>


    und die XML dazu:


    <<

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

    <addon id="script.service.playnext" name="play-next" version="0.0.1" provider-name="ej">

    <requires>

    <import addon="xbmc.python" version="2.25.0"/>

    </requires>

    <extension point="xbmc.service" library="pir.py" />

    <extension point="xbmc.addon.metadata">

    <summary lang="en_GB">Bewegungsmelder script</summary>

    <description lang="en_GB">a script to skip playback to the next titel when movement detected</description>

    <language></language>

    <platform>all</platform>

    </extension>

    </addon>

    >>


    Vielleicht antwortet ja dieses mal eine/r?






    Liebes Forum,


    nachdem ich schon seit Tagen gegoogelt und verschiedenes versucht habe, frage ich hier mal um Hilfe.


    Ich möchte einen Raspberry Pi 3B+ (Rasbian strech desktop) mit Hifiberry DAC+ und einem IPR Bewegungsmelder als Jukebox einsetzen. Jedesmal, wenn eine Bewegung erkannt wird (jemand nähert seine Hand dem IPR), soll die Musikwiedergabe auf den nächsten Titel der Playlist springen.


    Habe alle erfolgreich aufgebaut und den IPR mit Nagellack so manipuliert, dass er Bewegungen nur aus einer Richtung erkennt (Richtung, aus der die Hand sich nähert). Damit soll er quasi als Taster fungieren.


    Kodi startet beim Systemstart und spielt die Wiedergabeliste ab. Über das Keymapping addon habe ich der Funktion "next" die rechte Pfeiltaste zugewiesen.



    Alles funktioniert, bis auf die Ansteuerung des kodi. Getestet habe ich mit dem folgenden Python script pir.py, das ich im Homeverzeichnis (Pi) abgelegt habe und das später dann auch beim Systemstart neben Kodi starten soll.


    Leider gehen die Einrückungen hier verloren, habe sie durch ein "..." angedeutet.

    <<

    import RPi.GPIO as GPIO

    import time

    import keyboard

    import subprocess


    SENSOR_PIN = 23


    GPIO.setmode(GPIO.BCM)

    GPIO.setup(SENSOR_PIN, GPIO.IN)


    def mein_callback(channel):

    ...keyboard.press_and_release(77) #Pfeil rechts x'4d' = 77

    ...# print('Es gab eine Bewegung!')

    ...# global starttime

    ...# print "it took", time.time() - starttime, "seconds."

    ...# starttime = time.time()


    #starttime = time.time()

    GPIO.add_event_detect(SENSOR_PIN , GPIO.RISING, callback=mein_callback)

    #subprocess.call('/usr/share/applications/kodi.desktop')

    subprocess.call('kodi')


    try:

    ...while True:

    ......# print time.time()

    ......time.sleep(1)

    except KeyboardInterrupt:

    ...print "Beende..."


    GPIO.cleanup()

    <<


    Der Keyboard.press gibt die Taste natürlich auf der Console aus. Sie muss aber ans kodi geleitet werden. Daher habe ich es darüber versucht, dass ich kodi aus dem script heraus als subprocess starte, nur führt das auch nicht zu einer Weiterleitung des Signals an das Kodi. (Und "subprocess.call('/usr/share/applications/kodi.desktop')" funktioniert nicht, sodass ich eine andere Instanz von Kodi bekomme, ohne meine Voreinstellungen etc.)


    Ich könnte mir 3 Wege vorstellen:

    1. Das signal aus dem Pythonscript wieterleiten ans kodi

    2. Die Bewegungserkennung in das Kodi einbauen (addon?)

    3. Über das Webinterface ansteuern - aus dem Pythonscirpt heraus?


    Leider fehlen mir hier wohl zuviele Kenntnisse über Kodi.


    Ich würde mich sehr freuen, wenn mir jemand eine möglichst fertige Lösung zeigen könnte.

  • Hallo,

    denke das was du versuchst lässt sich hiermit umsetzen:

    https://www.cathyprod.de/blog/…teuern-per-json-und-curl/


    Desweiteren empfehle ich dir statt RPi.GPIO gpiozero einzusetzen, dies ist aktueller, einfacher und wir noch aktiv weiterentwickelt.


    EDIT: Zukünftig bitte Code in Codetags posten!

  • Danke, schau ich mir demnächst mal an, habe meine Lösung bereits umgesetzt. Es fehlt mir nur noch ein Schmankerl: Ich möchte eine Liste der übersprungenen Musikstücke erzeugen.


    Schreibe diese z.B. in eine Datei. Leider geht das scheinbar nur, wenn die Dateioperationen im Main stehen, nicht aber, wenn sie in der callback Routine stehen (gibt eine Exception, der Code dahinter wird nicht mehr ausgeführt, kann leider kein log sehen (kodi.log enthält nichts aus der Callbackroutine).


    Vielleicht kann ich in der callback einen array erzeugen und diesen in der Main in die Datei schreiben. Nur ist der Feldinhalt der in der callback verändert wird ausserhalb nicht sichtbar.

  • Dies ist meine funktionierende Lösung: Es fehlt leider die Ausgabe des übersprungenen Musikstückes. Vielleicht hat jemand eine Idee? :/

  • Habe etwas weiter gearbeitet, diese Lösung funktioniert noch nicht:


    1. Wenn die Schleife eine Endebedingung über den Abort (Verlassen des Kodi) hat - entweder über die auskommentierte Whilebedingung oder mittels des break - werden nur die Start- und die Endezeile in die Datei geschrieben.


    2. Meistens erhalte ich eine Zeile "not playing audio", obwohl die ganze Zeit über Musik läuft (von einer automatischen Playlist). Das auch dann, wenn ich die Bedingung if GPIO.event_detected(SENSOR_PIN) fortlasse. In wenigen Versuchen erhalte ich tatsächlich eine Ausgabe des Musikstückes, dann allerdings in nicht brauchbarer Form:

    Skipped: musicdb://songs/61.mp3?xsp=%7b%22order%22%3a%7b%22direction%22%3a%22ascending%22%2c%22ignorefolders%22%3a0%2c%22method%22%3a%22random%22%7d%2c%22rules%22%3a%7b%22and%22%3a%5b%7b%22field%22%3a%22time%22%2c%22operator%22%3a%22lessthan%22%2c%22value%22%3a%5b%2210%3a00%22%5d%7d%5d%7d%2c%22type%22%3a%22songs%22%7d

    Das ist offenbar die Definition der Playlist.

    Wenn ich nicht die automatische Playlist laufen habe, sondern Musik so laufen lasse, erhalte ich den Dateinamen in der Datenbank, z.B. 24.m4a, auch nicht wirklich ausagekräftig...

    Durch Fortlassen der Abortbedingung erhöht sich die Frequenz der Dateiausgaben erheblich. Damit wird offenbar hinreichend häufig der verklausulierte Dateinamen ausgegeben, sodass das script so belassen werden kann, wenn ich nur den wirklichen Musiktitel nur irgendwie ausgeben könnte.