Wunderground Wetter mit einfachem HM-Skript holen

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

Tobias78
Beiträge: 1464
Registriert: 27.06.2010, 01:01
Wohnort: Braunschweig
Hat sich bedankt: 4 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von Tobias78 » 03.01.2018, 11:52

Marcelinio0087 hat geschrieben:Ich bitte um eure Hilfe, da ich mein Programm einfach nicht mehr zum Laufen bekomme.

...
Hier mein Programm:
wetter-prog.PNG
...

Hat jemand eine Idee?
Du solltest Dein Skript auch als Quellcode einstellen. Der Screenshot hilft nicht wirklich.
Gruß, Tobias.
--------------------------------------------
Im Einsatz und empfehlenswert:
RaspberryMatic,IO.Broker, Homeputer Studio; CuXD; PocketControl, HomeStatus, Robonect, Alexa, io.Broker
------------------------------------------

PaulM
Beiträge: 315
Registriert: 16.02.2015, 17:05
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 126 Mal
Danksagung erhalten: 35 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von PaulM » 03.01.2018, 12:35

was heisst nicht zum Laufen ?

werden irgendwelche SV aktualisiert ?

werden Fehlermeldungen beim Testen des Skripts ausgegeben, wenn ja welche ?

Im Zweifel Skript beifügen

Gruß
Paul
Mit Mut und Entschlossenheit gegen Intoleranz

Marcelinio0087
Beiträge: 33
Registriert: 22.12.2017, 12:53

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von Marcelinio0087 » 03.01.2018, 13:06

okay natürlich.

Hier der Code meines Skriptes:

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
!W_Station        Zeichenkette
!W_Aktualisierung     Zeichenkette
!W_Bedingungen       Zeichenkette
!W_Temperatur  Zahl     °C
!W_Luftfeuchte  Zahl      %
!W_Windbedingungen       Zeichenkette
!W_Windrichtung       Zeichenkette
!W_Windrichtg   Zahl       °
!W_Windgeschwindigkeit   Zahl     km/h
!W_Windboeen  Zahl     km/h
!W_Luftdruck      Zahl      mb
!W_Luftdrucktrend     Zeichenkette
!W_Taupunkt      Zahl     °C
!W_UV      Zeichenkette
 
var url = "http://api.wunderground.com/api/XXXX/conditions/lang:DL/q/germany/pws%3AIBECKUM2.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("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);
Hier die Werte die aktuell in meine Variablen eingelesen werden:
system-var-value.PNG

Benutzeravatar
Moonrider
Beiträge: 66
Registriert: 25.08.2017, 13:17

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von Moonrider » 03.01.2018, 14:31

Bekommst du Daten, wenn du den Link direkt in den Browser eingibst ?
Bei mir war es auch so und die Wetterstation, die ich abgefragt habe war defekt.
So long

Marcus

Marcelinio0087
Beiträge: 33
Registriert: 22.12.2017, 12:53

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von Marcelinio0087 » 03.01.2018, 14:48

Moonrider hat geschrieben:Bekommst du Daten, wenn du den Link direkt in den Browser eingibst ?
Bei mir war es auch so und die Wetterstation, die ich abgefragt habe war defekt.
Ja der Link funktioniert. Du kannst ihn ja vorsichtshalber nochmal mit deiner API testen. Danke vorab.

PS: Ich habe auch schon andere Orte getestet jedoch auch dort ohne Erfolg.

Gesendet von meinem SM-G930F mit Tapatalk

PaulM
Beiträge: 315
Registriert: 16.02.2015, 17:05
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 126 Mal
Danksagung erhalten: 35 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von PaulM » 04.01.2018, 18:13

mindestens der API-Server von Wunderground hat derzeit Probleme

http://downdetector.com/status/wunderground
Mit Mut und Entschlossenheit gegen Intoleranz

Benutzeravatar
roe1974
Beiträge: 746
Registriert: 17.10.2017, 16:15
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wien
Hat sich bedankt: 52 Mal
Danksagung erhalten: 13 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von roe1974 » 05.01.2018, 12:50

Ja, die API hatte Probleme...
lief bei mir seit einem halben Jahr ohne Probleme....vorgestern/gestern wurden "wilde" Werte angezeigt....
Heute wieder alles normal.....
lg Richard

