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%
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?