Script zum Erzeugen von Differenzwerten berechnet auf 1 Stunde eines Datenpunktes, so das darüber z.B. der "Boost" der Wandheizung im Bad gesteuert werden kann. Die Dusche erhöht die Feuchte dramatisch -> Handtuch wärmen.
Das Script kann aber auf beliebige Datenpunkte angewendet werden.
Die Installation soll dabei möglichst automatisch und einfach sein.
Implementierung:
CCU-Programm anlegen, siehe: In diesem Beispiel habe ich 3 Sensoren angelegt. Auch mehr sind möglich.
Für das CCU-Programm das folgende Script einfügen. Anpassungen am Script sind nicht nötig!
Code: Alles auswählen
!Delta eines Datenpunktes, Ausgabe auf 1h berechnet
!Copyleft M.Henke
!https://homematic-forum.de/forum/viewtopic.php?f=26&t=75545
!Anpassungen am Script sind nicht nötig!
!V 0.7
!https://homematic-forum.de/forum/viewtopic.php?f=26&t=75545
!0.6 Wert umgedreht. Thx HM-Villa "Man subtrahiert immer das neue Niveau vom alten."
!0.7 Check bei Reboot hinzugefügt
string ScriptName = "Delta1DP";
boolean debug = false;
string sResult;
integer srcId = ("$src$").ToInteger();
if (srcId > 0) {
object oSrc = dom.GetObject(srcId);
if (!oSrc) { quit; };
object oCh = channels.Get(oSrc.Channel());
}
else { quit; }
if (!oCh || (oSrc.Type() != OT_HSSDP)) {
quit;
}
object oDP = oCh.DPByHssDP(oSrc.HssType());
if (!oDP) { quit; }
if (debug) {
WriteLine("run Kanal: "#oCh.ChnNumber()#", DP: \""#oSrc.HssType()#"\", Wert: "# "$val$");
WriteLine(oDP.Name() # " " # oDP.TypeName() # "-" # oDP.ValueName() # "-" # oDP.ID());
sResult = sResult # oDP.Name() # " " # oDP.TypeName() # "-" # oDP.ValueName() # "-" # oDP.ID() # "\n";
}
string unit = oDP.ValueUnit();
string afrei = oSrc.HssType();
if (afrei == "VOLTAGE") { afrei = "Spannung"; }
if (afrei == "ACTUAL_TEMPERATURE") { afrei = "Temperatur"; }
if (afrei == "HUMIDITY") { afrei = "Luftfeuchte"; }
string sv_DeltaT = afrei # " Delta"; !Delta Temperatur h
string praefix = "x_";
string sv_ref_DeltaT = praefix # sv_DeltaT # " " # oCh.ID();
object svOj_DeltaT = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sv_ref_DeltaT);
!Wenn noch keine Systemvariable vorhanden, diese anlegen
if ((true) && (!svOj_DeltaT)) {
WriteLine("Erstelle: " # sv_ref_DeltaT);
object svOj_list = dom.GetObject(ID_SYSTEM_VARIABLES);
svOj_DeltaT = dom.CreateObject(OT_VARDP);
svOj_list.Add(svOj_DeltaT.ID());
svOj_DeltaT.Name(sv_ref_DeltaT);
svOj_DeltaT.ValueType(ivtFloat);
svOj_DeltaT.ValueSubType(istGeneric);
svOj_DeltaT.DPInfo(afrei # ' Delta pro h - ' # oCh.Name());
svOj_DeltaT.ValueUnit(unit # '/h');
svOj_DeltaT.ValueMin((0 - oDP.ValueMax().ToFloat()));
svOj_DeltaT.ValueMax(oDP.ValueMax());
svOj_DeltaT.State("");
svOj_DeltaT.Internal(false);
svOj_DeltaT.Visible(true);
!svOj_DeltaT.DPArchive(true); !Protokoll
svOj_DeltaT.Channel(oCh.ID());
oCh.DPs().Add(svOj_DeltaT);
dom.RTUpdate(0);
}
! Reboot ?
if ( !oDP.Timestamp().ToInteger() ) {quit;}
if ( !oDP.LastTimestampSeconds().ToInteger() ) {quit;}
integer timeDiff = oDP.Timestamp().ToInteger() - oDP.LastTimestampSeconds().ToInteger();
if (!timeDiff) { quit; }
real valDiff = oDP.Value().ToFloat() - oDP.LastValue().ToFloat();
real valDiffH1 = (valDiff * 60 * 60) / timeDiff;
sResult = sResult # oDP.Value() # " " # oDP.LastValue() # " " # timeDiff #" "# valDiffH1 # " " #valDiff;
if (svOj_DeltaT) {
if (svOj_DeltaT.Value().ToString() != valDiffH1.ToString()) {
svOj_DeltaT.State(valDiffH1);
sResult = sResult # " Update " #(svOj_DeltaT.Value().ToString() - valDiffH1.ToString());
}
}
if (sResult && debug) {
string lg = 'logger -t SDV-H-$ScriptName$ -p user.debug "$sResult$"';
lg = lg.Replace("$sResult$", sResult).Replace("$ScriptName$", ScriptName);
system.Exec(lg);
}
G
Michael
Edit:
V0.6 Werte umgedreht
V0.7 Verhalten beim Neustart verbessert
Programm auf "Bei Aktualisierung" geändert