Wetterdaten von Wunderground

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Steffen_TM
Beiträge: 6
Registriert: 27.05.2019, 21:15

Wetterdaten von Wunderground

Beitrag von Steffen_TM » 27.05.2019, 21:43

Ich habe eine eigene Wetterstation und habe diese bei Wunderground registriert. Dadurch habe ich die Möglichkeit einen API-Key zu bekommen und mir die Daten über "https://api.weather.com/v2/pws/observat ... =m&apiKey=..." zu laden. Wenn ich die URL über einen Browser abrufe bekomme ich die Daten wie folgt zurück:
{"observations":[{"stationID":"...","obsTimeUtc":"2019-05-27T19:35:33Z","obsTimeLocal":"2019-05-27 21:35:33","neighborhood":"...","softwareType":"EasyWeatherV1.2.0","country":"DE","solarRadiation":0.0,"lon":...,"realtimeFrequency":null,"epoch":1558985733,"lat":...,"uv":0.0,"winddir":304,"humidity":77,"qcStatus":1,"metric":{"temp":13,"heatIndex":13,"dewpt":9,"windChill":13,"windSpeed":0,"windGust":0,"pressure":1002.03,"precipRate":0.0,"precipTotal":0.0,"elev":356}}]}.

Auf meiner CCU2 habe ich die Variable "Wetter" als String angelegt, den CUx installiert und das Skript geschrieben:
var url = "https://api.weather.com/v2/pws/observat ... =m&apiKey=...";
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();

daten = (wetter_XML);
dom.GetObject("Wetter").State(daten);

Die Daten kommen aus irgend einem Grund nicht in der Variable an. Was mache ich falsch?

nicolas-eric
Beiträge: 3302
Registriert: 07.01.2015, 23:26
Wohnort: Scheeßel
Hat sich bedankt: 21 Mal
Danksagung erhalten: 11 Mal

Re: Wetterdaten von Wunderground

Beitrag von nicolas-eric » 27.05.2019, 21:49

Suche mal nach Wunderground im Forum, dafür gibt es ein fertiges Script.

Steffen_TM
Beiträge: 6
Registriert: 27.05.2019, 21:15

Re: Wetterdaten von Wunderground

Beitrag von Steffen_TM » 27.05.2019, 21:54

Die Skripte sind von den Zugängen von vor über zwei Jahren. Diese URL's funzen schon ne weile nicht mehr.

Steffen_TM
Beiträge: 6
Registriert: 27.05.2019, 21:15

Re: Wetterdaten von Wunderground

Beitrag von Steffen_TM » 27.05.2019, 21:59

"Mein" Skript habe ich ja auch daher ;-)

nicolas-eric
Beiträge: 3302
Registriert: 07.01.2015, 23:26
Wohnort: Scheeßel
Hat sich bedankt: 21 Mal
Danksagung erhalten: 11 Mal

Re: Wetterdaten von Wunderground

Beitrag von nicolas-eric » 27.05.2019, 22:06

Das funktionierte bis zum Jahreswechsel bei mir noch, da wurde das APi ja kostenpflichtig.

viewtopic.php?f=18&t=17209

Steffen_TM
Beiträge: 6
Registriert: 27.05.2019, 21:15

Re: Wetterdaten von Wunderground

Beitrag von Steffen_TM » 27.05.2019, 22:21

Wenn man seine eigene Wetterstation hat, dann bekommt man wieder einen kostenlosen API-Key. Die aktuelle Abfrage ist wie in meiner Anfrage beschrieben und geht ja auch direkt im Browser. Nun ist halt die Frage, warum das aus dem Skript nicht funktioniert.

nicolas-eric
Beiträge: 3302
Registriert: 07.01.2015, 23:26
Wohnort: Scheeßel
Hat sich bedankt: 21 Mal
Danksagung erhalten: 11 Mal

Re: Wetterdaten von Wunderground

Beitrag von nicolas-eric » 27.05.2019, 22:38

Kommt überhaupt etwas an?
So müsste der Inhalt der Abfrage bei "Script Testen" wiedergegeben werden.

Code: Alles auswählen

var url = "https://api.weather.com/v2/pws/observat ... =m&apiKey=...";
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();
WriteLine(wetter_xml);
Wenn ich das mache und eine ausgedachte Station ID udn einen ausgedachten API Key da einsetze, wird mit der Quelltext der gesamten XML Fehlerseite angezeigt mit unter anderem "Invalid apiKey", so dass ich davon ausgehe, dass bei korrekter Station ID und korrektem API Key auch die Ausgabe dort stehen würde.

