Wettervorhersage über OpenWeatherMap

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

lennny
Beiträge: 9
Registriert: 14.06.2020, 10:39
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von lennny » 15.06.2020, 11:45

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

lennny
Beiträge: 9
Registriert: 14.06.2020, 10:39
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von lennny » 15.06.2020, 11:46

Wuste nicht wie man einen Code eingibt

lennny
Beiträge: 9
Registriert: 14.06.2020, 10:39
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von lennny » 15.06.2020, 11:49

Beim HomeMatic Script Executor v1.8 wird bei STOUT keine Ausgabe generiert.

MichaelN
Beiträge: 9655
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1617 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von MichaelN » 15.06.2020, 11:58

WIE genau hast Du das Skript aus dem Browser in die WebUI übertragen? Ich dachte zuerst, es wäre ein Kopierproblem, das bei Verwendung von Word gerne auftritt.

Aber nein, er stolpert über das CUxD-Device. Bist Du sicher, das CUxD.CUX9002001:1 richtig ist? (Tip: ist es nicht)
Zuletzt geändert von MichaelN am 15.06.2020, 12:07, insgesamt 1-mal geändert.
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 +++

lennny
Beiträge: 9
Registriert: 14.06.2020, 10:39
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von lennny » 15.06.2020, 12:04

STRG C + STRG V

MichaelN
Beiträge: 9655
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1617 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von MichaelN » 15.06.2020, 12:05

lennny hat geschrieben:
15.06.2020, 12:04
STRG C + STRG V
Gut, aber du bist zu langsam. Habe meinen Beitrag inzwischen editiert :mrgreen:
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 +++

lennny
Beiträge: 9
Registriert: 14.06.2020, 10:39
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von lennny » 15.06.2020, 14:27

Ahoi Michael,
danke für die Hilfe, jetzt läuft es.
Das jq-Addone hatte ich nicht in der Zusatzsoftware installiert.

beatwork
Beiträge: 4
Registriert: 19.06.2020, 09:08
System: CCU
Hat sich bedankt: 3 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von beatwork » 21.06.2020, 14:33

Hallo zusammen,

ich stehe auf dem Schlauch und krieg es nicht zum Laufen: Ich habe nur die 6 Variablen (für heute avg, min, max und für morgen avg, min, max) erstellt und die selbst gewählten Namen im gesamten Skript geändert. Ist das korrekt, oder muss ich die anderen Variablen (z.B.: xmlTagStart) auch vorher als SV anlegen (Typ? Sting?).

Danke im Voraus und viele Grüße
Björn

MichaelN
Beiträge: 9655
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1617 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von MichaelN » 21.06.2020, 14:35

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

beatwork
Beiträge: 4
Registriert: 19.06.2020, 09:08
System: CCU
Hat sich bedankt: 3 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von beatwork » 21.06.2020, 14:46

MichaelN hat geschrieben:
21.06.2020, 14:35
Siehe Beitrag 1
Danke Michael,
den habe ich versucht komplett zu befolgen.
Aber ich glaube ich weiß wo mein Fehler liegt: Ich habe einfach die falschen Variablen angelegt und editiert. Es müssen vermutlich die in den Anführungszeichen sein. Ich habe fälschlicherweise die XML-Variablen angelegt...

Ich Versuchs weiter!

EDIT: Es funktioniert! Vielen Dank @Michael

Antworten

Zurück zu „Projektvorstellungen“