Wetterdaten von Accuweather und OpenWeatherMap (updatet am 16.04.2019)

Wetterdaten von Accuweather und OpenWeatherMap (updatet am 16.04.2019)

Sie möchten Wetterdaten in der Homematic haben, besitzen aber keine teuere Homematic Wetterstation? Wer auf sekundengenaue Daten verzichten kann, der kann die Daten bequem aus dem Internet importieren. Hier möchte ich eine Lösung per Homematic Script vorstellen, das über die API-Schnittstelle von accuweather.com und/oder von OpenWeatherMap mittels CUxD die Daten vom Webservice herunterlädt und in die Homematic Systemvariablen abspeichert. Diese Daten können anschließend beliebig in Homematic Programmen wie z.B. in einer Gartenbewässerung usw. weiterverarbeitet werden.

Voraussetzung ist eine lauffähige CUxD Installation mit Exec-Gerät Konfiguration! Falls dies noch nicht geschehen ist, findest du hier eine Anleitung.

Los geht’s!

Update 14.08.2018: Es gibt eine zuverlässigere Methode, die Wetterdaten abzurufen. Dafür wird aber einen PHP-Server mit cURL Unterstützung benötigt. Diese Lösung habe ich hier beschrieben.

Wetterdaten von AccuWeather

API Key von AccuWeather generieren

Anmelden bei developer.accuweather.com.

Klicken auf „My Apps“ → „Add a New App“, alles ausfüllen und anschließend auf „Create App“ klicken. Das neue App wird erstellt.

Auf das erstellte App klicken, dort findet man das API-Key (s. Bild unten).

Das Benutzen von AccuWeatehr-API ist für private Zwecke kostenlos, es gibt allerdings die Begrenzung der Tagesaufrufe der API: 50 mal/Tag pro Account. Pro Abholvorgang braucht man 2 API-Aufrufe. Wenn man stündlich die Wetterdaten aktualisiert, verbraucht 24*2 = 48 Aufrufe/Tag , was noch unterhalb der Begrenzung liegt. Mit 2 Accounts (also 2 API-Keys) kann man die Wetterdaten halbstündlich aktualisieren.

Wetterstation suchen

Auf accuweather.com gehen, im Suchfeld der gewünschte Standort eingeben. In dem Adressenfeld des Browsers die 6-stellige Zahl merken, das ist das Wetterstation-ID.

System-Variablen anlegen

Im nächsten Schritt werden die Variablen angelegt. Es können insgesamt 40 Systemvariablen mit den Wetterdaten anlegt werden, dabei soll die korrekte Schreibweise und Feldtyp beachtet werden. Es müssen nicht alle Variablen angelegt werden, sondern nur die, die benötigt werden.

Programm anlegen

Homematic Programm: OpenWeatherMap
Einstellung des Zeitmoduls

Bedingung: Wenn…: Zeitsteuerung mit folgenden Einstellungen:Aktivität Dann…: Script einfügen.

ACHTUNG: Im Skript in den Zeilen string wetterstation_id = "HIER WETTERSTATION-ID EINTRAGEN"; und string api_key = "HIER DEIN API KEY EINTRAGEN";  das API-Key und Wetterstation-Id (mit“ „) einfügen!

Skript updatet am 03.02.2019

!Hier die WETTERSTATION-ID und API-KEY eintragen
string wetterstation_id = "HIER WETTERSTATION-ID EINTRAGEN";
string api_key = "HIER DEIN API KEY EINTRAGEN";

