Wunderground Wetter mit einfachem HM-Skript holen

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

Benutzeravatar
funkleuchtturm
Beiträge: 2444
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 26 Mal
Danksagung erhalten: 390 Mal
Kontaktdaten:

Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von funkleuchtturm » 19.02.2014, 17:08

Auf meiner Homepage gibt´s hierzu evtl. weitere Informationen: http://www.stall.biz/?project=wundergro ... ript-holen

In einem anderen Thread wurde sehr ausführlich und gut beschrieben, wie man die Wetterdaten von wunderground.com in die Homematic bekommt.
http://homematic-forum.de/forum/viewtop ... nderground
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 13 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!

Code: Alles auswählen

        !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
        !Wetter_Station                        Zeichenkette
        !Wetter_Aktualisierung             Zeichenkette
        !Wetter_Bedingungen               Zeichenkette
        !Wetter_Temperatur                  Zahl                     °C
        !Wetter_Luftfeuchte                  Zahl                      %
        !Wetter_Windbedingungen       Zeichenkette
        !Wetter_Windrichtung               Zeichenkette
        !Wetter_Windrichtg                   Zahl                       °
        !Wetter_Windgeschwindigkeit   Zahl                     km/h
        !Wetter_Windboeen                  Zahl                     km/h
        !Wetter_Luftdruck                      Zahl                      mb
        !Wetter_Luftdrucktrend             Zeichenkette
        !Wetter_Taupunkt                      Zahl                     °C
        !Wetter_UV                                Zeichenkette

        var url = "http://api.wunderground.com/api/<hier api-key>/conditions/lang:DL/q/Germany/Hierorthin.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("Wetter_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("Wetter_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("Wetter_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("Wetter_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("Wetter_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("Wetter_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("Wetter_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("Wetter_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("Wetter_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("Wetter_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("Wetter_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("Wetter_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("Wetter_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("Wetter_UV").State(zahl);
Changelog: 03.04.2014 Umlaute Himmelsrichtungen korrigiert, UV-Kennwert zugefügt. Danke für die entsprechenden Anregungen hier im Blog!
Zuletzt geändert von alchy am 04.04.2018, 22:32, insgesamt 8-mal geändert.
Grund: verschoben aus HomeMatic Allgemein
Viele Gruesse
Eugen
________________________________________________
Hier gibt's weitere nützliche HM-Skripte, Anregungen, Bauanleitungen für den ambitionierten DIY-Homematiker.
DUALBEAM-Antenne für bessere 868Mhz-Funkqualität,
WEATHERMAN
als ultimative Wetterstation,
AIRSNIFFER und ROOMSITTER als multifunktionale Sensoren für Wohnräume
PULSECOUNTER als 4kanaliger Energiezähler für die Messung von Strom, Ga-, Öl, Wasser

smike
Beiträge: 52
Registriert: 29.11.2013, 19:33

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von smike » 26.02.2014, 17:21

Danke! Das funktioniert sehr schön und ist auch sehr einfach!
Eine kurze Frage hätte ich: Warum müssen alle Systemvariablen angelegt sein, damit das Script funktioniert?
(Für mich wäre rein theoretisch Temperatur und Luftfeuchte ausreichend.)

Benutzeravatar
funkleuchtturm
Beiträge: 2444
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 26 Mal
Danksagung erhalten: 390 Mal
Kontaktdaten:

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von funkleuchtturm » 26.02.2014, 17:54

Du musst nicht unbedingt alle Wetterwerte bei Wunderground abholen. Wenn Du geeignete Änderungen im Skript machst, dann musst Du auch nur die zugehörigen Systemvariablen anlegen.
Wichtig ist nur, dass alle im Skript aufgerufenen Systemvariablen auch im WebUI angelegt sind und jeder den vorgegebenen Variablentyp hat. Wenn das Skript eine Systemvariable nicht findet, läuft das Skript nicht durch und funktioniert nicht!

Ich würde empfehlen, das Programm ohne Änderung zu übernehmen. Du wirst insbesondere mit den Winddaten sicher zukünftig was anfangen können: Beispielsweise bei einer bestimmten Windstärke aus einer bestimmten Windrichtung die Rolläden oder Markisen einfahren usw.
Viele Gruesse
Eugen
________________________________________________
Hier gibt's weitere nützliche HM-Skripte, Anregungen, Bauanleitungen für den ambitionierten DIY-Homematiker.
DUALBEAM-Antenne für bessere 868Mhz-Funkqualität,
WEATHERMAN
als ultimative Wetterstation,
AIRSNIFFER und ROOMSITTER als multifunktionale Sensoren für Wohnräume
PULSECOUNTER als 4kanaliger Energiezähler für die Messung von Strom, Ga-, Öl, Wasser

mike9677
Beiträge: 422
Registriert: 17.04.2011, 11:08

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von mike9677 » 13.03.2014, 11:50

Hi,

lässt sich hier an der Darstellung auch noch was machen ?
Dateianhänge
1.PNG
1.PNG (4.76 KiB) 50496 mal betrachtet

Benutzeravatar
SHC
Beiträge: 202
Registriert: 24.10.2007, 13:57
Danksagung erhalten: 1 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von SHC » 13.03.2014, 12:13

Hallo,

die URL gibt ja Neuwied als Ort vor

http://api.wunderground.com/api/****API ... euwied.xml

Ich finde bei Wunderground leider nicht die richtigen Daten, um die Stadt bzw. den Standort zu ändern? Wo kann ich das nachsehen?

Vielen Dank,
SHC

mike9677
Beiträge: 422
Registriert: 17.04.2011, 11:08

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von mike9677 » 13.03.2014, 12:18

ändere mal in der URL Niewied auf Köln oder Hamburg ab. Sollte gehen.

Benutzeravatar
SHC
Beiträge: 202
Registriert: 24.10.2007, 13:57
Danksagung erhalten: 1 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von SHC » 13.03.2014, 12:20

Stimmt das funktioniert! Danke!

Jetzt gibt es in Hamburg allerdings mehrere Stationen, kann man die auch direkt anwählen? :)

SHC

looxer01
Beiträge: 455
Registriert: 06.05.2012, 13:17

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von looxer01 » 13.03.2014, 12:27

Hi,

du gehst in Wunderground. Gibst in der Suche deine Stadt ein.
Dann, ganz unten auf der Seite gibt es eine Liste mit Stationen.
Du suchst dir die nächste Station, möglichst nah an deinem Standort. Am besten eine, die mit Echtzeit gekennzeichnet ist und klickst darauf.
Dann werden weiter unten einige Graphen angezeigt. Über den ersten steht der Stationsname:

Beispiel hier INORDRHE...
"http://api.wunderground.com/api/ID##### ... RHE###.xml"

vG L...
Zuletzt geändert von looxer01 am 13.03.2014, 12:58, insgesamt 2-mal geändert.

Benutzeravatar
SHC
Beiträge: 202
Registriert: 24.10.2007, 13:57
Danksagung erhalten: 1 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von SHC » 13.03.2014, 12:29

1000 Dank!! :D :D :D

Benutzeravatar
derAuge
Beiträge: 94
Registriert: 02.02.2014, 09:58
Wohnort: Münsterland

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von derAuge » 15.03.2014, 08:12

Hallo

Danke für die Anleitung.

Leider läuft der script bei mir nicht.
Die ersten Schritte konnte ich erfolgreich abschließen (Key - Ort)

Dann den Script erstellt und folgendes aktiviert (da ich CUxD installiert habe)

Code: Alles auswählen

!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();
Fehlermeldung: "ExecError: Execution failed"

muss ich bei diesee variante noch Geröte in CUxD anlegen?

Gruß

derAuge
CCU2 # 3xHM-CC-RT-DN # 1x HM-CC-TC mit HM-CC-VD # HM-WDS30-T-O # 2x HM-LC-Sw2-FM # HM-Sen-MDIR-O-2 # HM-Sen-MDIR # HQ WebUI Version 2.5.1 # CUxD-V0.67 # CUxD-Highcharts 1.4.3 # HCS 0.0.3.2 # CCU.IO 1.0.47 # DashUI 0.9beta121

Antworten

Zurück zu „Projektvorstellungen“