Steffen_TM
Beiträge: 6
Registriert: 27.05.2019, 21:15

Re: Wetterdaten von Wunderground

Beitrag von Steffen_TM » 28.05.2019, 07:30

Moin,
bei mir fehlte die Zeile "WriteLine(wetter_xml);". Diese habe ich jetzt ergänzt, hat aber leider nichts geändert. Wie es aussieht kommt erst gar nichts an. Wenn ich bei der URL die Adresse von meiner FritzBox eintrage bekomme ich diverse Einträge in der Variablen "Wetter". Sieht dann so aus:

!DOCTYPE html
html lang="de"
head
meta http-equiv=content-type content="text/html; charset=utf-8" /
meta http-equiv="Cache-Control" content="private, no-transform" /
meta http-equiv="X-UA-Compatible" content="IE=edge" /
meta name="format-detection" content="telephone=no" /
usw.

Also grundsätzlich geht's, nur alle url's im Internet scheinen nicht erreichbar. Meine CCU2 hat aber Zugriff zum Internet, auf der Startseite werden z.B. die Zeiten für Sonnenauf- und -untergang aktualisiert.

Steffen_TM
Beiträge: 6
Registriert: 27.05.2019, 21:15

Re: Wetterdaten von Wunderground

Beitrag von Steffen_TM » 29.05.2019, 06:43

Hallo nochmal,

ich habe die URL im Format von json auf xml geändert:
var url = "https://api.weather.com/v2/pws/observat ... =m&apiKey=...".

Im Browser sieht es jetzt so aus:
<?xml version="1.0" encoding="ISO-8859-1"?>
<observations xmlns="">
<observations>
<observations>
<stationID>...</stationID>
<obsTimeUtc>2019-05-29T04:38:05Z</obsTimeUtc>
<obsTimeLocal>2019-05-29 06:38:05</obsTimeLocal>
<neighborhood>...</neighborhood>
<softwareType>EasyWeatherV1.2.0</softwareType>
<country>DE</country>
<solarRadiation>29.85</solarRadiation>
<lon>...</lon>
<realtimeFrequency/>
<epoch>1559104685</epoch>
<lat>...</lat>
<uv>0.0</uv>
<winddir>290</winddir>
<humidity>88</humidity>
<qcStatus>1</qcStatus>
<metric>
<temp>6</temp>
<heatIndex>6</heatIndex>
<dewpt>4</dewpt>
<windChill>6</windChill>
<windSpeed>3</windSpeed>
<windGust>4</windGust>
<pressure>1012.19</pressure>
<precipRate>0.0</precipRate>
<precipTotal>0.0</precipTotal>
<elev>356</elev>
</metric>
</observations>
</observations>
</observations>

Hat in der Variablen leider nichts geändert. Die Internet-LED an der CCU2 leuchtet auch. Als DSL-Router nutze ich eine FritzBox 7490.
Vielleicht hat ja noch jemand eine Idee.


Danke

funzel1607
Beiträge: 132
Registriert: 13.10.2015, 14:34
Hat sich bedankt: 2 Mal

Re: Wetterdaten von Wunderground

Beitrag von funzel1607 » 24.06.2019, 12:55

probiere mal folgendes:

Code: Alles auswählen

!URSPRUNG 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
!STAND 24.06.2019
!CUxD Nummer prüfen oder ggf. anpassen!
 
var url = "http://api.weather.com/v2/pws/observations/current?stationId=DEINE_STATION_ID&format=xml&units=m&apiKey=DEIN_API_KEY";

!hier ist die Abfrage mit CUxD
dom.GetObject("CUxD.CUX2801004:1.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801004:1.CMD_QUERY_RET").State(1);
string wetter_xml = dom.GetObject("CUxD.CUX2801004:1.CMD_RETS").State();
 
 
!Daten mit Suchworten aus XML-File ausfiltern:
 
string word = "neighborhood";
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 = "obsTimeLocal";
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_Aktualisierung").State(daten);
 
string word = "temp";
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 = "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 = "winddir";
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 = "windSpeed";
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 = "windGust";
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";
string word = "pressure";
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 = "dewpt";
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);

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



Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“