var url = "http://dataservice.accuweather.com/currentconditions/v1/"#wetterstation_id#"?apikey="#api_key#"&language=de-de&details=true";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1); 
string responce = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
var WeatherText = (responce.StrValueByIndex(",",2)).StrValueByIndex(":",1).ToLatin().Replace("\"","");
var Temperature = (responce.StrValueByIndex(",",7)).StrValueByIndex(":",3).ToFloat();
var RealFeelTemperature = (responce.StrValueByIndex(",",13)).StrValueByIndex(":",3).ToFloat();
var RealFeelTemperatureShade = (responce.StrValueByIndex(",",19)).StrValueByIndex(":",3).ToFloat();
var RelativeHumidity = (responce.StrValueByIndex(",",25)).StrValueByIndex(":",1).ToFloat();
var WindSpeed = (responce.StrValueByIndex(",",35)).StrValueByIndex(":",3).ToFloat();
var UVIndex = (responce.StrValueByIndex(",",47)).StrValueByIndex(":",1).ToFloat();
var UVIndexText = (responce.StrValueByIndex(",",48)).StrValueByIndex(":",1).ToLatin().Replace("\"","");
var CloudCover = (responce.StrValueByIndex(",",56)).StrValueByIndex(":",1).ToFloat();
var Pressure = (responce.StrValueByIndex(",",63)).StrValueByIndex(":",3).ToFloat();
url = "http://dataservice.accuweather.com/forecasts/v1/daily/1day/"#wetterstation_id#"?apikey="#api_key#"&language=de-de&details=true&metric=true";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1); 
responce = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
var TemperatureMin = (responce.StrValueByIndex(",",22)).StrValueByIndex(":",3).ToFloat();
var TemperatureMax = (responce.StrValueByIndex(",",25)).StrValueByIndex(":",2).ToFloat();
var RealFeelTemperatureMin = (responce.StrValueByIndex(",",28)).StrValueByIndex(":",3).ToFloat();
var RealFeelTemperatureMax = (responce.StrValueByIndex(",",31)).StrValueByIndex(":",2).ToFloat();
var HoursOfSun = (responce.StrValueByIndex(",",40)).StrValueByIndex(":",1).ToFloat();
var DayWeather = (responce.StrValueByIndex(",",75)).StrValueByIndex(":",1).ToLatin().Replace("\"","");
var DayWindSpeed = (responce.StrValueByIndex(",",81)).StrValueByIndex(":",3).ToFloat();
var DayWindGust = (responce.StrValueByIndex(",",87)).StrValueByIndex(":",3).ToFloat();
var NightWeather = (responce.StrValueByIndex(",",113)).StrValueByIndex(":",1).ToLatin().Replace("\"","");
var NightWindSpeed = (responce.StrValueByIndex(",",119)).StrValueByIndex(":",3).ToFloat();
var NightWindGust = (responce.StrValueByIndex(",",125)).StrValueByIndex(":",3).ToFloat();
var DayWeatherPrecipitationProbability = (responce.StrValueByIndex(",",76)).StrValueByIndex(":",1).ToFloat();
var DayWeatherThunderstormProbability = (responce.StrValueByIndex(",",77)).StrValueByIndex(":",1).ToFloat();
var DayWeatherRainProbability = (responce.StrValueByIndex(",",78)).StrValueByIndex(":",1).ToFloat();
var DayWeatherSnowProbability = (responce.StrValueByIndex(",",79)).StrValueByIndex(":",1).ToFloat();
var DayWeatherIceProbability = (responce.StrValueByIndex(",",80)).StrValueByIndex(":",1).ToFloat();
var NightWeatherPrecipitationProbability = (responce.StrValueByIndex(",",114)).StrValueByIndex(":",1).ToFloat();
var NightWeatherThunderstormProbability = (responce.StrValueByIndex(",",115)).StrValueByIndex(":",1).ToFloat();
var NightWeatherRainProbability = (responce.StrValueByIndex(",",116)).StrValueByIndex(":",1).ToFloat();
var NightWeatherSnowProbability = (responce.StrValueByIndex(",",117)).StrValueByIndex(":",1).ToFloat();
var NightWeatherIceProbability = (responce.StrValueByIndex(",",118)).StrValueByIndex(":",1).ToFloat();
var DayHoursOfPrecipitation = (responce.StrValueByIndex(",",105)).StrValueByIndex(":",1).ToFloat();
var DayHoursOfRain = (responce.StrValueByIndex(",",106)).StrValueByIndex(":",1).ToFloat();
var DayHoursOfSnow = (responce.StrValueByIndex(",",107)).StrValueByIndex(":",1).ToFloat();
var DayHoursOfIce = (responce.StrValueByIndex(",",108)).StrValueByIndex(":",1).ToFloat();
var NightHoursOfPrecipitation = (responce.StrValueByIndex(",",143)).StrValueByIndex(":",1).ToFloat();
var NightHoursOfRain = (responce.StrValueByIndex(",",144)).StrValueByIndex(":",1).ToFloat();
var NightHoursOfSnow = (responce.StrValueByIndex(",",145)).StrValueByIndex(":",1).ToFloat();
var NightHoursOfIce = (responce.StrValueByIndex(",",146)).StrValueByIndex(":",1).ToFloat();

string svName;
object svObj;

svName = "Wetter";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(WeatherText);
}
svName = "Temperatur [°C]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(Temperature);
}
svName = "RealFeel-Temperatur [°C]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(RealFeelTemperature);
}
svName = "RealFeel-Temperatur im Schatten [°C]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(RealFeelTemperatureShade);
}
svName = "Luftfeuchtigkeit [%]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(RelativeHumidity);
}
svName = "Windgeschwindigkeit [km/h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(WindSpeed);
}
svName = "UV-Index";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(UVIndex);
}
svName = "UV-Intensität";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(UVIndexText);
}
svName = "Wolkendecke [%]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(CloudCover);
}
svName = "Luftdruck [hPa]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(Pressure);
}
svName = "Min. Temp. [°C]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj. Temp. [°C]").State(TemperatureMin);
}
svName = "Max. Temp. [°C]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj. Temp. [°C]").State(TemperatureMax);
}
svName = "Max. RealFeel-Temp. [°C]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj. RealFeel-Temp. [°C]").State(RealFeelTemperatureMax);
}
svName = "Min. RealFeel-Temp. [°C]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj. RealFeel-Temp. [°C]").State(RealFeelTemperatureMin);
}
svName = "Dauer Sonne [h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(HoursOfSun);
}
svName = "tagsüber";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(DayWeather);
}
svName = "Windstärke tagsüber [km/h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(DayWindSpeed);
}
svName = "Böen tagsüber [km/h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(DayWindGust);
}
svName = "Wetter nachtsüber";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(NightWeather);
}
svName = "Windstärke nachtsüber [km/h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(NightWindSpeed);
}
svName = "Böen nachtsüber [km/h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(NightWindGust);
}
svName = "Niederschlagwahrscheinlichkeit tagsüber [%]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(DayWeatherPrecipitationProbability);
}
svName = "Gewitterwahrscheinlichkeit tagsüber [%]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(DayWeatherThunderstormProbability);
}
svName = "Regenwahrscheinlichkeit tagsüber [%]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(DayWeatherRainProbability);
}
svName = "Schneewahrscheinlichkeit tagsüber [%]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(DayWeatherSnowProbability);
}
svName = "Icewahrscheinlichkeit tagsüber [%]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(DayWeatherIceProbability);
}
svName = "Niederschlagwahrscheinlichkeit nachtsüber [%]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(NightWeatherPrecipitationProbability);
}
svName = "Gewitterwahrscheinlichkeit nachtsüber [%]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(NightWeatherThunderstormProbability);
}
svName = "Regenwahrscheinlichkeit nachtsüber [%]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(NightWeatherRainProbability);
}
svName = "Schneewahrscheinlichkeit nachtsüber [%]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(NightWeatherSnowProbability);
}
svName = "Icewahrscheinlichkeit nachtsüber [%]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(NightWeatherIceProbability);
}
svName = "Niederschlagsdauer tagsüber [h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(DayHoursOfPrecipitation);
}
svName = "Regendauer tagsüber [h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(DayHoursOfRain);
}
svName = "Schnedauer tagsüber [h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(DayHoursOfSnow);
}
svName = "Icedauer tagsüber [h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(DayHoursOfIce);
}
svName = "Niederschlagsdauer nachtsüber [h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(NightHoursOfPrecipitation);
}
svName = "Regendauer nachtsüber [h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(NightHoursOfRain);
}
svName = "Schnedauer nachtsüber [h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(NightHoursOfSnow);
}
svName = "Icedauer nachtsüber [h]";
svObj = dom.GetObject(svName);
if (svObj){
  svObj.State(NightHoursOfIce);
}
svName = "Wetterdienst";
svObj = dom.GetObject(svName);
if (svObj){ 
  svObj.State("Accuweather");
}

