Script

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

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

Quicktipp: 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/&lt;HIER API-KEY&gt;/conditions/lang:DL/q/Germany/&lt;HIER ORT&gt;.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!

Homematic Wetterstation

Über die Favoriten kann man sich eine schöne Ansicht auf die Startseite legen

Verwendete Hardware

Dir hat der Beitrag gefallen?

Trage dich kostenlos & unverbindlich in den Newsletter ein
und verpasse keinen Beitrag mehr!

Schaue auch gerne auf Facebook vorbei: