Ankündigung

Einklappen
Keine Ankündigung bisher.

Daten für openHAB aus Webseite grabben

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

    #16
    Und wie bekommt man von dem File
    http://ip_des_Wechselrichters/page.measurements.html/gen.measurements.table.js
    , dass wohl an dieser Stelle verwertbare Daten hat:
    <td>U DC</td><td align='right'> 22.80</td>
    zu einem Binding. Wenn ich das für ein Beispiel weiß, kann ich die Fleißarbeit für die anderen Werte machen

    Kommentar


      #17
      Der passende XPath-Befehl, um an die 22.80 zu kommen, wäre bspw.:
      Code:
      //table[not(@class="invisible")]/tbody/tr[3]/td[2]/text()
      Mit tr[3] springst du in die dritte Zeile, mit td[2] in die zweite Spalte. text() gibt dir schließlich den Wert des Tags aus.

      Das obige Beispiel funktioniert aber nur, wenn der Client, der diesen XPath-Befehl ausführt, vorher auch tatsächlich die Javascript-Datei ausführt, da ansonsten die Tabelle mit deinen Werten nicht im Quellcode auftaucht.

      Das ganze ließe sich dann mit dem HTTP-Binding bewerkstelligen. Die allgemeine Form sieht wie folgt aus:
      Code:
      Number dein_Wert  "Wert 1 [%.1f]" {http="<[http://IP/page.measurements.html:refresh_in_ms:XPATH(//table[not(@class='invisible')]/tbody/tr[3]/td[2]/text())]" }
      // Edit: Eben mal lokal getestet, der openHAB Client führt das JavaScript nicht aus, daher funktioniert der obige Code nicht. Als Alternative könnte man es per Regex probieren, damit kenne ich mich aber leider nicht gut genug aus...

      Kommentar


        #18
        Hab ich das richtig verstanden: Die Webseite, wird sie aufgerufen vom einem Browser lädt doch die html Seite und darin das js File. Hinterher (also nach dem Aufruf) sind die Daten drin - in dem js File?
        Und weil das Ausführen nur im Browser passiert und nicht von OpenHAB getriggert wird, würden da nur alte Daten drin stehen bleiben, es also kein update geben?

        Kommentar


          #19
          Nein nein, ganz so stimmt das nicht.
          Hab ich das richtig verstanden: Die Webseite, wird sie aufgerufen vom einem Browser lädt doch die html Seite und darin das js File. Hinterher (also nach dem Aufruf) sind die Daten drin - in dem js File?
          Wenn du die Seite mit einem Browser öffnest, lädt dieser die JavaScript-Datei und führt diese aus. Das führt dazu, dass zur Laufzeit in den DOM tree neue Knoten eingefügt werden (ergo sich der HTML-Quellcode verändert). In die Javascript-Datei wird nichts geschrieben, das passiert alles nur client-seitig bei dir im Browser.

          Und weil das Ausführen nur im Browser passiert und nicht von OpenHAB getriggert wird, würden da nur alte Daten drin stehen bleiben, es also kein update geben?
          Wenn du das ganze mit dem http-Binding in openHAB machst, dann gibst du ja auch ein Refresh-Intervall mit an, nach welchem die Seite also neu eingelesen werden soll. Ein Update gäbe es also durchaus.

          Das Problem ist, dass openHAB beim Einlesen der Seite kein Javascript ausführt. Da XPath nur auf XML-konformen Dokumenten läuft (.js gehört nicht dazu), muss man also per Regex die Werte direkt aus der .js-Datei auslesen.

          Das ist machbar, aber eben etwas fummeliger...

          Kommentar


            #20
            Zitat von qwasyx Beitrag anzeigen
            Nein nein, ganz so stimmt das nicht.
            Wenn du die Seite mit einem Browser öffnest, lädt dieser die JavaScript-Datei und führt diese aus. Das führt dazu, dass zur Laufzeit in den DOM tree neue Knoten eingefügt werden (ergo sich der HTML-Quellcode verändert). In die Javascript-Datei wird nichts geschrieben, das passiert alles nur client-seitig bei dir im Browser.
            Die js Datei hab ich im Webbrowser angesehen, da standen die Messwerte drin. Aber die js Datei befindet sich doch auf dem Webserver? Wird da diese "unausgefüllte" js Datei vom Server geladen, ausgeführt und ändert sich dadurch der Inhalt?

            Zitat von qwasyx Beitrag anzeigen
            Das Problem ist, dass openHAB beim Einlesen der Seite kein Javascript ausführt. Da XPath nur auf XML-konformen Dokumenten läuft (.js gehört nicht dazu), muss man also per Regex die Werte direkt aus der .js-Datei auslesen.
            Das ist machbar, aber eben etwas fummeliger...
            Oh Mann, fand das mit XPATH schon nicht grad übersichtlich - wenn dabei sogar du ins stolpern kommst. Regex führt dann das Javascript oder einen Teil davon aus?

            Kommentar


              #21
              Zitat von steve7 Beitrag anzeigen
              Die js Datei hab ich im Webbrowser angesehen, da standen die Messwerte drin. Aber die js Datei befindet sich doch auf dem Webserver? Wird da diese "unausgefüllte" js Datei vom Server geladen, ausgeführt und ändert sich dadurch der Inhalt?
              Exakt. JavaScript wird vom Browser ausgeführt, nicht vom Server.

              Gruß,
              thoern

              Kommentar


                #22
                Zitat von steve7 Beitrag anzeigen
                Regex führt dann das Javascript oder einen Teil davon aus?
                Regex steht für Regular Expressions.
                Damit kannst Du aus einem langen Zeichenwust (=.js-Datei) die Dich interessierenden Teile ausfiltern. Das läuft so, dass Du eine eindeutige Zeichenkette in der .js suchst, die vor Deinem gesuchten Wert steht und ansonsten am besten nicht vorkommt. Dann brauchst Du noch eine Zeichenfolge hinter deinem Wert. Was Dich interessiert, ist der Teil dazwischen, der landet dann im Item.

                Kommentar


                  #23
                  Kennst Du ein gutes Beispiel, wo man sehen kann, wie man daraus ein (simples) Binding macht?

                  Kommentar


                    #24
                    Regex wird z.B. zum Konfigurieren von Items verwendet:
                    Code:
                    Number Test            "Test" {http="<[http://f.q.dn/index.htm:5000:REGEX(.*\"Testwert\":(.*?),.*)]"}
                    http://f.q.dn/index.htm ist dabei die Seite, die ausgewertet werden soll.
                    REGEX() bedeutet, dass eine Information extrahiert wird.
                    Der . nach der öffnenden Klammer steht für ein beliebiges Zeichen,
                    der * danach bedeutet, dass das vorangegangene Zeichen (also jedes beliebige) an dieser Stelle beliebig oft (auch null mal!) vorkommen darf.
                    Anschließend kommt mit \"Testwert\": der Begriff, auf den die Regex matcht,
                    danach die eigentliche Information, die im Item landet, die steht in einer weiteren Klammer (.*?) also eine beliebige Anzahl beliebiger Zeichen, aber sowenige wie möglich (das ?),
                    gefolgt von einem , und weiteren beliebigen Zeichen bis zum Ende der Seite.

                    Google liefert an prominenter Stelle RegExr: Learn, Build, & Test RegEx da kannst Du sehr anschaulich sehen und ausprobieren, wie Regular expressions verwendet werden.

                    Hat also erstmal nix mit Bindings zu tun.

                    Kommentar


                      #25
                      Hallo steve7,

                      bist du in der Zwischenzeit schon weiter gekommen?

                      Ich habe meinen Kostal Wechselrichter mit Hilfe des HTTP Binding ausgelesen.
                      siehe hier:
                      https://knx-user-forum.de/forum/supp...nding-auslesen
                      bzw.
                      https://github.com/openhab/openhab/w...a-http-binding

                      Zitat von steve7 Beitrag anzeigen
                      Danke qwasyx.
                      Genau, deswegen wußte ich auch nicht weiter. Ok, mach ich heute abend und aktualisiere den Post damit.
                      ---
                      So, js in txt umbenannt. Leider sind im Moment fast alle Werte ---, nur einer zeigt 22.8V an.
                      Irgendwie muss man sicher auch ein Kommando geben, um auf diese Seite zu kommen, oder?
                      Wenn du zum Beispiel per REGEX die 22.8 V auslesen möchtest, siehrt dies in etwa so aus (nicht getestet):

                      Code:
                       
                       Number Test  "DC Spannung [%.2f V]"  { http="<[[I]Link_zum_Wechselrichter[/I]:30000:REGEX(.*?U DC.*?([0-9.]*)</td>.*)]" }
                      Gruß
                      mepi0011

                      Kommentar


                        #26
                        Hallo, ich würde gern ein paar Daten von der UVR Steuerung auslesen. leider habe ich noch nicht verstanden wie ich nach den entsprechenden Parametern suchen kann. Die Seite ist so aufgebaut:
                        Code:
                         
                         <div class="style1" id="pos01">39,5&deg;C</div> <div class="style2" id="pos02">11,0&deg;C</div> <div class="style2" id="pos03">77,1&deg;C</div> <div class="style2" id="pos04">52,9&deg;C</div> <div class="style2" id="pos05">33,7&deg;C</div> <div class="style2" id="pos06">33,9&deg;C</div> <div class="style2" id="pos07">42,2&deg;C</div> <div class="style2" id="pos08">34,1&deg;C</div> <div class="style1" id="pos09">36,7&deg;C</div> <div class="style2" id="pos10">59,1&deg;C</div> <div class="style1" id="pos11">46,9&deg;C</div> <div class="style1" id="pos12">0%</div> <div class="style1" id="pos13">0%</div> <div class="style1" id="pos14">21,3&deg;C</div> <div class="style1" id="pos15">36,6&deg;C</div> <div class="style2" id="pos16">56,6&deg;C</div> <div class="style2" id="pos17">305,0KWh</div> <div class="style2" id="pos18">2,4KW</div> <div class="style2" id="pos19">200L/h</div> <div class="style2" id="pos20">18,6&deg;C</div> <div class="style3" id="pos21">EIN</div> <div class="style3" id="pos22">AUS</div> <div class="style3" id="pos23">AUS</div> <div class="style2" id="pos24">31MWh</div> <div class="style1" id="pos25">57,7&deg;C</div> <div class="style1" id="pos26">24%</div>
                        die Zahlenwerte entsprechen den Werten welche ich gern in Items schreiben würde.
                        Gruß

                        Guido

                        Kommentar


                          #27
                          Das ist eigentlich ganz einfach.
                          1. http Binding installieren (falls noch nicht geschehen)
                          2. REGEX installieren (falls noch nicht geschehen)
                          3. Einen http-Cache erstellen
                          4. Items anlegen und mit dem Cache koppeln
                          Leider werden die Werte aber mit einem Komma für die Dezimalstellen ausgegeben. openHAB braucht an dieser Stelle einen Punkt als Dezimalstelle. Solange es nur um die Anzeige der Werte geht, könnte man die Werte einfach als String anzeigen lassen:

                          zu 3.: In ./services/http.cfg folgende Zeilen anlegen:
                          Code:
                          # Cache für UVR; Abfrageinterval ist 60 Sekunden
                          uvr.url=http://die vollständige url zur Seite, die ausgewertet werden soll (ohne Anführungszeichen aber mit http://!)
                          uvr.updateInterval=60000
                          zu 4.: in /items/uvr.items (oder als Bestandteil einer anderen *.items-Datei):
                          Code:
                          String uvrPos01 "UVR Pos01 []" {http="uvr:60000:REGEX(.*pos01\">(.*)</div>.*)"}
                          String uvrPos01 "UVR Pos01 []" {http="uvr:60000:REGEX(.*pos01\">(.*)</div>.*)"}
                          String uvrPos02 "UVR Pos02 []" {http="uvr:60000:REGEX(.*pos02\">(.*)</div>.*)"}
                          String uvrPos03 "UVR Pos03 []" {http="uvr:60000:REGEX(.*pos03\">(.*)</div>.*)"}
                          String uvrPos04 "UVR Pos04 []" {http="uvr:60000:REGEX(.*pos04\">(.*)</div>.*)"}
                          String uvrPos05 "UVR Pos05 []" {http="uvr:60000:REGEX(.*pos05\">(.*)</div>.*)"}
                          String uvrPos06 "UVR Pos06 []" {http="uvr:60000:REGEX(.*pos06\">(.*)</div>.*)"}
                          String uvrPos07 "UVR Pos07 []" {http="uvr:60000:REGEX(.*pos07\">(.*)</div>.*)"}
                          String uvrPos08 "UVR Pos08 []" {http="uvr:60000:REGEX(.*pos08\">(.*)</div>.*)"}
                          String uvrPos09 "UVR Pos09 []" {http="uvr:60000:REGEX(.*pos09\">(.*)</div>.*)"}
                          String uvrPos10 "UVR Pos10 []" {http="uvr:60000:REGEX(.*pos10\">(.*)</div>.*)"}
                          String uvrPos11 "UVR Pos11 []" {http="uvr:60000:REGEX(.*pos11\">(.*)</div>.*)"}
                          String uvrPos12 "UVR Pos12 []" {http="uvr:60000:REGEX(.*pos12\">(.*)</div>.*)"}
                          String uvrPos13 "UVR Pos13 []" {http="uvr:60000:REGEX(.*pos13\">(.*)</div>.*)"}
                          String uvrPos14 "UVR Pos14 []" {http="uvr:60000:REGEX(.*pos14\">(.*)</div>.*)"}
                          String uvrPos15 "UVR Pos15 []" {http="uvr:60000:REGEX(.*pos15\">(.*)</div>.*)"}
                          String uvrPos16 "UVR Pos16 []" {http="uvr:60000:REGEX(.*pos16\">(.*)</div>.*)"}
                          String uvrPos17 "UVR Pos17 []" {http="uvr:60000:REGEX(.*pos17\">(.*)</div>.*)"}
                          String uvrPos18 "UVR Pos18 []" {http="uvr:60000:REGEX(.*pos18\">(.*)</div>.*)"}
                          String uvrPos19 "UVR Pos19 []" {http="uvr:60000:REGEX(.*pos19\">(.*)</div>.*)"}
                          String uvrPos20 "UVR Pos20 []" {http="uvr:60000:REGEX(.*pos20\">(.*)</div>.*)"}
                          String uvrPos21 "UVR Pos21 []" {http="uvr:60000:REGEX(.*pos21\">(.*)</div>.*)"}
                          String uvrPos22 "UVR Pos22 []" {http="uvr:60000:REGEX(.*pos22\">(.*)</div>.*)"}
                          String uvrPos23 "UVR Pos23 []" {http="uvr:60000:REGEX(.*pos23\">(.*)</div>.*)"}
                          String uvrPos24 "UVR Pos24 []" {http="uvr:60000:REGEX(.*pos24\">(.*)</div>.*)"}
                          String uvrPos25 "UVR Pos25 []" {http="uvr:60000:REGEX(.*pos25\">(.*)</div>.*)"}
                          String uvrPos26 "UVR Pos26 []" {http="uvr:60000:REGEX(.*pos26\">(.*)</div>.*)"}
                          Das sollte die Werte als String (mit Einheit) separat in Items vorhalten. Wenn Du mit den Werten rechenn willst, wird es komplizierter, aber auch das ist machbar.

                          Kommentar


                            #28
                            Hallo erst einmal vielen Dank bin heute erst aus dem Urlaub zurück und werde das die Tage ausprobieren
                            Gruß

                            Guido

                            Kommentar


                              #29
                              Hallo Leider funktioniert die Abfrage noch nicht.

                              ich vermute mal das dies an der Stelle
                              Code:
                               (.*pos01\">(.*)</div>.*}
                              liegt. in der Datei gibt es weiter Vorn die Positionsangeben für die CSS diese sind mit #pos1 gekennzeichent. also müsste ich nach
                              Code:
                              id="pos01">
                              suchen Aber leider haben ich den Syntax noch nicht gerafft. Du suchst nach
                              Code:
                              (.*pos1\"
                              . Also vermute ich mal das alles was nach dem "> steht ausgewertet wird. Leider meckert er wenn ich noch ein id=und die Anführungszeichen hinzu setzte. Kannst Du da bitte noch mal drüber schauen.
                              Gruß

                              Guido

                              Kommentar


                                #30
                                Ich hatte eigentlich den von Dir geposteten Inhalt verwendet, um den Match zu prüfen...
                                Code:
                                id=\"pos01\">
                                wäre der erweiterte Match. Anführungszeichen müssen escaped werden, das passiert mit dem Backslash. ein Punkt ist ein beliebiges Zeichen, ein Stern ist das vorherhgehende Zeichen, beliebig oft wiederholt, auch null mal. ".*" bedeutet also eine beliebige Anzahl beliebiger Zeichen.
                                REGEX matcht immer auf die kürzeste Zeichenfolge, die möglich ist.
                                Code:
                                (.*id=\"pos01\">(.*)</div>.*}
                                bedeutet also: suche die kürzeste Zeichenkette, die zwischen id="pos01"> und </div> steht, das wäre im Beispielcode 39,5&deg;C
                                Es ist gut möglich, dass diese Zeichenkettee dann genau so übernommen wird, vielleicht wird der HTML-Code aber auch in 39,5°C umgesetzt.

                                Kommentar

                                Lädt...
                                X