[HOWTO] Wie erstelle ich ein WAP-Interface mit der DM7025 (System der XML-Dateien)

  • Moin Leute,
    Ich hab mir mal gadacht das ich mal eine bestimmte eingebaute Funktion des Webinterface der DM7025 mal etwas genauer erleutere um evtuell jemanden zum mitmachen bewegen kann.


    Diese bestimmte Funktion betrifft die *.xml-Dateien in dem Ordner $PLUGINDIR/web/ . Und zwar denke ich, das diese Funktion viel mehr genutzt werden kann als bisser bekannt ist.


    Vielleicht eins vorweg: Das WebIf, so wie ihr es derzeit kennt, teilt sich in zwei Teile:
    das Frontend (Client):
    Das sind alle Dateien im Verzeichniss $PLUGINDIR/web-data, das unter der URL http://dm7025/webdata erreichbar ist. Diese Oberfläche besteht aus einer statischen Seite (index.html) und jeder Menge JavaScript. Im Endeffekt kann man sagen das das Frontend ein Client ist, wie z.B. der TVBrowser einer ist. Mit dem Unterschied das er verwirrender Weise gleich mit dem Server ausgeliefert wird. Was die Beiden gemeinsam haben ist, das sie beide auf den Server auf das gleiche XML-Interface auf die Box zugreifen.


    der Server:
    Der Server stellt zu aller Erst erstmal einen HTTP-Server zu Verfügung. Das betrifft vereinfacht gesagt alle Python *.py-Dateien auf die ich aber hier nicht eingehe, da das nicht Inhalt meines HOWTO´s werden soll. Was hier nun entscheidend interessiert, ist das Verzeichniss $PLUGINDIR/web/ . Diese Dateien werden vom Server in einer spiziellen Weise behandelt. Zum einen werden diese Dateien ohne die xml Endung aufgerufen... die wird vom Server an die Datei beim Aufrufen einfach hinten dran gehängt.


    So, und nun zum Kern der Sache, den XML-Dateien unter $PLUGINDIR/web/ . Diese XML-Dateien sind sozusagen nur Vorlagen, die der Server beim Aufrufen mit den eigentlichen Daten füllt. Ein Beispiel verdeutlicht das glaube ich besser als langer Text:


    gekürzte $PLUGINDIR/web/timerlist.xml


    Wenn man diese Datei nun über die URL http://dm7025/web/timerlist (wie oben geschrieben fällt die Endung xml weg) erhällt man folgendes Ergebniss:


    Was man hier dran sehen kann ist, das zwischen
    <e2:element source="TimerList" ><e2:convert type="web:ListFiller" > und </e2:convert><e2:convert type="web:TextToHTML" /></e2:element> alles so oft ausgegeben wird, wie es eben Timer gibt. Und die Tags wie <e2:item name="ServiceName" filter="xml"/> mit den entsprechenden Daten des einzelnen Timer ersetzt werden. Was auf den ersten Blick etwas komisch aussieht sind die &lt; . Die sind nötig, damit die Syntax der Datei korrekt bleibt. Hm, etwas schwer in Text auszudrücken... Also das File an sich, nur die Daten als Textausgabe würde so aussehen:



    Wie man hier sieht, ist das ein reines XML-Format. Dies würde eben reinen Text augeben, in dem man nicht wirklich gut einzelne Datenfelder erkennen könnte. Deswegen, und weil es vom Design her so gewollt war, werden zusätzlich in der Datei Angaben gemacht, die in der Ausgabe (das was im Browser ankommt) ausgegeben werden. Und damit die zu Grunde liegende XML-Syntax durch HTML-Tags etc. zerstöhrt wird (XML-Parser-Error), werden die gewünschten zusätzlichen XML-Tags mit &lt; 'maskiert'.


    So, lange Rede kurzer Sinn. Mal angenommen wir wollen eine HTML-Seite erstellen, die immer die aktuellen Timer einhält. Und diese Timer möchten wir in einer knappen HTML-Tabelle darstellen. Also gehen wir folgender Maßen vor:


    1. Wir legen uns ein neues Verzeichniss $PLUGINDIR/web/wap/ an. Ich bleib beim Timerliste-Beispiel und nenne die Datei timerlist.html.xml und speicher sie. Damit kann die Datei in der URL incl. der html-Endung mit http://dm7025/web/wap/timerlist.html.xml aufgerufen werden, Dies hat den Vorteil, das anhand der Extension manchmal entschieden wird, welchen Inhalt die Datei hat und dementsprechend angezeigt wird.


    2. Wir editieren unsere neue timerlist.html.xml und ergänzen erstmal unseren HTML-Kopf:


    Dnun haben wir, wenn wir die Datei mit dem Browser aufrufen, zwar schon eine HTML-Seite, aber die Timerdaten sind noch hümbsch durcheinander gewürfelt. Also müssen wir da noch irgendwie eine Tablelle draus schustern.


    Weiter oben hatte ich ja gesagt, das alles was zwischen <e2:convert type="web:ListFiller" > und </e2:convert> steht, pro Timer wiederholt wird. Und dazu wird alles, was vor oder hinter den <e2:item> steht, mit wiederholt. Also machen wir da vor und dahinter eben unsere Tabellen-HTML-Tags (dran denken das wird < durch &lt; ersetzen müssen):



    So, und wenn wir das nun aufrufen, haben wir eine schöne HTML-Tabelle, die immer unsere aktuellen Timer ausgibt. n ur kann man das dann noch mit StyleSheet-Angaben verhübschen und noch Links zum löschen oder zu weiteren Details einbauen, aber das sind dann nur 'Spielereien' oder besser gesagt Erweiterungen die nach dem gleichen Schema zu bewerkstelligen sind, wie unsere Tabelle.


    Um nun zu gucken, was alles an Daten zur Vefühgung stehen, kann man einfach sich die schon vorhanden XML-Dateien in $PLUGINDIR/web/ anschauen, den Inhalt kopieren und von XML-Ausgabe in HTML-Ausgabe umformatieren. Dabei gibt es nur die Einschränkung, das ein 'TestScreen' (den Namen sollten wir mal bald ändern :) ) und ein <e2:element source=> nur einmal pro Datei vorkommen darf. Mehr geht z.Z. nicht.


    Wo es derzeit evtl. zu Problem kommen könnte, sind die ContentType Angaben im HTTP-Header. Die sind derzeit auf text/xml oä. eingestellt.


    Das schönste an der Sache ist, das man E2 nicht neuzustarten braucht, wenn man eine Datei geändert hat. Um evtl. Fehler in der Datei zu finden, kann es hilfreich sein E2 in der konsole zu starten (init 4, dann kurz warten, enigma2 , und wenn man fertig ist und e2 wieder normal laufen soll init3), da man dann die entspreechenden Meldungen sehen kann. Witziger Weise zeigt Python/Twisted nur einmal einen solchen Fehler an. Weitere Fehler werden erst nach einem Restart von E2 wieder angezeigt.


    So, ich hoffe das ich das einiger Maßen verständlich rüber gebracht habe. Mit diesem System kann man vieles anstellen und jede Menge an verschiedenen Formaten der E2-Daten verwirklichen. Ich könnte mir zb. auch vorstellen, das man pro Client ein einzelnes Verzeichnis anlegt, wo das nur Dateien für diese Schnittstelle drin liegen. ZB. http://dm7025/web/tvbrowser/datenxyz . Aber dazu müssen erstmal genügend andere Interfaces da sein, damit ein Chaos entsteht und man deswegen sortieren muß.


    Mal angenommen jemand von euch setzt sich nun hin und baut ein entsprechendes (z.B. WAP) Interface, bin ich gerne bereit dies auch in das CVS des Webinterface einzufühgen. Müsst euch dann nur entsprechend melden. Und es sollte schon einiger Maßen durchdacht und ausgefertigt sein. Gebt euch Mühe *fg*.


    Für Fragen etc. bin ich gern zu haben, würd mich freuen wenn der Ein oder Andere an der Stelle mithilft ein schönes, geiles und funktionelles WebIf auf die Beine zu stellen... Eins das Reel nie haben wird :))


    Grüße
    3c5x9

    Es heißt auch nicht mehr Troll, sondern Netzbürger mit Frustrationshintergrund.
    <br>
    Leider muß ich es extra schreiben: Kein Support per PM. Privater Support hilft uns nicht weiter als Forum!

    Edited once, last by 3c5x9 ().