Favoriten - Python Script ausführen

  • Liebe Leute und Experten,

    ich kämpfe mittlerweilen seit mehren Monaten hart und verbissen mit Kodi und versuche es irgendwie zu bändigen bzw. meine Vorstellungen beizubringen. Vieles habe ich geschafft, vieles geht nicht, aber dann doch noch Workarounds von Workarounds gefunden, inzwischen habe ich mehrere Addons entwickelt und kiloweise Python geschrieben, Skin angepasst, eigene Slideshow gebaut, externe DVD Player entwickelt, usw... Allerdings ich stecke nun seit Tagen mit ein Problem fest, wo ich scheinbar ohne Hilfe wirklich nicht mehr weiterkomme.

    Möchte auch nicht hier lamentieren oder jammern - an sich ein tolles Programm und kann wahnsinnig viel... Und genausoviel kann es nicht oder nicht vollständig oder mühsam bis gar nicht. Natürlich auch noch erschwert dadurch, dass Kodi seit langem gibt und die Forenbeiträge (nicht hier, überall) sind mitunter 10-15 Jahre alt, da ist natürlich nichts mehr gültig, alles ist inzwischen obsolete und redesigned, aktuelle Dokus sind spärlich... Eindeutig eine ausgewogene Hass-Liebe Situation :D

    Mein Wunschvorstellung: ich habe eine einigermaßen aktuellen Kodi unter Windows laufen, meine Scripts bzw. Addons (z.B. für Steuerung von diversen externen Geräten, wie Beamer über COM, Stereoanlage über IR und Licht über Funk) sind über über Skin und eigene Menüpunkte problemlos ansprechbar und funktionieren einwandfrei. Nun habe ich den "Official Kodi Remote für IOS" auf mein Handy installiert und die (Fern-) Steuerung läuft größtenteils, wie ich es mir vorstelle. Da ich aber die eigene Menüpunkte aus dem Skin nicht mit dem Remote ansprechen/ansteuern kann, versuche ich ein paar Befehle in den vorhandenen Favoriten Ordner unterzubringen... Allerdings: ich bringe es nicht zusammen, Einträge aus "Favoriten" auszuführen...

    Mein Addon heißt script.home, extension point, etc. alles da und direkt über Kodi bzw. Skin funktioniert (OnLoad über Skin) einwandfrei. Also zB wenn ich auf Musik gehe, wird der Verstärker angeworfen, wenn aber eine Videowiedergabe startet, dann wird der Leinwand heruntergefahren und der Beamer geht an. Bei Herunterfahren oder Ausschalten kann ich es aber nicht mehr wieder ausschalten, weil der PC einfach heruntegefahren wird, ohne vorher Kodi Fenster zu schließen (wo ich ein OnUnLoad einbauen könnte), also ich würde ein Menüpunkt benöltigen für zB Verstärker aus, ohne dafür den Beamer mit Menü anzuwerfen...

    Ich liste jetzt nicht alle Versuche auf, würde den Rahmen sprengen - im Endeffekt bräuchte ich sowas: RunAddon(script.home,audio,off) oder auch RunScript(special://home/addons/script.home/toggleaudio.py). RunAddon verweigert mit "unknown". RunScript geht, aber reicht keine sys.args weiter ohne args geht ja mein Addon nicht. Runscript mit vollen Pfad oder auch mit special://... zu einem py script habe ich nicht zusammengebracht. Habe so ziemlich mit allem versucht: Pfad mit / oder auch Python style \\, mit und ohne ", quote;, Parameter mit , mit ? mit & mit named=xxx

    Wie kann ich bitte sowas einfaches wie "führe Addon aus mit parameter x, y" oder alternativ "führe Python script aus, von mir aus auch ohne Parameter" erreichen?!

    Ist das eine Enschränkung vom IOS Remote? Bitte, sagt nicht, dass ich mich nun in JSON RPC auch noch einarbeiten muss und auch noch den Remote anpassen soll, Python und Skinning haben mir völlig gereicht [dy]

    Ich danke Euch im Voraus für Tipps, Hilfe oder aktuelle Dokus... Liebe Grüße aus Wien!

  • Vielen Dank,

    ja, Dein Bespiel ist ziemlich genau was ich versuche, halt mit anderen Geräten (teilweise http calls, teilweise COM Port, teilweise IRClient, etc.). Mein addon script.home funktioniert auch, das Problem ist Aufrufen von favourites.xml über IOS Remote.

    Code sagt mehr als Erklärungen:

    Addon.py (Auszugsweise bzw. abgekürzt):
    from lib import automation
    from lib import xbmchelper
    ADDON = xbmcaddon.Addon()
    CWD = ADDON.getAddonInfo('path') # for kodi 19 and up..
    if (__name__ == '__main__'):
       device = str(sys.argv[1])
       command = str(sys.argv[2])
       if device == 'this_or_that':
            #do this or do that
            pass
       elif device == 'scene':
           if command == 'listen':
               automation.execute('audio', 'aux')
            elif command == 'somethingelse'
                #further "scenes" = environment macros
                pass
           else:
               xbmcgui.Dialog().notification('script.home', 'Unknown ' + device + ' command ' + command)
       else:
           automation.execute(device, command)
    # the end!

    Aufruf von Skin geht einwandfrei, zB in MusicOSD.xml - sobald ich auf Musik navigiere, möchte ich, dass der Verstärker angeworfen wird und speichere den derzeitigen Zustand in ein Skin Variable/Setting um später abrufen zu können, ob die Stereoanlage gerade rennt oder nicht:
        <onload>RunAddon(script.home,scene,listen)</onload>
        <onload>Skin.SetBool(Audio_State,true)</onload>

    Auch als Menüpunkt mit Schalter funktioniert fein:

    <control type="radiobutton" id="11144">
        <label>Stereoanlage</label>
        <include>DefaultSettingButton</include>
        <onclick>Skin.ToggleSetting(Audio_State)</onclick>
        <selected>Skin.HasSetting(Audio_State)</selected>
        <onclick condition="!Skin.HasSetting(Audio_State)">RunAddon(script.home,audio,aux)</onclick>
        <onclick condition="Skin.HasSetting(Audio_State)">RunAddon(script.home,audio,power)</onclick>
    </control>

    ...und hier ist, was ich nun versuche zu erreichen über favourites.xml - im Endeffekt dasselbe Button im Remote der mein Addon ausführt:

    <favourite name="Stereoanlage" thumb="DefaultAudio.png">RunScript(script.home,scene,listen)</favourite>

    <favourite name="Stereoanlage" thumb="DefaultAudio.png">RunScript("script.home","audio","power")</favourite>

    2024-10-18 09:30:44.721 T:7812 error <general>: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
    Traceback (most recent call last):
    File "C:\Users\Richard\AppData\Roaming\Kodi\addons\script.home\addon.py", line 17, in <module>
    device = str(sys.argv[1])
    IndexError: list index out of range

    ...also die Aufrufe werden an Kodi weitergeleitet, aber die Argumente nicht, sys.argv wird nicht bestückt

    Versuch, auf Python script auszuweichen:

    toggle.audio.py (Extrascript in Root von Addon, macht mehr oder weniger dasselbe aber kommt ohne Argumente aus)
    from lib import automation
    from lib import xbmchelper
    if xbmchelper.getsetting('audio_state') == 'true':
       automation.execute('audio','power')
    else:
       automation.execute('audio','aux')

    favourites.xml:

    <favourite name="Stereoanlage" thumb="DefaultAudio.png">RunScript("special://home/addons/script.home/toggle.audio.py")</favourite>

    IOS Remote: "Ausführen der Aktion nicht möglich", scheint nicht parsen zu können und mein Call kommt gar nicht bis Kodi durch

    Auch alle weitere Versuche schlugen fehl: batch file über System.Exec, RunAddon statt RunScript, ohne " oder quote; statt ", ', usw...

    Ich bin echt am Verzweifeln damit [cf]

    Einmal editiert, zuletzt von rj65 (18. Oktober 2024 um 10:46)

  • ...ich habe auch schon überlegt ob ich auf **kwargs mit benannten Argumenten umschreibe, vielleich ginge es dann mit RunScript(script.home?device=audio%command=power), aber dazu bin ich im Python noch nicht fit genug und keine Ahnung, wie command line kwargs an __main__ überleitet werden... sys.argv Array erschien mir ausreichend für meine Zwecke und wollte nich unnötig komplizieren...

  • Hmhm, danke, ein weiterer Versuch Wert. Bash und SH sagt mir zwar wenig, ich komme aus der Windows Ecke, aber ich schätze das wird sowas wie ein batch file, vielleicht auch PowerShell... Irgendwie wird es immer komplizierter... Kodi hat Python huckepack, aber um ein Python script auszuführen, muss der remote über JSON RPC ein shell script oder batchfile ausführen der dann an der Python script übergibt [bm]

    ...und wie ich in den andren Thread so flüchtig lese, überall mit anderem Syntax - mal mit mal ohne Leerzeichen, ein CR zuviel, Anführungszeichen, argh

  • Jetzt habe ich im Detail durchgelesen und versucht es zu behirnen.

    Es ist dort wohl gerade anders herum: jemand möchte shellscripts ausführen und es wurde ihm empfohlen statdessen py aufzurufen und von dort weg die shell scripts auszulösen.

    Bei mir scheitert es aber schon am py aufrufen, scheinbar im Remote oder Keyboard ist es anders gelöst als in Favourites? Die m.E. völlig identische Syntax

    <favourite name="Stereoanlage" thumb="DefaultAudio.png">RunScript("special://home/addons/script.home/toggle.audio.py")</favourite>

    wirft nur "Ausführen nicht möglich" und laut log geht gar nicht bis Kodi durch.

    Das einzige das bisher (halb) funktioniert is der Aufruf von der Addon mit

    <favourite name="Stereoanlage" thumb="DefaultAudio.png">RunScript("script.home","audio","power")</favourite>

    DIes erreicht Kodi und führt mein Addon aus (also der Teil mit RunScript("script.home" geht). Die Argumente werden aber nicht weitergegeben (Teil mit ,"audio","power") ist verschluckt und wird nicht an Kodi weitergereicht).

    Mein Addon script.home ist eine Sammelsurium von 12 verschiedenen Geräten, mit mehreren Befehlen, ersetzt im Endeffekt 4 oder 5 verschiedene Fernbedienungen. Natürlich geht sowas nur mit Parameter, wo ich den Addon doch mitteilen muss welches Gerät, welche Taste oder Aktion ausgeführt werden soll.

    Da ein Addon nicht mehrere extension points oder Einstiegspunkte anbieten kann, dennach (Stand bisher) müßte ich für jeden einzelnen Befehl ein eigenes Addon implementieren, ohne Argumente und diese alle einzeln installieren (script.audio.on, script.audio.off, script.beamer.on, script.beamer.off, script.beamer.hdmi, etc. etc.) und dann je danach einzeln aufrufen.

    Das kann doch nicht im Sinne des Erfinders sein...?

    Möglicherweise es handelt sich hier um eine Einschränkung der "Official Kodi Remote for IOS", aber in Apple Store und IOS Entwicklung werde ich mit Sicherheit nicht eintauchen wollen/können. Nachdem das Zeug "official" heißt, werde ich mal versuchen in der Kodi Foundation zu melden und schauen ob es ein bekanntes Problem ist...

    Danke für Eure Mühe!

  • Alles was ich jetzt anhänge ist eine umgeänderte Version vom Beispiel -Addon, welches ich oben verlinkt habe!

    Da ein Addon nicht mehrere extension points oder Einstiegspunkte anbieten kann, dennach (Stand bisher) müßte ich für jeden einzelnen Befehl ein eigenes Addon implementieren, ohne Argumente und diese alle einzeln installieren (script.audio.on, script.audio.off, script.beamer.on, script.beamer.off, script.beamer.hdmi, etc. etc.) und dann je danach einzeln aufrufen.

    Das kann doch nicht im Sinne des Erfinders sein...?

    Du müßtest dir schon nen Menü erstellen und dann über modes arbeiten. Jeder "mode" führt dann dein Befehl aus.

    Verlinken würde ich das ganze dann so: Ins Addon gehen auf Menüpunkt -> Contextmenü -> Zu Favoriten hinzufügen.

    k.A. ob das funzt, habs nur mal kurz dahin gerotzt. Aber so würde ich die Sache angehen (kannst du dir ja anpassen und erweitern):

    default.py

    EDIT:

    Anbei nochmal als komplettes Addon, brauchste dir nur bearbeiten. Nach installation unter Programm Addons zu finden.

  • Vielen, vielen dank, jetzt habe ich wieder einiges dazu gelernt - dynamische Menüaufbau mit ListItems habe ich bisher nicht zusammengebracht bzw. angeschaut. Werde ich mir genau ansehen.

    Inzwischen konnte ich auch mein Problem weiter eingrenzen - es scheint tatsächlich eine Beschränkung der IOS Remote zu sein, auch viele andere Items die ich nicht manuell, sondern über Kontextmenü in den Favoriten ablege, werden nicht bzw. nicht richtig ausgeführt. Demnach habe ich das Problem nicht in Kodi oder Python.

    Heute habe ich ein Workaround gefunden, der so ziemlich alles, was ich je verbrochen habe, übersteigt - wirklich dreckig :P

    Im Endeffekt hier ist der Hund begraben:

    Zitat

    Verlinken würde ich das ganze dann so: Ins Addon gehen auf Menüpunkt -> Contextmenü -> Zu Favoriten hinzufügen.

    Leider spielt hier dann der IOS Remote (trotz "Official Kodi") nicht mit. Folgendes habe bisher genau beobachten können:

    • IOS Remote verweigert RunAddon oder System.Exec oder ExecuteBuiltIn und kann lediglich RunScript ausführen
    • Die Implementation von RunScript führt allerdings nur installierte und richtig registrierte script Addons aus, ein Verweis auf eine beliebige py File oder mit Pfadangaben wird verweigert, es scheint nur RunScript("addonid") können und nichts mehr.
    • Letztens, mitgeschickte Argumente werden nicht weitergereicht, also kommen bei Kodi und dadurch auch in Python gar nicht an.

    Mein Dirty Workaround:

    • Eigene Miniaddon ohne Argumente kann beliebige py File ausführen
    • Diese py File fungiert dann als eigene entry point und kann dann mein Haupt-Addon mit dem gewünschten Argumente aufrufen

    Also ich habe jetzt vier oder fünf "Einzeiler"-Addons gebastelt, wie script.remote.audio, script.remote.beamer, etc. Diese rufen jeweils einen anderen py File auf im Root Verzeichnis meiner Addon zB script.home/toggle.audio.py oder toggle.beamer.py Und toggle.audio.py ruft dann mein Addon direkt mit dem benötigten Argumenten.

    favourites.xml

    <favourite name="Stereoanlage" thumb="DefaultAudio.png">RunScript(script.remote.audio)</favourite>

    script.remote.audio

    import xbmc
    if (__name__ == '__main__'):
       xbmc.executebuiltin('RunScript("special://home/addons/script.home/toggle.audio.py")')

    toggle.audio.py

    from lib import automation
    automation.execute('audio','toggle')

    (in automation.py habe ich der Logik meiner Addon für die Steuerung)

    Wirklich grauslich aber endlich scheint es zu laufen... ich bin sehr gespannt ob ich es in zwei Monaten, trotz ausführliche Kommentare, je wieder kapieren werde, was ich da herumgepfuscht habe...

Jetzt mitmachen!

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