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
HTTPMOD auf XPath (strict) einstellen, sich ein wenig mit XPath befassen und damit zielgenau die richtigen Readings herauspicken.
LG
pah
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
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?
Wie dort https://forum.fhem.de/index.php?topic=53953.msg456186#msg456186 (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 (https://forum.fhem.de/index.php/topic,38463.0.html) alle interessierenden Werte als Readings erzeugt werden.
Gruß,
Mario
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
Zitat von: Mario67 am 30 Mai 2016, 17:37:21
Wie dort https://forum.fhem.de/index.php?topic=53953.msg456186#msg456186 (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 (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.
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.
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
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
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?
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
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
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
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
Das vorangestellte xpath-strict:// ersetzt NICHT den Axis Specifier // !!
Also muss man entweder die // noch einmal schreiben, oder einfach den kompletten Baum hineinschreiben
xpath-strict://day_observations/current_observation[last()]/temp_c/text()
funktioniert hervorragend.
LG
pah
Danke für den Tipp,
der Firefox hat das XML nicht sauber dargestellt. Ich habe nicht gesehen, dass die Werte in ein
<day_observations> und alle Einzelwerte in <current_observation> geschachtelt sind!
Danke, jetzt geht es auch!
Eine Frage am Rande, wie sind denn so Deine aktualisierungszeiten von WeatherUnderground?
Grundsätzlich sind die <current_observation> in 10 Minuten Abständen.
Habe nur gerade (16:46 Uhr) festgestellt, dass der letzte XML Eintrag von 14:26 Uhr ist !!
Greets
Byte
Da ich nur die Vorhersage benötige, aktualisiere ich alle 3600 Sekunden.
Ich halte es ehrlich gesagt auch für unnötig, sich alle 10 Minuten das komplette Zeug zu holen, das kostet Zeit und Bandbreite, und die Leute von weather Underground sind bestimmt nicht glücklich drüber.
Da gibt es im API bestimmt eine Möglichkeit, nur das letzte Reading zu holen.
LG
pah
Hi,
ich hole es auch nicht alle 10 Minuten , aber wenn ich um 16:26 Uhr mir die Temperatur holen möchte und bekomme sie von 14:26 ist auch nicht so toll, zumindest wenn man davon Steuerungen machen möchte.
Ich hatte überlegt die Poolpumpe davon abhängig zu schalten, also wenn ein Schwellwert überschritten wird, läuft sie öfter am Tag....
Danke nochmal fürs Augenöffnen bezüglich XML...
Greets
Byte