Wettervorhersage über AccuWeather
Moderator: Co-Administratoren
-
- Beiträge: 10103
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 728 Mal
- Danksagung erhalten: 1743 Mal
Re: Wettervorhersage über AccuWeather
Selber mal für die 12 Stunden forecast API https://developer.accuweather.com/accuw ... tionKey%7D nach gesehen.Ob totalliquid oder rain sollte eigentlich egal sein. Es ist wenig plausibel das der eine Wert 0,1 beträgt, der andere 22.
Warum hast du überhaupt 2 Werte für Regen in deine Abfrage aufgenommen?
Warum hast du überhaupt 2 Werte für Regen in deine Abfrage aufgenommen?
LG, Michael.
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
-
- Beiträge: 17
- Registriert: 15.11.2021, 06:59
- System: CCU und Access Point
- Danksagung erhalten: 1 Mal
Re: Wettervorhersage über AccuWeather
Hi habe eine CCU3 neuste Firmware
ich glaube ich stehe irgend wie auf dem Schlauch oder denke zu kompliziert / ich habe bei Accuweather einen API Key sowie die Orts ID. Wenn ich den originalen Skript von Michael ( Seite 1 ) verwende ,mit meinen Daten und in ein Programm verpacke / dazu die Systemvariablen erstelle ( Forecast_Temp_AVG / FC_feel_AVG / Forecast_Feuchte_AVG / FC_Wolken_AVG / FC_Regen_gesamt,,FC_Text_Phrase / FC_Temp_min / FC_feel_min
/ FC_Feuchte_min / FC_Wolken_min / FC_Regen_min / FC-Timestamp-von / FC_Temp_max / FC_feel_max / FC_Feuchte_max / FC_Wolken_max / FC_Regen_max / FC-Timestamp-bis ) alle als Zahl angelegt. Mit enstsprechenden Angaben Temperatur -50 - 50 (°C)
Luftfeuchte / Bewölkungsgrad 0 - 100 (%) Niederschlag 0 - 1000 (mm) Windgeschwindigkeit 0 - 300 (km/h). Bekomme ich als Antwort keine Antwort vom Server.
Wenn ich nur diesen Script verwende geht es
ich glaube ich stehe irgend wie auf dem Schlauch oder denke zu kompliziert / ich habe bei Accuweather einen API Key sowie die Orts ID. Wenn ich den originalen Skript von Michael ( Seite 1 )
Code: Alles auswählen
!- aktuelle 12h-Wettervorhersage V1.8 AccuWeather universell (MichaelN 22.08.2021)
!- GPL-3.0-or-later
!- V1.8 Systemvariablen Typ Logik für boolesche Werte möglich
!- V1.7 deutsche Umlaute berücksichtigt
!- V1.6 CuxD/system-exec optional
!- V1.5 Fehlerbehandlung hinzu
!- V1.4 optionale Umrechnung Windgeschwindigkeit hinzu
!- V1.3 verarbeitet auch Stringwerte in den avg-Variablen
!- benötigte Systemvariablen anlegen: siehe Inhalt von NameSVxxx0
!-=== Hier anpassen ===
string OrtsID = "123456"; !- Hier ID für den Ort eintragen
string APIKey = "AAAAAAABBBBBBBBBBCCCCCCCCCDDDDDD"; !- Hier API-Key eintragen
string CUXD_Device = "CUxD.CUX2801001:1"; !- Hier CUxD-Device eintragen oder leer lassen für system.exec
!-=== Hier anpassen ===
integer AnzahlTags = 7; !-Anzahl der eingetragenen XML-Tags
string xmlTagStart = 'Temperature,RealFeelTemperature,RelativeHumidity,CloudCover,TotalLiquid,EpochDateTime,IconPhrase'; !-XML-Start-Tag
string xmlTagEnd = 'RealFeelTemperature,WetBulbTemperature,IndoorRelativeHumidity,MobileLink,Rain,WeatherIcon,Precipitation'; !-XML-End-Tag
string xmlWertStart = 'Value,Value,:,:,Value,:,:'; !-Suchstring vor dem Wert
string xmlWertEnd = 'Unit,Unit,",",Unit,",Has'; !-Suchstring nach dem Wert
string xmlWertStartOffset = "7,7,1,1,7,1,2"; !-Länge Wert-Suchstring + Anzahl Zeichen bis zum Wert
string xmlWertEndOffset = "9,9,2,2,9,2,5"; !-StartOffset + Anzahl Zeichen zwischen Zahl und Ende-String
string NameSVavg0 = "Forecast_Temp_AVG,FC_feel_AVG,Forecast_Feuchte_AVG,FC_Wolken_AVG,FC_Regen_gesamt,,FC_Text_Phrase"; !- Namen der Systemvariablen fuer Durchschnitt aktueller Tag
string NameSVmin0 = "FC_Temp_min,FC_feel_min,FC_Feuchte_min,FC_Wolken_min,FC_Regen_min,FC-Timestamp-von,"; !- Namen der Systemvariablen fuer min-Wert
string NameSVmax0 = "FC_Temp_max,FC_feel_max,FC_Feuchte_max,FC_Wolken_max,FC_Regen_max,FC-Timestamp-bis,"; !- Namen der Systemvariablen fuer max-Wert
integer RegenFlag = 4; !- Position der Regendaten (ab 0 zählen) zur Ausgabe der Gesamtmenge - auf 999 setzen, wenn stattdessen der Tagesdurchschnitt gewünscht ist
integer WindFlag = 999; ! Position der Winddaten (zur Umrechnung von km/h in m/s) - auf 999 setzen, wenn keine Umrechnung gewünscht oder kein Wind ausgewertet werden soll
integer Stunden = 12; !- Anzahl der Stunden, die ausgewertet werden (min 1 / max 12)
boolean SAVE = true; !- in SV speichern: auf false für Testbetrieb, sonst true
!- === ab hier nichts mehr anpassen ===
!- Suchstrings und Offset-Werte zum extrahieren der Zeit
string xmlTimeStart = "EpochDateTime";
integer xmlSkip = 100;
!- XML Accuweather
string recXML;
string error;
string func = "wget -q --timeout=2 -O - 'http://dataservice.accuweather.com/forecasts/v1/hourly/12hour/"#OrtsID#"?apikey="#APIKey#"&details=true&metric=true&language=de'";
!- Arbeitsvariablen
string wert1;
string wert2;
time zeit;
integer counter; !- Sicherheitszaehler gegen Endlosschleife
integer StartPos;
integer EndPos;
integer index;
var Wert_avg;
var Wert_min;
var Wert_max;
var Wert_tmp;
object SV;
integer SVTyp = ivtFloat; !- V1.3
string Trenner = "\t";
!- Diese Variablen enthalten am Schluss die Ergebnisse
string Day0_avg = "";
!- ENDE Deklarationen und Initialisierungen
!- ******************************************************************************************
!- Abruf der Daten
if ( !CUXD_Device ) {
! system.exec
system.Exec(func, &recXML, &error);
} else {
! CUxD
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)
{
if ( CUXD_Device ) { (dom.GetObject(ID_DATAPOINTS)).Get(CUXD_Device#".CMD_EXEC").State("logger -t script -p user.debug [MichaelN Script AccuWeather V1.8: keine Antwort vom Wetter-Server!]"); }
WriteLine("MichaelN Script AccuWeather V1.8: keine Antwort vom Wetter-Server!");
quit;
}
if( !recXML.Contains(xmlTimeStart) )
{ ! V1.6 division by Null abfangen
if (CUXD_Device ) { (dom.GetObject(ID_DATAPOINTS)).Get(CUXD_Device#".CMD_EXEC").State("logger -t script -p user.debug [MichaelN Script AccuWeather V1.8: xmlTimeStart falsch definiert!]"); }
WriteLine("MichaelN Script AccuWeather V1.8: xmlTimeStart falsch definiert!");
quit;
}
!- *** DEBUG recXML = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("xxTest").State();
!- *** DEBUG dom.GetObject (ID_SYSTEM_VARIABLES).Get ("xxTest").State(recXML);
recXML = recXML.ToLatin();
xmlSkip = recXML.Find(xmlTimeStart); !- ersten Block beschneiden
recXML = recXML.Substr(xmlSkip);
WriteLine(recXML);
!- Werte auslesen
counter = 0;
index = 0;
StartPos = recXML.Find(xmlTagStart.StrValueByIndex(",",0));
while ( (StartPos>=0) && (counter<100) ){
if (counter < Stunden) {
index = 0;
while ( index < AnzahlTags ) {
StartPos = recXML.Find(xmlTagStart.StrValueByIndex(",",index));
EndPos = recXML.Substr(StartPos).Find(xmlTagEnd.StrValueByIndex(",",index));
if ( EndPos == -1 )
{
EndPos = 5;
WriteLine("DEBUG Z96: EndPos nicht gefunden!");
}
EndPos = EndPos + StartPos;
wert2 = recXML.Substr(StartPos, EndPos-StartPos); !- nur das relevante Tag
WriteLine("DEBUG TAG: "#wert2);
StartPos = wert2.Find(xmlWertStart.StrValueByIndex(",",index));
EndPos = wert2.Substr(StartPos).Find(xmlWertEnd.StrValueByIndex(",",index));
if ( EndPos == -1 )
{
EndPos = 5;
WriteLine("DEBUG Z106: EndPos nicht gefunden!");
}
EndPos = EndPos + StartPos;
wert2 = wert2.Substr(StartPos+xmlWertStartOffset.StrValueByIndex(",",index).ToInteger(),(EndPos-StartPos)-xmlWertEndOffset.StrValueByIndex(",",index).ToInteger());
WriteLine("DEBUG WERT: "#wert2#" --- Start:"#StartPos#" --- End:"#EndPos);
Day0_avg = Day0_avg # wert2 # ","; !- V1.3
!- *** DEBUG
WriteLine("c/i/w2:"#counter#"/"#index#"/"#wert2);
index = index + 1;
}
}
StartPos = recXML.Find(xmlTimeStart);
xmlSkip = StartPos+xmlTimeStart.Length(); !- abgearbeiteten Block ausschneiden
recXML = recXML.Substr(xmlSkip);
StartPos = recXML.Find(xmlTimeStart);
if ( StartPos > -1 ) { recXML = recXML.Substr(StartPos); }
!- *** DEBUG
!- WriteLine("DEBUG SKIP: c"#counter#" --- Start:"#StartPos#" --- "#recXML);
counter = counter + 1;
}
!- Werte aus Ergebnisliste fischen und wieder richtig zuordnen
counter = 0;
wert1 = "";
while ( counter < AnzahlTags ) {
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVavg0.StrValueByIndex(",",counter)); !- V1.3
if ( SV ) { SVTyp = SV.ValueType(); WriteLine("===SVTyp==="#SVTyp#"==="#SV.Name()); } else { SVTyp = ivtFloat; }
index = AnzahlTags;
Wert_avg = 0.0;
Wert_min = 3000000000.0;
Wert_max = -1000.0;
EndPos = 0;
foreach(wert2,Day0_avg.Split(",")) {
if ( (index % AnzahlTags) == counter ) {
!- jeden x. Eintrag auslesen
if ( SVTyp == ivtFloat ) {
!- SV Zahl (V1.3)
Wert_tmp = wert2.ToFloat();
! Wind in m/s umrechnen?
if ( WindFlag == counter ) { Wert_tmp = Wert_tmp/3.6;};
Wert_avg = Wert_avg + Wert_tmp;
EndPos = EndPos + 1;
Wert_min = Wert_min.Min(Wert_tmp);
Wert_max = Wert_max.Max(Wert_tmp);
} elseif ( SVTyp == ivtString ) {
!- SV String
if ( Wert_avg.VarType() == ivtFloat )
{ Wert_avg = Wert_avg # Trenner # wert2; } else
{ Wert_avg = wert2; }
} elseif ( SVTyp == ivtBinary ) {
!- SV Boolean
if ( wert2 == "true" ) {
Wert_max = true;
Wert_avg = Wert_avg + 1;
}
if ( wert2 == "false" ) {
Wert_min = false;
}
EndPos = EndPos + 1;
!WriteLine("===min/max/avg==="#Wert_min#"/"#Wert_max#"/"#Wert_avg);
} else {
!- SV keine Zahl, kein String, keine Ergebnisse
Wert_avg = 0;
}
!- *** DEBUG
WriteLine("c/i/EP/w:"#counter#"/"#index#"/"#EndPos#"/"#wert2);
}
index = index + 1;
}
!- Durchschnitt berechnen
if ( (RegenFlag <> counter) && ( SVTyp == ivtFloat ) ) {
Wert_avg = Wert_avg/EndPos; }
if ( SVTyp == ivtBinary ) {
! bei booleschen Werte auf true oder false entscheiden
Wert_avg = (1.0 * Wert_avg)/EndPos;
Wert_avg = Wert_avg.Round(0);
}
if ( (SVTyp == ivtBinary) && ( Wert_max < 1 ) ) { Wert_max = false; }
!- Werte in die SV schieben
!- *** DEBUG
WriteLine("*** DEBUG Werte für SV ***");
WriteLine("--AVG--"#NameSVavg0.StrValueByIndex(",",counter)#": "#Wert_avg);
WriteLine("--MIN--"#NameSVmin0.StrValueByIndex(",",counter)#": "#Wert_min);
WriteLine("--MAX--"#NameSVmax0.StrValueByIndex(",",counter)#": "#Wert_max);
if ( SV && SAVE ) {SV.State(Wert_avg);}
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVmin0.StrValueByIndex(",",counter));
if ( SV && SAVE ) {SV.State(Wert_min);}
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVmax0.StrValueByIndex(",",counter));
if ( SV && SAVE ) {SV.State(Wert_max);}
!- *** DEBUG
wert1 = wert1 #"*"# xmlTagStart.StrValueByIndex(",",counter) #"* avg/min/max:"# Wert_avg.ToString(1) #"/"# Wert_min.ToString(1) #"/"# Wert_max.ToString(1) # "\n";
counter = counter + 1;
}
!- *** DEBUG
WriteLine(wert1);
WriteLine("===ENDE===");
/ FC_Feuchte_min / FC_Wolken_min / FC_Regen_min / FC-Timestamp-von / FC_Temp_max / FC_feel_max / FC_Feuchte_max / FC_Wolken_max / FC_Regen_max / FC-Timestamp-bis ) alle als Zahl angelegt. Mit enstsprechenden Angaben Temperatur -50 - 50 (°C)
Luftfeuchte / Bewölkungsgrad 0 - 100 (%) Niederschlag 0 - 1000 (mm) Windgeschwindigkeit 0 - 300 (km/h). Bekomme ich als Antwort keine Antwort vom Server.
Wenn ich nur diesen Script verwende geht es
Code: Alles auswählen
!- Vergangene 24h modifiziert von Skript V1.8 AccuWeather universell (MichaelN 22.08.2021)
!- GPL-3.0-or-later
!- V1.8 Systemvariablen Typ Logik für boolesche Werte möglich
!- V1.7 deutsche Umlaute berücksichtigt
!- V1.6 CuxD/system-exec optional
!- V1.5 Fehlerbehandlung hinzu
!- V1.4 optionale Umrechnung Windgeschwindigkeit hinzu
!- V1.3 verarbeitet auch Stringwerte in den avg-Variablen
!- benötigte Systemvariablen anlegen: siehe Inhalt von NameSVxxx0
!-=== Hier anpassen ===
string OrtsID = "XXXXXXX"; !- Hier ID für den Ort eintragen
string APIKey = "XXXXXXXXXXXXXXXXXXX"; !- Hier API-Key eintragen
string CUXD_Device = "CUxD.CUX2801001:1"; !- Hier CUxD-Device eintragen oder leer lassen für system.exec
!-=== Hier anpassen ===
integer AnzahlTags = 2; !-Anzahl der eingetragenen XML-Tags
string xmlTagStart = 'Past24Hours,Past12HourRange'; !-XML-Start-Tag
string xmlTagEnd = "TemperatureSummary,Past24HourRange"; !-XML-End-Tag
string xmlWertStart = 'Value,Maximum":{"Metric":{"Value"'; !-Suchstring vor dem Wert
string xmlWertEnd = "Unit,Unit"; !-Suchstring nach dem Wert
string xmlWertStartOffset = "7,28"; !-Länge Wert-Suchstring + Anzahl Zeichen bis zum Wert
string xmlWertEndOffset = "9,30"; !-StartOffset + Anzahl Zeichen zwischen Zahl und Ende-String
string NameSVavg0 = "FC_Regen_Past24,FC_Temp_Past12_Max,"; !- Namen der Systemvariablen fuer Durchschnitt aktueller Tag
string NameSVmin0 = ",,"; !- Namen der Systemvariablen fuer min-Wert
string NameSVmax0 = ",,"; !- Namen der Systemvariablen fuer max-Wert
integer RegenFlag = 0; !- Position der Regendaten (ab 0 zählen) zur Ausgabe der Gesamtmenge - auf 999 setzen, wenn stattdessen der Tagesdurchschnitt gewünscht ist
integer Stunden = 1; !- Anzahl der Stunden, die ausgewertet werden (min 1 / max 12)
boolean SAVE = true; !- in SV speichern: auf false für Testbetrieb, sonst true
!- === ab hier nichts mehr anpassen ===
!- Suchstrings und Offset-Werte zum extrahieren der Zeit
string xmlTimeStart = "EpochTime";
integer xmlSkip = 100;
!- XML Accuweather
string recXML;
string error;
string func = "wget -q --timeout=2 -O - 'http://dataservice.accuweather.com/currentconditions/v1/"#OrtsID#"?apikey="#APIKey#"&details=true&metric=true'";
!- Arbeitsvariablen
string wert1;
string wert2;
time zeit;
integer counter; !- Sicherheitszaehler gegen Endlosschleife
integer StartPos;
integer EndPos;
integer index;
var Wert_avg;
var Wert_min;
var Wert_max;
var Wert_tmp;
object SV;
integer SVTyp = ivtFloat; !- V1.3
string Trenner = "\t";
!- Diese Variablen enthalten am Schluss die Ergebnisse
string Day0_avg = "";
!- ENDE Deklarationen und Initialisierungen
!- ******************************************************************************************
!- Abruf der Daten
if ( !CUXD_Device ) {
! system.exec
system.Exec(func, &recXML, &error);
} else {
! CUxD
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)
{
if ( CUXD_Device ) { (dom.GetObject(ID_DATAPOINTS)).Get(CUXD_Device#".CMD_EXEC").State("logger -t script -p user.debug [MichaelN Script AccuWeather V1.8: keine Antwort vom Wetter-Server!]"); }
WriteLine("MichaelN Script AccuWeather V1.8: keine Antwort vom Wetter-Server!");
quit;
}
if( !recXML.Contains(xmlTimeStart) )
{ ! V1.6 division by Null abfangen
if (CUXD_Device ) { (dom.GetObject(ID_DATAPOINTS)).Get(CUXD_Device#".CMD_EXEC").State("logger -t script -p user.debug [MichaelN Script AccuWeather V1.8: xmlTimeStart falsch definiert!]"); }
WriteLine("MichaelN Script AccuWeather V1.8: xmlTimeStart falsch definiert!");
quit;
}
!- *** DEBUG recXML = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("xxTest").State();
!- *** DEBUG dom.GetObject (ID_SYSTEM_VARIABLES).Get ("xxTest").State(recXML);
recXML = recXML.ToLatin();
xmlSkip = recXML.Find(xmlTimeStart); !- ersten Block beschneiden
recXML = recXML.Substr(xmlSkip);
WriteLine(recXML);
!- Werte auslesen
counter = 0;
index = 0;
StartPos = recXML.Find(xmlTagStart.StrValueByIndex(",",0));
while ( (StartPos>=0) && (counter<100) ){
if (counter < Stunden) {
index = 0;
while ( index < AnzahlTags ) {
StartPos = recXML.Find(xmlTagStart.StrValueByIndex(",",index));
EndPos = recXML.Substr(StartPos).Find(xmlTagEnd.StrValueByIndex(",",index));
if ( EndPos == -1 )
{
EndPos = 5;
WriteLine("DEBUG Z96: EndPos nicht gefunden!");
}
EndPos = EndPos + StartPos;
wert2 = recXML.Substr(StartPos, EndPos-StartPos); !- nur das relevante Tag
WriteLine("DEBUG TAG: "#wert2);
StartPos = wert2.Find(xmlWertStart.StrValueByIndex(",",index));
EndPos = wert2.Substr(StartPos).Find(xmlWertEnd.StrValueByIndex(",",index));
if ( EndPos == -1 )
{
EndPos = 5;
WriteLine("DEBUG Z106: EndPos nicht gefunden!");
}
EndPos = EndPos + StartPos;
wert2 = wert2.Substr(StartPos+xmlWertStartOffset.StrValueByIndex(",",index).ToInteger(),(EndPos-StartPos)-xmlWertEndOffset.StrValueByIndex(",",index).ToInteger());
WriteLine("DEBUG WERT: "#wert2#" --- Start:"#StartPos#" --- End:"#EndPos);
Day0_avg = Day0_avg # wert2 # ","; !- V1.3
!- *** DEBUG
WriteLine("c/i/w2:"#counter#"/"#index#"/"#wert2);
index = index + 1;
}
}
StartPos = recXML.Find(xmlTimeStart);
xmlSkip = StartPos+xmlTimeStart.Length(); !- abgearbeiteten Block ausschneiden
recXML = recXML.Substr(xmlSkip);
StartPos = recXML.Find(xmlTimeStart);
if ( StartPos > -1 ) { recXML = recXML.Substr(StartPos); }
!- *** DEBUG
!- WriteLine("DEBUG SKIP: c"#counter#" --- Start:"#StartPos#" --- "#recXML);
counter = counter + 1;
}
!- Werte aus Ergebnisliste fischen und wieder richtig zuordnen
counter = 0;
wert1 = "";
while ( counter < AnzahlTags ) {
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVavg0.StrValueByIndex(",",counter)); !- V1.3
if ( SV ) { SVTyp = SV.ValueType(); WriteLine("===SVTyp==="#SVTyp#"==="#SV.Name()); } else { SVTyp = ivtFloat; }
index = AnzahlTags;
Wert_avg = 0.0;
Wert_min = 3000000000.0;
Wert_max = -1000.0;
EndPos = 0;
foreach(wert2,Day0_avg.Split(",")) {
if ( (index % AnzahlTags) == counter ) {
!- jeden x. Eintrag auslesen
if ( SVTyp == ivtFloat ) {
!- SV Zahl (V1.3)
Wert_tmp = wert2.ToFloat();
! Wind in m/s umrechnen?
if ( WindFlag == counter ) { Wert_tmp = Wert_tmp/3.6;};
Wert_avg = Wert_avg + Wert_tmp;
EndPos = EndPos + 1;
Wert_min = Wert_min.Min(Wert_tmp);
Wert_max = Wert_max.Max(Wert_tmp);
} elseif ( SVTyp == ivtString ) {
!- SV String
if ( Wert_avg.VarType() == ivtFloat )
{ Wert_avg = Wert_avg # Trenner # wert2; } else
{ Wert_avg = wert2; }
} elseif ( SVTyp == ivtBinary ) {
!- SV Boolean
if ( wert2 == "true" ) {
Wert_max = true;
Wert_avg = Wert_avg + 1;
}
if ( wert2 == "false" ) {
Wert_min = false;
}
EndPos = EndPos + 1;
!WriteLine("===min/max/avg==="#Wert_min#"/"#Wert_max#"/"#Wert_avg);
} else {
!- SV keine Zahl, kein String, keine Ergebnisse
Wert_avg = 0;
}
!- *** DEBUG
WriteLine("c/i/EP/w:"#counter#"/"#index#"/"#EndPos#"/"#wert2);
}
index = index + 1;
}
!- Durchschnitt berechnen
if ( (RegenFlag <> counter) && ( SVTyp == ivtFloat ) ) {
Wert_avg = Wert_avg/EndPos; }
if ( SVTyp == ivtBinary ) {
! bei booleschen Werte auf true oder false entscheiden
Wert_avg = (1.0 * Wert_avg)/EndPos;
Wert_avg = Wert_avg.Round(0);
}
if ( (SVTyp == ivtBinary) && ( Wert_max < 1 ) ) { Wert_max = false; }
!- Werte in die SV schieben
!- *** DEBUG
WriteLine("*** DEBUG Werte für SV ***");
WriteLine("--AVG--"#NameSVavg0.StrValueByIndex(",",counter)#": "#Wert_avg);
WriteLine("--MIN--"#NameSVmin0.StrValueByIndex(",",counter)#": "#Wert_min);
WriteLine("--MAX--"#NameSVmax0.StrValueByIndex(",",counter)#": "#Wert_max);
if ( SV && SAVE ) {SV.State(Wert_avg);}
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVmin0.StrValueByIndex(",",counter));
if ( SV && SAVE ) {SV.State(Wert_min);}
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVmax0.StrValueByIndex(",",counter));
if ( SV && SAVE ) {SV.State(Wert_max);}
!- *** DEBUG
wert1 = wert1 #"*"# xmlTagStart.StrValueByIndex(",",counter) #"* avg/min/max:"# Wert_avg.ToString(1) #"/"# Wert_min.ToString(1) #"/"# Wert_max.ToString(1) # "\n";
counter = counter + 1;
}
!- *** DEBUG
WriteLine(wert1);
WriteLine("===ENDE===");
-
- Beiträge: 10103
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 728 Mal
- Danksagung erhalten: 1743 Mal
Re: Wettervorhersage über AccuWeather
Was ist denn der Unterschied?
Was ich zum Support brauche steht in Beitrag 1
LG, Michael.
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
-
- Beiträge: 17
- Registriert: 15.11.2021, 06:59
- System: CCU und Access Point
- Danksagung erhalten: 1 Mal
Re: Wettervorhersage über AccuWeather
So wie gesagt hatte deinen originalen Script verwendet ohne zu ändern
OrtsID: 2273904
Dann die Variablen angelegt
und das Programm erstellt ausgabe wenn ich den Script Teste:
MichaelN Script AccuWeather V1.8: keine Antwort vom Wetter-Server!
OrtsID: 2273904
Code: Alles auswählen
!- aktuelle 12h-Wettervorhersage V1.8 AccuWeather universell (MichaelN 22.08.2021)
!- GPL-3.0-or-later
!- V1.8 Systemvariablen Typ Logik für boolesche Werte möglich
!- V1.7 deutsche Umlaute berücksichtigt
!- V1.6 CuxD/system-exec optional
!- V1.5 Fehlerbehandlung hinzu
!- V1.4 optionale Umrechnung Windgeschwindigkeit hinzu
!- V1.3 verarbeitet auch Stringwerte in den avg-Variablen
!- benötigte Systemvariablen anlegen: siehe Inhalt von NameSVxxx0
!-=== Hier anpassen ===
string OrtsID = "2273904"; !- Hier ID für den Ort eintragen
string APIKey = "AAAAAAABBBBBBBBBBCCCCCCCCCDDDDDD"; !- Hier API-Key eintragen
string CUXD_Device = "CUxD.CUX2801001:1"; !- Hier CUxD-Device eintragen oder leer lassen für system.exec
!-=== Hier anpassen ===
integer AnzahlTags = 7; !-Anzahl der eingetragenen XML-Tags
string xmlTagStart = 'Temperature,RealFeelTemperature,RelativeHumidity,CloudCover,TotalLiquid,EpochDateTime,IconPhrase'; !-XML-Start-Tag
string xmlTagEnd = 'RealFeelTemperature,WetBulbTemperature,IndoorRelativeHumidity,MobileLink,Rain,WeatherIcon,Precipitation'; !-XML-End-Tag
string xmlWertStart = 'Value,Value,:,:,Value,:,:'; !-Suchstring vor dem Wert
string xmlWertEnd = 'Unit,Unit,",",Unit,",Has'; !-Suchstring nach dem Wert
string xmlWertStartOffset = "7,7,1,1,7,1,2"; !-Länge Wert-Suchstring + Anzahl Zeichen bis zum Wert
string xmlWertEndOffset = "9,9,2,2,9,2,5"; !-StartOffset + Anzahl Zeichen zwischen Zahl und Ende-String
string NameSVavg0 = "Forecast_Temp_AVG,FC_feel_AVG,Forecast_Feuchte_AVG,FC_Wolken_AVG,FC_Regen_gesamt,,FC_Text_Phrase"; !- Namen der Systemvariablen fuer Durchschnitt aktueller Tag
string NameSVmin0 = "FC_Temp_min,FC_feel_min,FC_Feuchte_min,FC_Wolken_min,FC_Regen_min,FC-Timestamp-von,"; !- Namen der Systemvariablen fuer min-Wert
string NameSVmax0 = "FC_Temp_max,FC_feel_max,FC_Feuchte_max,FC_Wolken_max,FC_Regen_max,FC-Timestamp-bis,"; !- Namen der Systemvariablen fuer max-Wert
integer RegenFlag = 4; !- Position der Regendaten (ab 0 zählen) zur Ausgabe der Gesamtmenge - auf 999 setzen, wenn stattdessen der Tagesdurchschnitt gewünscht ist
integer WindFlag = 999; ! Position der Winddaten (zur Umrechnung von km/h in m/s) - auf 999 setzen, wenn keine Umrechnung gewünscht oder kein Wind ausgewertet werden soll
integer Stunden = 12; !- Anzahl der Stunden, die ausgewertet werden (min 1 / max 12)
boolean SAVE = true; !- in SV speichern: auf false für Testbetrieb, sonst true
!- === ab hier nichts mehr anpassen ===
!- Suchstrings und Offset-Werte zum extrahieren der Zeit
string xmlTimeStart = "EpochDateTime";
integer xmlSkip = 100;
!- XML Accuweather
string recXML;
string error;
string func = "wget -q --timeout=2 -O - 'http://dataservice.accuweather.com/forecasts/v1/hourly/12hour/"#OrtsID#"?apikey="#APIKey#"&details=true&metric=true&language=de'";
!- Arbeitsvariablen
string wert1;
string wert2;
time zeit;
integer counter; !- Sicherheitszaehler gegen Endlosschleife
integer StartPos;
integer EndPos;
integer index;
var Wert_avg;
var Wert_min;
var Wert_max;
var Wert_tmp;
object SV;
integer SVTyp = ivtFloat; !- V1.3
string Trenner = "\t";
!- Diese Variablen enthalten am Schluss die Ergebnisse
string Day0_avg = "";
!- ENDE Deklarationen und Initialisierungen
!- ******************************************************************************************
!- Abruf der Daten
if ( !CUXD_Device ) {
! system.exec
system.Exec(func, &recXML, &error);
} else {
! CUxD
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)
{
if ( CUXD_Device ) { (dom.GetObject(ID_DATAPOINTS)).Get(CUXD_Device#".CMD_EXEC").State("logger -t script -p user.debug [MichaelN Script AccuWeather V1.8: keine Antwort vom Wetter-Server!]"); }
WriteLine("MichaelN Script AccuWeather V1.8: keine Antwort vom Wetter-Server!");
quit;
}
if( !recXML.Contains(xmlTimeStart) )
{ ! V1.6 division by Null abfangen
if (CUXD_Device ) { (dom.GetObject(ID_DATAPOINTS)).Get(CUXD_Device#".CMD_EXEC").State("logger -t script -p user.debug [MichaelN Script AccuWeather V1.8: xmlTimeStart falsch definiert!]"); }
WriteLine("MichaelN Script AccuWeather V1.8: xmlTimeStart falsch definiert!");
quit;
}
!- *** DEBUG recXML = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("xxTest").State();
!- *** DEBUG dom.GetObject (ID_SYSTEM_VARIABLES).Get ("xxTest").State(recXML);
recXML = recXML.ToLatin();
xmlSkip = recXML.Find(xmlTimeStart); !- ersten Block beschneiden
recXML = recXML.Substr(xmlSkip);
WriteLine(recXML);
!- Werte auslesen
counter = 0;
index = 0;
StartPos = recXML.Find(xmlTagStart.StrValueByIndex(",",0));
while ( (StartPos>=0) && (counter<100) ){
if (counter < Stunden) {
index = 0;
while ( index < AnzahlTags ) {
StartPos = recXML.Find(xmlTagStart.StrValueByIndex(",",index));
EndPos = recXML.Substr(StartPos).Find(xmlTagEnd.StrValueByIndex(",",index));
if ( EndPos == -1 )
{
EndPos = 5;
WriteLine("DEBUG Z96: EndPos nicht gefunden!");
}
EndPos = EndPos + StartPos;
wert2 = recXML.Substr(StartPos, EndPos-StartPos); !- nur das relevante Tag
WriteLine("DEBUG TAG: "#wert2);
StartPos = wert2.Find(xmlWertStart.StrValueByIndex(",",index));
EndPos = wert2.Substr(StartPos).Find(xmlWertEnd.StrValueByIndex(",",index));
if ( EndPos == -1 )
{
EndPos = 5;
WriteLine("DEBUG Z106: EndPos nicht gefunden!");
}
EndPos = EndPos + StartPos;
wert2 = wert2.Substr(StartPos+xmlWertStartOffset.StrValueByIndex(",",index).ToInteger(),(EndPos-StartPos)-xmlWertEndOffset.StrValueByIndex(",",index).ToInteger());
WriteLine("DEBUG WERT: "#wert2#" --- Start:"#StartPos#" --- End:"#EndPos);
Day0_avg = Day0_avg # wert2 # ","; !- V1.3
!- *** DEBUG
WriteLine("c/i/w2:"#counter#"/"#index#"/"#wert2);
index = index + 1;
}
}
StartPos = recXML.Find(xmlTimeStart);
xmlSkip = StartPos+xmlTimeStart.Length(); !- abgearbeiteten Block ausschneiden
recXML = recXML.Substr(xmlSkip);
StartPos = recXML.Find(xmlTimeStart);
if ( StartPos > -1 ) { recXML = recXML.Substr(StartPos); }
!- *** DEBUG
!- WriteLine("DEBUG SKIP: c"#counter#" --- Start:"#StartPos#" --- "#recXML);
counter = counter + 1;
}
!- Werte aus Ergebnisliste fischen und wieder richtig zuordnen
counter = 0;
wert1 = "";
while ( counter < AnzahlTags ) {
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVavg0.StrValueByIndex(",",counter)); !- V1.3
if ( SV ) { SVTyp = SV.ValueType(); WriteLine("===SVTyp==="#SVTyp#"==="#SV.Name()); } else { SVTyp = ivtFloat; }
index = AnzahlTags;
Wert_avg = 0.0;
Wert_min = 3000000000.0;
Wert_max = -1000.0;
EndPos = 0;
foreach(wert2,Day0_avg.Split(",")) {
if ( (index % AnzahlTags) == counter ) {
!- jeden x. Eintrag auslesen
if ( SVTyp == ivtFloat ) {
!- SV Zahl (V1.3)
Wert_tmp = wert2.ToFloat();
! Wind in m/s umrechnen?
if ( WindFlag == counter ) { Wert_tmp = Wert_tmp/3.6;};
Wert_avg = Wert_avg + Wert_tmp;
EndPos = EndPos + 1;
Wert_min = Wert_min.Min(Wert_tmp);
Wert_max = Wert_max.Max(Wert_tmp);
} elseif ( SVTyp == ivtString ) {
!- SV String
if ( Wert_avg.VarType() == ivtFloat )
{ Wert_avg = Wert_avg # Trenner # wert2; } else
{ Wert_avg = wert2; }
} elseif ( SVTyp == ivtBinary ) {
!- SV Boolean
if ( wert2 == "true" ) {
Wert_max = true;
Wert_avg = Wert_avg + 1;
}
if ( wert2 == "false" ) {
Wert_min = false;
}
EndPos = EndPos + 1;
!WriteLine("===min/max/avg==="#Wert_min#"/"#Wert_max#"/"#Wert_avg);
} else {
!- SV keine Zahl, kein String, keine Ergebnisse
Wert_avg = 0;
}
!- *** DEBUG
WriteLine("c/i/EP/w:"#counter#"/"#index#"/"#EndPos#"/"#wert2);
}
index = index + 1;
}
!- Durchschnitt berechnen
if ( (RegenFlag <> counter) && ( SVTyp == ivtFloat ) ) {
Wert_avg = Wert_avg/EndPos; }
if ( SVTyp == ivtBinary ) {
! bei booleschen Werte auf true oder false entscheiden
Wert_avg = (1.0 * Wert_avg)/EndPos;
Wert_avg = Wert_avg.Round(0);
}
if ( (SVTyp == ivtBinary) && ( Wert_max < 1 ) ) { Wert_max = false; }
!- Werte in die SV schieben
!- *** DEBUG
WriteLine("*** DEBUG Werte für SV ***");
WriteLine("--AVG--"#NameSVavg0.StrValueByIndex(",",counter)#": "#Wert_avg);
WriteLine("--MIN--"#NameSVmin0.StrValueByIndex(",",counter)#": "#Wert_min);
WriteLine("--MAX--"#NameSVmax0.StrValueByIndex(",",counter)#": "#Wert_max);
if ( SV && SAVE ) {SV.State(Wert_avg);}
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVmin0.StrValueByIndex(",",counter));
if ( SV && SAVE ) {SV.State(Wert_min);}
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVmax0.StrValueByIndex(",",counter));
if ( SV && SAVE ) {SV.State(Wert_max);}
!- *** DEBUG
wert1 = wert1 #"*"# xmlTagStart.StrValueByIndex(",",counter) #"* avg/min/max:"# Wert_avg.ToString(1) #"/"# Wert_min.ToString(1) #"/"# Wert_max.ToString(1) # "\n";
counter = counter + 1;
}
!- *** DEBUG
WriteLine(wert1);
WriteLine("===ENDE===");
und das Programm erstellt ausgabe wenn ich den Script Teste:
MichaelN Script AccuWeather V1.8: keine Antwort vom Wetter-Server!
-
- Beiträge: 10103
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 728 Mal
- Danksagung erhalten: 1743 Mal
Re: Wettervorhersage über AccuWeather
ist doch eine klare Fehlermeldung. Es werden schon gar keine Daten geliefert, da kann das Skript auch nichts auswerten.
LG, Michael.
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
-
- Beiträge: 27
- Registriert: 18.12.2022, 21:38
- System: CCU
- Hat sich bedankt: 7 Mal
- Danksagung erhalten: 2 Mal
Re: Wettervorhersage über AccuWeather
Geht mir genauso - hatte am Sonntag morgen den Workflow aufgesetzt.
Zusammengesetzter URL Request mit ID/Key im Browser gibt Daten zurück.
Nach 2 Std. rumprobieren haben ich dann abgebrochen.
Bei mir auch die Fehlermeldung Meldung. Meine Skills sind nicht ausgereift genug
das näher einzugrenzen. Test ob die CCU3 ins Netz rauskommt gemacht - bestanden.
Ich habe kein CUXD - übersteigt mein Wissen damit umzugehen - von daher nicht installiert.
Danke für die Variablenübersicht zum Abgleich.
Zusammengesetzter URL Request mit ID/Key im Browser gibt Daten zurück.
Nach 2 Std. rumprobieren haben ich dann abgebrochen.
Bei mir auch die Fehlermeldung Meldung. Meine Skills sind nicht ausgereift genug
das näher einzugrenzen. Test ob die CCU3 ins Netz rauskommt gemacht - bestanden.
Ich habe kein CUXD - übersteigt mein Wissen damit umzugehen - von daher nicht installiert.
Danke für die Variablenübersicht zum Abgleich.
-
- Beiträge: 10103
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 728 Mal
- Danksagung erhalten: 1743 Mal
Re: Wettervorhersage über AccuWeather
Dann muss es auch im Skript funktionieren. Du kannst ja mal in Code-Tags (!) die Ausgabe des Browsers posten
Hast Du dann auch den Parameter entsprechend gesetzt?
Code: Alles auswählen
string CUXD_Device = ""; !- Hier CUxD-Device konfigurieren
LG, Michael.
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
-
- Beiträge: 27
- Registriert: 18.12.2022, 21:38
- System: CCU
- Hat sich bedankt: 7 Mal
- Danksagung erhalten: 2 Mal
Re: Wettervorhersage über AccuWeather
CUXD -> "" hab ich gemacht
Ausgabe im Browser war wild - da kam sehr viel Output. Stelle ich am WE mal nach. War aber viel Holz.
Wichtig war für mich zu testen ob der API Key und Ort-ID valide ist - sah so aus.
Ausgabe im Browser war wild - da kam sehr viel Output. Stelle ich am WE mal nach. War aber viel Holz.
Wichtig war für mich zu testen ob der API Key und Ort-ID valide ist - sah so aus.
-
- Beiträge: 17
- Registriert: 15.11.2021, 06:59
- System: CCU und Access Point
- Danksagung erhalten: 1 Mal
Re: Wettervorhersage über AccuWeather
Hi das ist meine Ausgabe in Firefox
ich hatte vorher die Daten von Openwether das lief / das bedeutet das ich mit der CCU3 auch ins WEB komme.
http://dataservice.accuweather.com/fore ... 04?apikey= Mein AP Key
Anbei die Ausgabe Info im Cux unter INFO
Gruss
ich hatte vorher die Daten von Openwether das lief / das bedeutet das ich mit der CCU3 auch ins WEB komme.
http://dataservice.accuweather.com/fore ... 04?apikey= Mein AP Key
Code: Alles auswählen
Headline
EffectiveDate "2024-06-10T17:00:00+02:00"
EffectiveEpochDate 1718031600
Severity 5
Text "Expect showers late Monday afternoon"
Category "rain"
EndDate "2024-06-10T23:00:00+02:00"
EndEpochDate 1718053200
MobileLink "http://www.accuweather.com/en/de/selters/65618/daily-weather-forecast/2273904?lang=en-us"
Link "http://www.accuweather.com/en/de/selters/65618/daily-weather-forecast/2273904?lang=en-us"
DailyForecasts
0
Date "2024-06-10T07:00:00+02:00"
EpochDate 1717995600
Temperature
Minimum
Value 46
Unit "F"
UnitType 18
Maximum
Value 68
Unit "F"
UnitType 18
Day
Icon 13
IconPhrase "Mostly cloudy w/ showers"
HasPrecipitation true
PrecipitationType "Rain"
PrecipitationIntensity "Light"
Night
Icon 35
IconPhrase "Partly cloudy"
HasPrecipitation false
Sources
0 "AccuWeather"
MobileLink "http://www.accuweather.com/en/de/selters/65618/daily-weather-forecast/2273904?day=1&lang=en-us"
Link "http://www.accuweather.com/en/de/selters/65618/daily-weather-forecast/2273904?day=1&lang=en-us"
Code: Alles auswählen
Jun 11 16:40:16 Homematic-Controller local0.err ReGaHss: ERROR: ScriptRuntimeError: !- aktuelle 12h-Wettervorhersage V1.8 AccuWeather universell (MichaelN 22.08.2021) !- GPL-3.0-or-later !- V1.8 Systemvariablen Typ Logik für boolesche Werte möglich !- V1.7 deutsche Umlaute berücksichtigt !- V1.6 CuxD/system-exec optional !- V1.5 Fehlerbehandlung hinzu !- V1.4 optionale Umrechnung Windgeschwindigkeit hinzu !- V1.3 verarbeitet auch Stringwerte in den avg-Variablen !- benötigte Systemvariablen anlegen: siehe
Inhalt von NameSVxxx0 !-=== Hier anpassen === string OrtsID = "2273904"; !- Hier ID für den Ort eintragen string APIKey = "mein API KEY"; !- Hier API-Key eintragen string CUXD_Device = "CUxD.CUX2801001:1"; !- Hier CUxD-Device eintragen oder leer lassen für system.exec !-=== Hier anpassen === integer AnzahlTags = 7; !-Anzahl der eingetragenen XML-Tags string xmlTagStart = 'Temperature,RealFeelTemperature,RelativeHumidity,CloudCover,TotlLiquid,EpochDateTime,IconPh
-
- Beiträge: 10103
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 728 Mal
- Danksagung erhalten: 1743 Mal
Re: Wettervorhersage über AccuWeather
Na, dann hast Du Dir irgendwo einen Fehler eingebaut.
Es kommt auf jedes Zeichen an. " ' ; , oder so sind nicht wahlfrei, sondern folgenden gewissen Regeln.
LG, Michael.
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++