Seite 1 von 4

Regenvorhersage OpenWeatherMap

Verfasst: 10.04.2019, 20:39
von Marcus1807
Hallo zusammen,
nachdem ich für meine Gartenbewässerung die Regenvorhersage der nächsten Tage benötige und Wunderground ihre API umgestellt hat und eine Vorhersage nicht mehr kostenlos abgerufen werden kann bin ich auf OpenWeatherMap umgestiegen.

Es gibt sicherlich elegantere Möglichkeiten die Regenvorhersage aus dem XML abzufragen - aber für mich funktioniert es.

Voraussetzungen:
  • Du hast einen API-Key (kostenlos)
  • Du legst diese Systemvariablen an: "Regen00_24","Regen24_48", "Regen48_72", "Regen72_96", "Regen96_120"
Die Systemvariablen werden bei Ausführung des Scripts gefüllt mit den summierten Regenvorhersagen in mm:
"Regen00_24" liefert die Vorhersage für die nächsten 24h
"Regen24_48" liefert die Vorhersage für den Zeitraum 24h und 48h
usw.

Code: Alles auswählen


var url = "http://api.openweathermap.org/data/2.5/forecast?id=2817736&appid=YOUR-API-KEY&lang=de&mode=xml&units=metric&lang=de"; 

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var weatherData = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
WriteLine(weatherData);

