Homematic Wetterdaten von Wunderground abrufen
Homematic Wetterdaten ohne Wetterstation?
Sie möchten Wetterdaten in der Homematic haben, besitzen aber keine Homematic Wetterstation?
Wer auf sekundengenaue Daten verzichten kann, der kann die Daten bequem aus dem Internet importieren bzw. sich an der Wetterstation des Nachbarn bedienen 🙂
Hier stelle ich Ihnen eine Lösung per Homematic Script vor, das über die API-Schnittstelle von Wunderground.com mittels CUxD die Daten vom Webservice herunterlädt und in die Homematic Systemvariablen abspeichert.
Diese Daten können anschließend beliebig in Homematic Programmen wie z.B. in einer Gartenbewässerung weiterverarbeitet werden.
ACHTUNG! Aktuell gibt Wunderground keine kostenlosen API-Keys heraus!
Los geht’s!
Voraussetzung ist eine lauffähige CUxD Installation mit Exec-Gerät Konfiguration
TIPP: Installation CUxD-Addon
- API Key generieren
- Bei wunderground.com anmelden
- Wetterstation in der Nähe suchen
- Hier: https://www.wunderground.com/weather/api/ Api-Key generieren
- Variablen anlegen
Quicktipp: Variable anlegen
Auf Korrekte Schreibweise achten!
- Wetter Station
Name: W_Station Typ: Zeichenkette - Wetter Aktualisierung
Name: W_Aktualisierung Typ: Zeichenkette - Wetter Bedingungen
Name: W_Bedingungen Typ: Zeichenkette - Wetter Bedingungen
Name: W_Bedingungen Typ: Zeichenkette - Wetter Luftdrucktrend
Name: W_Luftdrucktrend Typ: Zeichenkette - Wetter UV
Name: W_UV Typ: Zeichenkette - Wetter Windbedingungen
Name: W_Windbedingungen Typ: Zeichenkette - Wetter Windrichtung
Name: W_Windrichtung Typ: Zeichenkette - Wetter Luftdruck
Name: W_Luftdruck Typ: Zahl Maßeinheit: mb - Wetter Luftfeuchte
Name: W_Luftfeuchte Typ: Zahl Maßeinheit: % - Wetter Taupunkt
Name: W_Taupunkt Typ: Zahl Maßeinheit: °C - Wetter Temperatur
Name: W_Temperatur Typ: Zahl Maßeinheit: °C Minimalwert: -59 Maximalwert: 59 - Wetter Windboeen
Name: W_Windboeen Typ: Zahl Maßeinheit: km/h - Wetter Windgeschwindigkeit
Name: W_Windgeschwindigkeit Typ: Zahl Maßeinheit: km/h - Wetter Windrichtung (Grad)
Name: W_Windrichtg Typ: Zahl Maßeinheit: ° - Programm anlegen
- Bedingung: Wenn… Zeitsteuerung, Zeitspannung ganztägig, Serienmuster Zeitintervall alle 15 Minuten
- Aktivität: Dann… Script einfügen
ACHTUNG: In der URL den API-Key und ORT (ohne <>) einfügen!
Beispiel var url = „http://api.wunderground.com/api/jdf7g4h58hgfj75h/conditions/lang:DL/q/Germany/FRANKFURT.xml“;
!Stand 03.04.2014 http://homematic-forum.de/forum/viewtopic.php?f=31&t=17209 var url = "http://api.wunderground.com/api/<HIER API-KEY>/conditions/lang:DL/q/Germany/<HIER ORT>.xml"; 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(); !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);
Danke an Eugen Stall (stall.biz), für die HM-Script Übersetzung!
Fertig!
Über die Favoriten kann man sich eine schöne Ansicht auf die Startseite legen
Verwendete Hardware
-
Homematic Zentrale CCU3 inkl. AIO CREATOR NEO Lizenz
€179,95
Enthält 19% Mwst.zzgl. VersandIn den Warenkorb