Wunderground Wetter mit einfachem HM-Skript holen

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

andreas33
Beiträge: 68
Registriert: 20.06.2013, 10:47

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von andreas33 » 02.04.2014, 09:52

Hallo,

vielen Dank für das Skript. Funktioniert super auf der Startseite.

Ich möchte mir die Temperatur (z.b.) per Mail zusenden lassen.
Die Mail wird verschickt wenn eine bestimmte Tür geöffnet wird bzw. wenn die Rolladen (morgens/abends) sich bewegen.

Leider erhalte ich nur die "null" in der Mail.
Könnt Ihr mir einen Tipp geben welche Daten ich im Tcl-Skript eintragen muss?

Danke und Gruß
Andreas

vepman
Beiträge: 164
Registriert: 12.09.2013, 13:52
System: CCU
Hat sich bedankt: 5 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von vepman » 03.04.2014, 11:28

Herzlichen Dank an funkleuchtturm und alle, die an diesem Skript Verbesserungen eingebracht haben.
Da ich aus dem Thread alle Veränderungen mühsam zusammengesucht habe, hier mal eine Zusammenfassung, um es allen anderen zu erleichtern:

Code: Alles auswählen

 !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);

Benutzeravatar
funkleuchtturm
Beiträge: 2368
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 357 Mal
Kontaktdaten:

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von funkleuchtturm » 03.04.2014, 12:00

vepman hat geschrieben:hier mal eine Zusammenfassung, um es allen anderen zu erleichtern:
Hallo vepman ,
Danke für die Anregung!
Habe das aktuelle Skript an den Anfang des Blogs mit einem Changelog gesetzt, das ist dann einfacher zu finden. :D
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

tibid
Beiträge: 144
Registriert: 14.03.2014, 19:56
Danksagung erhalten: 1 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von tibid » 05.04.2014, 13:22

Hallo vepman,
danke für das super Skript!

Darf ich es noch um die Daten zur aktuellen Sonnenstrahlung ergänzen?

Habe das Skript so ergänzt, dass es zusätzlich auch den Wert "solarradiation" ausliest, damit ist die aktuelle Sonnenstrahlung in Watt/m² verfügbar, denke dies lässt sich präziser auswerten für die Storen/Markisensteuerung als UV.

Habe das Skript folgenderweise ergänzt:

Code: Alles auswählen

   !Wetter_Sonnenstrahlung                      Zahl                     W/m2
 string word = "solarradiation";
    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_Sonnenstrahlung").State(zahl);

tibid
Beiträge: 144
Registriert: 14.03.2014, 19:56
Danksagung erhalten: 1 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von tibid » 06.04.2014, 16:06

Und noch eine Erweiterung, um die Regenmengen auszuwerten, in mm pro Stunde bzw. Tag, als String und als Zahl:

Ideal geeignet für Markisenschutzsteuerung, z.B. WENN Wetter_Regen_h >= 0 DANN Markisen auf 100%.

Code: Alles auswählen

    !Wetter_Regen_h                      Zahl                     mm/h
    !Wetter_Regen_d                      Zahl                     mm/d
    !Wetter_Regen_h_txt                Zeichenkette 
    !Wetter_Regen_d_txt                Zeichenkette 

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

    string word = "precip_1hr_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_Regen_h_txt").State(daten);

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

    string word = "precip_today_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_Regen_d_txt").State(daten);

tibid
Beiträge: 144
Registriert: 14.03.2014, 19:56
Danksagung erhalten: 1 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von tibid » 06.04.2014, 16:13

Und noch ein Tipp in Sachen Umlautproblematik: ich habe das so gelöst, dass ich die wunderground-API-Abfrage auf englisch statt deutsch mache, einfach in der API-URL DL für deutsch mit EN für englisch ersetzen:

Code: Alles auswählen

var url = "http://api.wunderground.com/api/<hier api-key>/conditions/lang:EN/q/Germany/Hierorthin.xml";
!var url = "http://api.wunderground.com/api/<hier api-key>/conditions/lang:DL/q/Germany/Hierorthin.xml";
Damit erscheinen die Wetterbegingungen und andere Text-daten auf englisch, wen das nicht stört, ist damit die Umlaute los.

Benutzeravatar
Murmelbaerchen69
Beiträge: 274
Registriert: 01.12.2013, 22:55
Wohnort: @home

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von Murmelbaerchen69 » 07.04.2014, 10:28

Hallo,

ist es möglich das bei den Wetterbedingungen mit einzubauen:

Code: Alles auswählen

<icon_url>http://icons-ak.wxug.com/i/c/k/mostlycloudy.gif</icon_url>
Also dass das jeweilige Wetter Gif mitangezeigt wird.

Gruß
Murmelbaerchen69
Das soll ein neuer Computer sein ? Warum steht den auf der Tastatur "ALT" ?

markuswil
Beiträge: 217
Registriert: 24.02.2014, 13:24
Wohnort: Frechen bei Köln

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von markuswil » 07.04.2014, 12:24

Hi Tibid,

danke für die Skript-Erweiterung. Wie kommt man denn an die Daten ran? Wenn ich mir die URL anschaue sind darin keine Regendaten enthalten.

Danke

LG Markus

tibid
Beiträge: 144
Registriert: 14.03.2014, 19:56
Danksagung erhalten: 1 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von tibid » 07.04.2014, 16:29

Hi Markus,

nicht jede Wetterstation liefert Regenmengen bzw. Sonnenstrahlungsdaten.

Einfach mal auf wunderground.com Webseite nach (d)einem Ort suchen, und dann ganz nach unten scrollen, und in der untersten Tabelle "<Ort> Weather Stations" eine Wetterstation aussuchen, welche auch die gewünschten Daten liefert. Die meisten liefern Regenmengen, aber Sonnenstrahlung eher wenige.

Die API-Abfrage-URL muss entsprechend angepasst werden, damit die richtige Station ausgewält wird. Am besten den Ort angeben, welcher am nächsten bei der gewünschten Station ist. Oder es kann auch direkt die Wetterstation angegeben werden: ".../q/pws:<WetterstationsID>.xml"

LG, Tibi

markuswil
Beiträge: 217
Registriert: 24.02.2014, 13:24
Wohnort: Frechen bei Köln

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von markuswil » 08.04.2014, 10:13

Hi,
das ist ja das merkwürdige. Wenn ich auf die Webseite gehe, dann sehe ich Angaben zur Regenmenge. In der API für genau die Wetterstation sind die Daten nicht vorhanden.

LG Markus

Antworten

Zurück zu „Projektvorstellungen“