Skip to end of metadata
Go to start of metadata

Problem

Nach der Übernahme von Weather Underground durch IBM bietet WU keine kostenlosen Developer Keys zur Abfrage von Daten mehr an. Um weiterhin an die Daten der eigenen Wetterstation über Wunderground zu gelangen nutze ich einen Aufruf, welcher auch in der Webansicht der eigenen Wetterstation von Wunderground (https://www.wunderground.com/personal-weather-station/dashboard?ID=StationID) genutzt wird.

Lösung

Nicht offiziell supported!

Das hier verwendete Verfahren ist nicht offiziell zur externen Nutzung vorgesehen, jedoch aktuell funktionsfähig. Sollten vom Anbieter Änderungen an der Webansicht vorgenommen werden, ist es gut möglich, dass auch dieser Aufruf nicht mehr funktioniert!
Getestet: Januar 2019

Die Webview von Wunderground nutzt diverse Webservices um die Daten für die aktuelle Ansicht zu erhalten. Einige davon liefern als Antwort ein JSON, welches wiederum in Loxone verarbeitet werden können:

http://stationdata.wunderground.com/cgi-bin/stationdata?format=json&station=StationID

In diesem (verkürzten) Aufruf muss lediglich die StationID eingetragen werden. Diese findet man am einfachsten über die Wundermap heraus. 


Der Original-Request auf der Wunderground-Webseite nutzt noch weitere Parameter, die hier der Vollständigkeit halber ebenfalls genannt werden. Benötigt werden diese Parameter nicht.

URL des genutzt Webservices
http://stationdata.wunderground.com/cgi-bin/stationdata?iconsize=16&width=512&height=512&maxage=7200&format=json&maxstations=1&station=StationID

Der genutzte Webservice stellt die Information für die Kartenansicht von Wunderground zu Verfügung, was auch einige der erforderlichen Übergabeparameter erklärt:

Request

Basis-URL: http://stationdata.wunderground.com/cgi-bin/stationdata

Parameter:
iconsize=16 ← Die größe der Icons auf der Kartenasicht [ für die Implementierung hier irrelevant ]
width=512 ← Breitenangabe des Kartenausschnitts [ für die Implementierung hier irrelevant ]
height=512 ← Höhe des Kartenausschnitts [ für die Implementierung hier irrelevant ]
maxage=7200 ← Limitiert die die Antwort auf Datensätze von Station die innerhalb der letzten 7200 Sekunden einen validen Datensatz eingeliefert haben
format=json ← Rückgabeformat, JSON lässt sich gut in Loxone verarbeiten
maxstations=1 ← Anzahl maximal zurück gegebener Datensätze
station=<StationID> ← die Wunderground ID eurer Wetterstation

Auf den ersten Blick verwundern einige der Parameter, jedoch wenn man sich den eigentlichen Sinn für den Aufruf vor Augen hält wird es verständlicher: Der Webservice wird angefragt, wenn jemand auf dem Kartenausschnitt alle verfügbaren Wetterstationen sehen will. Daher ist der Webservice darauf ausgelegt mehrere Datensätze zurück zu liefern, nämlich alle die eben in dem aktuellen Bereich sichtbar wären. Wir interessieren uns jedoch nur für unsere eigene Wetterstation, daher limitieren wir die Antwort über die Parameter soweit das wir nur einen Datensatz als Antwort erhalten. Hinweis: Die Verarbreitung mehrerer Datensätze in einer Antwort ist in Loxone nicht so einfach möglich - Frag euch ob dies wirklich benötigt.


Was bekommen wir nun zurück? Ein JSON formatierter Datensatz der die Informationen der im Request eingegrenzten Wetterstation enthält!

Response
{"conds": {
	"<StationID>": {
		"epoch": 1547805002, 
		"ageh": 0,
		"agem": 0, 
		"ages": 6, 
		"dateutc": "2019-01-18 09:49:53", 
		"id": "<StationID>", 
		"lat": "49.12345", 
		"lon": "7.12345", 
		"elev": "800", 
		"adm1": "<Stationsname>", 
		"country": "DE", 
		"neighborhood": "<Umgebung>", 
		"baromin": "30.21", 
		"dailyrainin": "0.00", 
		"dewptf": "25.0", 
		"humidity": "60", 
		"indoorhumidity": "49", 
		"rainin": "0.00", 
		"softwaretype": "<Statsionstyp>", 
		"solarradiation": "100.77", 
		"type": "PWS", 
		"UV": "1.00", 
		"windgustmph": "0.0", 
		"winddir": "200", 
		"windspeedmph": "0.0", 
		"tempf": "37.6", 
		"heatindexf": "37.6", 
		"localhour": "10", 
		"tzname": "Europe/Berlin", 
		"windchillf": "37.6", 
		"maxtemp": "37.6", 
		"maxtemp_time": "09:49AM", 
		"mintemp": "32.7", 
		"mintemp_time": "02:58AM", 
		"maxdewpoint": "29.1", 
		"mindewpoint": "24.8", 
		"maxpressure": "30.22", 
		"minpressure": "30.03", 
		"maxwindspeed": "6.9", 
		"maxwindgust": "7.6", 
		"minwindchill": "27.2", 
		"maxheatindex": "37.6", 
		"qc_failed": "false", 
		"updated": "1547804996"
	}}}

Interessant hierbei ist, dass mehr Informationen zurück geliefert werden als die Kartenansicht benötigt und sogar z. B. die Daten des Innentemperatursensors, die so nicht in der Webansicht zu sehen sind, enthalten sind.

In der Loxone Config

Um die Daten in Loxone zu Verfügung zu haben legen wir uns nun einen entsprechenden Virtuellen HTTP Eingang an:

Objekttyp: Virtueller HTTP Eingang

Name: WundergroundAsJason (oder was euch besser gefällt)
URL: http://stationdata.wunderground.com/cgi-bin/stationdata?iconsize=16&width=512&height=512&maxage=7200&format=json&maxstations=1&station=StationID
Abfragezyklus: 600
Timeout: 4000


Nun benötigen wir noch die "Virtuellen HTTP Eingangs Befehle" für die Werte die wir verwenden möchten. Ich nutze z.B. folgende:

InformationBefehlserkennungAusgabe
Windrichtung"winddir": "\vGrad als Kompassrichtung → Für Umrechnung in Himmelsrichtung siehe unten
Windgeschwindigkeit"windspeedmph": "\vAktuelle Windgeschwindigkeit in Meilen je Stunde (mp/h) (ggf. Umrechnung notwendig: I1*1,61 für km/h → Formelbaustein)
Windböen"windgustmph": "\vWindböen in Meilen je Stunde (mp/h) (ggf. Umrechnung notwendig: I1*1,61 für km/h → Formelbaustein)
Luftfeuchtigkeit"humidity": "\vLuftfeuchtigkeit in %
Außentemperatur"tempf": "\vTemperatur in Fahrenheit (°F) (ggf. Umrechnung notwendig: (I1-32)/1,8 → Formelbaustein)
Regenrate"rainin": "\vAktuelle Regenrate in Inch je Stunde (in/h) (ggf. Umrechnung notwendig: I1*25,4 für L/m²h→ Formelbaustein )
Regenmenge"dailyrain": "\vTagesregenmenge in Inch je m² (in/m²) (ggf. Umrechnung notwendig: I1*25,4 für L/m²→ Formelbaustein )
Sonneneinstrahlung"solarradiation": "\vAktuelle Sonneneinstrahlung in Watt je m² (w/m²) (Umrechnung in Lux z. B.: I1*130 → Formelbaustein)
Datenalter (Std.)"ageh": \vAlter der letzten Datenübertragung der Wetterstation relativ zum aktuellen Zeitpunkt
Datenalter (Min.)"agem": \vAlter der letzten Datenübertragung der Wetterstation relativ zum aktuellen Zeitpunkt
Datenalter (Sek.)"ages": \vAlter der letzten Datenübertragung der Wetterstation relativ zum aktuellen Zeitpunkt
"Updated""updated": "\vTimestamp der letzten Aktualisierung des Datensatzes bei Wunderground

Natürlich können alle Werte aus dem Json verwendet werden, der Bedarf hängt von der eigenen Programmierung ab.

Beispiel für einen Aufbau in der Config (ohne API-Key)

Bei den virtuellen Eingängen wird ein neuer Virtueller HTTP Eingang angelegt und und die entsprechende URL für die gewünschte Wetterstation eingetragen.

In diesem Beispiel nennen wir den Eingang Wetter und die Station ID der Wetterstation ist ABC123

Station ID: https://www.wunderground.com/wundermap

    einfach deinen Ort suchen und die nächstegelegene Wetterstation anklicken (die farbigen Punkte auf der Landkarte)

    in dem kleinen Fenster, das sich öffnet, findest du die Station ID



Anschließend werden mit Virtueller HTTP Eingang Befehl die gewünschten Daten ausgelesen.

In diesem Beispiel wird die Windrichtung mit dem Befehl "winddir": "\v abgefragt.


Windrichtung als Himmelsrichtung Visualisieren

der Befehl "winddir": "\v gibt die Himmelsrichtung in Grad aus. 0°=Norden, 180°=Süden usw.

Die Windrichtung kann mithilfe des status-bausteins auch im Format N NO O SO S SW W NW angezeigt werden.


Datenalter und Validierung

Im Jason sind zwei Informationen verfügbar, welche es erlauben die Daten auf Aktualität zu validieren:

  • Zeitpunkt der letzten Datenübermittlung der Wettertstaion an Wunderground → "Datenalter" (aufgeteilt in Stunden, Minuten und Sekunden)
  • Zeitpunkt der letzten Datensatzaktualisierung bei Wunderground selbst → "Updated" (als unix Timestamp)

Über das Datenalter und dem Wissen der Uploadhäufigkeit kann sich jeder eine eigene Logik bauen ab wann er die Daten als veraltet einstuft.

Über den Updated Timestamp ist es möglich die korrekte Funktion des Requests und der Verarbeitung innerhalb der Wunderground-Datenhaltung zu überprüfen:

Eigenschaften

Merker "WU Lastupdated": Verzögerung=1 Zyklus
Ausschaltverzögerung: 910 sekunden

Was passiert hier: Ich speichere im Merker den Timestamp der Antwort und vergleiche Ihn bei der folgenden Antwort mit dem Timestamp. Im Merker ist eine Verzägerung von einem Zyklus konfiguriert.  Somit ergibts sich folgender Programmablauf (Zykluszahlen sind abstrahiert - Natürlich werden mehr Zyklen zwischen den einzelnen Abrufen verarbeitet):

Programm-
zyklus 
AbrufMerkerUngleichAusschaltverzögerung Kommentar
 11 (OK)Eingang: Timestamp Abruf 111 (Start der 910 Sek. Verzögerung)  Kommt nur einmalig beim Miniserverneustart vor
 2

Eingang: Timestamp Abruf 1
Ausgang: Timestamp Abruf 1

 01 (bis Ablauf der 910 Sek. Verzögerung) Normaler Ablauf wenn keine Fehler auftritt     
 32 (OK)Eingang: Timstemap Abruf 2
Ausgang Timestamp Abruf 1
11 (Neustart der 910 Sek. Verzögerung) 11
 4
Eingang: Timstemap Abruf 2
Ausgang Timestamp Abruf 2
01 (bis Ablauf der 910 Sek. Verzögerung) 1
 53 (OK)Eingang: Timestamp Abruf 3
Ausgang Timestamp Abruf 2
 1 (Neustart der 910 Sek. Verzögerung) 

Eingang: Timestamp Abruf 3
Ausgang Timestamp Abruf 3
 1 (bis Ablauf der 910 Sek. Verzögerung) 
4 (Fehler)Eingang: Timestamp Abruf 3
Ausgang Timestamp Abruf 3
0 (nach Ablauf der 910 Sek Verzögerung Fehler erkannt!
Innerhalb der 910 Sekunden ist kein fehlerfreier Abruf erfolgt.
 8

Eingang: Timestamp Abruf 3
Ausgang: Timestamp Abruf 3

 0Fehlermeldung weiterhin aktiv.
 95 (OK)Eingang: Timstemap Abruf 5
Ausgang Timestamp Abruf 3
11 (Neustart der 910 Sek. Verzögerung) Daten wieder in Ordnung!


Somit kann der Ausgang der Ausschaltverzögerung (negiert) zur Fehlererkennung genutzt werden.










12 Comments

  1. Hallo Stefan,

    Du hast meine Version wieder überschrieben. Der Aufruf braucht aber die zusätzlichen Parameter wie iconsize etc, nicht! Probier' es doch bitte aus: http://stationdata.wunderground.com/cgi-bin/stationdata?maxage=7200&format=json&station=ISACHSEN347

    Die Begründung ist doch etwas unsinnig. Der Aufruf ist nicht offiziell, daher kann er sowieso jederzeit geändert werden. Ob Du Dich nun "nahe an das Original" hälst oder nicht spielt doch da keine Rolle. Den Abruf in dieser Art gibt es übrigens bereits seit 2012 - auch die kurze Version.


    1. Hallo Michael,

      es gibt sicherlich differenzierte Meinung dazu, ich ken nes aus meineem beruflich Background , du sicherlich auch, dass es an viele Stellen die Methodik "Detect & React" gibt. Daher macht es meiner Meineung nach schon Sinn mit dne Requests möglichts am Orginial zu bleiben um nicht eine entsprechende Regel auszulösen.

      Das der Request mit weniger Parameter klar kommt ist richtig, aber es spart auch nur bedingt ressourcen auf dem Miniserver. Den Hinweis über nicht zwingend notwendige Parameter können wir gerne vermerken, dann darf es sich jeder selbst überlegen. Ich fande nur das Entfernen der Erklärung für die optionalenem Request-Parameter suboptimal, irgendwnan such jemand nach genau dieser Information.

  2. Ach, übrigens:

    Das hier ist ein Wiki. Und an einem Wiki sollen alle mitarbeiten. Die Seite auf "nicht beschreibbar" zu setzen ist ein extrem seltsames Verhalten in einem Wiki. Was ist, wenn Du keine Lust mehr hast "Deine" Seite hier zu pflegen? Dann landet die Seite im Nirvana.

    Was soll denn sowas? Fühlst Du Dich dadurch "angegriffen"? Dann hast Du das Prinzip eines Wikis nicht verstanden.

    1. Wie oben schon geschrieben, ich fühle mich nicht angegriffen und schätze auch kompetenten Input, jedoch finde ich das Löschen von korrekten Informationen ohne entsprechenden Hinweis nicht gut.

  3. Lieber Peter, ich habe deine Seite wieder - wie in einem Wiki üblich - auf allgemein bearbeitbar gesetzt. 

    Wie Michael schon ausführt, darf jeder richtige und sinnvolle ergänzungen an jedem Artikel im Wiki machen, ausgenommen sind ein paar Administrative Seiten sowie Startseite, Wiki Regeln usw.  

    Eine bitte noch an dich, bevor du nächstes mal Änderungen von jemandem zurücksetzt, klär das ab.

    Deine loxwiki Admins

  4. Hallo Spezialisten (wink)

    Gibt es eine Mögichkeit die windrichtung nicht in Grad sondern in N NO O SO S usw. zu visualisieren?

    So wie es auch auf der Wetterseite angezeigt wird

    https://www.wunderground.com/personal-weather-station/dashboard?ID=IWAIZENK9#history

    z.b.: Wind from ESE

  5. Florian Mitter     mit dem Statusbaustein kannst du es mit Text ausgeben

  6. Hallo Miteinander,

    das mit den "Zuvor registrierte API Keys bleiben (vorläufig) funktionsfähig." scheint nicht mehr zu funktionieren. Bekomme seit 06.03.2019 keine Daten mehr. Hab es leider erst heute bemerkt.

  7. Irgendwie funktioniert das bei mir nicht (sad)
    Ich übermittel meine Daten auch an WeatherUnderground und ich kann mir in meinem Account einen neuen API-Key generieren lassen. Es gibt auch eine neue URL dazu die auch ein JSON zurück gibt:

    https://api.weather.com/v2/pws/observations/current?stationId=ID-DER-STATION&format=json&units=m&apiKey=NEUER-32-ZEICHEN-KEY

    Bekomme dies aber leider auch nicht zum laufen... im Browser bekomme ich die neuen Werte angezeigt aber in der Loxone Config kommt nix.
    Mit der neuen URL inkl. dem Key habe ich mich hier an die Anleitung gehalten.

    1. Vergiss den Key, den brauchst du nicht mehr.

      Schau dir den Punkt "Beispiel für einen Aufbau in der Config" an.

      1. Okay, erneut copy&paste gemacht und schon geht es...
        Besten Dank