Ati
Beiträge: 18
Registriert: 22.11.2017, 12:50

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von Ati » 17.01.2018, 14:21

Ich schließe mich grad mal hier an, weil ich auch Wunderground grad installiert habe.
Account angelegt API erhalten und in URL eingefügt. Im Browser wird auch die richtige XML angezeigt. Das Script ist auf CUxD umgestellt. Das Script habe ich inklusive der Variablen cm um cm geprüft und keine Abweichung festgestellt. Dennoch funktioniert es nicht in der CCU (piVCCU auf einem Pi3)
Habe auch die Variablen mit den in der XML-Datei enthaltenen Variablen verglichen - passt. Alle Variablen sind per Copy/paste angelegt worden (ohne die Auskommentierung ! davor)
Auch die Anleitung auf https://homematic.simdorn.net/wettervor ... derground/ zeigte nichts Neues.

Was könnte da noch reinspielen? Oder habe ich doch was vergessen?

Hier die CUxD Version:

Code: Alles auswählen

CUxD-Uptime(1.11a):     1 Tag(e) 03:26:07, 58608 Bytes belegt, Compiled Sep  4 2017 21:35:14
  CCU-Uptime(2.29.23):    1 Tag(e) 19:37:04, load-average: 0.02 0.01 0.00, 10s-cpu-load: 0.6%
Wunderground-HM-Programm.jpg
Und das Script sieht so aus:

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
!W_Station        Zeichenkette
!W_Aktualisierung     Zeichenkette
!W_Bedingungen       Zeichenkette
!W_Temperatur  Zahl     °C
!W_Luftfeuchte  Zahl      %
!W_Windbedingungen       Zeichenkette
!W_Windrichtung       Zeichenkette
!W_Windrichtg   Zahl       °
!W_Windgeschwindigkeit   Zahl     km/h
!W_Windboeen  Zahl     km/h
!W_Luftdruck      Zahl      mb
!W_Luftdrucktrend     Zeichenkette
!W_Taupunkt      Zahl     °C
!W_UV      Zeichenkette
 
var url = "http://api.wunderground.com/api/89exxxxxxxxxxxxx/conditions/lang:DL/q/germany/Birkenwerder.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("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);
Im Ergebnis steht dann unter Status und Bedienung/Systemvariable als Einziger realer Wert die Location, in diesem Fall Birkenwerder. Alle anderen Werte sind bei Zahlenwerten Null und bei Zeichenketten drei Fragezeichen. Wenn da nicht Birkenwerder stehen würde, würde ich denken, das Script funktioniert gar nicht.

Hier noch der etwas gekürzte Inhalt der XML aus Browseraufruf:

Code: Alles auswählen

<station_id>IBRANDEN25</station_id>

<observation_time>Last Updated on Januar 17, 14:16 CET</observation_time>

<observation_time_rfc822>Wed, 17 Jan 2018 14:16:15 +0100</observation_time_rfc822>

<observation_epoch>1516194975</observation_epoch>

<local_time_rfc822>Wed, 17 Jan 2018 14:19:22 +0100</local_time_rfc822>

<local_epoch>1516195162</local_epoch>

<local_tz_short>CET</local_tz_short>

<local_tz_long>Europe/Berlin</local_tz_long>

<local_tz_offset>+0100</local_tz_offset>

<weather>Schneefall</weather>

<temperature_string>33.8 F (1.0 C)</temperature_string>

<temp_f>33.8</temp_f>

<temp_c>1.0</temp_c>

<relative_humidity>82%</relative_humidity>

<wind_string>From the West at 1.6 MPH Gusting to 3.1 MPH</wind_string>

<wind_dir>West</wind_dir>

<wind_degrees>270</wind_degrees>

<wind_mph>1.6</wind_mph>

<wind_gust_mph>3.1</wind_gust_mph>

<wind_kph>2.6</wind_kph>

<wind_gust_kph>5.0</wind_gust_kph>

<pressure_mb>994</pressure_mb>

<pressure_in>29.36</pressure_in>

<pressure_trend>0</pressure_trend>

<dewpoint_string>29 F (-2 C)</dewpoint_string>

<dewpoint_f>29</dewpoint_f>

