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 OpenWeatherMap Zugang https://home.openweathermap.org/users/sign_in
- Du hast einen API-Key (kostenlos)
- Du kennst Deine Station ID: steht in der URL wenn du nach einer Seite suchst: https://openweathermap.org/city/2867714
- Du legst diese Systemvariablen an: "Regen00_24","Regen24_48", "Regen48_72", "Regen72_96", "Regen96_120"
"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);
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.
Viele Grüße
Marcus