Wettervorhersage über AccuWeather

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

MichaelN
Beiträge: 9864
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 712 Mal
Danksagung erhalten: 1685 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 25.06.2023, 18:25

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

my_idefix
Beiträge: 17
Registriert: 15.11.2021, 06:59
System: CCU und Access Point
Danksagung erhalten: 1 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von my_idefix » 08.06.2024, 18:38

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 )

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===");
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

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===");

MichaelN
Beiträge: 9864
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 712 Mal
Danksagung erhalten: 1685 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 08.06.2024, 19:33

my_idefix hat geschrieben:
08.06.2024, 18:38
Wenn ich nur diesen Script verwende geht es
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 +++

my_idefix
Beiträge: 17
Registriert: 15.11.2021, 06:59
System: CCU und Access Point
Danksagung erhalten: 1 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von my_idefix » 10.06.2024, 19:38

So wie gesagt hatte deinen originalen Script verwendet ohne zu ändern
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===");
Dann die Variablen angelegt
1.JPG
Variable1
2.JPG
Variable2

und das Programm erstellt
3.JPG
Programm
ausgabe wenn ich den Script Teste:

MichaelN Script AccuWeather V1.8: keine Antwort vom Wetter-Server!

MichaelN
Beiträge: 9864
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 712 Mal
Danksagung erhalten: 1685 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 10.06.2024, 19:45

my_idefix hat geschrieben:
10.06.2024, 19:38
keine Antwort vom Wetter-Server!
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 +++

burnster
Beiträge: 27
Registriert: 18.12.2022, 21:38
System: CCU
Hat sich bedankt: 6 Mal
Danksagung erhalten: 2 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von burnster » 11.06.2024, 08:12

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.

MichaelN
Beiträge: 9864
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 712 Mal
Danksagung erhalten: 1685 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 11.06.2024, 09:13

burnster hat geschrieben:
11.06.2024, 08:12
Zusammengesetzter URL Request mit ID/Key im Browser gibt Daten zurück.
Dann muss es auch im Skript funktionieren. Du kannst ja mal in Code-Tags (!) die Ausgabe des Browsers posten
burnster hat geschrieben:
11.06.2024, 08:12
Ich habe kein CUXD
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 +++

burnster
Beiträge: 27
Registriert: 18.12.2022, 21:38
System: CCU
Hat sich bedankt: 6 Mal
Danksagung erhalten: 2 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von burnster » 11.06.2024, 09:28

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.

my_idefix
Beiträge: 17
Registriert: 15.11.2021, 06:59
System: CCU und Access Point
Danksagung erhalten: 1 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von my_idefix » 11.06.2024, 16:47

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

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"
Anbei die Ausgabe Info im Cux unter INFO

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
Gruss

MichaelN
Beiträge: 9864
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 712 Mal
Danksagung erhalten: 1685 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 11.06.2024, 16:53

my_idefix hat geschrieben:
11.06.2024, 16:47
ERROR: ScriptRuntimeError
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 +++

Antworten

Zurück zu „Projektvorstellungen“