<dewpoint_c>-2</dewpoint_c>

<heat_index_string>NA</heat_index_string>

<heat_index_f>NA</heat_index_f>

<heat_index_c>NA</heat_index_c>

<windchill_string>34 F (1 C)</windchill_string>

<windchill_f>34</windchill_f>

<windchill_c>1</windchill_c>

<feelslike_string>34 F (1 C)</feelslike_string>

<feelslike_f>34</feelslike_f>

<feelslike_c>1</feelslike_c>

<visibility_mi>1.9</visibility_mi>

<visibility_km>3.0</visibility_km>

<solarradiation>1</solarradiation>

<UV>0.0</UV>
Hat jemand eine Idee dazu?

MartinBr
Beiträge: 393
Registriert: 25.01.2017, 10:51
Wohnort: Bei Berlin
Hat sich bedankt: 3 Mal
Danksagung erhalten: 8 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von MartinBr » 17.01.2018, 16:36

Hallo ati,

ich habe hier ein Script das funktioniert. Ich habe es mit weiteren Informationen erweitert, z.B. Solar-Einstrahlung und Regenmengen.
Wie du an der Wetterstation erkenn kannst, komme ich aus Bergfelde :D
Gruß
Martin

Hier das Script:

Code: Alles auswählen

!Wunderground Wetterdaten 12.12.2017  
! http://homematic-forum.de/forum/viewtopic.php?f=31&t=17209
! zuerst folgende Systemvariablen anlegen
! Achtung: keine vergessen und exakte Schreibweise mit Drag&Drop
! 
!W_Station                Zeichenkette
!W_Aktualisierung         Zeichenkette
!W_Bedingungen            Zeichenkette
!W_Temperatur             Zahl                  °C
!W_Luftfeuchte            Zahl                  %
!W_Windbedingungen        Zeichenkette
!W_Windrichtung           Zeichenkette
!W_Windrichtg             Zahl                  °
!W_Windgeschwindigkeit    Zahl                  km/h
!W_Windboeen              Zahl                  km/h
!W_Luftdruck              Zahl                  mbar
!W_Luftdrucktrend         Zeichenkette
!W_Taupunkt               Zahl                  °C
!W_UV                     Zeichenkette
!W_Solar         	  Zahl    	        W/m2
!W_GefühlteLufttemp       Zahl                  °C
!W_Windkühle              Zahl                  °C
!W_Regenmenge             Zahl                  mm
!W_Regenmenge1h           Zahl                  mm

!  var url = "http://api.wunderground.com/api/xxxxxxxxxxx/conditions/lang:DL/q/pws:IBRANDEN25.xml";
var url = "http://api.wunderground.com/api/xxxxxxx/conditions/lang:DL/q/Germany/Berlin.xml";

!hier ist die Abfrage mit CUxD
dom.GetObject("CUxD.CUX2801001:4.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:4.CMD_QUERY_RET").State(1);
string wetter_xml = dom.GetObject("CUxD.CUX2801001:4.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);
dom.GetObject("Aussentemperatur").State(zahl);

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("WetterFct_Condition").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("W_Icon").State(daten);

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

!W_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("W_Solar").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);

string word = "feelslike_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_GefühlteLufttemp").State(zahl);

string word = "windchill_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_Windkühle").State(zahl);

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));
real zahl = daten.ToFloat();
dom.GetObject("W_Regenmenge").State(zahl);

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));
real zahl = daten.ToFloat();
dom.GetObject("W_Regenmenge1h").State(zahl);
RaspberryMatic-3.59.6 auf Tinkerboard S, CUxD 2.6, XML-1.20, ioBroker (HM,HMIP, Zigbee, Zwave und Shelly) und Alexa in einer VM unter Proxmox, VitoComfort 200

lilu24
Beiträge: 50
Registriert: 04.01.2018, 07:55

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von lilu24 » 17.01.2018, 16:44

Hallo,

ich habe ein Problem. Das Script läuft und mit der URL kann ich auch alle Werte abrufen im Browser.

Jedoch werden in der CUU nicht alle abgerufen. Zum Beispiel sehe ich keinen W_Luftdruck und auch kein W_Windboeen

An was kann das liegen?

Antworten

Zurück zu „Projektvorstellungen“