Code: Alles auswählen
! Wettervorhersage V4.1a (MichaelN 09.06.2020 test)
! benötigte Systemvariablen anlegen
! in func bitte unter &id= die Ortskennung und unter &APPID= den API-Schlüssel eintragen
! in CUXD_Device bitte die Kennung des Gerätes eintragen
string func = "wget -q -O - 'http://api.openweathermap.org/data/2.5/forecast?mode=xml&units=metric&id=2959083&APPID=13985cff27301b385d95d758c1ace761'";
string CUXD_Device = "CUxD.CUX9002001:1";
! === Hier anpassen ===
integer AnzahlTags = 4; ! Anzahl der eingetragenen XML-Tags
string xmlTagStart = "windSpeed,temperature unit=,humidity value,precipitation unit="; ! XML-Start-Tag
string xmlTagEnd = "/windSpeed,/temperature,/humidity,/precipitation"; ! XML-End-Tag
string xmlWertStart = "mps=,value=,value=,value="; ! Suchstring vor dem Wert
string xmlWertEnd = " unit=, min=, unit=, type="; ! Suchstring nach dem Wert - LEERZEICHEN beachten
string xmlWertStartOffset = "5,7,7,7"; ! Länge Wert-Suchstring + Anzahl Zeichen bis zum Wert
string xmlWertEndOffset = "6,8,8,8"; ! StartOffset + Anzahl Zeichen zwischen Zahl und Ende-String
string NameSVavg0 = "Forecast_Wind_heute,Forecast_Temp_heute,Forecast_Feuchte_heute,FC_Regen_heute"; ! Namen der Systemvariablen fuer Durchschnitt aktueller Tag
string NameSVmin0 = "FC_Wind_heute_min,FC_Temp_heute_min,FC_Feuchte_heute_min,FC_Regen_heute_min"; ! Namen der Systemvariablen fuer min-Wert
string NameSVmax0 = "FC_Wind_heute_max,FC_Temp_heute_max,FC_Feuchte_heute_max,FC_Regen_heute_max"; ! Namen der Systemvariablen fuer max-Wert
string NameSVavg1 = "Forecast_Wind_morgen,Forecast_Temp_morgen,Forecast_Feuchte_morgen,FC_Regen_morgen"; ! Namen der Systemvariablen fuer Durchschnitt nächster Tag
string NameSVmin1 = "FC_Wind_morgen_min,FC_Temp_morgen_min,FC_Feuchte_morgen_min,FC_Regen_morgen_min"; ! Namen der Systemvariablen fuer min-Wert
string NameSVmax1 = "FC_Wind_morgen_max,FC_Temp_morgen_max,FC_Feuchte_morgen_max,FC_Regen_morgen_max"; ! Namen der Systemvariablen fuer max-Wert
integer WindFlag = 0; ! Position der Winddaten (zur Umrechnung in km/h) - auf 999 setzen, wenn keine Umrechnung gewünscht oder kein Wind ausgewertet werden soll
integer RegenFlag = 3; ! Position der Regendaten zur Ausgabe der Gesamtmenge - auf 999 setzen, wenn stattdessen der Tagesdurchschnitt gewünscht ist
! === ab hier nichts mehr anpassen ===
! Suchstrings und Offset-Werte zum extrahieren der Zeit
string xmlTimeStart = "time from=";
string xmlTimeEnd = " to=";
integer xmlTimeStartOffset = 11;
integer xmlTimeEndOffset = 21;
integer xmlSkip = 100;
! XML-Antwort von OpenWeatherMaps
string recXML;
string TMPrecXML;
! Arbeitsvariablen
string wert1;
string wert2;
time zeit;
integer counter; ! Sicherheitszaehler gegen Endlosschleife
integer StartPos;
integer EndPos;
integer index;
real Wert_avg;
real Wert_min;
real Wert_max;
real Wert_tmp;
object SV;
! Datumswerte
string Day0; ! heute
string Day1; ! morgen
! Diese Variablen enthalten am Schluss die Ergebnisse
string Day1_avg; ! Werteliste für morgen
string Day0_avg; ! Day0 gibt nur am Tageswechsel korrekte Werte aus
! ENDE Deklarationen und Initialisierungen
! ******************************************************************************************
! Datum als String für die nächsten 3 Tage zum suchen
Day0 = system.Date("%F"); ! Day0 = heute
zeit = Day0.ToTime()+24*3600;
Day1= zeit.Format("%F"); ! Day1 = Datumsstring fuer morgen
! Abruf der Daten
dom.GetObject(CUXD_Device#".CMD_SETS").State(func);
dom.GetObject(CUXD_Device#".CMD_QUERY_RET").State(1);
recXML = dom.GetObject(CUXD_Device#".CMD_RETS").State();
if(!recXML){quit;}
recXML = recXML.Substr(recXML.Find("forecast")); ! nur den Forecast-Teil nutzen
TMPrecXML = recXML;
! Werte auslesen
counter = 0;
index = 0;
StartPos = recXML.Find(xmlTagStart.StrValueByIndex(",",0));
while ( (StartPos>=0) && (counter<100) ){
counter = counter + 1;
wert1 = recXML.Substr(recXML.Find(xmlTimeStart)+xmlTimeStartOffset, recXML.Find(xmlTimeEnd)-recXML.Find(xmlTimeStart)+xmlTimeEndOffset);
! Day0
if (wert1==Day0) {
index = 0;
while ( index < AnzahlTags ) {
StartPos = recXML.Find(xmlTagStart.StrValueByIndex(",",index));
EndPos = recXML.Find(xmlTagEnd.StrValueByIndex(",",index));
wert2 = recXML.Substr(StartPos, EndPos-StartPos); ! nur das relevante Tag
WriteLine("DEBUG TAG0: "#wert2);
StartPos = wert2.Find(xmlWertStart.StrValueByIndex(",",index));
EndPos = wert2.Find(xmlWertEnd.StrValueByIndex(",",index));
wert2 = wert2.Substr(StartPos+xmlWertStartOffset.StrValueByIndex(",",index).ToInteger(),(EndPos-StartPos)-xmlWertEndOffset.StrValueByIndex(",",index).ToInteger());
Day0_avg = Day0_avg # wert2 # ",";
! *** DEBUG
WriteLine("c/i/w1/w2:"#counter#"/"#index#"/"#wert1#" "#wert2);
index = index + 1;
}
}
! Day1
if (wert1==Day1) {
index = 0;
while ( index < AnzahlTags ) {
StartPos = recXML.Find(xmlTagStart.StrValueByIndex(",",index));
EndPos = recXML.Find(xmlTagEnd.StrValueByIndex(",",index));
wert2 = recXML.Substr(StartPos, EndPos-StartPos); ! nur das relevante Tag
WriteLine("DEBUG TAG1: "#wert2);
StartPos = wert2.Find(xmlWertStart.StrValueByIndex(",",index));
EndPos = wert2.Find(xmlWertEnd.StrValueByIndex(",",index));
wert2 = wert2.Substr(StartPos+xmlWertStartOffset.StrValueByIndex(",",index).ToInteger(),(EndPos-StartPos)-xmlWertEndOffset.StrValueByIndex(",",index).ToInteger());
Day1_avg = Day1_avg # wert2 # ",";
! *** DEBUG
WriteLine("c/i/w1/w2:"#counter#"/"#index#"/"#wert1#" "#wert2);
index = index + 1;
}
}
xmlSkip = recXML.Find("/time")+5; ! abgearbeiteten Block ausschneiden
recXML = recXML.Substr(xmlSkip);
StartPos = recXML.Find(xmlTagStart.StrValueByIndex(",",0));
}
! Werte aus Ergebnisliste fischen und wieder richtig zuordnen
counter = 0;
wert1 = "";
while ( counter < AnzahlTags ) {
! Day0
index = AnzahlTags;
Wert_avg = 0.0;
Wert_min = 1000.0;
Wert_max = -1000.0;
EndPos = 0;
foreach(wert2,Day0_avg.Split(",")) {
if ( (index % AnzahlTags) == counter ) {
! jeden x. Eintrag auslesen
Wert_tmp = wert2.ToFloat();
! Wind in km/h umrechnen?
if ( WindFlag == counter ) { Wert_tmp = Wert_tmp*3.6; }
Wert_avg = Wert_avg + Wert_tmp;
EndPos = EndPos + 1;
if (Wert_min>Wert_tmp) {Wert_min=Wert_tmp;}
if (Wert_max<Wert_tmp) {Wert_max=Wert_tmp;}
! *** DEBUG
WriteLine("c/i/EP/w:"#counter#"/"#index#"/"#EndPos#"/"#Wert_tmp);
}
index = index + 1;
}
! Durchschnitt berechnen
if ( RegenFlag <> counter ) {
Wert_avg = Wert_avg/EndPos; }
! Werte in die SV schieben
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVavg0.StrValueByIndex(",",counter));
if (SV) {SV.State(Wert_avg);}
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVmin0.StrValueByIndex(",",counter));
if (SV) {SV.State(Wert_min);}
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVmax0.StrValueByIndex(",",counter));
if (SV) {SV.State(Wert_max);}
! *** DEBUG
wert1 = wert1 #"Day0 "# xmlTagStart.StrValueByIndex(",",counter) #" avg/min/max:"# Wert_avg.ToString(1) #"/"# Wert_min.ToString(1) #"/"# Wert_max.ToString(1) #" +++ ";
! Day1
index = AnzahlTags;
Wert_avg = 0.0;
Wert_min = 1000.0;
Wert_max = -1000.0;
EndPos = 0;
foreach(wert2,Day1_avg.Split(",")) {
if ( (index % AnzahlTags) == counter ) {
! jeden x. Eintrag auslesen
Wert_tmp = wert2.ToFloat();
! Wind in km/h umrechnen?
if ( WindFlag == counter ) { Wert_tmp = Wert_tmp*3.6; }
Wert_avg = Wert_avg + Wert_tmp;
EndPos = EndPos + 1;
if (Wert_min>Wert_tmp) {Wert_min=Wert_tmp;}
if (Wert_max<Wert_tmp) {Wert_max=Wert_tmp;}
! *** DEBUG
WriteLine("c/i/EP/w:"#counter#"/"#index#"/"#EndPos#"/"#Wert_tmp);
}
index = index + 1;
}
! Durchschnitt berechnen
if ( RegenFlag <> counter ) {
Wert_avg = Wert_avg/EndPos; }
! Werte in die SV schieben
! *** DEBUG
WriteLine(NameSVavg1.StrValueByIndex(",",counter));
WriteLine(Wert_avg);
WriteLine(NameSVmin1.StrValueByIndex(",",counter));
WriteLine(Wert_min);
WriteLine(NameSVmax1.StrValueByIndex(",",counter));
WriteLine(Wert_max);
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVavg1.StrValueByIndex(",",counter));
if (SV) {SV.State(Wert_avg);}
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVmin1.StrValueByIndex(",",counter));
if (SV) {SV.State(Wert_min);}
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVmax1.StrValueByIndex(",",counter));
if (SV) {SV.State(Wert_max);}
! *** DEBUG
wert1 = wert1 #"Day1 "# xmlTagStart.StrValueByIndex(",",counter) #" avg/min/max:"# Wert_avg.ToString(1) #"/"# Wert_min.ToString(1) #"/"# Wert_max.ToString(1) #" +++ ";
counter = counter + 1;
}
! *** DEBUG
WriteLine(wert1);