ALso das ganze geht IMHO einfacher -
hier mein komplett selbst-konfigurierendes Skript:
WebUI Programm anlegen, das von dem zu mittelnden Datenpunkt getriggert wird. Dieser Datenpunkt muss einen Wert für .Value() liefern:
In diesem Beispiel wird die Berechnung bei jeder Aktualisierung von FBH_temp_0 oder FBH_temp_1 angestoßen und der Mittelwert dafür in aa_FBH_temp_0_MW bzw aa_FBH_temp_1_MW gespeichert.
Wichtig ist die Bedingung so zu formulieren, das bei jeder Aktualisierung des Messwertes das Programm getriggert wird. Es können beliebig viele Trigger (mit
ODER verknüpft) aufgeführt werden, da der Name der Systemvariable mit dem Ergebnis dynamisch aus dem triggernden Objekt berechnet wird.
Alternativ: Programm regelmäßig von einem Zeitmodul triggern lassen - z.B. Jede Stunde mit n=24 für einen Tagesdurchschnitt.
Wichtig: dann muss die erste Bedingung des Programms den Datenpunkt/Systemvariable enthalten, der gemittelt werden soll - aber mit
"nur prüfen" - der soll ja nicht das Programm triggern.
Man kann sogar beide Varianten kombinieren und in weiteren Bedingungen das Programm von Datenpunkten triggern lassen - diese werden dann bei Aktualisierung gemittelt - unabhängig vom Zeitmodul. Wichtig: die Bedingungen ver-
ODER-n, so das sie immer erfüllt sind.
In diesem Beispiel wird die Berechnung für sonne_elevation vom Zeitmodul angestoßen und in aa_sonne_elevation_MW gespeichert, sowie bei jeder Aktualisierung von FBH_temp_1 wird der Mittelwert dafür in aa_FBH_temp_1_MW gespeichert.
Dann dieses Skript einfügen. Das einzige was man im Skript konfigurieren muss ist ggf. Suffix und Prefix, sowie auf jedenfall den Wert n, der bestimmt aus wievielen Werten der Mittelwert gebildet wird.
Es wird das Ergebnis in eine Systemvariable geschrieben, die aus Prefix + Objekt-Name + Suffix gebildet wird. Im Beispiel heißt das Objekt FBH_Temp_1. Die SV wird dann aa_FBH_Temp_1_MW heißen. Existiert diese SV nicht, wird sie angelegt.
Setzt man bDebug auf true kann man im Fehlerprotokoll Log-Daten des Skript finden.
Code: Alles auswählen
! gleitenden Mittelwert aus triggerndem Wert berechnen
! V1.1 MichaelN https://homematic-forum.de/forum/viewtopic.php?f=43&t=10182&p=750572#p750572
! GPL-3.0-or-later
! triggern durch zu mittelnden Datenpunkt/SV oder Zeitmodul - dann muss der zu mittelnde DP/SV in der erste Bedingung stehen (auf nur prüfen)
! gespeichert wird in Systemvariable aus Prefix + Name + Suffix
string Prefix = "aa_";
string Suffix = "_MW";
real n = 24.0; ! Anzahl der Werte aus denen der Mittelwert gebildet wird - wichtig mit .0
boolean bDebug = false; ! true für Debugging Infos im Fehlerprotokoll
! ab hier nichts mehr ändern
object oPrg = dom.GetObject("$this$");
string Skriptname = oPrg.Name();
string s_text; string s_out; string s_err; string SVName ="";
if (bDebug) {
s_text = "+++ START";
system.Exec("logger -t "#Skriptname#" -p user.debug "#s_text, &s_out, &s_err);
}
integer iSrcId = ("$src$").ToInteger();
if (!iSrcId ) { quit; }
object oSrc = dom.GetObject(iSrcId);
if (!oSrc) { quit; }
if(oSrc.TypeName() == "CALENDARDP")
{
! Auslöser ist Zeitmodul
! Datenpunkt ermitteln
integer iCondition = 0; !Nummer der Condition
integer iSingle = 0; !Nummer der SingleCondition
object oCND; object oSCND;
object oRULE= oPrg.Rule ();
oCND=oRULE.RuleCondition(iCondition); ! Condition
oSCND=oCND.CndSingleCondition(iSingle);
oSrc = dom.GetObject(oSCND.LeftVal());
if (bDebug) {
s_text = "Auslöser ist Zeitmodul - DP ist:" # oSrc.Name();
system.Exec("logger -t "#Skriptname#" -p user.debug "#s_text, &s_out, &s_err);
}
SVName = Prefix # oSrc.Name() # Suffix;
} else {
! Auslöser ist Datenpunkt oder SV
if (bDebug) {
s_text = "Auslöser ist DP oder SV:" # oSrc.Name();
system.Exec("logger -t "#Skriptname#" -p user.debug "#s_text, &s_out, &s_err);
}
SVName = Prefix # oSrc.Name() # Suffix;
}
if (bDebug) {
s_text = "speichern in : " #SVName;
system.Exec("logger -t "#Skriptname#" -p user.debug "#s_text, &s_out, &s_err);
}
object MittelwertSV = dom.GetObject (ID_SYSTEM_VARIABLES).Get (SVName);
if (!MittelwertSV) {
s_text = "Erstelle SV: " # SVName;
system.Exec("logger -t "#Skriptname#" -p user.debug "#s_text, &s_out, &s_err);
MittelwertSV = dom.CreateObject(OT_VARDP, SVName);
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObjects.Add(MittelwertSV.ID());
MittelwertSV.ValueType(ivtFloat);
MittelwertSV.ValueSubType(istGeneric);
MittelwertSV.DPInfo("Script " # Skriptname # " Result - Variable nicht umbenennen");
MittelwertSV.ValueUnit('');
MittelwertSV.State(oSrc.Value().ToFloat());
MittelwertSV.Internal(false);
MittelwertSV.Visible(true);
dom.RTUpdate(0);
}
real Messung = oSrc.Value().ToFloat();
real MW = MittelwertSV.Value();
if (bDebug) {
s_text = "Startwert: "#MW;
system.Exec("logger -t "#Skriptname#" -p user.debug "#s_text, &s_out, &s_err);
s_text = "Messwert: "#Messung;
system.Exec("logger -t "#Skriptname#" -p user.debug "#s_text, &s_out, &s_err);
}
MW = (MW * ((n-1.0)/n)) + (Messung / n);
MW = MW.Round(3);
MittelwertSV.State(MW);
if (bDebug) {
s_text = "Neuer Wert: "#MW;
system.Exec("logger -t "#Skriptname#" -p user.debug "#s_text, &s_out, &s_err);
}
if (bDebug) {
s_text = "+++ ENDE";
system.Exec("logger -t "#Skriptname#" -p user.debug "#s_text, &s_out, &s_err);
}
ChangeLog:
V1.1 Auslösung auch durch Zeitmodul möglich