Wettervorhersage von Wunderground

Wettervorhersage von Wunderground
wunderground.com

Nachdem mein Beitrag „Wetterdaten von Wunderground“ bei vielen Lesern auf großes Interesse gestoßen ist und es dazu viele Anregungen gab, möchte ich mich heute einem Programm für die Wettervorhersage von Wunderground zuwenden.

Das Skript stammt ursprünglich aus dem HomeMatic-Forum. Es wertet mittels HomeMatic-Script eine XML-Datei von wunderground.com aus und schreibt die gefundenen Inhalte in Systemvariablen.

Update 30.07.18: Wunderground vergibt inzwischen keine API-Keys mehr.

Wunderground schreibt dazu auf der Website: „To improve our services and enhance our relationship with our users, we will no longer provide free weather API keys as part of our program. If you have been directed to download our Weather Underground free API key by a third party provider, please contact your vendor for resolution.“

Wer sich ein bisschen in HomeMatic-Script eingelesen hat, kann sehr einfach auch weitere Daten aus dem XML-File in Systemvariable schreiben oder evtl. auch an der Datenaufbereitung „schrauben“ um die Wettervorhersage von Wunderground für die Steuerung von HomeMatic-Komponenten zu nutzen.

Hinweis: Ich gehe davon aus, dass du CUxD bereits installierst hast! Falls dies noch nicht geschehen ist, findest du hier eine Anleitung.

Hier in aller Kürze, wie du das Script zum Laufen bringst:

  • Einen Account bei wunderground.com anlegen und einen API-Key erstellen, eine detaillierte Anleitung dazu findest du hier.
  • Alle 7 Systemvariablen anlegen, Schreibweise und Feldtyp bitte beachten. Achtung: Beim kleinsten Schreibfehler, oder wenn du eine Systemvariable vergisst anzulegen, läuft das Script NICHT!
  • Im Script deinen API-Key und die von dir präferierte Wetterstation in der URL-Zeile eintragen. Am besten dir zusammengebaute URL zum Test direkt im Browser ausprobieren. Hast du alles richtig gemacht, erscheint beim Testen ein kompletter XML-File deiner präferierten Wetterstation im Browser.
  • Anschliessend ein Programm (siehe unten) erstellen und das Script an entsprechende Stelle kopieren, um die Wettervorhersage von Wunderground in Systemvariablen zu schreiben.
! Wettervorhersage von wunderground holen

!Stand 21.08.2017  https://homematic-forum.de/forum/viewtopic.php?t=17209

!zuerst folgende Systemvariablen anlegen
!Achtung: keine vergessen und exakte Schreibweise mit Copy & Paste

!WV_Tag                        Zeichenkette -> Forecast fuer welchen Wochentag
!WV_Kondition               Zeichenkette -> Forecast Wetterbedingung
!WV_Icon                       Zeichenkette -> Forecast URL zu Pictogramm (zeigt Bild im Protokoll / Systemvariablen)
!WV_Text                       Zeichenkette -> Forecast Text (max 200 Zeichen)
!WV_TempMax               Zahl         °C -> Forecast Maximale Temperatur
!WV_Regen                        Zahl          % -> Forecast Regenwahrscheinlichkeit (probability of precipation)
!WV_Zeit                       Zeichenkette -> Forecast erstellt um diese Zeit

