Weatherunderground XML Daten parsen, Neuerungen ggü. Wiki ???

Begonnen von Bytechanger, 30 Mai 2016, 11:35:00

Vorheriges Thema - Nächstes Thema

Bytechanger

Hallo,

ich habe bisher meine Wetterdaten der Nachbarschaft über HTTPMOD nach dem Wiki (http://www.fhemwiki.de/wiki/Wetter_und_Wettervorhersagen)
geladen. Funktionierte Problemlos.
Jetzt hat sich das HTTPMOD ja geändert. Auch kein Problem,  kann man anpassen.

Ich habe aber derzeit allerdings das Problem, dass WeatherUnderground in der XML mehrere Wetterdaten sendet.
Also den Tagesverlauf. Das aktuellste steht i.d.R. als letztes.

Der bisherige Wiki-Code geht wohl davon aus, dass nur die aktuellen gesendet werden, so dass das regex nur die ERSTEN Daten des XML zieht, die aktuellen aber ganz unten stehen??

Hat jemand einen Tipp für mich, wie man das anpassen kann??
Zusätzlich würde ich auch gerne den Zeitpunkt der Messung im Reading haben, da ich auf eine andere Wetterstation zurückgreifen möchte, falls die Daten zu alt sind...


Greets

Byte

Prof. Dr. Peter Henning

HTTPMOD auf XPath (strict) einstellen, sich ein wenig mit XPath befassen und damit zielgenau die richtigen Readings herauspicken.

LG

pah

Bytechanger

#2
Danke, habe umgestellt:

reading01Name  temperature
reading01XPath-Strict //temp_c/text()
reading02Name Zeitpunkt
reading02XPath-Strict //observation_time_rfc822/text()


Nun bekomme ich für jeden Eintrag ein eigenes Reading.
Womit bekomme ich nur den letzten Eintrag?
Wäre für einen Tipp dankbar...

Hiermit ging es nicht:
//temp_c[last()]/text()

aber auch der Test
//temp_c[1]/text()
war nicht erfolgreich, immer bekam ich ALLE Daten in die Readings

Liegt es daran, dass das XML keine IDs hat, wie im Wiki Beispiel?
<wert id="1">blabla</wert>


<observation_time_rfc822>Mon, 30 May 2016 13:09:00 GMT</observation_time_rfc822>
<temp_c>18.9</temp_c>
<observation_time_rfc822>Mon, 30 May 2016 13:15:00 GMT</observation_time_rfc822>
<temp_c>18.9</temp_c>
<observation_time_rfc822>Mon, 30 May 2016 13:19:00 GMT</observation_time_rfc822>
<temp_c>18.9</temp_c>

Eine unfeine Lösung wäre per Perl alle Readings auszulesen, bis ich das Höchste gefunden habe...
Also temperature-12 testen, wenn vorhanden temperature-13 testen, usw. bis ich eine Fehlermeldung bekomme, dann nehme ich den Vorwert!
Gruß

Byte

ernst1024

Das Problem ist ja das gleiche geblieben. Und auch xpath ist jetzt nix was man sich mal so eben in 5 min reinzieht, ich habe es jedenfalls auf die Schnelle nicht geblickt. Als Ansatz könnte man den TimeStamp nehmen. Wenn man weiß die Aktualisierung kommt immer alle 10 min usw um ...... dann vielleicht ein zwei min zeitversetzt mit der Systemzeit nach observation_time schauen und das als Orientierung für die weitere Suche nehmen?
Gruß Ernst

Mario67

Wie dort https://forum.fhem.de/index.php?topic=53953.msg456186#msg456186 kurz erwähnt, können mit "echtem" JSON dank des Moduls JSONREADINGS https://forum.fhem.de/index.php/topic,38463.0.html alle interessierenden Werte als Readings erzeugt werden.

Gruß,
Mario
FHEM auf Raspberry Pi 4 mit CUL868, WMBUS,
FS20 ST, FS20 AS4-3, FS20 SU-2, FS20 DF, 1-Wire + RS-232: AB Electronics Com Pi RS232, Brandmelder + Fenster: AB Electronics IO Pi 32
BUDERUS GB142 über EMS/AVR-NET-IO, WESTAFLEX WAC250 über RS232, MySensors
mit fhem.cfg & includes glücklich

Bytechanger

Grundsätzlich würde mein xpath funktionieren. Denke das Problem ist, Dass das xml kein gültiges xml ist. Die Einträge sind auch nicht geschachtelt, und sind mehrfach ohne id vorhanden.
Und json kann weather Underground nicht. Wenn im Format was anderes als xml steht kommt einfaches HTML raus..

Denke ich werde mir was in Perl programmieren...

Greets

Byte

ernst1024

Zitat von: Mario67 am 30 Mai 2016, 17:37:21
Wie dort https://forum.fhem.de/index.php?topic=53953.msg456186#msg456186 kurz erwähnt, können mit "echtem" JSON dank des Moduls JSONREADINGS https://forum.fhem.de/index.php/topic,38463.0.html alle interessierenden Werte als Readings erzeugt werden.

Gruß,
Mario

Hi Mario,

du, genau wie auch ich haben eine WU api-key. Den hat der TE wohl nicht. Da kommen ganz andere Daten von daher kann man da so direkt nicht vergleichen.
Gruß Ernst

ernst1024

Zitat von: Bytechanger am 30 Mai 2016, 18:40:03
Grundsätzlich würde mein xpath funktionieren. Denke das Problem ist, Dass das xml kein gültiges xml ist. Die Einträge sind auch nicht geschachtelt, und sind mehrfach ohne id vorhanden.
Und json kann weather Underground nicht. Wenn im Format was anderes als xml steht kommt einfaches HTML raus..

Denke ich werde mir was in Perl programmieren...

Greets

Byte

OK, ich kenne jetzt xpath nicht genug, aber da wo es 10 identische Einträge gibt, die sich nur in den Werten (die du ja auslesen willst, also nicht kennst) unterscheiden, weiss ich nicht wie xpath das lösen will wenn regex es nicht kann?  Ich lasse mich da gerne belehren.

WUG kann json, zumindest wenn du wie ich einen API-KEY hast. Allerdings unterscheidet WUG  noch den zwischen privaten und offiziellen
Stationen, mag sein dass es auch daran liegt. Ich beziehe die Wetterdaten vom Köln-Bonner Flughafen, da ist wohl eine offizielle Station.
Gruß Ernst

Bytechanger

Hi,

da ich nicht mit XPath weiter komme, versuche ich doch RegEx.

Komme aber nicht weiter. Gib es keine Abfrage, die das letzte Vorkommen prüft...

ähnlich wie nachfolgend:

temp_c>([\d\.]+)</temp_c$


Greets

Byte

Prof. Dr. Peter Henning

Selbstverständlich geht das mit XPath, und zwar in einer einzelnen Zeile.

Und das ist bitte sehr nicht irgendein theoretischer Inhalt aus meiner Semantic Web-Vorlesung, sondern ich selbst werte damit Weather Underground aus, sowohl für meine Location (2 Tage) als auch für den Golfplatz.

Ergebnis ist eine konsistente Vorhersage, die ich mir auch ansagen lassen kann.

LG

pah

ernst1024

Zitat von: Prof. Dr. Peter Henning am 31 Mai 2016, 12:30:08
Selbstverständlich geht das mit XPath, und zwar in einer einzelnen Zeile.



Die Zusicherung der Machbarkeit wird den Fragenden freuen. Noch mehr würde er sich aber, so denke ich, über einen codeschnipsel freuen, der ihm zumindest eine Richtung anzeigt. Das sollte doch, zumal es sich ja nur um einen Ein Zeiler handelt, machbar sein, oder muss man dafür ein Web Seminar buchen?
Gruß Ernst

Bytechanger

Hallo,

und wie sich der Fragensteller drüber freuen würde, ist ja der Kern dieses Threats...

Ich bin für meinen Bereich natürlich auch ein einer "konsistente Vorhersage" interessiert.

Über XPath muss man sich vermutlich das letzte Element mit dem Namen temp_c anzeigen lassen, habe ich aber nicht hinbekommen...

Greets

Byte

Prof. Dr. Peter Henning

Ich bin etwa knapp in der Zeit, darum nur ganz kurz:

//Elementname[last()]

// = Axis specifier root-descendant-or-self, also alle Knoten
Elementname, in dem Fall temp_c adressiert alle Elemente des Typs temp_c
[] = Zwangsbedingung (predicate)
last() = Xpath function

Siehe hier: http://www.w3schools.com/xsl/xpath_syntax.asp

LG

pah

Bytechanger

Hallo,

ja habe ich auch schon gesehen, aber

reading01XPath-Strict  //temp_c[last()]/text()

müsste demnach ja funktionieren, tut es aber definitiv NICHT (wie bereits einige Posts zuvor geschrieben)!!
Genau so wenig wie eine -testweise- direkte Adressierung über //temp_c[1]/text() die ja das erste Element liefern sollte!

Log wirft auch kein Fehler, scheint also einfach nicht zu treffen...
Meine Vermutung war, dass es kein echtes (strict) XML ist, die Nodes haben ja auch keine ID <temp_c>12</temp_c> usw..

Also nochmal die Frage an @Prof. Dr. Peter Henning  wie parst man ein Ergebnis von
https://api.wunderground.com/weatherstation/WXDailyHistory.asp?ID=INORDRHE357&format=XML
über XPath, dass man das letzte temp_c Ergebnis erhält?

Greets

Byte

Bytechanger

#14
So nochmal rumprobiert, es scheint die Elementselektion nicht zu funktionieren,

mit

reading01XPath-Strict  //temp_c[last()]/text()

erhalte ich ALLE Elemente, es wird also ein riesen Reading mit Name-1, Name-2, ..., Name-34
also so, als hätte ich [] nicht benutzt!
Muss noch etwas im Linux System installiert werden, oder die [] maskiert werden???
(Ist diese Golfplatzansage so geheim/elitär, dass man nicht einfach den Code zeigen könnte??  ???)

Bei mir sieht es so aus:


define wetter_test HTTPMOD http://api.wunderground.com/weatherstation/WXDailyHistory.asp?ID=INORDRHE357&format=XML 600
attr wetter_test reading01Name Zeitpunkt
attr wetter_test reading01XPath-Strict //observation_time_rfc822[last()]/text()
attr wetter_test reading02Name temperature
attr wetter_test reading02XPath-Strict //temp_c[last()]/text()
attr wetter_test room Wettervorhersage


Greets

Byte