kein Unterschied zischen bei Änderung/Aktualisierung auslösen

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Benutzeravatar
Henke
Beiträge: 1520
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 140 Mal
Danksagung erhalten: 306 Mal

Re: kein Unterschied zischen bei Änderung/Aktualisierung auslösen

Beitrag von Henke » 25.09.2022, 17:15

Das Auslöseproblem kann gelöst werden. Ich habe mein Schalter/Variablen Script angepasst, so das es alle Datenpunkte verarbeitet. Das Script filtert vorher schon gleiche Eingangs und Ausgangswerte raus.

Installation wie hier: viewtopic.php?f=26&t=75564

aber mit der neueren Version:

Code: Alles auswählen

!Schaltaktorstatus/Variablenstatus weiterleiten
!Copyleft M.Henke
!V 1.1
!Anpassungen am Script sind nicht nötig!
!- V1.0
! Akt/Last gleich, Ausgabe unterdrückt
!- V1.1
! Alle DAtenpunkte können weitergeleitet werden
!this 17500 src 17478 - für mich zum Testen

string ScriptName = "SA_VA";
boolean debug = false;
string sResult;

integer srcId = ("$src$").ToInteger();
if (srcId > 0) {
    object oSrc = dom.GetObject(srcId);
    if (!oSrc) { quit; };
}
else { quit; }

if (debug) {
!oSrc.Name()
    sResult = "run val: "# "$val$" # " this: " # "$this$" # " " # oSrc.FullName() # " " # oSrc.TypeName() # "-" # oSrc.ValueName() # "-" # oSrc.ID();
}
object oPrg = dom.GetObject("$this$");
if (!oPrg) { quit; };
!WriteLine(oPrg.Rule().RuleConditions());

boolean found = false;
string s;
foreach(s, oPrg.Rule().RuleConditions().EnumIDs()) {
    object o = dom.GetObject(s);

    if (o.CndSingleCount() >= 2) {
        !string cc = o.CndSingleConditions().EnumIDs();
        object quelleObj = o.CndSingleConditions().GetAt(0);
        var dp1 = quelleObj.LeftVal();
        if (srcId == dp1) { found = true; break; }
    }
}

if (!found) { quit; }

object oDP1 = dom.GetObject(dp1);
if (!oDP1) { quit; }

integer run = 1;
var setWert = oDP1.Value();
var lastWert = oDP1.LastValue();
sResult = sResult # " " # lastWert;