var url = "http://api.wunderground.com/api/hier_deinen_API-Key_eintragen/forecast/lang:DL/q/pws:IHESSENG16.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();

    !Beim XML-File den ueberfluessigen Header entfernen
    integer laenge = wetter_xml.Length();
    integer wort_position = wetter_xml.Find("forecast");
    wetter_xml = wetter_xml.Substr(wort_position, (laenge - wort_position));
    !WriteLine(wetter_xml);
    integer laenge = wetter_xml.Length();

    !hier den Auszugebenden tag anpassen, period 2 ist der nächste tag
    integer wort_position = wetter_xml.Find("period 2");
    wetter_xml = wetter_xml.Substr(wort_position, (laenge - wort_position));
    !WriteLine(wetter_xml);

    !Daten mit Suchworten aus XML-File ausfiltern:
    string word = "title";
    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));
    WriteLine(daten);
    dom.GetObject("WV_Tag").State(daten);

    string word = "icon";
    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));
    string daten2 = daten;
    dom.GetObject("WV_Kondition").State(daten);

    string word = "icon_url";
    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 = "</div><img src=\"" + daten + "\" alt=\"" + daten2 + "\">";
    dom.GetObject("WV_Icon").State(daten);

    string word = "fcttext_metric";
    integer word_laenge = word.Length();
    integer word_position = wetter_xml.Find(word);
    string daten = wetter_xml.Substr((word_position + word_laenge + 1 + 9), 200);
    integer word_position = daten.Find(word);
    daten = daten.Substr(0, (word_position-5));
    !umlaut ö finden, zeichen ö   
    string txtneu = "";
    string teilstr;
    foreach(teilstr, daten.Split("¶"))
    {
       if (txtneu == "")
       {
           txtneu = teilstr;
       }else{
           txtneu = txtneu # "ö" # teilstr;
       }
    }
    daten = txtneu;

    !umlaut ü finden, zeichen ü   
    string txtneu = "";
    string teilstr;
    foreach(teilstr, daten.Split("¼"))
    {
       if (txtneu == "")
       {
          txtneu = teilstr;
       }else{
          txtneu = txtneu # "ü" # teilstr;
       }
    }
    daten = txtneu;

    !umlaut ä finden, zeichen ä
    string txtneu = "";
    string teilstr;
    foreach(teilstr, daten.Split("¤"))
    {
       if (txtneu == "")
       {
          txtneu = teilstr;
       }else{
          txtneu = txtneu # "ä" # teilstr;
       }
    }
    daten = txtneu;

    !umlaute korrigiert, zeichen à entfernen
    string txtneu = "";
    string teilstr;
    foreach(teilstr, daten.Split("Ã"))
    {
       if (txtneu == "")
      {
         txtneu = teilstr;
      }else{
         txtneu = txtneu # "" # teilstr;
      }
    }
    daten = txtneu;
    
    dom.GetObject("WV_Text").State(daten);

    string word = "celsius";
    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("WV_TempMax").State(zahl);

    string word = "pop";
    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("WV_Regen").State(zahl);

    string word = "pretty_short";
    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));
    string daten2 = daten;
    dom.GetObject("WV_Zeit").State(daten);

Wettervorhersage von Wunderground

Wettervorhersage von Wunderground

Der XML-Datenstrom der Wettervorhersage von Wunderground enthält die Vorhersage für den aktuellen Tag und die kommenden drei Tage. Am Anfang des Skriptes kannst du den gewünschten Tag über „period x“ definierten. „period 2“ liefert z.B. die Wettervorhersage für den nächsten Tag. Falls du die Daten für eine grafische Anzeige nutzen willst, kannst du die mitgelieferte URL für das Wettersymbol nutzen.

Falls du auch die aktuellen Wetterdaten in deiner HomeMatic-Installation verarbeiten möchtest, findest du alles dazu Notwendige in meinem Betrag „Wetterdaten von Wunderground„.

Autor: Erhard Simdorn

Am 1. September 2014 habe ich mir meine erste CCU2 gekauft und war von den Möglichkeiten der Hausautomation sofort begeistert. Am 22. November 2014 folgte dann die zweite CCU2 für einen weiteren Standort und bis heute sind es schon acht CCU2 für die ich der "Auslöser" war.

