Grundlage ist eine gezielte Sammlung von Umweltdaten über einen definierten Zeitraum. Das kann man so übrigens für sämtliche Sensordaten adaptieren.
Code: Alles auswählen
!- liefert Wind-Werte der letzten 6h, bytelander - 05.05.2020
string DeviceChannelName = "Wetterstation:1";
string LogVariable = "UmweltWindLog";
string LogValue = "WIND_SPEED";
integer SecondsLog = 21600;
real Faktor = 2.0;
!- aktuelle Uhrzeit über Datum und 24-Stunden Zeit als Integer in Sekunden
integer now = system.Date("%F %X").ToTime().ToInteger();
!- aktuelle LogVariable auslesen
string list = dom.GetObject(LogVariable).Value();
string index;
integer count = 1; !- da es bei Eventauslösung immer ein (neues) Element gibt
!- neues Element an den Anfang der neuen Liste stellen
string newlist = dom.GetObject(DeviceChannelName).DPByHssDP(LogValue).Timestamp().ToTime().ToInteger().ToString()+"#"+dom.GetObject(DeviceChannelName).DPByHssDP(LogValue).Value().Round(1).ToString().RTrim("0").RTrim(".");
!- durch alle Listenelemente, um bereits gespeicherte Elemente, die noch nicht zu alt sind, in die neue Liste aufzunehmen, Liste wird HINTEN um zu alte Elemente abgeschnitten
foreach (index, list){
!- Zeitauswertung für alle ALTEN Listenelemente
if ((now-index.StrValueByIndex("#", 0).ToInteger())<=SecondsLog){
newlist=newlist+"\t"+index;
count=count+1;
}
}
dom.GetObject(LogVariable).State(newlist); !- neue LOG-Liste schreiben
!- WriteLine(newlist.Replace("\t","@"));
Code: Alles auswählen
!------------------- Mittelwert, gewichteter Mittelwert, Varianz und Standardabweichung für Long --------------------
string GMWLogVariable = "GMWWindLong"; !- Variable für gewichteten Mittelwert
string WindLong95Variable = "WindLong95"; !- Variable für WindLong95
integer GMWSecondsLog = 5400; !- Zeitspanne für gewichteten Mittelwert in Sekunden: 5400 (90 Minuten)
real sumMW;
!- Anzahl Elemente für Zeiteinheit ermitteln und "normalen" Mittelwert berechnen
integer count = 0;
foreach (index, newlist){
if ((now-index.StrValueByIndex("#", 0).ToInteger())<=GMWSecondsLog){
sumMW = sumMW + index.StrValueByIndex("#", 1).ToFloat();
count=count+1;
}
}
real MWLong = sumMW/count; !- Mittelwert für Long
real sumVQ;
foreach (index, newlist){
if ((now-index.StrValueByIndex("#", 0).ToInteger())<=GMWSecondsLog){
sumVQ = sumVQ + ((index.StrValueByIndex("#", 1).ToFloat() - MWLong) * (index.StrValueByIndex("#", 1).ToFloat() - MWLong));
}
}
real VarianzLong = sumVQ/count;
real StandAbwLong = VarianzLong.Sqrt();
real WindLong95 = MWLong+(StandAbwLong*Faktor);
dom.GetObject(WindLong95Variable).State(WindLong95.Round(2)); !- WindLong95 schreiben
real countGMW = ((count*(count+1))/2);
real sumGMW;
integer c = 0; !- Zähler für Gewichtung
foreach (index, newlist){
if ((now-index.StrValueByIndex("#", 0).ToInteger())<=GMWSecondsLog){
sumGMW=sumGMW+(index.StrValueByIndex("#", 1).ToFloat()*(count-c));
c=c+1;
}
}
real GMW = sumGMW/countGMW;
dom.GetObject(GMWLogVariable).State(GMW.Round(2)); !- neuen gewichteten Mittelwert für Long schreiben
!- WriteLine(GMW.Round(2));
!------------------- Mittelwert, gewichteter Mittelwert, Varianz und Standardabweichung für Short --------------------
string GMWLogVariable = "GMWWindShort"; !- Variable für gewichteten Mittelwert
string WindShort95Variable = "WindShort95"; !- Variable für WindLong95
integer GMWSecondsLog = 1800; !- Zeitspanne für gewichteten Mittelwert in Sekunden: 1800 (30 Minuten)
real sumMW;
!- Anzahl Elemente für Zeiteinheit ermitteln und "normalen" Mittelwert berechnen
integer count = 0;
foreach (index, newlist){
if ((now-index.StrValueByIndex("#", 0).ToInteger())<=GMWSecondsLog){
sumMW = sumMW + index.StrValueByIndex("#", 1).ToFloat();
count=count+1;
}
}
real MWShort = sumMW/count; !- Mittelwert für Short
real sumVQ;
foreach (index, newlist){
if ((now-index.StrValueByIndex("#", 0).ToInteger())<=GMWSecondsLog){
sumVQ = sumVQ + ((index.StrValueByIndex("#", 1).ToFloat() - MWShort) * (index.StrValueByIndex("#", 1).ToFloat() - MWShort));
}
}
real VarianzShort = sumVQ/count;
real StandAbwShort = VarianzShort.Sqrt();
real WindShort95 = MWShort+(StandAbwShort*Faktor);
dom.GetObject(WindShort95Variable).State(WindShort95.Round(2)); !- WindShort95 schreiben
real countGMW = ((count*(count+1))/2);
real sumGMW;
integer c = 0; !- Zähler für Gewichtung
foreach (index, newlist){
if ((now-index.StrValueByIndex("#", 0).ToInteger())<=GMWSecondsLog){
sumGMW=sumGMW+(index.StrValueByIndex("#", 1).ToFloat()*(count-c));
c=c+1;
}
}
real GMW = sumGMW/countGMW;
dom.GetObject(GMWLogVariable).State(GMW.Round(2)); !- neuen gewichteten Mittelwert für Short schreiben
!- WriteLine(GMW.Round(2));
Viel Spaß, bytelander