Ankündigung

Einklappen
Keine Ankündigung bisher.

Dreambox Powerstate per XML auslesen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Dreambox Powerstate per XML auslesen

    Hallo,

    ich versuche den Status meiner Dreambox per Openhab auszulesen.
    Auf meiner Dreambox läuft Newnigma 4.
    Es wird unter folgendem Link der Status in einer XML Datei ausgegeben: http://dreamboxip/web/powerstate

    Code:
      
     <?xml version="1.0" encoding="UTF-8"?> <e2powerstate> <e2instandby>true</e2instandby> </e2powerstate>
    Die Konfiguration in OpenHAB sieht folgendermaßen aus:

    Item:
    String Dreambox_Status "Dreambox Standby [%s]" { http="<[http://dreamboxip/web/powerstate:60000:XSLT(dreambox_standby.xsl)]" }

    Sitemap:
    Text item=Dreambox_Status

    configurations\transform\dreambox_standby.xsl:
    Code:
    <?xml version="1.0"?>
     <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
        <xsl:output indent="yes" method="xml" encoding="UTF-8" omit-xml-declaration="yes" />
        <xsl:template match="/">
        <xsl:value-of select="//e2powerstate/@e2instandby"/>
        </xsl:template>
      </xsl:stylesheet>

    Ich vermute der Fehler liegt in der .xsl Datei, allerdings zeigt mir der Debugmodus von Openhab auch nichts hilfreiches an.

    Code:
    09:25:11.224 [DEBUG] [.o.b.http.internal.HttpBinding:160  ] - item 'Dreambox_Status' is about to be refreshed now
    09:25:11.280 [DEBUG] [.i.s.XsltTransformationService:74   ] - about to transform '<?xml version="1.0" encoding="UTF-8"?>
    <e2powerstate>
            <e2instandby>true</e2instandby>
    </e2powerstate>
    ' by the function 'javax.xml.transform.stream.StreamSource@14a61fc'
    09:25:11.337 [DEBUG] [.i.s.XsltTransformationService:89   ] - transformation resulted in '
    '
    09:25:11.338 [DEBUG] [.o.b.http.internal.HttpBinding:194  ] - transformed response is '
    '
    09:25:11.342 [INFO ] [runtime.busevents             :26   ] - Dreambox_Status state updated to
    Wer kann mir einen Tipp geben was ich falsch mache?

    #2
    Falls jemand die Lösung braucht...

    Es geht mit dem http-Binding relativ einfach:
    Code:
    String Dreambox_Powerstate {http="<[http://DreamboxIP/web/powerstate:3000:REGEX(.*?<e2instandby>(.*?)</e2instandby>.*)]"}

    Kommentar


      #3
      Hallo Zusammen,

      ich habe diese Idee vor einigen Wochen schon mal gesehen, und wollte die Idee jetzt auch mal aufgreifen. Das funktioniert soweit auch ganz gut, ich bekomme ein "true" bzw. "false" zurück. Wenn ich jetzt aber den Status in einer Regel verwenden möchte (bspw. um das WZ zu verdunkeln wenn die Box gestartet wird) funktioniert die Abfrage in der Rule nicht.


      Code:
      [B]items: [/B]
      [SIZE=11px]String Dreambox_Standby "Dreambox in Standby [%s]" <video> (Status,Test) { http="<[http://192.168.xxx.x/web/powerstate:3000:REGEX(.*?<e2instandby>(.*?)" ")]" }[/SIZE]
      Code:
      [B]Inhalt der "Powerstate" Seite der enigma2 Box: [/B]
      [SIZE=11px]<?xml version="1.0" encoding="UTF-8"?> <e2powerstate> <e2instandby> false </e2instandby> (==> oder eben auch "true </e2instandby>" wenn die Box im Standby ist) </e2powerstate>[/SIZE] [B]rule: [/B]
      [SIZE=10px]import org.openhab.core.library.types.*[/SIZE]
      Code:
      [SIZE=10px]rule "TV schauen"
      when
      Item Dreambox_Standby changed
      then
      if (Dreambox_Standby.state == "false"){
      logInfo("Multimedia", "vuduo2 eingeschaltet - Status:<"+Dreambox_Standby.state+">")
      } else {
      logInfo("Multimedia", "vuduo2 ausgeschaltet - Status:<"+Dreambox_Standby.state+">")
      }
      end[/SIZE]
      Das Problem ist, dass in dem String über die REGEX nicht etwa "true" gespeichert wird, sondern "true " (mit ein paar Leerzeichen hinten dran).
      Jetzt habe ich eine Weile gesucht und probiert, habe in der Rule auch mit Dreambox_Standby.state.toString experimentiert, habe auch versucht die Reg. Expression weiter zu editieren aber leider ohne Erfolg :-( Aus meiner Sicht gibt es nun zwei Lösungsansätze, entweder gibt es eine Lösung die REGEX so zu schreiben dass nach dem Wort (true/false) abgeschnitten wird, oder die Leerzeichen einfach eleminiert werden, oder ich finde eine Lösung in der Rule die blanks aus dem String herauszulöschen, ich vermute jedoch die Variante mit der REGEX wäre eleganter.

      Da der eine oder andere diese Lösung ja sicher schon im Einsatz hat, wäre ich für Anregungen oder Ideen wirklich sehr dankbar - ich vermute das Problem müsste ja eigentlich bei Euch genau so bestehen, richtig?

      Viele Grüße,
      motto



      Zuletzt geändert von motto; 31.05.2016, 07:06.

      Kommentar


        #4
        Du musst bei String-Vergleichen auf jeden Fall mit toString arbeiten, nicht mit dem State:
        Code:
        if (Dreambox_Standby.state.toString == "false"){
        Wie wäre es mit folgendem REGEX:
        Code:
        { http="<[http://192.168.xxx.x/web/powerstate:3000:REGEX(.*?<e2instandby>(true|false).*?)]" }
        (ungetestet)
        Zuletzt geändert von udo1toni; 30.05.2016, 20:14.

        Kommentar


          #5

          Da fehlt das Ende.
          Code:
          String Dreambox_Powerstate {http="<[http://192.168.xxx.x/web/powerstate:3000:REGEX(.*?<e2instandby>(.*?)</e2instandby>.*)]"}
          Code:
          String Dreambox_Standby   { http="<[http://192.168.xxx.x/web/powerstate:3000:REGEX(.*?<e2instandby>(.*?)" ")]" }
          Meine Rule funktioniert ohne .tostring.


          Code:
          if (Dreambox_Powerstate.state == "false")
          Zuletzt geändert von Brain0verflow; 30.05.2016, 22:18.

          Kommentar


            #6
            Hallo Zusammen, vielen Dank für die Hinweise. Leider bin ich damit jetzt auch nicht wirklich weitergekommen - die Vorschläge haben (bei mir) beide nicht funktioniert.
            Aber ich habe eine Lösung gefunden, die würde ich hier gern kurz skizzieren - vielleicht hilft es früher oder später jemandem weiter.

            Also das Problem waren ja die "Whitespaces" jeweils hinter dem (true|false). Zunächst wollte ich versuchen ob ich nicht mit einem substring arbeiten kann, das funktioniert zwar - ich fand das aber nicht so elegant weil true bzw. false substring 0,3 bzw 0,4 gebraucht hätten - hätte zwar funktioniert aber eben nicht so elegant.

            Was ist aber bislang nicht wusste, dass die Welt quasi nach dem toString noch nicht zu Ende ist :-) Will sagen es gibt noch weitere Funktionen wie beispielsweise das deleteWhitespaces - und das ist die Lösung für mein Problem. Da gibt es auch noch so lustige Funktionen wie Split uvm. das werde ich sicher irgendwann auch mal gebrauchen. Insofern hat sich die Suche und das herumgefummel für mich auf jeden Fall gelohnt :-)


            Code:
            [SIZE=11px][FONT=comic sans ms]rule "TV schauen"
            when
            Item Dreambox_Standby changed
            then
            if (Dreambox_Standby.state.toString.[COLOR=#FF0000]deleteWhitespace[/COLOR] == "true"){
            logInfo("Multimedia", "vuduo2 ausgeschaltet - Status: <"+Dreambox_Standby.state.toString.deleteWhitespac e+">")
            } else {
            logInfo("Multimedia", "vuduo2 eingeschaltet - Status: <"+Dreambox_Standby.state.toString.deleteWhitespac e+">")
            }
            end[/FONT][/SIZE]
            Also vielen Dank für die Gedankenanstöße!
            motto
            Zuletzt geändert von motto; 31.05.2016, 07:06.

            Kommentar

            Lädt...
            X