25 Gedanken zu „Wettervorhersage von Wunderground“

  1. Hallo

    die aktuellen Wetterdaten konnte ich mit Ihrer Anleitung bereits bei mir einbinden. Jetzt würde ich gerne auch die Vorhersage nutzen. Wenn ich es richtig sehe können sie im Skript nur einen Tag auswählen, hier die Periode 2. Gibt es eine Möglichkeit mir alle Tage der Vorhersage (Periode 2-4) auslesen zu lassen?

    Viele Grüße, Claus

    1. Hallo Claus,

      die Vorhersage für mehrere Tage kannst du leider nur über eine Schleife im Skript oder über mehrere Skripte abfragen. Beides ist nicht optimal für die CCU2, da diese String-Verarbeitung die CCU2 stark belastet. Ich setzte inzwischen ioBroker in meiner Hausautomation ein, dort ist die String-Verarbeitung gar kein Problem und es gibt bereits für Wunderground Konnektoren die alle Daten in Variablen bereitstellt. Ich kann dir ioBroker nur wärmstens empfehlen, habe allerdings noch keine Zeit gefunden hier entsprechende Beiträge zu veröffentlichen.

      Gruß Erhard

  2. Habe händisch das veruscht:

    dom.GetObject(„W_Test“).State(„“);

    das funktioniert….. es werden zwei icons nebeneinander in der varaivle dargestellt.
    Nur reicht mein Wissen nicht, um jetzt die icons für heute, morgen und übermorgen per script von wunderground auszuelesen 😉

    lg Richard

    1. Hallo Richard,

      ich stehe auf dem Schlauch, was hast du mit „dom.GetObject(„W_Test“).State(„“); versucht?

      Wenn du mehr als eine Vorhersage abrufen möchtest, muss das Script entweder in zwei Versionen mit unterschiedlichen Systemvariablen aufgerufen werden oder man baut in das Script eine Schleife ein.

      Was möchtest du konkret erledigen?

      Gruß Erhard

  3. Hallo Erhard,
    ioBroker habe ich auch schon in meiner Überlegung will mich jedoch vorerst nur mit der HM beschäftigen. Denk aber das der ioBroker bald bei mir Einzug halten wird.
    Grüße, Claus

    1. Hallo Mario,

      du rufst https://www.wunderground.com auf und klickst in den Suchschlitz:
      Wunderground Suchschlitz

      Dann klickt du auf „Find nearest Station“:
      Wunderground - Find nearest Station

      Falls das nicht funktioniert, gib deinen Heimatort in dem Suchschlitz ein. Anschliessend klickst du auf den Namen der gefundenen Wetterstation:
      Wunderground - Weather Station

      Dann sieht du den Namen der Wetterstation den du im Skript verwenden kannst:
      Wunderground - Name der Station

      Bin gespannt, ob dir mein Tipp weiterhilft.

      Gruß Erhard

  4. Hallo,
    gibt es die Möglichkeit ebenfalls aus dem Bereich simpleforcast die „low“ Temperatur auszulesen und mit der TempMax in eine Systemvariable vom Typ „Text“ mit den Werten „TempLow – TempMax“ abzulegen?

    Ich nutze die Abholung der aktuelle Bedingungen und der Vorhersage um die aktuelle Temperatur, die zu erwartende Temperatur und die Regenwahrscheinlichkeit im E-Paper Display anzeigen zu lassen. Ebenso im EasyHome-Tablet. Da wäre es einfacher dies als eine Variable zu verwenden.

    1. Hallo Christof,

      seit ich ioBroker für die Visualisierung und die Steuerung meiner Hausautomation nutze, verwende ich das Programm „Wettervorhersage von Wunderground“ nicht mehr in meiner CCU2-Installation. ioBroker ist wirklich sehr empfehlenswert und der Wunderground-Adapter liefert alle Werte.

      Gruß Erhard

    2. So hole ich mir die Min-Temperatur aus dem WU-XML (XPath für Arme 😉 ):

      string segment = „low“;
      integer segment_laenge = segment.Length();
      integer segment_position = wetter_xml.Find(segment);
      string wetter_low_xml= wetter_xml.Substr((segment_position + segment_laenge +1), 200);
      string word = „celsius“;
      integer word_laenge = word.Length();
      integer word_position = wetter_low_xml.Find(word);
      string daten = wetter_low_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(„WV_TempMin“).State(zahl);

  5. Bei mir sind die Variablen leer. Der Test im Browser mit der URL und meiner API ist allerdings positiv.
    Ich habe noch ein älteres Wonderground-Programm mit aktuellen Wetterdaten. Dieses funktioniert.
    Hat jemand einen Tipp für mich?

  6. Ups. Muss mich korrigieren. Heute sind die Variablen, bis auf WV_Text, gefüllt.
    Warum ist die eine Variable nicht gefüllt?

    1. Hallo Michael,

      schaue bitte mal in den XML-Stream deiner Wetterstation, dort müsste ein Abschnitt mit dem Schlüsselwort „fcttext_metric“ sein. Anscheinend hat Wunderground den XML-Stream umgestellt, bei mir kommt jetzt statt „fcttext_metric“ die „forecast_url“. In diesem Abschnitt steht jetzt leider nur dir URL zur Seite mit der Wettervorhersage. Ich selbst nutze das Wunderground-Skript auf der CCU2 seit ca. 1 Jahr nicht mehr, da habe ich ioBroker in Betrieb genommen und lasse darüber jetzt alle Skripte laufen. Das ist die nächste Stufe der Hausautomation auf Basis von HomeMatic, kann ich nur wärmstens empfehlen.

      Gruß Erhard

  7. Hab auch das hinbekommen. Habe
    string word = „fcttext_metric“; unbenannt in
    string word = „fcttext“;

    1. Hallo Michael,

      super dass du den Lösungshinweis gepostet hast, in meinem XML-Stream taucht dieser Abschnitt allerdings nicht auf.

      Gruß Erhard

  8. Hallo !
    Zunächst DANKE für das Script und die Mühe. Wirklich klasse.
    Bei mir funktioniert soweit alles.
    Allerdings eine Frage:
    WV-TempMax weicht z. B. von WV_Text ab.
    Bsp: WV-TempMax 17 Grad, Text… Teilweise bedeckt… 22 Grad.
    Warum ist das s0?

    Danke. Gruss

    1. Hallo,

      welche Wetterstation wird abgerufen? Ich benötige lediglich die Kennung der Wetterstation, bitte NICHT die Wunderground-Zugangskennung schicken!

      Gruß Erhard

    1. Hallo Torsten,

      stimmt, deshalb habe ich es am Anfang meines Beitrag erwähnt. Ich habe deshalb angefangen meine eigenen Wettersensoren zu installieren und teste derzeit OpenWeatherMap. Allerdings nutze ich heute schon nicht mehr dieses Script, ich hole mir die Wetterinformationen über ioBroker.

      Gruß Erhard

  9. Hallo,
    echt super das Skript und soweit zeigt es mir auch die Variablen befüllt in der Homematic CCU2 an. Jedoch stehe ich gerade auf dem Schlauch und blick da gerade nicht durch wie ich mehrere Tage mit den richtigen Icons darstelle. period 2 ist für nächsten Tag, soweit hab ich es, jedoch wie bekomm ich die richtigen icons zum richtigen tag, wie müsste da das skript abgeändert werden bzw. muss ich da noch variablen in der ccu2 zusätzlich anlegen ?

    Danke für eine Info 🙂

    1. Hallo Robert,

      ich nutze das Script in meiner CCU2-Installation inzwischen nicht mehr, ich nutze für Wunderground und und die Visualisierung inzwischen ioBroker. Mit ioBroker kann man auch Philips HUE und andere Systeme sehr einfach in die eigenen Hausautomation integrieren. In meinem Beitrag „Ein neuer Mitbewohner ist eingezogen“ siehst du ein Beispiel für die Integration eines Multisensors und die Visualisierung über VIS.

      Gruß Erhard

Kommentare sind geschlossen.