NEWS
Parsen einer Webseite und RegEx Verzweiflung
-
Hallo zusammen,
als längerer Homematic Nutzer habe ich am Wochenende mal mit ioBroker auf einem Raspberry gespielt und bin recht begeistert.
Für ein Lüftungsgerät würde ich gern Daten protokollieren, leider gibt es dafür noch nichts. Es gibt aber eine Statusseite als Abruf, außerdem habe ich den "parser.0" in ioBroker gefunden.
Das Prinzip ist mir klar, allerdings habe ich trotz gewisser IT- und Linux Kenntnisse bisher immer einen Bogen um RegEx gemacht. Und irgendwie ist das nichts, was ich mir mal eine Stunde ansehe und vertehe, habe ich festgestellt.Ich glaube, wenn man Ahnung hat, ist es garnicht so schwer
Die Webseite liefert die Ansicht:
Date: 27.01.2020
Time: 16:46:33
DeviceName: WRG-BB-CC
MAC: ECFXXCXX9EXX
LocalIP: 192.168.10.188
RSSI: -82
FW_MainController: 1437060A
FW_WiFi: WS181130
SystemMode: Behaglichkeitsmode
Speed_In: 10
Speed_Out: 10
Speed_AntiFreeze: 00
Temp_In: 13,7
Temp_Out: 17,8
Temp_Fresh: 8,5
rel_Humidity_In: 57,3
rel_Humidity_Out: 52,4
abs_Humidity_In: 6,8
abs_Humidity_Out: 8,0
Efficiency: 56,1
Humidity_Transport: -558Und auch die Ansicht als Quelltext im Firefox liefert das obige. Man kann den Export auch noch im xml bzw. yaml Format ausgeben, habe ich bisher aber nicht probiert.
Es müsste für jeden Eintrag eine RegEx geben, die bis zum Keyword incl. ":" alles wegwirft, den Inhalt bis zum Ende der Zeile ausgibt und alles nachfolgende auch wieder verwirft.
Falls da jemand einen Hinweis hat, wäre ich dankbar. Ansonsten muss ich wohl mal RegEx lernen.Danke, Michael
-
@Sonderform sagte in Parsen einer Webseite und RegEx Verzweiflung:
Date: 27.01.2020
Time: 16:46:33
DeviceName: WRG-BB-CC
MAC: ECFXXCXX9EXX
LocalIP: 192.168.10.188
RSSI: -82
FW_MainController: 1437060A
FW_WiFi: WS181130
SystemMode: Behaglichkeitsmode
Speed_In: 10
Speed_Out: 10
Speed_AntiFreeze: 00
Temp_In: 13,7
Temp_Out: 17,8
Temp_Fresh: 8,5
rel_Humidity_In: 57,3
rel_Humidity_Out: 52,4
abs_Humidity_In: 6,8
abs_Humidity_Out: 8,0
Efficiency: 56,1
Humidity_Transport: -558Nimm mal
:\s+(\-?\d+\,?\d+)
alsRegex und ändere nur die NUM in der Konfiguration für jeden einzelnen Wert ab RSSIOder
\w+:\s+([^\n]*)
dann hast du alle Datenpunkte und musst dann aber darauf achten den Richtigen Typ (Nummer mit Komma/Text) zu wählen -
Danke für die Hinweise. Mit der ersten RegEx und dem Text geht das auch und ist nachvollziehbar. Auch wenn ich es noch überhaupt nicht verstehe
Leider klemmt es mit dem Parser die notwendige url herunterzuladen. Die lautet:
http://192.168.10.188/?export=1
Das erzeugt im Logfile die Fehlermeldung:
(14782) Cannot read link "http://192.168.10.188/?export=1": Error: Parse ErrorZugriffsprobleme sind es nicht, denn für eine x-beliebiege andere Webseite zeigt er die Inhalte an. Weiterhin bekommt man von dem Raspberry mit einem wget auch die gewünschte Textdatei.
Irgendwo ist da noch der Wurm drin.
-
@Sonderform sagte in Parsen einer Webseite und RegEx Verzweiflung:
Auch wenn ich es noch überhaupt nicht verstehe
bei so etwas hift regex101.com ungemein.
Da wird jeder einzelne Schritt bis ins Detail erklärt@Sonderform sagte in Parsen einer Webseite und RegEx Verzweiflung:
Leider klemmt es mit dem Parser die notwendige url herunterzuladen
- Im Browser klappt es mit dem URL?
- mal ohne http:// versucht?
Bitte mal den URL in den Parser eintragen und auf editieren (Bleistift) gehen
Screenshots könnten dann auch noch helfen.
-
@Homoran sagte in Parsen einer Webseite und RegEx Verzweiflung:
...- Im Browser klappt es mit dem URL?
- mal ohne http:// versucht?
Bitte mal den URL in den Parser eintragen und auf editieren (Bleistift) gehen
Screenshots könnten dann auch noch helfen.
Ja, in verschiedenen Browsern wird die Tabelle wie im ersten Thread dargestellt.
Es scheint für das Parser Modul ein Problem beim Abruf der URL http://192.168.10.188/?export=1 mit dem enthalteten '?' zu geben. Das erzeugt die Fehlermeldung, die bei Anwahl der "Stift" Option eine leere Seite zeigt. Was es also für eine Fehlermeldung ist, sieht man nicht bzw. im Zweifel entspricht die dem Log Eintrag.
Ich bin auf die Idee gekommen, die Seite auf dem Raspberry mit wget abzurufen und in ein File zu schreiben, um zu sehen ober er damit klar kommt. Wenn ich das als Quelle im Parser angebe, dann funktioniert das wie gewünscht.
Instanzen --> Parser:
Ausfabe in ioBroker --> Objekte:
Mit dem direkten Aufruf und die Ausgabe beim Anklicken des "Stift" im Regel Editor:
Ausgabe:
Mit einem http:// davor, also http://192.168.10.188/?export=1
Derzeitige unschöne Lösung ist also mit einem cron-job getriggertem wget auf dem Raspberry die Datei abzulegen.
Und die RegEx hilft, Danke nochmal dafür!
-
@Sonderform sagte in Parsen einer Webseite und RegEx Verzweiflung:
Mit dem direkten Aufruf und die Ausgabe beim Anklicken des "Stift" im Regel Editor:
Da hast du als 'Number' die 5 angegeben - also den 6. Treffer und als Typ Number:
Das wäre dann Speed IN und da das zumindest bei mir '10' ist, ist es auch egal, dass du dort nicht 'Nummer mit Komma' ausgewählt hat.
Dann wird es tatsächlich so sein dass die Meldung
@Sonderform sagte in Parsen einer Webseite und RegEx Verzweiflung:(14782) Cannot read link "http://192.168.10.188/?export=1": Error: Parse Error
Meint was sie sagt.
Ich werde mal etwas ähnliches Probieren
EDIT:
Habe eben auch eine Abfrage im eigenen Netz mit einem ? gestellthttp://192.168.138.57/?xpert:0:
das klappt:
-
@Sonderform sagte in Parsen einer Webseite und RegEx Verzweiflung:
Derzeitige unschöne Lösung ist also mit einem cron-job getriggertem wget
das ist eigentlich die schönere Variante, gerade bei mehreren Daten.
Wenn du im ersten Versuch bereits versucht hattest alle Daten auf einmal von deiner Quelle abzurufen versucht er gleichzeitig (!) 11x zuzugreifen.
Das könnte natürlich zu dem Fehler führen -
@Homoran sagte in Parsen einer Webseite und RegEx Verzweiflung:
@Sonderform sagte in Parsen einer Webseite und RegEx Verzweiflung:
Mit dem direkten Aufruf und die Ausgabe beim Anklicken des "Stift" im Regel Editor:
Da hast du als 'Number' die 5 angegeben - also den 6. Treffer und als Typ Number:
Das wäre dann Speed IN und da das zumindest bei mir '10' ist, ist es auch egal, dass du dort nicht 'Nummer mit Komma' ausgewählt hat.
Dann wird es tatsächlich so sein dass die Meldung
@Sonderform sagte in Parsen einer Webseite und RegEx Verzweiflung:(14782) Cannot read link "http://192.168.10.188/?export=1": Error: Parse Error
Meint was sie sagt.
Die Werte von dem Datenpunkt sind die Stufen und nehmen nur ganze Werte wzischen 1 bis 10 an, keine Kommata.
-
@Homoran sagte in Parsen einer Webseite und RegEx Verzweiflung:
@Sonderform sagte in Parsen einer Webseite und RegEx Verzweiflung:
Derzeitige unschöne Lösung ist also mit einem cron-job getriggertem wget
das ist eigentlich die schönere Variante, gerade bei mehreren Daten.
Wenn du im ersten Versuch bereits versucht hattest alle Daten auf einmal von deiner Quelle abzurufen versucht er gleichzeitig (!) 11x zuzugreifen.
Das könnte natürlich zu dem Fehler führenDa alle Einträge mit einem identischen Intervall definiert werden, sollte doch der Performance Kommentar aus dem Info des Parser.io zutreffen. Der sagt, dass der Abruf nur einmal geschieht und dieser zwischengespeichert wird.
Quelle: ioBroker parser adapter --> Settings -> 2. Table --> Performance Note:
If you enter the same URL or filename more than once into different table rows, and if the values of the column "Interval" are the same, the content of the URL or filename will be retrieved only once and cached for proccesing multiple table rows matching URL/filename and Interval. This allows you to apply multiple regex (so multiple table rows) to a single URL or filename, without the need of retrieving the data multiple times from the source.Die Daten werden von einem internen Webserver des Geräts geliefert, der auf einer WLan Karte integriert ist. Sicher also nicht sehr performant.
Zur Zeit läuft der cron-job jede Minute mit einem wget. Später kann ich das noch verlängern und tut jetzt das was es soll.
-
@Sonderform sagte in Parsen einer Webseite und RegEx Verzweiflung:
sollte doch der Performance Kommentar aus dem Info des Parser.io zutreffen. Der sagt, dass der Abruf nur einmal geschieht und dieser zwischengespeichert wird.
Das ist ja super - war mir nicht bekannt
Aber wie ich dir zeigte liegt es nicht an dem Aufruf.
Wein ähnlicher Aufruf auf einen Wiffi (ESP mit WebUI) funktioniert einwandfrei