Anmerkung 04.06.2019:
Offensichtlich vergibt Wunderground keine kostenlose API-Keys mehr. Deshalb unbedingt vorher zu dem Thema die geeigneten Informationen einholen!
In einem anderen Blog wurde sehr ausführlich und gut beschrieben, wie man die Wetterdaten von wunderground.com in die Homematic bekommt.
http://homematic-forum.de/forum/viewtopic.php?f=31&t=10071&hilit=wunderground
Allerdings verwendet diese Lösung ein TCL-Skript, was insbesondere für den Anfänger nur mit Aufwand implementierbar ist und dementsprechend Fehlermöglichkeiten hat.Hier wird ein „Kochrezept“ für die Implementierung eines wunderground.com-Wetterdatenabrufes beschrieben, der nur mit einem HM-Skript arbeitet:
1 API-Key von Wunderground besorgen wie unter o.a. Link beschrieben
2 Insgesamt 14 Systemvariable entsprechend der Vorgaben im nachfolgenden Skript sorgfältig ohne Schreibfehler (!) anlegen
(schon bei einem kleinsten Schreibfehler oder fehlender Systemvariable läuft das Skript nicht durch!)
3 Im nachfolgenden Skript den API-Key in die URL-Zeile eintragen und vorher die Funktion der URL ausprobieren
(im Browser aufrufen und dann erhält man den aktuellen XML-Wetterfile im Browser angezeigt!).
4 Ein einfaches WebUI-Programm erstellen, das auf Tastendruck oder alle 30min das nachfolgende Skript aufruft.Fertig!
Allerdings verwendet diese Lösung ein TCL-Skript, was insbesondere für den Anfänger nur mit Aufwand implementierbar ist und dementsprechend Fehlermöglichkeiten hat.Hier wird ein „Kochrezept“ für die Implementierung eines wunderground.com-Wetterdatenabrufes beschrieben, der nur mit einem HM-Skript arbeitet:
1 API-Key von Wunderground besorgen wie unter o.a. Link beschrieben
2 Insgesamt 14 Systemvariable entsprechend der Vorgaben im nachfolgenden Skript sorgfältig ohne Schreibfehler (!) anlegen
(schon bei einem kleinsten Schreibfehler oder fehlender Systemvariable läuft das Skript nicht durch!)
3 Im nachfolgenden Skript den API-Key in die URL-Zeile eintragen und vorher die Funktion der URL ausprobieren
(im Browser aufrufen und dann erhält man den aktuellen XML-Wetterfile im Browser angezeigt!).
4 Ein einfaches WebUI-Programm erstellen, das auf Tastendruck oder alle 30min das nachfolgende Skript aufruft.Fertig!
Hinweis: Das Skript benutzt CuxD-zum Aufruf des Wunderground-Servers. Wenn ein entsprecchendes CUxD-Gerät vorher nicht installiert wurde, dann kann man auch die in der CCU standardmässig verfügbare Abfrage mit system.Exec verwenden. Dazu im Skript die entsprecheenden CUxD-Zeilen mit Rufzeichen auskommentieren und im Gegenzug bei den system-Exec-Zeilen die Ausrufezeichen entfernen.
.
[codesyntax lang=“text“ title=“HM-Skript“]
!Stand 03.04.2014 http://homematic-forum.de/forum/viewtopic.php?f=31&t=17209 !zuerst folgende Systemvariablen anlegen !Achtung: keine vergessen und exakte Schreibweise mit Drag&Drop !W_Station Zeichenkette !W_Aktualisierung Zeichenkette !W_Bedingungen Zeichenkette !W_Temperatur Zahl °C !W_Luftfeuchte Zahl % !W_Windbedingungen Zeichenkette !W_Windrichtung Zeichenkette !W_Windrichtg Zahl ° !W_Windgeschwindigkeit Zahl km/h !W_Windboeen Zahl km/h !W_Luftdruck Zahl mb !W_Luftdrucktrend Zeichenkette !W_Taupunkt Zahl °C !W_UV Zeichenkette var url = "http://api.wunderground.com/api/<api-key>/conditions/lang:DL/q/Germany/Neuwied.xml"; !hier ist die Abfrage mit CUxD dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#url#"'"); dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1); string wetter_xml = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); !hier ist die Abfrage mit system.Exec !string stdout; !string stderr; !system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr); !WriteLine(stdout); !string wetter_xml = stdout; !WriteLine(wetter_xml); !Beim XML-File den ueberfluessigen Header entfernen integer laenge = wetter_xml.Length(); integer wort_position = wetter_xml.Find("display_location"); wetter_xml = wetter_xml.Substr(wort_position, (laenge - wort_position)); !WriteLine(wetter_xml); !Daten mit Suchworten aus XML-File ausfiltern: !string word = "full"; string word = "city"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); daten = daten.Substr(0, (word_position -2)); dom.GetObject("W_Station").State(daten); !string word = "observation_time"; string word = "observation_time_rfc822"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); !daten = daten.Substr(0, (word_position -2)); daten = daten.Substr(0, (word_position -11)); dom.GetObject("W_Aktualisierung").State(daten); string word = "weather"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); daten = daten.Substr(0, (word_position -2)); dom.GetObject("W_Bedingungen").State(daten); string word = "temp_c"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); daten = daten.Substr(0, (word_position -2)); real zahl = daten.ToFloat(); dom.GetObject("W_Temperatur").State(zahl); string word = "relative_humidity"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); daten = daten.Substr(0, (word_position -2)); integer zahl = daten.ToFloat(); dom.GetObject("W_Luftfeuchte").State(zahl); string word = "wind_string"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); daten = daten.Substr(0, (word_position -2)); dom.GetObject("W_Windbedingungen").State(daten); string word = "wind_dir"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); daten = daten.Substr(0, (word_position -2)); word_laenge =daten.Length(); string anfangsbuchstabe = daten.Substr(0,1); ! Umlaute korrigieren ! ! N # Nord *** if (anfangsbuchstabe == "N") { ! if (daten == "Nordwest") {daten = "Nord-West" ;} } ! S # Süd *** if (anfangsbuchstabe == "S") { ! 4 # Süd if (word_laenge == 4) {daten = "Süd";} ! 8 # Südwest if (word_laenge == 8) {daten = "Süd-West";} ! 12 # Süd-Südost if (word_laenge == 12) {daten = "Süd-Süd-Ost" ;} ! 13 if (word_laenge == 13) {daten = "Süd-Süd-West" ;} } ! W # Westen if (anfangsbuchstabe == "W") { ! 13 # West-Südwest if (word_laenge == 13) {daten = "West-Süd-West" ;} } ! O # Osten if (anfangsbuchstabe == "O") { ! 11 # Ost-Südost if (word_laenge == 11) {daten = "Ost-Süd-Ost" ;} } dom.GetObject("W_Windrichtung").State(daten); !WriteLine(daten); string word = "wind_degrees"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); daten = daten.Substr(0, (word_position -2)); integer zahl = daten.ToFloat(); dom.GetObject("W_Windrichtg").State(zahl); string word = "wind_kph"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); daten = daten.Substr(0, (word_position -2)); integer zahl = daten.ToFloat(); dom.GetObject("W_Windgeschwindigkeit").State(zahl); string word = "wind_gust_kph"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); daten = daten.Substr(0, (word_position -2)); integer zahl = daten.ToFloat(); dom.GetObject("W_Windboeen").State(zahl); string word = "pressure_mb"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); daten = daten.Substr(0, (word_position -2)); integer zahl = daten.ToFloat(); dom.GetObject("W_Luftdruck").State(zahl); string word = "pressure_trend"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); daten = daten.Substr(0, (word_position -2)); dom.GetObject("W_Luftdrucktrend").State(daten); string word = "dewpoint_c"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); daten = daten.Substr(0, (word_position -2)); real zahl = daten.ToFloat(); dom.GetObject("W_Taupunkt").State(zahl); string word = "UV"; integer word_laenge = word.Length(); integer word_position = wetter_xml.Find(word); string daten = wetter_xml.Substr((word_position + word_laenge +1), 100); integer word_position = daten.Find(word); daten = daten.Substr(0, (word_position -2)); real zahl = daten.ToFloat(); dom.GetObject("W_UV").State(zahl);
[/codesyntax]
Changelog: 03.04.2014 Umlaute Himmelsrichtungen korrigiert, UV-Kennwert zugefügt.