Wettervorhersage über AccuWeather

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

MichaelN
Beiträge: 9681
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 13.04.2023, 07:17

Wie geschrieben einen free API-Key beantragen. Ich werde keine Anleitung für deren Website schreiben. Da musst du dich halt mal durchwühlen.
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 +++

MichaelN
Beiträge: 9681
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 13.04.2023, 08:25

Wenn Du Dich eingeloggt hast, probier es mal mit My Apps / Add a new App
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 +++

Tripplex
Beiträge: 519
Registriert: 11.01.2015, 19:16
System: CCU
Hat sich bedankt: 11 Mal
Danksagung erhalten: 4 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von Tripplex » 13.04.2023, 09:06

In My Ap habe ich ein API bekommen.
Dort kann ich als Ort aber nur Vienna Auswählen. Das ist einige Hundert KM von mir Enfernt.??
CCU3 mit Cul stick,dazu Intertechno Steckosen.
HM Steuert. Das Haus/Heizung inkl Pool und Robomow RC.

MichaelN
Beiträge: 9681
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 13.04.2023, 09:56

Sorry das ich das so hart sagen muss, aber in Beitrag 1 ist alles beschrieben. Wenn ich Dir jetzt jeden einzelnen Schritt nochmal vorlesen muss, dann wird das eine harte Zeit für uns beide. Vielleicht solltest Du diesen Teil deines Projekts einfach verschieben bis Du mehr Erfahrung mit IT gesammelt hast.
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 +++

Tripplex
Beiträge: 519
Registriert: 11.01.2015, 19:16
System: CCU
Hat sich bedankt: 11 Mal
Danksagung erhalten: 4 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von Tripplex » 13.04.2023, 11:43

Punkt 1 habe ich ja schon.
Eine APi habe ich und die Nummer auch,findet man über google.
CCU3 mit Cul stick,dazu Intertechno Steckosen.
HM Steuert. Das Haus/Heizung inkl Pool und Robomow RC.

Benutzeravatar
shartelt
Beiträge: 7421
Registriert: 14.01.2015, 14:59
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 524 Mal
Danksagung erhalten: 753 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von shartelt » 13.04.2023, 11:50

also um Dir das mal vorzulesen, was Michael meint:

Du gehst auf die Seite und gibts rechts oben Deinen Ort ein:
2023-04-13 11_47_24-Window.png

dann bekommst Du hinten die ID.

Ich habe extra Knittelfeld genommen, da ich natürlich keine Ahnung habe, wo aus Österreich Du kommst....allerdings als Beweis, dass es mehr als Wien gibt.

Ist es WIRKLICH so schwer?
MichaelN hat geschrieben:
13.04.2023, 09:56
Vielleicht solltest Du diesen Teil deines Projekts einfach verschieben bis Du mehr Erfahrung mit IT gesammelt hast.
Ich schließe mich Michael an. Wenn Du mehrere Posts und Hinweise benötigst um einen simplen Ort in eine Sucheingabe einer Website zu schreiben und dann eine Zahl am Ende des Browserlinks herauszufinden...wie soll das erst weiter gehen?

Tripplex
Beiträge: 519
Registriert: 11.01.2015, 19:16
System: CCU
Hat sich bedankt: 11 Mal
Danksagung erhalten: 4 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von Tripplex » 13.04.2023, 11:55

Ich habe doch schon meinen Ort gefunden! Einige Poste vorher und da steht auch die Nummer!
https://www.accuweather.com/de/at/stain ... ast/25523
CCU3 mit Cul stick,dazu Intertechno Steckosen.
HM Steuert. Das Haus/Heizung inkl Pool und Robomow RC.

Benutzeravatar
shartelt
Beiträge: 7421
Registriert: 14.01.2015, 14:59
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 524 Mal
Danksagung erhalten: 753 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von shartelt » 13.04.2023, 11:58

ja und den hast Du in Dein script eingefügt und der bringt Dir nun in dem Script nicht Deine Werte sondern die von Wien?

Tripplex
Beiträge: 519
Registriert: 11.01.2015, 19:16
System: CCU
Hat sich bedankt: 11 Mal
Danksagung erhalten: 4 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von Tripplex » 13.04.2023, 15:43

So ich habe mich jetzt mal an dem Skript Versucht.
SV Variablen als Test Angelegt/ SV-Temperatur, ,SV-CloudCover.
Die beiden habe ich unter string xmlTagStart eingetragen.
Die Anzahl habe ich auf 2 gesetzt. Habe ja nur 2 Variablen derzeit.
Ist das die richtige Richtung??
Beim Skript Test bekomme viele Werte Angezeigt,also nehme ich an das Läuft.

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 = "25523";                           !- Hier ID für den Ort eintragen
string APIKey = "u3FpAJ6uEDp7C1iNAM00yfkYSYzJBQtC"; !- 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,SV-Temperature,SV-Wind";      !- 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.6: keine Antwort vom Wetter-Server!]"); }
  WriteLine("MichaelN Script AccuWeather V1.6: 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.6: xmlTimeStart falsch definiert!]"); }
  WriteLine("MichaelN Script AccuWeather V1.6: 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==="); 
Zuletzt geändert von Tripplex am 13.04.2023, 16:23, insgesamt 1-mal geändert.
CCU3 mit Cul stick,dazu Intertechno Steckosen.
HM Steuert. Das Haus/Heizung inkl Pool und Robomow RC.

MichaelN
Beiträge: 9681
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 13.04.2023, 16:22

Welche Ausgabe (STDOUT) erhält man, wenn man es unter "Skript testen" laufen lässt? Als CODE in den Beitrag kopieren!
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“