Script Delta Wert (Zeitliche Änderung) aus einem Gerät in eine Systemvariable schreiben

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Henke
Beiträge: 705
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 86 Mal
Danksagung erhalten: 137 Mal

Script Delta Wert (Zeitliche Änderung) aus einem Gerät in eine Systemvariable schreiben

Beitrag von Henke » 16.09.2022, 03:12

Ziel:

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.

Screenshot 2022-09-16 024705.jpg
Anzeige beim Kanal
Screenshot 2022-10-06 204513.jpg
Beispiel: Programm, das die Variable auswertet
Implementierung:

CCU-Programm anlegen, siehe:
Screenshot 2022-10-06 204020.jpg
CCU-Programm
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);
}
Ich hoffe es ist nützlich.

G
Michael

Edit:
V0.6 Werte umgedreht
V0.7 Verhalten beim Neustart verbessert
Programm auf "Bei Aktualisierung" geändert
Zuletzt geändert von Henke am 06.10.2022, 20:49, insgesamt 3-mal geändert.

MichaelN
Beiträge: 7523
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 565 Mal
Danksagung erhalten: 1213 Mal

Re: Script Delta Wert (Zeitliche Änderung) aus einem Gerät in eine Systemvariable schreiben

Beitrag von MichaelN » 16.09.2022, 08:31

Dein anderes Skript hat mich da auf eine Idee gebracht. Ich möchte zum Beispiel nicht das delta von 60 Minuten haben sondern nur von 10. Klar könnte man nun das Programm anpassen. Aber dein Ziel ist ja eine universelle Lösung zu haben.

Nun meine Idee: man übergibt die Zeitspanne zum Auswerten im WebUI-Programm.

z. B. So:

Code: Alles auswählen

WENN Gerät bei Änderung auslösen
      UND SV_Zeitspanne kleiner als 30 nur prüfen
.... 
Haken daran ist die SV_Zeitspanne muss schon existieren und sollte 0 sein.
Dann könntest Du in Deinem Skript prüfen ob es eine 2. Bedingung gibt und dort den Zahlen Wert auslesen.

Allerdings verstehe ich deine Berechnung noch nicht ganz:

Code: Alles auswählen

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; 
Ich habe einen Temperatursensor, der alle 3 Minuten einen Wert sendet. Die Temperatur ist um 0.2° gefallen. Dann ermittelt dein Programm 4°
D.h. Es handelt sich um eine Hochrechnung?
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 +++

Benutzeravatar
HM-Villa
Beiträge: 343
Registriert: 24.01.2022, 10:13
System: CCU
Hat sich bedankt: 20 Mal
Danksagung erhalten: 69 Mal

Re: Script Delta Wert (Zeitliche Änderung) aus einem Gerät in eine Systemvariable schreiben

Beitrag von HM-Villa » 16.09.2022, 09:42

Hallo MichaelN,

@Henke ermittelt aus der zeitlichen und der Änderung des Wertes des DP ein Delta pro Zeitschritt, das durch (* 60 * 60) auf eine Stunde umgerechnet wird. Um bei Deinem Beispiel zu bleiben also 4°C/h (unter der Voraussetzung, dass sich die Temperatur alle 3 min weiter um je 0,2°C ändern würde). Insofern ist das schon eine Hochrechnung, denn die o. g. Voraussetzung muss gelten. Es ist aber der tatsächliche Anstieg im letzten Sendeintervall, der auf eine Stunde normiert wurde.

Um mit diesem Wert sinnvoll etwas steuern zu können, ist diese Vorgehensweise erforderlich (Reaktion auf kurzfristige [starke] Änderungen eines Wertes). Die tatsächliche Änderung eines Wertes im Zeitraum einer Stunde wird in der Praxis oft sehr viel geringer ausfallen (außer, etwa bei Deinem Beispiel der Heizung, vielleicht in der morgendlichen Aufheizphase), so dass Änderungen zu wenig differenziert sind, um darauf reagieren zu können.

@Henke: Normalerweise müssten die Operatoren umgedreht werden. Man subtrahiert immer das neue Niveau vom alten. Dann wäre korrekterweise der Anstieg beim Beispiel von @MichaelH mit -4°C/h auch negativ.
______________________________________________________
797 Kanäle in 184 Geräten und 39 CUxD-Kanäle in 5 CUxD-Geräten

MichaelN
Beiträge: 7523
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 565 Mal
Danksagung erhalten: 1213 Mal

Re: Script Delta Wert (Zeitliche Änderung) aus einem Gerät in eine Systemvariable schreiben

Beitrag von MichaelN » 16.09.2022, 10:02

HM-Villa hat geschrieben:
16.09.2022, 09:42
Um mit diesem Wert sinnvoll etwas steuern zu können, ist diese Vorgehensweise erforderlich
Wirklich? Es ist doch nur ein Faktor eingebaut. Daher ist es am Ende egal, ob ich auf (hochgerechnete) 5° reagiere oder auf 0.25° Änderung.
Ne, das nicht ganz das was ich mir vorstellte. Der einzige Vorteil ist, daß die Änderungen normiert auf ein festes Zeitintervall berechnet werden.
Aber wenn ich weiß das mein Gerät ca. Alle 3 Minuten sendet und ich starke Änderungen erfassen will, dann kann ich davon ausgehen, das eben nach 3 Minuten auch ein neuer Messwert kommt.
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 +++

Benutzeravatar
HM-Villa
Beiträge: 343
Registriert: 24.01.2022, 10:13
System: CCU
Hat sich bedankt: 20 Mal
Danksagung erhalten: 69 Mal

Re: Script Delta Wert (Zeitliche Änderung) aus einem Gerät in eine Systemvariable schreiben

