addon script GPIO.add_event_detect callback löst nicht aus

  • Hallo Forum,

    habe in kodi (17.6) unter raspbian strech desktop das folgende addon service script installiert. Leider wird die callback methode nicht gerufen. Unter Linux in der Kommandozeile geht es.

    Der add_event_detect wird offensichtlich ausgeführt, jedoch kommt es nie zur Ausführung des in der callback Methode definierten codes.

    Mein script:


    und die XML dazu:


    Danke euch im voraus, hoffentlich kann mir jemand weiterhelfen, es ist ein Geburtstagsgeschenk für meinen Sohn, der wegen einer Behinderung eine normale Stereoanlage nicht bedienen kann.

  • Bitte gewöhne dir an das [code] Tag zu benutzen :)
    Es ermöglicht unter anderem Syntaxhighlighting und ist zudem auf und zuklappbar.

    --------------
    Guides nicht mehr verfügbar wegen Youtube unvermögen guten von schlechten Kodi Videos zu unterscheiden.

  • Bei RPi und GPIO bin ich eigentlich raus. Allerdings:

    - Liegt die pir.py (so sollte dein Script lt. addon.xml heissen) mit im Addon-Verzeichnis?

    Code
    try:
    ...while True:
    ......#	print(time.time())
    ......time.sleep(1)
    except KeyboardInterrupt:
    ...print("Beende...")

    Der Code ist eher suboptimal, für ein Service-Addon wird empfohlen, mit xbmc.Monitor.WaitforAbort(int time) zu arbeiten:

    Code
    while not xbmc.Monitor.waitForAbort(1):
    
    
    ...
    
    
    GPIO.cleanup()

    Auch würde ich keyboard.press_and_release(77) durch einen JSON-Aufruf(next) ersetzen, da die Taste in verschiedenen Menüs unterschiedliche Bedeutung haben kann - allerdings löst das auch nicht Dein Problem.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960

    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • Hab leider mein Leben verskillt. Ich kann von allem ein bisschen, aber nichts gscheid.

    Kann leider nicht helfen.

    "I don't caretaker"

    SKIN: Embuary - Donate: HIER de Hoibe bestellen, merci :thumbup:

    Devices: Nvidia Shield + Fire TV 4k --- NAS: i3 6100 | 8GB | 15tb | OMV4 | Emby --- TV: Sony 55" XF9005 + LG 47" LM640S | 114x Adalight | Yamaha 683

  • Hallo

    Ich klinke mich hier mal mit ein, weil es spannend klingt ;)

    Der add_event_detect wird offensichtlich ausgeführt

    Was veranlasst Dich zu der Annahme?

    Ist der Input richtig konfiguriert (inklusive Pullup oder Pulldown)? Ich sehe im obigen Code nichts davon.

    Kann Pin 23 überhaupt als Input verwendet werden oder liegen da ggf. noch andere Funktionen drauf?

    Hast Du schonmal in einem ganz normalen Polling (z. B. mit while(true)) probiert, ob Du die Zustände des Inputs korrekt lesen kannst?
    Sowas wie:

    Python
    while 1:
     if GPIO.input(channel):
      print('Input was HIGH')
     else:
      print('Input was LOW')
     time.sleep(0.01)


    Werden unerwünschte Seiteneffekte (wie z. B. "Prellen" des Inputs) irgendwie abgefangen (entweder per Software oder per Hardware)? Ich sehe im obigen Code nichts davon, dann wird softwareseitig scheinbar nicht entprellt.

    Läuft der funktionierende Code per sudo oder auch als normaler user ohne root Rechte? Kann mich an was erinnern, dass /dev/gpiomem root Rechte braucht, um direkt auf die Hardware des RPi zugreifen zu können.

    Bitte auch ans "richtige" Einrücken von Code denken. Soweit ich weiß (komme eigentlich aus der C-Welt) wird bei Python immer in 1-er Schritten oder Vielfachen von 8 Leerzeichen eingerückt.

    Ein paar mehr Infos, bitte!

    OpenELEC 5.0 Final (5.0.7 / 5.0.8 github) | SolidRun CuBox-i4Pro (CPU: ARM Cortex A9 | GPU: Vivante GC2000)
    Kein kodi.log => Kein Support! | Spendier' mir ein Bier!

    3 Mal editiert, zuletzt von root2 (3. Juli 2018 um 15:23)

  • Dies ist meine funktionierende Lösung. Leider fehlt die Ausgabe des übersprungenen Musikstücks. Vielleicht hat jemand eine Idee?

    Danke euch.

  • 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.

  • Habe gerade keine Lösung, sorry, aber mal den Quellcode farbig formatiert. Das kannst Du auch selbst machen, wenn Du "Python" als Code angibst :)
    Das macht es für die Leser etwas einfacher den Code zu überblicken.

  • Jetzt ist alles bestens, bis auf die fehlende Abort-Behandlung. Soll Kodi beim Verlassen also weiterhin das script nach 5 Sec killen, macht fast gar nix.

    Offen ist auch die Frage, warum häufig audio not playing erkannt wird, das aber nur aus akademischem Interesse.
    Dumm ist auch, dass ich 2 Bedingungen für die Bewegungserkennung habe, das kostet unnötige Resourcen, zumal die If-Abfrage ja ständig wiederholt wird.

    Ich lass es jetzt erst mal so, verbessern kann ich immer noch, Hauptsache es läuft.

    Das ganze Projekt stelle ich später als ganzes vor.

    Danke euch allen und liebe Grüße

  • du solltest bei "waitForAbort" nicht "monitor" übergeben sonder die Zeit die gewartet werden soll.

    probier mal sowas

  • du solltest bei "waitForAbort" nicht "monitor" übergeben sonder die Zeit die gewartet werden soll.

    probier mal sowas

    xbmc.Monitor.waitForAbort(1) gab bei mir eine exception, es werde kein integer verlangt, sondern ein object. daher meine Anpassung, die ja funktioniert, wenn auch nicht ohne Nebenwirkungen...

  • das hier ein Objekt benötigt wird wäre mir neu
    https://codedocs.xyz/xbmc/xbmc/grou…06abcda904e8249


  • Die richtige Syntax sollte sein:

    Code
    xbmc.Monitor().waitForAbort(1)

    Normalerweise bildet man eine Instanz des Monitorobjektes, da wandern dann die Klammern mit.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960

    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!