[Erledigt]Addon beenden ---> Wert in anderem Addon setzen

  • Hallo Nerds,

    ich mache aktuell die Weiterbildung zum staatlich geprüften Techniker und bin quasi mitten in meiner Abschlussarbeit.
    Ein Teil von meinem Projekt beinhaltet die Programmierung eines XBMC-Addons.

    Nun hab ich schon einige Sachen selbstständig in Erfahrung gebracht, bei einigen Sachen suche ich wahrscheinlich an der falschen Stelle :D

    Nun zu meinem Problem:

    Ich hab ein Addon geschrieben, welches nur zum Einstellen von einigen Paramatern über die GUI ist. Also das Parametermenü ist unter Addon-Einstellungen aufrufbar.
    Ein Paramter soll aber nachdem das Einstellungsfester geschlossen wird in ein anderes Addon geschrieben werden.

    Dachte eigentlich ich mach das mit xbmc.addon.setSetting(). Nur wie weiß ich, wann das Fenster geschlossen wird?

    Wäre euch sehr dankbar, wenn ihr mir hier weiterhelfen oder mir einen Tipp geben könntet =)

    Grüße ShankZ

  • kannst das genauer schildern, das könnten evtl. mehrere gebrauchen (z.B. ich :rolleyes: )
    ich habe das immer so gelöst, wenn ich die Settings direkt aus dem Addon öffne, das die Parameter gleich zur Verfügung stehen
    nach dem open legt Kodi eine Pause ein, bis OK gedrückt wird, erst dann wird die nächste Zeile ausgeführt
    und ohne das sys.exit, wird komischerweise nach ca 10 sek, die Settings auf den vorherigen Originalwert zurückgesetzt

    Code
    def gosetting():
        Addon.openSettings()
        xbmc.executebuiltin('Container.Refresh')
        sys.exit(0)

    gruß Gerhard

  • Um hier nichts durcheinander zu bringen. Ich habe 2 Scripte am Laufen. Das eine lässt sich unter Programme aufrufen und ist nur zum Einstellen von Werten da. Diese Werte werden dann in meinem 2. Script, welches nicht unter Programme geführt wird, sondern im Hintergrund ab Systemstart mitläuft, eingelesen und verwendet.

    Hier mal einen Auszug aus meinem Script. Das Script läuft ab Systemstart alle 10 Sekunden durch die While-Schleife. Vor der While-Schleife wird beim ersten Scriptaufruf der aktuelle Wert "Abdunklung" in die Variable "brightness" geschrieben. Beim ersten Schleifen durchlauf wird der gleiche Wert in die brightness_temp Variable geschrieben. Da die beiden Werte göeich sind, passiert beim ersten Durchlauf nichts. Ändert man nun während der 10 Sekunden Pause den Wert ab, wird der neue Wert beim nächsten Schleifenaufruf in brightness_temp geschrieben. Da der INhalt von brightness und brightness_temp nun verschieden sind, wird der Wert von brightness_temp in brightness geschrieben und der neue Wert von brightness wird nun benutzt, um einen Parameter von einem anderen Plugin zu setzen.
    Eine Änderungen von meinem Parameter wird also im schlimmsten Fall erst 10 Sekunden Später in einem anderen Plugin übernommen. Aber das kann ich verkraften ;)

    Weiß nicht genau ob das genau das gleiche macht wie dein Code Gerhard. Ich weiß auch nicht ob wir beide das gleiche beabsichtigen. Aber es war genau das, was ich gebraucht hab.
    Gruß Tobias

    Einmal editiert, zuletzt von ShankZ (31. Dezember 2014 um 14:34)

  • Also ich hab es mit dem onSettingsChanged gelöst, nur werden bei mir die neuen Settings nicht geladen, wenn ich sie mit getSetting hole.
    Erst wenn ich das addon deaktivere und wieder aktiviere, werden die settings richtig geladen.

    Sehr merkwürdig. Weiß evtl. jemand Rat?

  • Deine while-Schleife im ersten Code-Segment läuft Amok. Da sollte wenigstens ein xbmc.sleep(xxx) mit rein. Dann heißt deine Instanz monitor und nicht __monitor__. --> while not monitor.abortRequested():

    BTW. Bei den vielen globalen Variablen rollen sich nicht nur bei mir, sondern wahrscheinlich auch allen anderen OOPs die Fussnägel ;)

    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

  • sleep ist in der aufgerufenen funktion drin.

    OK, wie kann ichs denn mit den Variablen besser machen?

    Wie kannst du zum Problem helfen?

    edit:
    meinst das hängt mit der monitor / __monitor__ zusammen?
    weiter oben hatte ich noch drin: __monitor__ = xbmc.Monitor()
    da ich jetzt das ändern der settings einbauen möchte.

  • meinst das hängt mit der monitor / __monitor__ zusammen?

    Wirft die Zeile keinen Fehler? __monitor__ hat keine Methode abortRequested. monitor dagegen schon...

    Wie man das mit den globalen Variablen besser machen könnte: Keine verwenden, aber dazu kenne ich deine Projektstruktur nicht.

    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

  • Ich brauche die Variablen nicht nur in der Funktion.

    Na dann definiere sie als Eigenschaften der Klasse.

    class Monitor(xbmc.Monitor):

    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

  • OK, probiere ich morgen mal.
    Kann mir aber nicht erklären, warum es dann gehen sollte.
    Die Funktion zu Settings laden importiere ich aus nen anderen script.
    from resources.lib.events import loadSettings
    oder muss ich innerhalb des scripts ne function schreiben, z.B. relaodSettings, dass es geht?

    Da sich die fußnägel bei dir rollen, traue ich mich gar nicht mein code zu zeigen.habe erst vor 2-3monaten mit python angefangen.
    hatte bisher nur mit vb6 und vba zu tun. und mal wenig c fürn arduino.

    oder muss man die addon instanz neu setzen?

  • Da sich die fußnägel bei dir rollen, traue ich mich gar nicht mein code zu zeigen.habe erst vor 2-3monaten mit python angefangen.
    hatte bisher nur mit vb6 und vba zu tun.

    ;) . Ich habe 2011 mit Python angefangen, da sah mein Code auch nicht anders aus. BTW, VB versaut Dir den Programmierstil in der OOP.

    Die Funktion zu Settings laden importiere ich aus nen anderen script.
    from resources.lib.events import loadSettings
    oder muss ich innerhalb des scripts ne function schreiben, z.B. relaodSettings, dass es geht?

    Hängt wie gesagt von Deiner Projektstruktur und dem Umfang desselben ab. Gerade am Anfang würde ich ein Projekt nicht zu sehr zerpflücken, dann lieber eine Superklasse, die alles kann, alles macht und alles weiß...

    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

  • also unter dem dowhatever() wollte ich es ungern platzieren, weil ich vom serial port lese und unter umständen bremst das aus.
    geholfen hätte es vermutlich auch nicht.

    aber ich habe das problem lösen können.
    da ich zum settings lesen das vordefinierte variabel __addon__ hernahm blieben die settings wohl erhalten.

    jetzt mit der funktion geht es:

    Python
    def getAddonSetting(id):
        setting = xbmcaddon.Addon().getSetting(id)
        if setting == 'true': return True
        if setting == 'false': return False
        return str(setting)
  • __addon__ ist keine vordefinierte Variable. Das ist nur eine Schreibweise für __magische__ Variablen, die im Userspace definiert werden. Bei XBMC/Kodi wird das zur Kennzeichnung eben spezieller Vars aus den Libs xbmc, xbmcgui, xbmcaddon usw. genutzt. Bei meinen Addons/Scripten/Plugins sieht das immer so aus:

    Code
    import xbmc, xbmcaddon, xbmcgui
    
    
    __addon__ = xbmcaddon.Addon()
    __addonid__ = __addon__.getAddonInfo('id')
    __addonname__ = __addon__.getAddonInfo('name')
    __path__ = __addon__.getAddonInfo('path')
    __version__ = __addon__.getAddonInfo('version')
    __LS__ = __addon__.getLocalizedString


    Damit würde Deine Funktion so aussehen:

    Code
    def getAddonSetting():
        # da Python Probleme mit True/true/"true" und False/False/"false" 
        # hat und selbst boolsche Werte in den Settings als String
        # gespeichert werden, mache ich das so:
        setting = True if __addon__.getSetting(id).upper() == "TRUE" else False
        return setting

    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

  • ja schon, bei mir im code ist es auch definiert. ich hatte nur einen auszug meines codes gepostet.
    andere settings, die werte enthalten, werden bei dir nur als False zurück gegeben.
    deswegen bei mir dieses dreifach return.
    aber das upper ist ne gute lösung, hatte ich auch schon überlegt.

    eine frage noch dazu:
    warum muss ich diese variablen nich per global "abholen"
    und was zum teufel ist OOP? :O

  • was zum teufel ist OOP?

    (O)bjekt(o)rientierte (P)rogrammierung ;)


    andere settings, die werte enthalten, werden bei dir nur als False zurück gegeben.

    Ja natürlich, deswegen mache ich das ja auch nur für boolsche Werte. Bei Strings wird das einfach per __addon__.getSetting(id) ausgelesen und bei Integer per int(__addon__.getSetting(id)) gewandelt. Dann gibt es bei mir noch den Spezialfall der 'gemischten' Settings (z.B. '5 min', '10 min', '15 min'), wo nur der Zahlenwert 5,10 oder 15 benötigt wird:

    Code
    setting = int(re.match('\d+', __addon__.getSetting(id)).group())

    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!