boolean isState =  (oDP1.ValueSubType() ==  istBool);
if ( false ){
if ( oDP1.Type() != OT_VARDP ){
isState = (oDP1.HssType() == "STATE" );
}else
{
WriteLine ( oDP1.ValueSubType() # " " #  istBool );
}
}

if ( (!quelleObj.RightVal1()) && isState ) {
    setWert = (!setWert);
!    WriteLine( "a " # setWert # " " # oDP1.HssType());
}

if ( setWert !=      lastWert ){
sResult = sResult # "->" # setWert;
if ( setWert.ToInteger() ==      lastWert.ToInteger() ){
	sResult = sResult # "!!!";
}
}
else
{
	sResult = sResult # "-G";
}
	sResult = sResult # " >> ";

while (run < o.CndSingleCount().ToInteger()) {
    !WriteLine(run);
    object zielObj = o.CndSingleConditions().GetAt(run);
    var dp2 = zielObj.LeftVal();

    if (dp2) {
	    var ist = dom.GetObject(dp2).Value();

        var setZiel = setWert;
        if ( (!zielObj.RightVal1()) && isState) {
            setZiel = (!setZiel);
        }
        sResult = sResult # "/" # ist;
        if ( setZiel != ist )
        {
	        dom.GetObject(dp2).State(setZiel);
	        sResult = sResult # "->" # setZiel;
        }
        else
        {
	        sResult = sResult # "-G";
        }
    }
    run = run + 1;
}

if (sResult && debug) {
    WriteLine(sResult);
    string lg = 'logger -t SDV-H-$ScriptName$ -p user.debug "$sResult$"';
    lg = lg.Replace("$sResult$", sResult).Replace("$ScriptName$", ScriptName);
    system.Exec(lg);
}

Gerti
Beiträge: 3025
Registriert: 28.01.2016, 18:06
System: CCU
Wohnort: Hürth
Hat sich bedankt: 16 Mal
Danksagung erhalten: 268 Mal

Re: kein Unterschied zischen bei Änderung/Aktualisierung auslösen

Beitrag von Gerti » 26.09.2022, 07:25

Hi,

bei Änderung auslösen und bei Aktualisierung auslösen, lösen grundsätzlich beide den Programmstart bereits bei einer Aktualisierung aus. Ob es eine Änderung oder eine Aktualisierung des Wertes war, die das Programm getriggert hat, wird erst zur Laufzeit des Programms im entsprechenden Zweig geprüft.

Hier mal ein einfaches Beispiel, wo das problematisch wird.

WENN
Fensterkontakt 1 geöffnet bei Änderung auslösen
DANN
Rollladen hoch
SONST, WENN
Fensterkontakt 1 geschlossen bei Änderung auslösen
UND
Fensterkontakt 2 geschlossen bei Änderung auslösen
DANN
Rollladen runter

Wenn Fensterkontakt 1 seinen Status nur aktualisiert, wird keine Aktion ausgeführt, da in beiden Zweigen auf eine Änderung getriggert wird.
Wenn aber Fensterkontakt 2 seinen Status nur aktualisiert und Fensterkontakt 1 offen ist, wird das erste DANN ausgeführt, weil die Bedingung erfüllt ist und die Prüfung, ob Fensterkontakt 2 eine Aktualisierung oder Änderung war, in dem Zweig gar nicht geprüft wird.
Der Rollladen würde also etwa jede Stunde einen Hochfahrbefehl bekommen, solange Fenster 1 offen ist.

Gruß
Gerti
Zuletzt geändert von Gerti am 26.09.2022, 11:12, insgesamt 1-mal geändert.

MichaelN
Beiträge: 9635
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1614 Mal

Re: kein Unterschied zischen bei Änderung/Aktualisierung auslösen

Beitrag von MichaelN » 26.09.2022, 08:48

So wie Du das schilderst klingt das erstmal logisch. Dann wäre das aber ein Bug, den man beheben könnte.
Ist das eine Vermutung oder hast Du das Evaluiert?
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 +++

Gerti
Beiträge: 3025
Registriert: 28.01.2016, 18:06
System: CCU
Wohnort: Hürth
Hat sich bedankt: 16 Mal
Danksagung erhalten: 268 Mal

Re: kein Unterschied zischen bei Änderung/Aktualisierung auslösen

Beitrag von Gerti » 26.09.2022, 09:47

Hi,

das habe ich so ausprobiert.
War aber schon immer so und würde vermutlich einen massiven Umbau im Backend benötigen um das zu ändern.

Gruß
Gerti

Matsch
Beiträge: 5416
Registriert: 30.05.2019, 11:37
System: Alternative CCU (auf Basis OCCU)
Wohnort: Chemnitz
Hat sich bedankt: 114 Mal
Danksagung erhalten: 730 Mal

Re: kein Unterschied zischen bei Änderung/Aktualisierung auslösen

Beitrag von Matsch » 26.09.2022, 10:30

Erschreckend!

Benutzeravatar
Schuki91
Beiträge: 18
Registriert: 05.12.2021, 20:01
System: CCU
Wohnort: Baden-Württemberg
Hat sich bedankt: 14 Mal

Re: kein Unterschied zischen bei Änderung/Aktualisierung auslösen

Beitrag von Schuki91 » 26.09.2022, 20:55

Henke hat geschrieben:
25.09.2022, 17:15
Das Auslöseproblem kann gelöst werden. Ich habe mein Schalter/Variablen Script angepasst, so das es alle Datenpunkte verarbeitet. Das Script filtert vorher schon gleiche Eingangs und Ausgangswerte raus.

Installation wie hier: viewtopic.php?f=26&t=75564

aber mit der neueren Version:

Code: Alles auswählen

!Schaltaktorstatus/Variablenstatus weiterleiten
!Copyleft M.Henke
!V 1.1
!Anpassungen am Script sind nicht nötig!
!- V1.0
! Akt/Last gleich, Ausgabe unterdrückt
!- V1.1
! Alle DAtenpunkte können weitergeleitet werden
!this 17500 src 17478 - für mich zum Testen

string ScriptName = "SA_VA";
boolean debug = false;
string sResult;

integer srcId = ("$src$").ToInteger();
if (srcId > 0) {
    object oSrc = dom.GetObject(srcId);
    if (!oSrc) { quit; };
}
else { quit; }

if (debug) {
!oSrc.Name()
    sResult = "run val: "# "$val$" # " this: " # "$this$" # " " # oSrc.FullName() # " " # oSrc.TypeName() # "-" # oSrc.ValueName() # "-" # oSrc.ID();
}
object oPrg = dom.GetObject("$this$");
if (!oPrg) { quit; };
!WriteLine(oPrg.Rule().RuleConditions());

boolean found = false;
string s;
foreach(s, oPrg.Rule().RuleConditions().EnumIDs()) {
    object o = dom.GetObject(s);

    if (o.CndSingleCount() >= 2) {
        !string cc = o.CndSingleConditions().EnumIDs();
        object quelleObj = o.CndSingleConditions().GetAt(0);
        var dp1 = quelleObj.LeftVal();
        if (srcId == dp1) { found = true; break; }
    }
}

if (!found) { quit; }

object oDP1 = dom.GetObject(dp1);
if (!oDP1) { quit; }

integer run = 1;
var setWert = oDP1.Value();
var lastWert = oDP1.LastValue();
sResult = sResult # " " # lastWert;

boolean isState =  (oDP1.ValueSubType() ==  istBool);
if ( false ){
if ( oDP1.Type() != OT_VARDP ){
isState = (oDP1.HssType() == "STATE" );
}else
{
WriteLine ( oDP1.ValueSubType() # " " #  istBool );
}
}

if ( (!quelleObj.RightVal1()) && isState ) {
    setWert = (!setWert);
!    WriteLine( "a " # setWert # " " # oDP1.HssType());
}

if ( setWert !=      lastWert ){
sResult = sResult # "->" # setWert;
if ( setWert.ToInteger() ==      lastWert.ToInteger() ){
	sResult = sResult # "!!!";
}
}
else
{
	sResult = sResult # "-G";
}
	sResult = sResult # " >> ";

while (run < o.CndSingleCount().ToInteger()) {
    !WriteLine(run);
    object zielObj = o.CndSingleConditions().GetAt(run);
    var dp2 = zielObj.LeftVal();

    if (dp2) {
	    var ist = dom.GetObject(dp2).Value();

        var setZiel = setWert;
        if ( (!zielObj.RightVal1()) && isState) {
            setZiel = (!setZiel);
        }
        sResult = sResult # "/" # ist;
        if ( setZiel != ist )
        {
	        dom.GetObject(dp2).State(setZiel);
	        sResult = sResult # "->" # setZiel;
        }
        else
        {
	        sResult = sResult # "-G";
        }
    }
    run = run + 1;
}

if (sResult && debug) {
    WriteLine(sResult);
    string lg = 'logger -t SDV-H-$ScriptName$ -p user.debug "$sResult$"';
    lg = lg.Replace("$sResult$", sResult).Replace("$ScriptName$", ScriptName);
    system.Exec(lg);
}
Kannst du mir bitte erklären was genau dieses Programm macht und wo es hingehört? Ich habe es nicht verstanden.
RaspberryMatic in umgebauter CCU3 (externe Antenne + 32GB Speicherkarte + 64GB USB Stick)

Benutzeravatar
Henke
Beiträge: 1520
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 140 Mal
Danksagung erhalten: 306 Mal

Re: kein Unterschied zischen bei Änderung/Aktualisierung auslösen

Beitrag von Henke » 26.09.2022, 21:43

Siehe viewtopic.php?f=26&t=75564 Implementierung.

Nur das du in einem Block als erstes den Datenpunkt "Zulauftemperatur Solarthermie" anlegst und als 2. eine neue Systemvariable als Zahl. Diese wird dann nur geändert, wenn sich der Inhalt von "Zulauf ändert".

Dann diese Systemvariable als Test in den Programmen verwenden. Damit sind die 30 Sekunden weg.

LG
Michael

Antworten

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