Beitrag von HM-Villa » 16.09.2022, 11:32

MichaelN hat geschrieben:
16.09.2022, 10:02
HM-Villa hat geschrieben:
16.09.2022, 09:42
Um mit diesem Wert sinnvoll etwas steuern zu können, ist diese Vorgehensweise erforderlich
Wirklich? Es ist doch nur ein Faktor eingebaut.
Ich meinte, auch wenn das zugegebenermaßen nicht so richtig heraus kam, damit den normierten Wert, nicht den Faktor selbst, der den Wert ja erst normiert. Außerdem ermöglicht die Normierung erst, dem Wert eine Einheit (z. B. °C/h) zuzuordnen und damit die Dimension noch besser vorstellbar zu machen. Darüber hinaus wird die Abhängigkeit vom Sendeabstand, der ja nicht bei jedem Sensor immer gleich sein muss, beseitigt.

Natürlich kann man mit Timestamp und Value und deren Vorgängern immer selbst im Script rechnen. Ein weiterer Vorteil ist aber, dass man dann quasi ohne Script (dieses hier unberücksichtigt), den Anstiegs-DP nur mit Hilfe eines Programmes benutzen kann. Für Anwendungen, in denen z. B. der Temperaturgradient mehrfach benötigt wird, ist das doch gar nicht so schlecht?
______________________________________________________
797 Kanäle in 184 Geräten und 39 CUxD-Kanäle in 5 CUxD-Geräten

MichaelN
Beiträge: 7523
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 565 Mal
Danksagung erhalten: 1213 Mal

Re: Script Delta Wert (Zeitliche Änderung) aus einem Gerät in eine Systemvariable schreiben

Beitrag von MichaelN » 16.09.2022, 12:25

Nein, schlecht ist die Idee 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 +++

Henke
Beiträge: 705
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 86 Mal
Danksagung erhalten: 137 Mal

Re: Script Delta Wert (Zeitliche Änderung) aus einem Gerät in eine Systemvariable schreiben

Beitrag von Henke » 16.09.2022, 17:43

HM-Villa hat geschrieben:
16.09.2022, 09:42
@Henke: Normalerweise müssten die Operatoren umgedreht werden. Man subtrahiert immer das neue Niveau vom alten. Dann wäre korrekterweise der Anstieg beim Beispiel von @MichaelH mit -4°C/h auch negativ.
@HM-Villa
Erledigt! Bevor es zu häufig genutzt wird, ist dafür jetzt der richtige Zeitpunkt.
Reaktion auf kurzfristige [starke] Änderungen eines Wertes
Super erklärt. Das genau ist das Ziel. Die Werte selber sind eigentlich Schrott. thx
Screenshot 2022-09-16 172704.jpg
Beispiel Feuchte Bad, wenn geduscht wird.
Daher muss auch direkt auf das Event reagieren werden. Das kommt schon spät spät genug und mit einer zeitlichen Abfrage passt es nicht mehr.

@MichaelN
MichaelN hat geschrieben:
16.09.2022, 08:31
Dein anderes Skript hat mich da auf eine Idee gebracht. Ich möchte zum Beispiel nicht das delta von 60 Minuten haben sondern nur von 10. Klar könnte man nun das Programm anpassen. Aber dein Ziel ist ja eine universelle Lösung zu haben.
Dafür ist dieses Script weniger geeignet. Es wäre ziemlich aufwendig die Werte zu loggen/speichern um daraus eine saubere Durchschnittsberechnung zu machen. Aber, hmmm, das nächste Script zur Berechnung von Min/Max und Tagesdurchschnitt mach ja genau das. :D
Ich sehe mir das noch mal an, bevor ich es veröffentliche. Aktuell schmeißt es gleiche Werte direkt raus. Behalte ich die aber als Paar, so habe ich alle Informationen die gebraucht werden. Mal sehen, was da raus kommt.

LG
Michael

MichaelN
Beiträge: 7523
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 565 Mal
Danksagung erhalten: 1213 Mal

Re: Script Delta Wert (Zeitliche Änderung) aus einem Gerät in eine Systemvariable schreiben

Beitrag von MichaelN » 16.09.2022, 18:09

Henke hat geschrieben:
16.09.2022, 17:43
Es wäre ziemlich aufwendig die Werte zu loggen/speichern um daraus eine saubere Durchschnittsberechnung zu machen
Man kann es mit einem gewichteten Mittelwert relativ einfach machen. Dann müsstest du nur einen Wert zwischen speichern. Zum Beispiel in den Metadaten des Gerätes. Der Unterschied wäre dann, dass die Ausgabe nicht die Hochrechnung aus den letzten beiden Messwerten ist, sondern die Differenz aus dem letzten Messwert und dem Durchschnitt über X Werte.

Ich bin nicht sicher, aber gefühlt macht es keinen Unterschied wenn man einen starken Sprung identifizieren will. Es sei denn man hat eh stark schwankende Messwerte.

Beispiel zur Berechnung viewtopic.php?f=43&t=10182&hilit=gleite ... ert#p94879
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 +++

aschenk
Beiträge: 12
Registriert: 20.02.2016, 17:32
Hat sich bedankt: 1 Mal

Re: Script Delta Wert (Zeitliche Änderung) aus einem Gerät in eine Systemvariable schreiben

Beitrag von aschenk » 04.10.2022, 15:23

Wenn ich das richtig einordne, dann kann ich mir mit so einem Script alle Fenster- und Türkontakte sparen, oder?
Zumindest wenn es um das Ausschalten der Heizung beim Lüften geht und das Script die Temperatur statt die Luftfeuchtigkeit prüft.
Oder sehe ich das falsch?

Gruß Achim


Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“