Regenvorhersage OpenWeatherMap

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

Marcus1807
Beiträge: 119
Registriert: 12.07.2013, 11:12
Wohnort: Fürth
Danksagung erhalten: 10 Mal

Regenvorhersage OpenWeatherMap

Beitrag von Marcus1807 » 10.04.2019, 20:39

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
------------------------------------------------------------------------------------------------
when you make a change: ensure that it is an improvement... :idea:
Raspberrymatic auf PI4+ mit SSD & iobroker
--------------------------------------------

Hypnos
Beiträge: 460
Registriert: 06.01.2018, 12:48
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 57 Mal
Danksagung erhalten: 39 Mal

Re: Regenvorhersage OpenWeatherMap

Beitrag von Hypnos » 11.04.2019, 12:10

Hallo,

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

Gruß

spartacuss
Beiträge: 65
Registriert: 05.08.2016, 22:27
Hat sich bedankt: 6 Mal

Re: Regenvorhersage OpenWeatherMap

Beitrag von spartacuss » 12.04.2019, 07:29

@Hypnos,
wo liegt der Vorteil gegenüber dem Script?

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

Re: Regenvorhersage OpenWeatherMap

Beitrag von MartinBr » 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
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

Hypnos
Beiträge: 460
Registriert: 06.01.2018, 12:48
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 57 Mal
Danksagung erhalten: 39 Mal

Re: Regenvorhersage OpenWeatherMap

Beitrag von Hypnos » 12.04.2019, 23:25

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.

Hypnos
Beiträge: 460
Registriert: 06.01.2018, 12:48
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 57 Mal
Danksagung erhalten: 39 Mal

Re: Regenvorhersage OpenWeatherMap

Beitrag von Hypnos » 12.04.2019, 23:40

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) 11564 mal betrachtet
Man kann die Openweathermap node auch 2 mal nehmen, ein mal für die aktuellen Wetterdaten und eine für die Vorhersage.

Muasmolle
Beiträge: 68
Registriert: 30.03.2017, 21:34
Wohnort: Laupheim
Hat sich bedankt: 11 Mal

Re: Regenvorhersage OpenWeatherMap

Beitrag von Muasmolle » 13.04.2019, 02:12

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

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

Re: Regenvorhersage OpenWeatherMap

Beitrag von MartinBr » 13.04.2019, 07:30

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

spartacuss
Beiträge: 65
Registriert: 05.08.2016, 22:27
Hat sich bedankt: 6 Mal

Re: Regenvorhersage OpenWeatherMap

Beitrag von spartacuss » 13.04.2019, 19:21

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?

Marcus1807
Beiträge: 119
Registriert: 12.07.2013, 11:12
Wohnort: Fürth
Danksagung erhalten: 10 Mal

Re: Regenvorhersage OpenWeatherMap

Beitrag von Marcus1807 » 23.04.2019, 10:06

Was funktioniert denn nicht?
Verwendest Du mein Script oder den node/flow in RedMatic?
------------------------------------------------------------------------------------------------
when you make a change: ensure that it is an improvement... :idea:
Raspberrymatic auf PI4+ mit SSD & iobroker
--------------------------------------------

Antworten

Zurück zu „Projektvorstellungen“