Seite 1 von 1

Gewichtete Mittelwerte von Sensordaten über unterschiedliche Zeitabschnitte

Verfasst: 23.08.2019, 17:01
von Stefan0815
Wer seine Markisen in Abhängigkeit vom Wind steuern möchte, stößt früher oder später auf das Problem, dass einzelne Messwerte keinen zuverlässigen Sensorwert zur Steuerung darstellen. Eine Abhilfe ist eine Hysterese, die bei böigem Wind aber meist unkomfortabel ist. Daher hier ein kleines Scriptbeispiel, wie man Sensorwerte (hier Windgeschwindigkeit) über einen größeren Zeitraum in einer einzelnen (Text)-Variablen speichern und später auswerten kann. Ich nutze das Beispiel analog für Helligkeit und Temperatur. Das konkrete Script bestimmt die gewichteten Mittelwerte der letzten ca. 90 Minuten und 30 Minuten. Dabei hat der letzte Wert die höchste Wichtung. Das Script wird dann bei jeder Aktualisierung der Windgeschwindigkeit ausgelöst (also ca. alle 3 Minuten). Die Variablen "GMWWindLong" und "GMWWindShort" werden vorher als Typ Zahl angelegt und können einfach direkt an die Wetterstation gebunden werden. Über die Variable Short fahre ich die Markisen ein und über Short und Long darf sie wieder ausfahren. Am Beispiel der Helligkeit lässt eine einzelne Wolke die Markisen nicht gleich wieder einfahren.

Code: Alles auswählen

!gewichteten Mittelwert der letzten ca. 90 Minuten berechnen
string Wetterstation = "Wetterstation:1"; !hier den Namen und Kanal der Wetterstation eingeben
string list = dom.GetObject("WindLOG").Value(); !Variable muss vorher als Zeichenkette angelegt werden
string newlist;
string index;
integer count = 0; !Zähler für Abbruch und Anzahl der Werte
integer maxElements=29; !maximale alte Werte, hinzu kommt dann noch der neue Wert, zusammen also 30

if (list=="???"){
	newlist=dom.GetObject(Wetterstation).DPByHssDP("WIND_SPEED").Value().Round(1).ToString().RTrim("0").RTrim(".");
  count=1;
}
else{
	foreach (index, list){
		if (count<maxElements){
			if (count==0){
				newlist=index;
			}
			else{
				newlist=newlist+"\t"+index;
			}
			count=count+1;
		}
	}
	newlist=dom.GetObject(Wetterstation).DPByHssDP("WIND_SPEED").Value().Round(1).ToString().RTrim("0").RTrim(".")+"\t"+newlist;
	count=count+1;
}
dom.GetObject("WindLOG").State(newlist); !neue Liste in Variable schreiben

integer countGMW = ((count*(count+1))/2);
real sumGMW;
integer c = 0;

foreach (index, newlist){
  sumGMW=sumGMW+(index.ToFloat()*(count-c));
  c=c+1;
}
real GMW=sumGMW/countGMW;
dom.GetObject("GMWWindLong").State(GMW.Round(2));

!hier ist der 90 Minuten-Teil zu Ende

!gewichteten Mittelwert der letzten ca. 30 Minuten berechnen
integer short = 10;
if (count>short){
  count=short;
}

integer countGMW = ((count*(count+1))/2);
real sumGMW;
integer c = 0;

foreach (index, newlist){
  if (c<short){
  sumGMW=sumGMW+(index.ToFloat()*(count-c));
  c=c+1;
  }
}
real GMW=sumGMW/countGMW;
dom.GetObject("GMWWindShort").State(GMW.Round(2));
Unbenannt.PNG
Unbenannt.PNG (7.15 KiB) 1102 mal betrachtet
2.PNG
2.PNG (23.74 KiB) 1096 mal betrachtet