Zum Ende der Metadaten springen
Zum Anfang der Metadaten

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 nutz 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:

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
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)
Regenmenge"dailyrain": "\vTagesregenmenge in Inch je m² (in/m²) (ggf. Umrechnung notwendig)
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.

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.