Über die Favoriten kann man sich eine schöne Ansicht der Wetterdaten legen:

Es ist möglich, bei mehreren Accounts anzumelden, um die Zeit zw. zwei Updates der Wetterdaten zu minimieren. Beim Programm soll man dann das zweite Skript einfügen, dessen Ausführung zeitlich versetzt ist. Im folgenden Bsp. werden die Daten alle 30 Minuten aktualisiert.

Wetterdaten von OpenWeatherMap

Da die aktuelle Temperatur (Variable: „Temperatur [°C]“) in weiteren Programmen eingebunden ist (bei mir: Heizungssteuerung und automatische Gartenbewässerung), soll der Abholvorgang der Wetterdaten 100% zuverlässig sein. Für den Fall, wenn bei AccuWeather zum Beispiel API sich ändert oder der Server nicht verfügbar ist, habe ich mir das zweite Skript gebastelt, der im Falle eines Fehlers von AccuWeather sich die aktuellen Wetterdaten (Wettervorhersage wird folgen) von OpenWeatherMap einholt. Das Gute ist, dass OpenWeatherMap keine Einschränkungen der API-Aufrufe hat, die Wetterdaten sind aber etwas ungenauer, als bei AccuWeather. Der Fehlerzustand beim Aufruf von AccuWeather-Wetterdaten wird abgefangen durch die Veriable „Luftdruck [hPa]“. Wenn die Variable null wird, was im Normalzustand nicht sein kann, werden die Wetterdaten von OpenWeatherMap einholt.

Das Vorgehen ist ähnlich wie bei AccuWeather.

API Key von OpenWeatherMap generieren

Anmelden bei openweathermap.org.

Unter „API keys“ liegt der API-key, das man für die API-Aufrufe braucht (s. Bild unten).

Wetterstation suchen

Auf openweathermap.org gehen, im Suchfeld das gewünschte Standort eingeben. Aus den vorgeschlagenen Wetterstationen die passende wählen.

In dem Adressenfeld des Browsers die 7-stelluge Zahl merken, das ist das Wetterstation-ID.

System-Variablen anlegen

In diesem Schritt werden die Variablen angelegt. Es können insgesamt 5 Systemvariablen mit Wetterdaten anlegt werden, dabei soll die korrekte Schreibweise und Feldtyp beachtet werden. Auch hier müssen nicht alle Variablen angelegt werden, sondern nur die, die benötigt werden. Falls diese Variablen im Abschnitt AccuWeather angelegt wurden, kann dieser Schritt übersprungen werden.

Programm anlegen

Als Auslösebedingung wollte ich den Fehlerzustand vom AccuWeather-Skript abfangen. Somit wird das Skript ausgelöst, wenn Lüftdruck=0 ist, was im Normalfall nicht vorkommen kann.

Homematic Programm: OpenWeatherMap

Bedingung: Wenn…: Luftdruck [hPa] im Wertebereich von 0.00 bis kleiner 0.01 bei Änderung auslösen.

Aktivität: Dann…: Skript.

ACHTUNG: Im Skript in den Zeilen string wetterstation_id = "HIER WETTERSTATION-ID EINTRAGEN"; und string app_id = "HIER DEIN APP-ID EINTRAGEN";  das App-ID und Wetterstation-Id (mit “ „) einfügen!

Skript updatet am 03.02.2019

!Hier die WETTERSTATION-ID und APP-ID eintragen
string wetterstation_id = "HIER WETTERSTATION-ID EINTRAGEN";
string app_id = "HIER DEIN APP-ID EINTRAGEN";


