Für AWEKAS habe ich mich entschieden, da dort a) die Daten einer lokalen Wetterstation b) eine einfache Prognose online verfügbar sind.
Meine Nachfrage direkt bei AWEKAS betreffend einer API für die Wetterdaten einer bestimmten Station wurde leider negativ beantwortet. D.h. ein entsprechender Service existiert zur Zeit nicht.
Daher habe ich nun 2 Scripts geschrieben, die mir einerseits die aktuellen Daten und andererseits die Forecast-Daten einer bestimmten Wetterstation via Webauftritt herunterladen, parsen und die Daten in Systemvariablen speichern.
Code: Alles auswählen
!---- AWEKAS forcast Daten holen ----------------------------------------------------------------------------------------------------
! Skript liest forcast Wetterdaten des AWEKAS Wetterdienstes und speichert diese in lokalen Variablen ab
! - Prognosedaten für Temperatur, Niederschlag, Wolkendecke, Windgeschwindigkeit, Windspitzen
!--------------------------------------------------------------------------------------------------------------------------
!
! variable Daten
var Station = "5826"; ! Stationsnummer im AWEKAS
! -------------------------------------------------------------------------------------------------------------------------
! fixe Daten und Variablennamen
var address = "https://stationsweb.awekas.at/";
var CUxD_Device = "CUxD.CUX2801001:1";
var stdout; ! Zwischenspeicher für Rohdaten
string text1;
var pos_text1;
var pos_text2;
var pos_text3;
var i;
string text2;
string text3;
string text4;
string linie;
real Cover; ! Cloudcover
real Temp;
real Baro;
real Wind;
real Gust;
real Rain;
string singlecover; ! variable to store all 6 values of cover
string singletemp; ! variable to store all 12 values of temp
string singlebaro;
string singlewind;
string singlegust;
string singlerain;
string variable_cover ="Cover_";
string zeiten_cover ="12;24;36;48;60;72"; ! hours from now for the forecast values of cover
string variable_wind ="Wind_";
string variable_gust ="Gust_";
string variable_baro ="Baro_";
string variable_rain ="Rain_";
string variable_temp ="Temp_";
string zeiten = "6;12;18;24;30;36;42;48;54;60;66;72"; ! hours from now for the forecast data of all the rest
string singlezeit;
string url_forcast_values = address + "forecast.php?id=" + Station + "&lng=de";
!-------------------------------------------------------------------------------------------------------------------------
! hole die Rohdaten
dom.GetObject(CUxD_Device + ".CMD_SETS").State("wget -q -O - " + url_forcast_values);
dom.GetObject(CUxD_Device + ".CMD_QUERY_RET").State(1);
stdout = dom.GetObject(CUxD_Device + ".CMD_RETS").State();
!WriteLine(stdout);
!---- Cloudcover
text1 = "src=\"images/fc_cloudcover.png\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
text3 = stdout.Substr(pos_text1, 400); ! finde den Abschnitt mit den Forecast Werten für cloudcover
text3 = text3.Substr( text3.Find("\n")+1, text3.Find("/tr") - text3.Find("\n")+1 ); ! trimme auf den Bereich zwischen dem ersten Zeilenumbruch und dem "/tr"
!WriteLine(text3);
Cover = "";
foreach(linie, text3.Split("\n")) {
text2 = linie.StrValueByIndex("data2", 1); ! holt den Teilstring raus, der nach "data2" steht (ata2" 13% /td )
Cover = Cover + ";" + text2.Substr(6, text2.Find("/td")-8); ! schneidet zwischen "ata2" und vor dem "%"-Zeichen
!WriteLine(Cover);
}
Cover = Cover.Substr(1, Cover.Length()-2); ! Trennt das führende ";" und das abschliessende ";" ab
WriteLine("Cover: " + Cover);
!------------- Temperature Forecast Data
text1 = "var data";
pos_text1 = stdout.Find(text1) + text1.Length();
text3 = stdout.Substr(pos_text1, 100);
Temp = text3.Substr( text3.Find("[") + 1, text3.Find("]") - text3.Find("[") +1 );
WriteLine("Temp: " + Temp);
!------------ Barometer Forecast Data
text1 = "var barodata";
pos_text1 = stdout.Find(text1) + text1.Length();
text3 = stdout.Substr(pos_text1, 100);
Baro = text3.Substr( text3.Find("[") + 1, text3.Find("]") - text3.Find("[") +1 );
WriteLine("Baro: " + Baro);
!------------ Wind Forecast Data
text1 = "var winddata";
pos_text1 = stdout.Find(text1) + text1.Length();
text3 = stdout.Substr(pos_text1, 100);
Wind = text3.Substr( text3.Find("[") + 1, text3.Find("]") - text3.Find("[") +1 );
WriteLine("Wind: " + Wind);
!------------ Gust Forecast Data
text1 = "var gustdata";
pos_text1 = stdout.Find(text1) + text1.Length();
text3 = stdout.Substr(pos_text1, 100);
Gust = text3.Substr( text3.Find("[") + 1, text3.Find("]") - text3.Find("[") +1 );
WriteLine("Gust: " + Gust);
!------------ Rain Forecast Data
text1 = "var raindata";
pos_text1 = stdout.Find(text1) + text1.Length();
text3 = stdout.Substr(pos_text1, 100);
Rain = text3.Substr( text3.Find("[") + 1, text3.Find("]") - text3.Find("[") +1 );
WriteLine("Rain: " + Rain);
!----------- Variablen befüllen
i=0; !----- Variablen mit 6 Werten befüllen, Abstand 12h
foreach(singlecover, Cover.Split(";")) {
variable_cover = "Cover_" + zeiten_cover.StrValueByIndex(";", i);
dom.GetObject(variable_cover).Variable(singlecover.ToInteger());
i = i+1;
}
i=0;
foreach(singlezeit, zeiten.Split(";")) { ! ---- Variablen befüllen, die 12 Forecast Werte im Abstand von 6h haben
variable_wind = "Wind_" + singlezeit.ToInteger();
variable_gust ="Gust_" + singlezeit.ToInteger();
variable_baro ="Baro_" + singlezeit.ToInteger();
variable_rain ="Rain_" + singlezeit.ToInteger();
variable_temp ="Temp_" + singlezeit.ToInteger();
dom.GetObject(variable_wind).Variable(Wind.StrValueByIndex(",",i));
dom.GetObject(variable_gust).Variable(Gust.StrValueByIndex(",",i));
dom.GetObject(variable_baro).Variable(Baro.StrValueByIndex(",",i));
dom.GetObject(variable_rain).Variable(Rain.StrValueByIndex(",",i));
dom.GetObject(variable_temp).Variable(Temp.StrValueByIndex(",",i));
i = i+1;
}
Wind_6, Wind_12, Wind_18, etc. für die Vorhersagewerte in 6, 12 und 18 Stunden (das geht bis 72h)
Gust_6, Baro_6, Rain_6, Temp_6 für die verschiedenen Vorhersagekategorien
Die Variablen für CloudCover haben nur 6 Vorhersagewerte im Abstand von 12h. Daher heissen die Variablen: Cover_12, Cover_24, ....., Cover_72. Das Script für die aktuellen Werte sieht wie folgt aus. Hier fehlt noch die Übergabe an die Systemvariablen.
Code: Alles auswählen
!---- AWEKAS aktuelle Daten holen ----------------------------------------------------------------------------------------------------
! Skript liest Wetterdaten des AWEKAS Wetterdienstes und speichert diese in lokalen Variablen ab
! - aktuelle Wetterdaten: Temperatur, Feuchtigkeit, Luftdruck, Windgeschwindigkeit, Windspitzen, Regenrate, Niederschlagsmenge seit Mitternacht, Sonneneinstrahlung
! - Prognosedaten für Temperatur, Niederschlag, Wolkendecke, Windgeschwindigkeit, Windspitzen
!--------------------------------------------------------------------------------------------------------------------------
!
! variable Daten
var Station = "5826"; ! Stationsnummer im AWEKAS
! -------------------------------------------------------------------------------------------------------------------------
! fixe Daten und Variablennamen
var address = "https://stationsweb.awekas.at/";
var CUxD_Device = "CUxD.CUX2801001:1";
var stdout; ! Zwischenspeicher für Rohdaten
string text1;
var pos_text1;
string text2;
real Temp_act; ! aktuelle Temperatur
real Humid_act; ! aktuelle Feuchtigkeit
real Press_act; ! aktueller Luftdruck
real Wind_act; ! aktuelle Windgewschwindigkeit
real Gust_act; ! aktuelle Böengeschwindigkeit
real Rainrate_act; ! aktuelle Regenrate
real Rain_act; ! Niederschlag seit Mitternacht
real Sunrad_act; ! aktuelle Sonneneinstrahlung
string url_act_values = address + "index.php?id=" + Station;
!-------------------------------------------------------------------------------------------------------------------------
! hole die Rohdaten
dom.GetObject(CUxD_Device + ".CMD_SETS").State("wget -q -O - " + url_act_values);
dom.GetObject(CUxD_Device + ".CMD_QUERY_RET").State(1);
stdout = dom.GetObject(CUxD_Device + ".CMD_RETS").State();
!WriteLine(stdout);
!--- Temperatur
text1 = "id=\"temp_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length(); ! finde die Position mit der aktuellen Temperatur
Temp_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1); ! schneide dort einen String mit der Lànge 15 raus, unterteile diesen String an den Leerstellen und nimm den ersten Teilstring davon
!--- Feuchtigkeit
text1 = "id=\"feuchte_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Humid_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1);
!--- Luftdruck
text1 = "id=\"luftdruck_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Press_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1);
!--- Windgeschwindigkeit
text1 = "id=\"wind_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Wind_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1);
!--- Windböen
text1 = "id=\"boen_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Gust_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1);
!--- Regenrate
text1 = "id=\"rate_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Rainrate_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1);
!--- Niederschlag seit Mitternacht
text1 = "id=\"regen_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Rain_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1);
!--- Sonneneinstrahlung
text1 = "id=\"solar_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Sunrad_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1);
!---Fehlerkontrolle
WriteLine("Temperatur aktuell:" + Temp_act);
WriteLine("Feuchtigkeit aktuell:" + Humid_act);
WriteLine("Luftdruck aktuell:" + Press_act);
WriteLine("Windgeschwindigkeit aktuell:" + Wind_act);
WriteLine("Böenspitzen aktuell:" + Gust_act);
WriteLine("Regenrate aktuell:" + Rainrate_act);
WriteLine("Regen seit Mitternacht:" + Rain_act);
WriteLine("Sonneneinstrahlung aktuell:" + Sunrad_act);
!-------------------------------------------------------------------------------------------------------------------------
Viele Grüsse
Justus