integer startIndex = weatherData.Find("forecast");
integer endIndex = weatherData.Find("/forecast");
WriteLine("StartIndex: " # startIndex);
WriteLine("EndIndex: " # endIndex);
string forecast = weatherData.Substr(startIndex, endIndex);
WriteLine(forecast);

real rain00_24 = 0.0;
real rain24_48 = 0.0;
real rain48_72 = 0.0;
real rain72_96 = 0.0;
real rain96_120 = 0.0;

integer counter = 0;
integer len = forecast.Length();
integer start = forecast.Find("time");
integer end = forecast.Find("/time");

while (start > 0)
{
  counter = counter + 1;
  !WriteLine("+++ " #counter # " +++");

  string currentForecast = forecast.Substr(start, end);
  !WriteLine(currentForecast);
  
  integer noValue = currentForecast.Find("precipitation  /precipitation");
  if (noValue < 0)
  {
     integer rainStart = currentForecast.Find(" precipitation");
     integer rainEnd = currentForecast.Find("/precipitation");
     string rainString = currentForecast.Substr(rainStart, rainEnd);
     !WriteLine(rainString);
    
     integer rainValueStart = rainString.Find("value=\"");
     integer rainValueEnd = rainString.Find(" type=\"");
     string rainValue = rainString.Substr(rainValueStart + 7, rainValueEnd - rainValueStart + 8);
     real rainValueReal = rainValue.ToFloat();
     !WriteLine(rainValueReal); 
    
     if (rainValueReal > 0)
     {
       if (counter <= 8)
       {
       	 rain00_24 = rain00_24 + rainValueReal;
       }
       elseif (counter <= 16)
       {
       	 rain24_48 = rain24_48 + rainValueReal;
       }
       elseif (counter <= 24)
       {
       	 rain48_72 = rain48_72 + rainValueReal;
       }
       elseif (counter <= 32)
       {
       	 rain72_96 = rain72_96 + rainValueReal;
       }
       elseif (counter <= 40)
       {
       	 rain96_120 = rain96_120 + rainValueReal;
       }
     }
  }  
  
  ! ##### Prepare next loop ######
  integer newEnd = end + 5; 
  integer newLength = len - end -5;
  if (newLength > 0)
  {
	forecast = forecast.Substr(newEnd, newLength);
    len = forecast.Length();
    start = forecast.Find("time");
    end = forecast.Find("/time");
  }
  else 
  {  
	  start = -1;
  }
    
  
  ! ##### Block infinite loop ######
  if (counter == 50)
  {
    WriteLine("Endlosschleifenabssicherung")
    start = -1;
  }
}

dom.GetObject("Regen00_24").State(rain00_24);
dom.GetObject("Regen24_48").State(rain24_48);
dom.GetObject("Regen48_72").State(rain48_72);
dom.GetObject("Regen72_96").State(rain72_96);
dom.GetObject("Regen96_120").State(rain96_120);

!WriteLine("00_24: " # rain00_24);
!WriteLine("24_48: " # rain24_48);
!WriteLine("48_72: " # rain48_72);
!WriteLine("72_96: " # rain72_96);
!WriteLine("96_120: " # rain96_120);

Bei mir läuft das Script alle 3h.

Im Script sind noch einige Debug-Ausgaben enthalten. Einfach auskommentieren wenn es stört.

Für Verbesserungen und Fehlerkorrekturen bin ich jederzeit zu haben - einfach kommentieren. :D

Viele Grüße
Marcus

Re: Regenvorhersage OpenWeatherMap

Verfasst: 11.04.2019, 12:10
von Hypnos
Hallo,

weil es gerade eine Anfrage gab, hier gibt es eine Anleitung, wie das mit Redmatic anstelle eines Scriptes geht.

Gruß

Re: Regenvorhersage OpenWeatherMap

Verfasst: 12.04.2019, 07:29
von spartacuss
@Hypnos,
wo liegt der Vorteil gegenüber dem Script?

Re: Regenvorhersage OpenWeatherMap

Verfasst: 12.04.2019, 11:16
von MartinBr
Hallo Hypnos,
in dem RedMatic Node vermisse ich die Regenvorhersage, also irgendetwas in Richtung <msg.payload.rain>.
Das könnte ich für die Bewässerungssteuerung nutzen.
Aktuell kopiere ich mir die Systemvariablen vom ioBroker auf die CCU und werte sie dort in der Steuerung aus.
Gruß
Martin

Re: Regenvorhersage OpenWeatherMap

Verfasst: 12.04.2019, 23:25
von Hypnos
spartacuss hat geschrieben:
12.04.2019, 07:29
@Hypnos,
wo liegt der Vorteil gegenüber dem Script?
Da gehen die Meinungen auseinander. Einige finden die WebUI mit Ihren Programmen und Scripten gut und andere machen einen großen Bogen drumherum, weil sie schon zu viele Probleme mit den Bugs hatten.

Nähere Informationen siehe diese Diskussion.

Re: Regenvorhersage OpenWeatherMap

Verfasst: 12.04.2019, 23:40
von Hypnos
MartinBr hat geschrieben:
12.04.2019, 11:16
Hallo Hypnos,
in dem RedMatic Node vermisse ich die Regenvorhersage, also irgendetwas in Richtung <msg.payload.rain>.
Das könnte ich für die Bewässerungssteuerung nutzen.
Aktuell kopiere ich mir die Systemvariablen vom ioBroker auf die CCU und werte sie dort in der Steuerung aus.
Gruß
Martin
Anstelle "current weather for" kann man in der node "5 day forecast" auswählen:
2019-04-12_23h32 001.png
Damit ändern sich die ausgegebenen Daten und hier gibt es die Regenvorhersage unter <msg.payload.0.rain.3h>, <msg.payload.1.rain.3h>, <msg.payload.2.rain.3h> ...

Die vorhandene Daten kann man sich ansehen, indem man einen debug node an den Ausgang hängt:
2019-04-12_23h33 001.png
2019-04-12_23h33 001.png (10.05 KiB) 11626 mal betrachtet
Man kann die Openweathermap node auch 2 mal nehmen, ein mal für die aktuellen Wetterdaten und eine für die Vorhersage.

Re: Regenvorhersage OpenWeatherMap

Verfasst: 13.04.2019, 02:12
von Muasmolle
Hallo Markus,
das Skript ist ja super. Hat bei mir auf der CCU2 auf anhieb funktioniert!
Es wäre noch super, wenn auch noch die Vorhersagen für die nächsten 3 Tage der Temperatur (<temperature unit="celsius" value="5.55" min="5.46" max="5.55"/>) und der Wolken (<clouds value="Ein paar Wolken" all="12" unit="%"/>) in Systemvariablen geschrieben werden könnten. Dann hätte man alle wichtigen Parameter einer Vorhersage im System.
Da ich aber mit Skripten auf Kriegsfuss stehe, wäre es toll, wenn du mir dabei helfen könntest. Denke dass viele andere Nutzer hier auch Interesse an einer funktionierenden Wettervorhersage hätten. Die vielen Anleitungen dazu hier im Forum basieren ja auf Skripte für Dienste, die mitlerweile keine Kostenlosen API-Schnittstelle mehr anbieten.
Viele Grüße,
Klaus

Re: Regenvorhersage OpenWeatherMap

Verfasst: 13.04.2019, 07:30
von MartinBr
Hallo Hypnos,
das ist genau die Lösung, die ich gesucht habe. Vielen Dank für die Info. Da werde ich wohl in den nächsten Tage ein bisschen experimentieren müssen :D

Gruß
Martin

Re: Regenvorhersage OpenWeatherMap

Verfasst: 13.04.2019, 19:21
von spartacuss
Moin,

irgendwie funktioniert das bei mir nicht, alle Werte in den Sysvar stehen fest auf 0,00mm.

Ist das denn http://api.openweathermap.org/data/2.5/ ... &lang=de";schon mal korrekt? Ich komme aus Köln.

Wo kann ich sonst noch suchen?

Re: Regenvorhersage OpenWeatherMap

Verfasst: 23.04.2019, 10:06
von Marcus1807
Was funktioniert denn nicht?
Verwendest Du mein Script oder den node/flow in RedMatic?