convert in skin.xml

  • Hallo,
    wenn ich in den Convert Ordner einen eigenen .py erstelle, und im skin.xml
    es mit widget einfüge, dann funktioniert es auch.
    Aber was ich noch nicht herauslesen konnte war, was das rot markierte zu sagen hat:


    <convert type="meinconvert">Reference</convert>


    Was hat der abschnitt zu bedeuten, ist das nur ein Platzhalter?
    Vielen dank.

  • Das ist kein Platzhalter sondern das was dir der Converter ausgeben soll bzw. ausgeben kann,in deinem Beispiel mit der "Reference" wird das zb. bei Piconanzeige genutzt und der Converter zeigt anhand der Ref das Picon .


    <widget position="1675,120" render="Picon" size="220,132" source="ServiceEvent">
    <convert type="ServiceName">Reference</convert>
    </widget>

  • Aber wenn ich da irgendein Irrsinn hin schreibe, dann wird z.B. auch ein Text angezeigt.

  • Das ist der Steuercode für den Converter, den er intern auswertet und dann entsprechend des angegebenen Steuercodes den passenden Wert zurückliefert.


    Kommt ganz auf den Converter an, wie der die zulässigen Steuercodes auswertet.
    Kann ja sein, dass er immer einen Standardwert zurückliefert, egal was man da angibt.


    hier am Beispiel des ServiceName-Converters:


    <convert type="ServiceName">Name</convert>


    Da wird in Zeile 13-18 der Steuercode ausgewertet:
    http://git.opendreambox.org/?p…573d1d6;hb=refs/heads/4.3


    Die Rückfallebene, egal was ich angebe, ist dann immer der "Name"-Rückgabewert.
    Weitere zulässige Steuercodes wären "Provider" und "Reference".

    Gruß
    Sven

    Edited 2 times, last by Sven H ().

  • Damit es eine Methode unter @cached ausgeführt wird, muss es die variable "text" sein.


    Beispiel:


    Code
    text = property(getText)


    Wo ist das definiert, dass es immer text sein muss und auch immer eine property?


    Frage 2: hat der ´source="xxxxx"` eine besondere Bedeutung?


    Es geht darum, das ich alles genau machen möchte und nicht nur "es läuft doch..."

  • Das "text" ist in der skin.py fest definiert.
    http://git.opendreambox.org/?p…8;hb=refs/heads/4.3#l1036


    Darüber wird in jedem Converter der Wert aus der Source in den gewünschten Text zur Ausgabe im Screen konvertiert.
    Was bei property in Klammern steht, ist dann die eigentliche Funktion im Converter, die dabei über "text" aufgerufen wird.


    Die Source liefert die Datenbasis für den gewünschten Rückgabewert.
    Daher muss die Source auch immer zum Renderer/Converter passen, so dass man da nicht wahllos irgendeine Source verwenden kann.


    Wobei im Renderer im changed() auch noch die Werte wie text (und in anderen Fällen auch value) aus dem Converter abgefragt werden.
    http://git.opendreambox.org/?p…dd1;hb=refs/heads/4.3#l40


    Auch muss die Source im Plugin entsprechend bereitgestellt werden.
    Im konkreten Beispiel ist es die Source "ServiceEvent":
    http://git.opendreambox.org/?p…5b7bb71;hb=refs/heads/4.3


    Diese wird im Plugin dann so bereitgestellt:
    self["ServiceEvent"] = ServiceEvent()


    Wobei der Text in den eckigen Klammer, den Text darstellt, den man im Skin-Widget bei source angibt.


    So hab ich das zumindest verstanden ;)
    Ich hoffe, ich hab da keinen Müll erzählt.
    So 100% hab ich das auch noch nicht begriffen. Ich lass es dabei dann meist bei "es geht doch".

    Gruß
    Sven

    Edited 3 times, last by Sven H ().

  • Vielen dank für die Ausführliche Erklärung.


    Welcher Source wäre bei einen Bild oder Text Anzeige der richtige?


    Ich blicke (trotz Anschauung der einzelnen Sources) nicht durch.

  • Ich möchte in der infobar einen Text angezeigt bekommen, das klappt auch.


    Nur wegen welche source ist für so etwas das richtige? Geht nur um das Prinzip.

  • Also geht es dir weniger um das Erstellen eines Plugins mit Anbindung an den Skin, sondern du möchtest einfach nur den Skin für vorhandene Dinge (hier InfoBar) für dich anpassen.


    Leider ist deine Aussage immer noch nicht konkret genug.


    Einen eigenen Text kann man in einem Screen wie folgt ausgeben:
    (da braucht man keine Source - die benötigt man nur bei widgets mit einem Renderer und ggf. auch Converter)


    Code
    <eLabel text="...Dein Text ..." position="50,40" size="100,35" font="Regular;28" halign="center" valign="center" backgroundColor="background" transparent="1" />


    Deshalb jetzt die Frage, welchen Text willst du in der InfoBar ausgeben?
    Und welchen Code hast du da bereits als Lösung, weil du ja sagst, dass es funktioniert.

    Gruß
    Sven

    Edited once, last by Sven H ().

  • Also, ich lese ein Thermometer aus. Das stelle ich per ip:port bereit. Rufe es per Converter script ab und lasse es mir anzeigen.


    das klappt auch, nur welcher source ist der richtige?


    Aktuelle habe ich einfach einen genommen (session.FrontendStatus).

  • Der converter liest z.B. "18,5 °C" aus, das gebe ich dann in der Infobar als Text aus.


    Ich dachte es gibt für so etwas ein allgemein source.
    Kann man irgendwo nachlesen für was die einzelnen sources gut sind?

  • Also hast du dir einen eigenen Converter erstellt, der dir die Temperatur per IP abfragt und übermittelt.


    In dem Fall kannst du da eine Pseudo-Source angeben, da du ja offensichtlich im Converter keine Source-Daten verarbeitest.


    In solchen Fällen (z.B. VPNInfo) wird oft die source "session.CurrentService" verwendet.


    Entscheidend ist hier jedoch, wie oft der Wert abgefragt werden soll.
    Das ist dann auch von der Source abhängig, die dann ein changed schicken, wenn sich die Source ändert.
    Bei session.CurrentService dürfte das nur beim Umschalten sein.


    Am besten du machst dir einen print-Befehl in den Converter bei getText und schaust dann im telnet livelog, wie oft der Converter aufgerufen wird.


    Ich glaube bei session.CurrentTime wird ständig aktualisiert.
    (also solange der Screen sichtbar ist)


    Du kannst im .__init__ des Converters auch ein eigenes Polling einrichten, so dass du unabhängig von der Source eine Aktualisierung erreichen kannst.


    z.B.
    Poll.__init__(self)
    self.poll_interval = 1000
    self.poll_enabled = True


    Beispiele findest du in anderen Convertern.


    Wobei im konkreten Beispiel session.CurrentService glaub ich ganz ok wäre. Da braucht man auch kein eigenes Poll.
    Denn beim Einblenden der InfoBar wird der Wert auch abgefragt.
    Nur dann eben nicht mehr solange die InfoBar geöffnet bleibt. Da diese aber ja meist nur wenige Sekunden zu sehen ist, sollte das kein Problem sein.

  • Ja genau, ich habe einen eigenen converter angelegt.

    Ich habe es ohne Poll gemacht, und der Wert wird ständig abgefragt und angezeigt, heißt der Text ändert sich auch, wenn die infobar gerade angezeigt wird.


    Als source habe ich "session.FrontendStatus" genommen. Das klappt.

  • Ok.


    Da muss man dann nur schauen, wie systemlastig so ein Converter ist, wenn er dann zu oft aufgerufen wird.


    Das kannst du in telnet dann per top sehen, ob die CPU-Last für enigma2 deutlich ansteigt, wenn die InfoBar zu sehen ist.


    Da kann man dann ggf. nachbessern mit einer anderen Pseudo-Source und evtl. einem Poll.
    Aber bei den wenigen Sekunden, wo die InfoBar zu sehen ist, sollte das kein Problem sein.
    Schwierig könnte es nur werden, wenn die IP mal nicht erreichbar ist.
    Kommt dann wieder auf den Converter-Code an, ob der damit klarkommt.


    Aber das wird sich im Laufe der Zeit schon alles zeigen ;)
    Wenn es Probleme gibt, muss man eben nachbessern.

  • Ich bedanke mich sehr über die kompetenten Hinweise.
    Jetzt habe ich wieder etwas gelernt, danke.