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.

Los geht’s!

Voraussetzung ist eine lauffähige CUxD Installation mit Exec-Gerät Konfiguration
TIPP: Installation CUxD-Addon

  • 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
  • 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/ASCHAFFENBURG.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
    Homematic Wetterstation


    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: