Wettervorhersage über OpenWeatherMap

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von MichaelN » 27.09.2020, 18:30

Müsste eigentlich funktionieren. ABER du hast die Wind und Regen Flags nicht angepasst. Nun wird dein Symbol Wert in km/h umgerechnet. Also den Zahlenwert für Wind und Regen an die tatsächliche Position anpassen. Zählung beginnt bei 0.
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 +++

flo_ded
Beiträge: 94
Registriert: 08.05.2018, 00:46
Hat sich bedankt: 11 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von flo_ded » 14.10.2020, 21:40

Hallo Michael,

danke für dein Skript. Habe es insoweit angepasst, dass ich noch wissen wollte wie die Wolkendecke (0-100%) aussieht. Will den Wert für meine Photovoltaik Prognose nutzen.
Es läuft soweit nur hätte ich gerne noch zwei Anpassungen.
1. Übermorgen mit aufnehmen. An welcher Stelle muss ich im Skript ansetzen? Counter erhöhen und weitere IF Schleife mit Day2 einbauen? Bleibt dann der Rest kompatibel?
2. Gerade bei der Wolkendecke wäre ich sehr daran interessiert zu wissen, wie sich die Wolkendecke tagsüber im 3 Stunden-Raster entwickelt. Folgender Use-Case liegt dem zu Grunde: Wenn morgens bewölkt oder regnerisch ist, könnte es trotzdem sein, dass ab 12 oder 15 Uhr mehr Sonne bzw. Strom zur Verfügung steht, um die weiße Ware anzuschalten.
Das JSON liefert ja den 3h Raster.

Deine Beobachtungen mit OpenWeatherMap kann ich bestätigen. AccuWeather kenne ich noch nicht. Wunderground finde ich bisher am genausten bei der Vorhersage. Habe eine eigene Wetterstation und somit auch ein Wunderground API-Key.
RasPi 4B 4GB
Addons: CCU-Historian, CUxD, hm-ioBroker, E-Mail, HVL, RedMatic

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von MichaelN » 15.10.2020, 09:48

1) Zunächst mal brauchst Du weitere Variablen. Praktisch alle Variablen die auf 0 und 1 enden brauchst Du nochmal mit 2 am Ende.
Und im Code findest Du ein paar Blöcke, die mit !Day0 und !Day1 gekennzeichnet sind. Die musst Du für Day2 entsprechend kopieren und anpassen. Ausschlaggebend ist, daß Du die Variable Day2 analog zu Day1 mit dem richtigen Datumswert befüllst.
Ich habe für die Haussteuerung keinen Nutzen in Daten für übermorgen gesehen. Die Day2 zum Day0 geworden ist, hat sich die Vorhersage eh noch 3x geändert.

2) gerade mit der Vorhersage der Bewölkung war ich bei OWM sehr unzufrieden. Deswegen bin ich zu Accuweather gewechselt.
Beim OWM-Skript habe ich nicht vorgesehen nur ausgewählte Stunden abzufragen. Beim Accuweather-Skript hingegen ist die Anzahl der abzufragenden Stunden parametrisiert. Da könntest Du Dir also leicht eine Deklaration für Bewölkung erstellen, die Stunden auf 1 stellen und die Daten stündlich abfragen. Oder halt Stunden = 3 und alle 3 Stunden abfragen.
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 +++

flo_ded
Beiträge: 94
Registriert: 08.05.2018, 00:46
Hat sich bedankt: 11 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von flo_ded » 15.10.2020, 10:37

Danke Michael für deine Ausführlichkeit. Das habe ich mir so schon gedacht gehabt. Die Werte für Übermorgen werde ich nur als Visualisierung nutzen. Eine konkrete Automatisierungsaufgabe sehe ich dahinter auch noch nicht. Eventuell nur etwas wegen Lüftungsempfehlung.


Bin leider erst danach auf deine AccuWeather Umsetzung gestoßen und nutze nun die für meine 12h Bewölkungsvorhersage. So ist es perfekt, dann kann ich genau vorhersagen ab wann mit ausreichend PV Strom zu rechnen ist. Muss jetzt lediglich lernen wie das Verhältnis zwischen Bewölkung und PV Ertrag ist.
RasPi 4B 4GB
Addons: CCU-Historian, CUxD, hm-ioBroker, E-Mail, HVL, RedMatic

Tom_SW
Beiträge: 2
Registriert: 30.10.2020, 09:06
System: CCU
Hat sich bedankt: 1 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von Tom_SW » 15.03.2021, 12:37

Hallo MichaelN,
zunächst einmal vielen Dank für das gelungene Skript, welches sehr schlank und elegant umgesetzt wurde und auch auf Anhieb funktioniert hat.

Bei der Verwendung der Werte in meiner Homematic habe ich versucht die Ergebnisse für Regen zu interpretieren und da habe ich noch etwas Klärungsbedarf.

Bei den Interpretationen der Meteorologen vom DWD (https://www.dwd.de/DE/service/lexikon/F ... lv3=101906) wird die Einteilung der Regenmenge (in mm) in die folgenden Bereiche eingeteilt:
leicht: Niederschlagshöhe in 60 Minuten < 2,5 mm
mäßig: Niederschlagshöhe in 60 Minuten ≥ 2,5 mm bis < 10,0 mm
stark: Niederschlagshöhe in 60 Minuten ≥ 10,0 mm
sehr stark: Niederschlagshöhe in 60 Minuten ≥ 50,0 mm
Der DWD warnt ab einer Regenmenge >15 mm.

Nach Umrechnung Ergibt sich 1 mm = 1 l/m² / h und die vorher genannten Werte bleiben gleich.

Bei den Daten, die durch Dein Skript von OpenWeatherMap heruntergeladen werden, handelt es sich jedoch um Angaben (3h) für 3 Stunden.
Würde es daher bei Deinem Skript nicht auch noch Sinn machen die Werte als 1h-Angaben direkt umzurechnen und den Wetter-Code auch direkt in die Variablen zu schreiben?
Wenn dies möglich wäre, dann könnte man entweder mit Hilfe einer Interpretationsskala oder anhand des Codes die png-Bilder von OWM (https://openweathermap.org/weather-conditions) für Niederschlagsmenge in der NEO-AIOCreator-App verwenden.

Group 5xx: Rain
ID Main Description Icon
500 Rain light rain 10d
501 Rain moderate rain 10d
502 Rain heavy intensity rain 10d
503 Rain very heavy rain 10d
504 Rain extreme rain 10d
511 Rain freezing rain 13d
520 Rain light intensity shower rain 09d
521 Rain shower rain 09d
522 Rain heavy intensity shower rain 09d
531 Rain ragged shower rain 09d

Gruß
Tom

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von MichaelN » 15.03.2021, 13:22

Bei der AccuWeather-API kann man auch stündliche Daten abrufen. Außerdem halte ich die Daten für etwas weniger ungenau. Link zu dem Skript steht in meiner Signatur.

Ich persönlich habe kein Interesse daran "alles" mit der CCU zu lösen. Die Wettervorhersage bekomme ich bequemer über die Wetter-App auf meinem Handy. Ich verwende die abgerufenen Daten ausschließlich zur HAusautomation. Und dazu brauche ich keine wissenschaftliche Genauigkeit. Und eben auch keine Wetter-Icons.

Das gibt es aber auch alles zumindest in der AccuWeather API und ich meine auch in der OWM-Api und kann daher auch abgefragt werden, wenn Du die Deklaration entsprechend anpasst.
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 +++

wolfi73
Beiträge: 6
Registriert: 26.03.2021, 18:25
System: CCU
Hat sich bedankt: 7 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von wolfi73 » 30.07.2023, 08:48

Vielen Dank für das tolle Beispiel!!! Nach so etwas habe ich gesucht. Vielen Dank auch an alle die Ihre Probleme gepostet haben. Mir hat es bei meinem Fehler (lag natürlich bei mir) weitergeholfen.

gamehunter
Beiträge: 26
Registriert: 27.09.2015, 01:59
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von gamehunter » 22.08.2023, 09:11

Sehr schön beschrieben. Danke!!!


Ich möchte gerne die Daten in eine virtuelle Wetterstation schreiben.
Die Daten kommen da allerdings nicht an.

Orts- und App-ID habe ich ausgeblendet.

Besten Dank für die Unterstützung.

Code: Alles auswählen

! Wettervorhersage V4.1b (MichaelN 19.08.2020)
! GPL-3.0-or-later
! 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=-----------&APPID=----------------'";
string CUXD_Device = "CUxD.CUX9002001:1"; !CUX2801001:1

! === Hier anpassen ===
integer AnzahlTags        = 4; ! Anzahl der eingetragenen XML-Tags
string xmlTagStart        = "windSpeed,temperature unit=,humidity value,precipitation"; ! 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_gesamt"; ! 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_gesamt";  ! 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)
  {
  (dom.GetObject(ID_DATAPOINTS)).Get(CUXD_Device#".CMD_EXEC").State("logger -t script -p user.debug [MichaelN Script OpenWeatherMap V4.1: keine Antwort vom Wetter-Server!]");
  WriteLine("MichaelN Script OpenWeatherMap V4.1: keine Antwort vom Wetter-Server!");
  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
	! *** DEBUG
	WriteLine(NameSVavg0.StrValueByIndex(",",counter));
	WriteLine(Wert_avg);
	WriteLine(NameSVmin0.StrValueByIndex(",",counter));
	WriteLine(Wert_min);
	WriteLine(NameSVmax0.StrValueByIndex(",",counter));
	WriteLine(Wert_max);
	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);
Dateianhänge
Screenshot 2023-08-22 090929.png
Screenshot 2023-08-22 090929.png (5.11 KiB) 808 mal betrachtet

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von MichaelN » 22.08.2023, 11:28

Siehe Seite 1 unter "Was macht es nicht:"
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 +++

gamehunter
Beiträge: 26
Registriert: 27.09.2015, 01:59
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Wettervorhersage über OpenWeatherMap

Beitrag von gamehunter » 23.08.2023, 08:00

Manchmal sollte man genauer lesen. Danke für den Hinweis.

Ich habe ein Verständnisproblem. Diese werte wurden mir heute um 7:45 Uhr angezeigt. Laut Internetseite von OWM passen die Werte nicht zusammen.

Wichtig für mich sind die Werte für Regen und Temp. Sollten die Werte der SV von "FC Temp heute max" und "Forcast Temp heute" nicht identisch sein?
Screenshot 2023-08-23 075045.png

Ich habe den Basic API Key.

Danke im Voraus. LG Mark
Zuletzt geändert von gamehunter am 23.08.2023, 08:41, insgesamt 1-mal geändert.

Antworten

Zurück zu „Projektvorstellungen“