Vergleich mit Systemvariable / Programm-Trigger mit variablen Werten

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Vergleich mit Systemvariable / Programm-Trigger mit variablen Werten

Beitrag von MichaelN » 28.09.2022, 21:46

Bekanntermaßen kann man in der WebUI keine Bedingung nach dem Muster

Code: Alles auswählen

WENN Systemvariable_1 größer als Systemvariable_2
bilden. Genauso bekannt ist, das dies seit langem ein großer Wunsch der Community ist.

Nachdem ich die Möglichkeit über die Manipulation der Rega mit Hilfe des SDV mit gemischten Ergebnissen ausprobiert habe, hatte ich mal eine Konzeptstudie gezeigt, wie man das mit Bordmitteln machen kann. Das war aber sehr tricky und eher nicht massenkompatibel.

Henkes geniale "selbstkonfigurierenden" Skripte haben mich dann auf die Idee gebracht diesen Ansatz weiter zu verbessern.
Dabei herausgekommen ist dieses universelle Skript. Ich würde mich freuen wenn ihr das mal testet und ggf. ein Feedback gibt.

Zunächst mal hat man ein normales WebUI-Programm (hier: "wwwTest"), bei dem der Vergleich variabel sein soll.
Wichtig ist nur zu beachten, das im manipulierten Programm immer die erste Bedingung angepasst wird :!:
In dieser ersten Bedingung müssen 2 Zahlenwerte miteinander verglichen werden. Kein Wertebereich! (Geht auch, aber dann kann man nur den unteren oder oberen Wert variabel gestalten).
Siehe Beispiel: Hier wird Forecast_Temp mit 18°C verglichen. Diese 18°C sollen variabel werden.
Unbenannt.JPG
Dann legt man ein 2. WebUI Programm an. Das wichtige ist, das der Name sich zusammensetzt aus :!: "Wertemanipulation_" und dem Programmnamen des zu manipulierenden Programms :!: Hier wwwTest. Das neue Programm heißt also "Wertemanipulation_wwwTest"

Dieses Programm hat genau einen Trigger und dieser muss einen Zahlenwert liefern! Das Programm ist so zu gestalten, das es immer triggert wenn sich die Systemvariable ändert. Hier ist es die SV TempSchwelle.
Unbenannt2.JPG
Im DANN wird dieses Skript ausgeführt:

Code: Alles auswählen

! Vergleichswert eines anderen Programms anpassen
! V0.95 MichaelN https://homematic-forum.de/forum/viewtopic.php?f=18&t=68762
! GPL-3.0-or-later
!
! Das Programm mit diesem Skript muss den Namen Wertemanipulation_programmname tragen
! Es muss eine triggernde Systemvariable Typ Zahl haben, dessen Wert wird in das andere Programm eingetragen
! programmname ist der Name des Programms, das manipuliert wird
! Es wird immer die erste Bedingung manipuliert

integer iVal = 1; !Nummer des zu ändernden Werts: 1 bei größer/kleiner Bedingungen, bei Wertebereich 1 für den ersten, 2 für den zweiten Wert
real neuerWert = ("$val$").ToFloat();
integer srcId = ("$src$").ToInteger();
object oPrg = dom.GetObject("$this$");
system.Exec ("logger -t [Wertemanipulation] -p user.debug START SRC: " # srcId # " - THIS: " # "$this$" # " - VAL: " # neuerWert);

if (srcId > 0) {
    object oSrc = dom.GetObject(srcId);
    if (!oSrc) { system.Exec ("logger -t [Wertemanipulation] -p user.debug QUIT 1: SRC kein Object"); quit; };
    }
else { system.Exec ("logger -t [Wertemanipulation] -p user.debug QUIT 2: SRC kein Object"); quit; }

! Namen des Programms ermitteln, prüfen ob mit Wertemanipulation_ beginnt und den Teil dahinter ermitteln
string PrgNameBoss = oPrg.Name();
if (PrgNameBoss.StrValueByIndex("_",0) != "Wertemanipulation")  { system.Exec ("logger -t [Wertemanipulation] -p user.debug QUIT falscher Programmname"); quit; };
string PrgNameClient = PrgNameBoss.Substr(18);   ! Wertemanipulation_ wegschneiden
oPrg= dom.GetObject (ID_PROGRAMS).Get (PrgNameClient);
if (!oPrg) { system.Exec ("logger -t [Wertemanipulation] -p user.debug QUIT kein Programm-Object"); quit; };
system.Exec ("logger -t [Wertemanipulation] -p user.debug gefunden: " #PrgNameClient # " - ID: " # oPrg.ID()) ;

! Vergleichswert einer Trigger-Bedingung ändern
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); ! Single Condition

! neuen Wert zuweisen
if ( (iVal == 1) && (oSCND.RightVal1ValType() == ivtFloat) ) {
	oSCND.RightVal1(neuerWert );
} elseif ( (iVal == 2) && (oSCND.RightVal2ValType() == ivtFloat) ) {
	oSCND.RightVal2(neuerWert );
}
dom.RTUpdate (0);
system.Exec ("logger -t [Wertemanipulation] -p user.debug Programm \"" # PrgNameClient # "\" Bedingung "#iCondition#"/"#iSingle#" geändert auf "#neuerWert);

object LeftCND = dom.GetObject(oSCND.LeftVal());
if ( LeftCND.Type() == OT_VARDP )
    {
    ! Links Systemvariable? Ist-Wert um 0.000001 erhöhen, damit Trigger aktiv wird
    system.Exec ("logger -t [Wertemanipulation] -p user.debug Systemvariable gefunden: " # LeftCND.Name());
    real Wert = LeftCND.State();
    Wert = Wert + 0.000001;
    ! zulässigen Max Wert beachten
    if ( Wert > LeftCND.ValueMax() ) { Wert = Wert - 0.000002;}
    LeftCND.State(Wert);
    }
elseif ( LeftCND.Type() == OT_HSSDP )
    {
    ! Links Geräte-Datenpunkt? Ist-Wert um 0.000001 erhöhen, damit Trigger aktiv wird
    system.Exec ("logger -t [Wertemanipulation] -p user.debug Geräte-Datenpunkt gefunden: " # LeftCND.Name());
    real Wert = LeftCND.State();
    Wert = Wert + 0.000001;
    ! zulässigen Max Wert beachten
    if ( Wert > LeftCND.MetaData("MAX") ) { Wert = Wert - 0.000002;}
    LeftCND.State(Wert);
    }
system.Exec ("logger -t [Wertemanipulation] -p user.debug FINISHED");
Das Skript benötigt keine Konfiguration.


Ändert sich nun der Wert von TempSchwelle, dann wird das Programm wwwTest automatisch angepasst:
Unbenannt3.JPG

Change-Log:
V0.90 - erste Version
V0.95 - Aufruf ohne gültigen Trigger wird abgefangen; Logging ins Fehlerprotokoll
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 +++

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“