Wunderground Wetter mit einfachem HM-Skript holen
Moderator: Co-Administratoren
Re: Wunderground Wetter mit einfachem HM-Skript holen
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
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
Re: Wunderground Wetter mit einfachem HM-Skript holen
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:
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);
- 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
Hallo vepman ,vepman hat geschrieben:hier mal eine Zusammenfassung, um es allen anderen zu erleichtern:
Danke für die Anregung!
Habe das aktuelle Skript an den Anfang des Blogs mit einem Changelog gesetzt, das ist dann einfacher zu finden.
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
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
Re: Wunderground Wetter mit einfachem HM-Skript holen
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:
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);
Re: Wunderground Wetter mit einfachem HM-Skript holen
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%.
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);
Re: Wunderground Wetter mit einfachem HM-Skript holen
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:
Damit erscheinen die Wetterbegingungen und andere Text-daten auf englisch, wen das nicht stört, ist damit die Umlaute los.
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";
- Murmelbaerchen69
- Beiträge: 274
- Registriert: 01.12.2013, 22:55
- Wohnort: @home
Re: Wunderground Wetter mit einfachem HM-Skript holen
Hallo,
ist es möglich das bei den Wetterbedingungen mit einzubauen:
Also dass das jeweilige Wetter Gif mitangezeigt wird.
Gruß
Murmelbaerchen69
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>
Gruß
Murmelbaerchen69
Das soll ein neuer Computer sein ? Warum steht den auf der Tastatur "ALT" ?
Re: Wunderground Wetter mit einfachem HM-Skript holen
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
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
Re: Wunderground Wetter mit einfachem HM-Skript holen
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
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
Re: Wunderground Wetter mit einfachem HM-Skript holen
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
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