var url = "http://api.openweathermap.org/data/2.5/weather?id="#wetterstation_id#"&units=metric&lang=de&appid="#app_id;
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);	 
string rueckgabe = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
integer slenght = rueckgabe.Length();
integer scount = 1;
integer sstart=1;
string s;
while (scount<slenght){
  s=rueckgabe.Substr(scount,1).ToString(1);
  if (rueckgabe.Substr(scount,1)=="]"){sstart = scount;}
  scount=scount+1;
}
string rueckgabe2=rueckgabe.Substr(sstart+2,slenght);
var wspeed = (rueckgabe2.StrValueByIndex(",",7)).StrValueByIndex(":",2).ToFloat()*3.6;
var stemp = (rueckgabe2.StrValueByIndex(",",1)).StrValueByIndex(":",2).ToFloat();
var pressure = (rueckgabe2.StrValueByIndex(",",2)).StrValueByIndex(":",1).ToInteger();
var humidity = (rueckgabe2.StrValueByIndex(",",3)).StrValueByIndex(":",1).ToInteger();
var description = (rueckgabe.StrValueByIndex(",",4)).StrValueByIndex(":",1).ToLatin().Replace("\"","");
string svName;
object svObj;
svName = "Windgeschwindigkeit [km/h]";
svObj = dom.GetObject(svName);
if (svObj) {
  svObj.State(wspeed);
}
svName = "Temperatur [°C]";
svObj = dom.GetObject(svName);
if (svObj) {
  svObj.State(stemp);
}
svName = "Luftdruck [hPa]";
svObj = dom.GetObject(svName);
if (svObj) {
  svObj.State(pressure);
}
svName = "Luftfeuchtigkeit [%]";
svObj = dom.GetObject(svName);
if (svObj) {
  svObj.State(humidity);
}
svName = "Wetter";
svObj = dom.GetObject(svName);
if (svObj) {
  svObj.Get("Wetter").State(description);
}
svName = "Wetterdienst";
svObj = dom.GetObject(svName);
if (svObj) {
  svObj.State("OpenWeatherMap");
}

Fertig! Für Verbesserungsvorschläge oder Anmerkungen bin ich dankbar.

Wichtiger Hinweis (16.04.2019)

Es kommen immer wieder die Fragen, ob das Skript noch gepflegt wird. Die aktuelle Lösung für CCU2 hat sich leider ziemlich schlecht ausgewiesen, wenn die Reihenfolge der Wetterdaten sich ändert (was schon mal passiert hatte), stimmen die Wetterdaten nicht mehr. Etwas besser ist die PHP-Lösung, man braucht aber einen PHP-fähigen Server. Besser geht es mit einer CCU3/RaspberyMatic. Dort gibt es einen JSON-Parser (bzw. kann installiert werden), was es da leichter macht, die Wetterdaten abzurufen. Diese Wetterdaten werden nämlich im JSON-Format von AccuWeather bereitgestellt. Im Laufe des nächsten Monats wird es ein SH-Skript geben (oder zumindest geplant), das die Wetterdaten von Accuweather abruft und auswertet.

Dieser Beitrag hat 46 Kommentare

  1. Hallo Dmitri,
    es ist eine sehr gute Anleitung!
    Ich habe schon lange nach der Möglichkeit gesucht, Wetterdaten in meine Homematic Steuerung aus dem Internet zu holen.
    Ich habe deine Anleitung befolgt, leider werden meine Variablen nicht beschrieben.
    CUxD habe ich nach deiner Anleitung installiert und das Systemgerät mit Exec-Funktion angelegt.
    Könntest du mir ein Paar Tipps geben wie ich den Fehler finden kann?
    Vielen Dank im Voraus!

    1. Hallo Alex,
      um den Fehler besser identifizieren zu können, gehst du in „Programme und Zentralverknüpfung“, klickst dann auf „Skript testen“ und dort fügst dein Skript ein. Danach nach jeder Wertzugabe der jeweiligen Variable prüfst du mit WriteLine() ob die Variable tatsächlich diesen Wert bekommen hat. Zum Beispiel:

      string responce = dom.GetObject(„CUxD.CUX2801001:1.CMD_RETS“).State();
      WriteLine(responce);
      Damit prüfst du, ob ein Antwort auf HTTP-Request überhaupt kommt.

      Dannach z. B.:
      var Temperature = (responce.StrValueByIndex(„,“,5)).StrValueByIndex(„:“,3).ToFloat();
      WriteLine(Temperature);
      Damit prüfst du, ob der in dem Skript deklarierte Variablen den Temperaturwert zugewiesen wird.

      oder z. B. hier:
      dom.GetObject(„Temperatur [°C]“).State(Temperature);
      WriteLine(dom.GetObject(„Temperatur [°C]“).State());
      Hier prüfst du z. B. ob die zuvor eingelegte Systemvariable den Temperaturwert bekommt.

      So würde ich vorgehen.

      1. Hallo Dmitri,
        danke für den Tipp, ich habe den Fehler gefunden.
        es sieht so aus, dass die Werte verschoben wurden.
        z.B der Temperaturwert wird an der 7.Stelle geliefert
        responce.StrValueByIndex(„,“,7)).StrValueByIndex(„:“,3).ToFloat();
        Danke noch mal für deine Unterstützung!

        1. Das ist aber komisch, bei mir funktioniert es immer noch mit den alten Stellen, die in dieser Anleitung aufgeführt sind. Nur „UV-Intensität“ liefert komischen Wert. Ich überprüfe es aber noch mal. Danke für den Hinweis.

  2. Hallo Dimitri,
    zuerst herzlichen Dank für Deine Super Beschreibung.
    Habe das soeben auch für meine CCU2 konfiguriert und kann die Aussage von Alex bestätigen.
    Vielen Dank und Grüße

    1. Ja, es stimmt. Habe ich nicht sofort bemerkt, weil ich, wie in diesem Artikel auch beschrieben wurde, zur Absicherung die Daten von OpenWeatherMap verwende. Das Skript funktioniert also nicht und muss angepasst werden! Die Anpassung kommt bald…

  3. Hallo Dimitri,
    ich kann mich Alex und Mike nur anschließen. Eine richtig tolle Anleitung.
    Es funktioniert auch soweit. Allerdings habe ich auch das gleiche Problem. Wie ist das mit den verschobenen Daten? Kann man einfach die Zeilen durchzählen und die entsprechende Zahl im Script einsetzen oder ist da speziel etwas zu beachten? Welche Zeilen muss man bechten, welche nicht?

    1. Ich habe jetzt das Skript angepasst, sodass die richtigen Werte geliefert werden. Mal sehen für wie lange…

  4. Hallo,
    Tolle Idee. Danke für die Anleitung.
    Beim Script-Test kommt bei mir dieser Fehler (Id und Key verfremdet).
    Wie kann ich dem Fehler auf dem Grund gehen?

    Error 1 at row 253 col 85 near ^ather“);^
    Parse following code failed:
    !Hier die WETTERSTATION-ID und API-KEY eintragen
    string wetterstation_id = „2273999“;
    string api_key = „uuuLX8uTfMd0LBGMFlH8DMmK30MaGUf8Um“;
    var url = „http://dataservice.accuweather.com/currentconditions/v1/“#wetterstation_id#“?apikey=“#api_key#“&language=de-de&details=true“;

  5. Sorry, war mein Fehler.

  6. Hallo Dmitri,
    vielen Dank für das Skript. Beim Schreiben der Wetterdaten in die Systemvariablen hakt es bei mir.
    Wenn ich bei Skripttest z.B nach „dom.GetObject(„Windgeschwindigkeit [km/h]“).State(wspeed);“
    die Zeile „WriteLine(dom.GetObject(„Windgeschwindigkeit [km/h]“).State());“ einfüge, sehe ich das den Systemvariablen kein Wert zugwiesen wird. Die Daten kommen von Openweather rein und die im Skript deklarierten Variablen werden auch alle befüllt. Das habe ich vorher schon überprüft.

    1. Wird der Variable wspeed ein Wert zugewiesen?
      Steht es bei dir so?
      var wspeed = (rueckgabe2.StrValueByIndex(„,“,7)).StrValueByIndex(„:“,2).ToFloat()*3.6;
      Welcher Wert wird der Variable „wspeed“ zugewiesen? Führ mal die Zeile aus: WriteLine(wspeed);
      Was kommt da raus? Ich befürchte, dass irgendwas mit der Variablen wspeed nicht stimmt.

      Bei mir steht so was (und funktioniert auch):
      var wspeed = (rueckgabe2.StrValueByIndex(„,“,7)).StrValueByIndex(„:“,2).ToFloat()*3.6;
      dom.GetObject(„[Wetter] Windgeschwindigkeit“).State(wspeed);

  7. Danke für die schnelle Antwort. Es kommt bei WriteLine(wspeed) der Wert 20.5 raus.
    Den anderen Variablen stemp, pressure, humidity und description werden auch Werte zugewiesen.

  8. Hallo Dimitri,
    von Deinen Skripten benutze ich nur das zweite Skript für die Open Weather Daten. Die Abfrage ob die Luftdruckdaten = 0 sind bei AccuWeather hab ich dementsprechend bei mir nicht berücksichtigt.
    Ich glaube das Problem gefunden zu haben. Das Skript springt nicht in den If Abfrage Zweig
    „if (!svObj) {
    dom.GetObject(„Windgeschwindigkeit [km/h]“).State(wspeed);
    }
    Warum wird die Abfrage im Skript durchgeführt ( if (!svObj)….) ?

    1. Hallo Carsten,

      du hast recht, da ist ein Fehler drin. Es soll „if (!svObj)…“ sein, ohne Ausrufezeichen.
      In diesem If-Zweig wird überprüft, ob die Variable existiert, nur dann wird der Variablen ein Wert zugewiesen. Ich habe das Skript angepasst, es soll jetzt funktionieren.

      Gruß
      Dmitri

  9. Hallo,
    ich habe alles entsprechend der Vorgaben umgesetzt, erhalte aber nur Standardwerte in den Variablen (den niedrigst zulässigeen Wert). Habe daher mal die URL aus dem Skript im Browser eingegeben:

    http://dataservice.accuweather.com/currentconditions/v1/„#167330#“?apikey=“#yp380aS…9NdkeMnAp#“&language=de-de&details=true (Key wurde gekürzt)

    Dann erhalte ich folgende Rückmeldung:
    fault
    faultstring „Failed to resolve API Key variable request.queryparam.apikey“
    detail
    errorcode „steps.oauth.v2.FailedToResolveAPIKey“

    Hat jemand eine Idee, was mein Fehler ist? Die erstellte App auf Accuweather hat den Status Approved, und der Key wurde mit Copy and Paste übernommen. Vielen Dank für Tips.

  10. Hallo,

    sehr schönes Script, funktioniert soweit auch. Eine Frag habe ich: Können Sie mir sagen für welchen Zeitraum die Forecast werte gültig sind? Ich würde gerne für den kommenden Tag die Sonnenscheindauer haben (für die Steuerung von Rollläden). Weis aber nicht wann ich den Abruf machen soll um den Zeitraum für den kommenden Tag zu erhalten.
    Gibt es dazu eine Dokumentation oder hat dazu schon jemand Erfahrung?

    Grüße,
    Benedikt

    1. Hallo,

      in dem Skript werden die 1-Tag-Wetterdaten von AccuWeather abgerufen. Leider steht auf der Seite on AccuWeather nichts darüber, für welchen Zeitraum die Wetterdaten gültig sind. Es steht nur so was da: Returns daily forecast data for a specific location. Ich nehmen an, die Wetterdaten sind für kommenden Tag gpltig. Wenn du also den Abruf der Wetterdaten bis 00:00 machst, werden die Wetterdaten für den nächsten Tag ab 00:00 gültig.

      Gruß
      Dmitri

  11. Hallo.

    habe beide Skripte von hier erfolgreich laufen. Ein prima Beitrag.
    Nur leider lassen sich ein paar Daten nur sehr unregelmäßig empfangen. z.B. min. Temp und max. Temp sehe ich in den Variablen nur sehr sehr selten mal. Woran kann das liegen?

    Gruß

    Christian

  12. Hallo Dmitri,
    es scheinen sich einige Fehler u.a. ab Zeile 109 MinTemp eingeschlichen zu haben. Kannst Du bitte mal prüfen. Irgendwie komme ich nicht weiter.
    VG, Peter

    1. Das geht mir genauso, AccuWeather-Script:

      Error 1 at row 109 col 20 near ^. [°C]“).State(TemperatureMin);
      }
      svName = „Max. Temp. [°C]“;
      svObj = dom.GetO
      Error 1 at row 109 col 20 near ^. [°C]“).State(TemperatureMin);
      }
      svName = „Max. Temp. [°C]“;
      svObj = dom.GetO

      1. Da hat sich vermutlich ein Fehler eingeschlichen, statt

        svName = „Min. Temp. [°C]“;
        svObj = dom.GetObject(svName);
        if (svObj){
        svObj. Temp. [°C]“).State(TemperatureMin);
        }
        svName = „Max. Temp. [°C]“;
        svObj = dom.GetObject(svName);
        if (svObj){
        svObj. Temp. [°C]“).State(TemperatureMax);
        }
        svName = „Max. RealFeel-Temp. [°C]“;
        svObj = dom.GetObject(svName);
        if (svObj){
        svObj. RealFeel-Temp. [°C]“).State(RealFeelTemperatureMax);
        }
        svName = „Min. RealFeel-Temp. [°C]“;
        svObj = dom.GetObject(svName);
        if (svObj){
        svObj. RealFeel-Temp. [°C]“).State(RealFeelTemperatureMin);
        }

        sollte es wohl so sein:

        svName = „Min. Temp. [°C]“;
        svObj = dom.GetObject(svName);
        if (svObj){
        svObj.State(TemperatureMin);
        }
        svName = „Max. Temp. [°C]“;
        svObj = dom.GetObject(svName);
        if (svObj){
        svObj.State(TemperatureMax);
        }
        svName = „Max. RealFeel-Temp. [°C]“;
        svObj = dom.GetObject(svName);
        if (svObj){
        svObj.State(RealFeelTemperatureMax);
        }
        svName = „Min. RealFeel-Temp. [°C]“;
        svObj = dom.GetObject(svName);
        if (svObj){
        svObj.State(RealFeelTemperatureMin);
        }

  13. Hi!

    Leider liefert mir die variable „rueckgabe“ in deinem openweathermap skript keinerlei werte zurück. URL mittels WriteLine (url); direkt im Browser funktioniert hingegen anstandslos – was habe ich falsch gemacht?

    1. Hat sich erledigt (CUxD addon vergessen..)

  14. Hallo Dmitri, danke für das Skript für OpenWeatherCom.
    Funktioniert super.
    Allerdings geht die Variable Wetter bei mir so nicht:
    svName = „Wetter“;
    svObj = dom.GetObject(svName);
    if (svObj) {
    svObj.Get(„Wetter“).State(description);
    }

    Habe es in
    svObj.State(description);

    geändert.

    1. Danke für Deinen Hinweis Patrick, habe mich schon dusselig gesucht.

      Hallo Dmitri, vielleicht kannst Du Deinen Scriptvorschlag entsprechend anpassen.

      Besten Dank und Gruß

      1. Danke für den Hinweis. Stimmt, das ist ein Fehler. Ich habe es bei mir korrigiert, hier aber vergessen. Jetzt ist es erledigt.

  15. Hallo Dimitri,
    super Skript ! Hast Du eine Liste der Rückgabewerte bei OpenWeatherMap, damit ich auch z.B. Regen in mm oder anderes abrufen kann ?

      1. Das mit OpenWeatherMap hat super geklappt. Nun würde mich noch interessieren, wie Du bei AccuWeather auf die Variablen ID gekommen bist. z.B CloudCover, „56“ ?
        Ich habe eine API Abfrage gemacht, konnte aber keinen Zusammenhang feststellen.
        Danke im Voraus

  16. Hallo Dimitri,
    super Skript ! bei mir sieh es so aus, als hätten sich die Werte wieder verschoben. z.B temperatureMin

    Danke noch mal für deine Unterstützung!

    1. Das ist gerade das Problem bei diesem Skript, wenn die Reihenfolge der Werten geändert wird, funktioniert alles nicht mehr. Ich nutze jetzt das PHP-Skript zur abfrage, da gibt es ein richtiger JSON-Parser. Ich werde in Kürze PHP-Lösung ein SSH-Script für CCU3 (da gibt es auch ein XML/JSON parser) vorstellen.

  17. Hallo ! Danke für das Script:
    Es funktioniert aber nur bedingt, da einige Werte nicht gefüllt werden. Z. B. wird kein Wert NightWindSpeed zurückgegeben:
    [{„LocalObservationDateTime“:“2019-03-10T15:11:00+01:00″,“EpochTime“:1552227060,“WeatherText“:“Leichter Regen“,“WeatherIcon“:12,“HasPrecipitation“:true,“PrecipitationType“:“Rain“,“IsDayTime“:true,“Temperature“:{„Metric“:{„Value“:4.3,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:40.0,“Unit“:“F“,“UnitType“:18}},“RealFeelTemperature“:{„Metric“:{„Value“:0.5,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:33.0,“Unit“:“F“,“UnitType“:18}},“RealFeelTemperatureShade“:{„Metric“:{„Value“:0.5,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:33.0,“Unit“:“F“,“UnitType“:18}},“RelativeHumidity“:96,“DewPoint“:{„Metric“:{„Value“:3.6,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:39.0,“Unit“:“F“,“UnitType“:18}},“Wind“:{„Direction“:{„Degrees“:113,“Localized“:“OSO“,“English“:“ESE“},“Speed“:{„Metric“:{„Value“:11.3,“Unit“:“km/h“,“UnitType“:7},“Imperial“:{„Value“:7.0,“Unit“:“mi/h“,“UnitType“:9}}},“WindGust“:{„Speed“:{„Metric“:{„Value“:14.9,“Unit“:“km/h“,“UnitType“:7},“Imperial“:{„Value“:9.3,“Unit“:“mi/h“,“UnitType“:9}}},“UVIndex“:0,“UVIndexText“:“Niedrig“,“Visibility“:{„Metric“:{„Value“:9.7,“Unit“:“km“,“UnitType“:6},“Imperial“:{„Value“:6.0,“Unit“:“mi“,“UnitType“:2}},“ObstructionsToVisibility“:““,“CloudCover“:100,“Ceiling“:{„Metric“:{„Value“:488.0,“Unit“:“m“,“UnitType“:5},“Imperial“:{„Value“:1600.0,“Unit“:“ft“,“UnitType“:0}},“Pressure“:{„Metric“:{„Value“:998.6,“Unit“:“mb“,“UnitType“:14},“Imperial“:{„Value“:29.49,“Unit“:“inHg“,“UnitType“:12}},“PressureTendency“:{„LocalizedText“:“Gleichbleibend“,“Code“:“S“},“Past24HourTemperatureDeparture“:{„Metric“:{„Value“:-4.3,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:-8.0,“Unit“:“F“,“UnitType“:18}},“ApparentTemperature“:{„Metric“:{„Value“:6.1,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:43.0,“Unit“:“F“,“UnitType“:18}},“WindChillTemperature“:{„Metric“:{„Value“:1.7,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:35.0,“Unit“:“F“,“UnitType“:18}},“WetBulbTemperature“:{„Metric“:{„Value“:4.0,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:39.0,“Unit“:“F“,“UnitType“:18}},“Precip1hr“:{„Metric“:{„Value“:1.2,“Unit“:“mm“,“UnitType“:3},“Imperial“:{„Value“:0.05,“Unit“:“in“,“UnitType“:1}},“PrecipitationSummary“:{„Precipitation“:{„Metric“:{„Value“:1.2,“Unit“:“mm“,“UnitType“:3},“Imperial“:{„Value“:0.05,“Unit“:“in“,“UnitType“:1}},“PastHour“:{„Metric“:{„Value“:1.2,“Unit“:“mm“,“UnitType“:3},“Imperial“:{„Value“:0.05,“Unit“:“in“,“UnitType“:1}},“Past3Hours“:{„Metric“:{„Value“:3.3,“Unit“:“mm“,“UnitType“:3},“Imperial“:{„Value“:0.13,“Unit“:“in“,“UnitType“:1}},“Past6Hours“:{„Metric“:{„Value“:3.3,“Unit“:“mm“,“UnitType“:3},“Imperial“:{„Value“:0.13,“Unit“:“in“,“UnitType“:1}},“Past9Hours“:{„Metric“:{„Value“:5.1,“Unit“:“mm“,“UnitType“:3},“Imperial“:{„Value“:0.2,“Unit“:“in“,“UnitType“:1}},“Past12Hours“:{„Metric“:{„Value“:5.7,“Unit“:“mm“,“UnitType“:3},“Imperial“:{„Value“:0.22,“Unit“:“in“,“UnitType“:1}},“Past18Hours“:{„Metric“:{„Value“:8.1,“Unit“:“mm“,“UnitType“:3},“Imperial“:{„Value“:0.32,“Unit“:“in“,“UnitType“:1}},“Past24Hours“:{„Metric“:{„Value“:8.1,“Unit“:“mm“,“UnitType“:3},“Imperial“:{„Value“:0.32,“Unit“:“in“,“UnitType“:1}}},“TemperatureSummary“:{„Past6HourRange“:{„Minimum“:{„Metric“:{„Value“:4.3,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:40.0,“Unit“:“F“,“UnitType“:18}},“Maximum“:{„Metric“:{„Value“:6.1,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:43.0,“Unit“:“F“,“UnitType“:18}}},“Past12HourRange“:{„Minimum“:{„Metric“:{„Value“:4.3,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:40.0,“Unit“:“F“,“UnitType“:18}},“Maximum“:{„Metric“:{„Value“:6.1,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:43.0,“Unit“:“F“,“UnitType“:18}}},“Past24HourRange“:{„Minimum“:{„Metric“:{„Value“:4.3,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:40.0,“Unit“:“F“,“UnitType“:18}},“Maximum“:{„Metric“:{„Value“:8.4,“Unit“:“C“,“UnitType“:17},“Imperial“:{„Value“:47.0,“Unit“:“F“,“UnitType“:18}}}},“MobileLink“:“http://m.accuweather.com/de/de/papenburg/26871/current-weather/174028″,“Link“:“http://www.accuweather.com/de/de/papenburg/26871/current-weather/174028″}]

    Ich denke es bedarf einer Anpassung. Danke für die Mühe !!!
    Gruß, Jörg

    1. Ich habe es oben schon geschrieben. Das ist gerade das Problem bei diesem Skript, wenn die Reihenfolge der Werten geändert wird, funktioniert alles nicht mehr. Ich nutze jetzt das PHP-Skript zur abfrage, da gibt es ein richtiger JSON-Parser. Ich werde in Kürze PHP-Lösung für CCU2 sowie ein SSH-Skript für CCU3 (da gibt es auch ein XML/JSON parser) vorstellen. Diese Lösung ist leider nicht gelungen, die Änderungen an den Wetterdaten einzupflegen, ist keine gute Lösung. Sorry.

  18. Hallo,
    ich möchte von hier:
    Resource URL
    http://dataservice.accuweather.com/currentconditions/v1/174583
    Query Parameters

    Name
    Values
    Description
    apikey
    (required)

    Provided API Key
    language

    String indicating the language in which to return the resource
    details

    Boolean value specifies whether or not to include full details in the response.

    Reset
    Request Response cURL
    HTTP/1.1 200 OK

    „UVIndex“: 0,
    „UVIndexText“: „Niedrig“,
    „Visibility“:
    „Pressure“: {
    „Metric“: {
    „Value“: 1019,
    „Unit“: „mb“,
    „UnitType“: 14
    },
    „Imperial“: {
    „Value“: 30.09,
    „Unit“: „inHg“,
    „UnitType“: 12
    }
    },
    „PressureTendency“: {
    „LocalizedText“: „Steigend“,
    „Code“: „R“
    nur diese Daten nutzen als:
    Neuer Luftdruck
    Luftdrucktrend
    Luftdruck inHq
    UV und
    UV Index
    Wie bringe ich die ins Script und in die Variablen?
    Hatte das bisher von Wonderground, aber da gibts seit Jahresanfang keine Daten mehr.

  19. Hallo Dmitri
    ich habe bisher Wunderground benutzt geht ja nicht mehr
    Frage was ist denn bei der obigen Lösung mit Akku Wheather über Cux Daemon das Problem
    bzw wieso haben sie das ganze mit dem PHP skript nochmals gemacht ?

    1. Hallo Norber,

      Das Problem der Lösung über CuxD ist, dass CuxD bzw. CCU2 keinen JSON-Parser besetzen. In dieser Lösung werden Kommas und Doppelpunkte gezählt. Sobald bei Accuweather die Reihenfolge verändert wird, funktioniert das Skript nicht mehr (oder liefert falsche Daten). Dies ist schon ein paarmal passiert. In der PHP-Lösung spielt die Reihenfolge der Daten keine Rolle, da es über einen JSON-Parser realisiert wird.

      Gruß,
      Dmitri

  20. Hallo Dmitri,
    danke für die Anleitung, läuft soweit, auch wenn nicht alle Accuweather-Werte beschrieben werden (nutze bisher nur den Teil). Aber wäre es auch noch möglich, irgendwie die Windrichtung sowie die Zeiten für Sonnen/Mond Auf/Untergang mit auswerten zu können?

    1. Hallo Michael,

      Das Skript wird leider nicht mehr entwickelt, weil es sich ergeben hat, dass das Skript unzuverlässig ist (sehe mein Kommentar oben).

      Gruß
      Dmitri

    2. @Michael:
      Script Sonnenauf/Untergang:
      dom.GetObject(‚Sonnenaufgang‘).State(system.SunriseTime(„%H:%M“));
      dom.GetObject(‚Sonnenuntergang‘).State(system.SunsetTime(„%H:%M“));

      Script Windrichtung:
      var Winddirection = (responce.StrValueByIndex(„,“,33)).StrValueByIndex(„:“,1).ToLatin().Replace(„\““,““);
      svName = „Windrichtung“;
      svObj = dom.GetObject(svName);
      if (svObj){
      svObj.State(Winddirection);
      }

      Systemvariable anlegen „Windrichtung“, Zeichenkette

      für diejenigen, die es ohne CUXD laufen lassen wollen:
      !dom.GetObject(„CUxD.CUX2801001:1.CMD_SETS“).State(„wget -q -O – ‚“#url#“‚“);
      !dom.GetObject(„CUxD.CUX2801001:1.CMD_QUERY_RET“).State(1);
      !string responce = dom.GetObject(„CUxD.CUX2801001:1.CMD_RETS“).State();
      string stdout;
      string stderr;
      system.Exec(„wget -q -O – ‚“#url#“‚“, &stdout, &stderr);
      WriteLine(stdout);
      string responce = stdout;
      WriteLine(responce);

  21. Hallo Dmitri,
    habe das Skript trotz der Unzuverlässigkeit mal nachgebaut.
    Was mich interessieren würde: Einige Datenpunkte (Temperatur, Luftfeuchtigkeit, Luftdruck, …) gehen problemlos. Andere, wie ich das sehe hauptsächlich die Vorhersagen, gehen nicht (mehr). Kannst du das erklären, bzw ist davon auszugehen dass die aktuell funktionsfähigen auch weiterhin gehen werden?
    Danke

    1. …..ach ja, noch eine Frage: Besteht die „Unzuverlässigkeit“ bei OpenWeatherMap eigentlich auch?

      1. Da leider auch. Das Problem ist, es gibt kein JSON-Parser bei CCU, nachinstallieren kann man es auch nicht. Um an die Wetterdaten zu kommen, werden Kommas und Klammern gezählt, sobald aber deren Reinfolge sich ändert, funktioniert das ganze nicht mehr.

  22. Hallo Dmitri,

    besteht die Möglichkeit das Script von Accuweather zur Abfrage der Wetterdaten um die Abfrage der Niederschlagsmenge zu erweitern?

    Gruß Tobias

    1. Das Skript ist leider sehr unzuverlässig, ich arbeite gerade an dem Skript für CCU3/Raspberymatic, das zuverlässiger sein sollte. In dem Skript kann ich es realisieren, wenn das Wetter-API diese anbietet.

Schreibe einen Kommentar

Menü schließen