ISSUE: WEB-UI Programmtrigger nicht mehr mit Konstanten, sondern mit variablen Werten aus z.B Systemvariablen

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Antworten
Benutzeravatar
Black
Beiträge: 5471
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1071 Mal
Kontaktdaten:

ISSUE: WEB-UI Programmtrigger nicht mehr mit Konstanten, sondern mit variablen Werten aus z.B Systemvariablen

Beitrag von Black » 12.05.2019, 11:20

Bekannterweise ist es in der WebUI nur möglich, Programmauslösungen auf feste Werte hin zu überprüfen. Eine Triggerbedingung auf Variable Werte ist nicht vorgesehen in der WEBUI. nicht vorgesehen ? oder aus Zeitmangel oder was weiss ich nicht umgesetzt ? Die Frage kann man an EQ3 weiterreichen.

Interessant ist, die Rega kann mit Variablen Werten umgehen (wie einige wenige mit Sicherheit auch schon vorher wussten) Man es halt nur nicht in der WebUI programmieren.

letztlich ist der Bedingungsteil genauso aufgebaut wie der Anweisungsteil. Hier wird durch einen ValTypeVal () definiert, wie der richtige Wert Val () zu interpretieren ist. (macht das ganze im ersten Moment ein wenig komplex, ist abr halb so wild, wenn man da einmal hintergeblickt hat).
Wenn man das kennt, kann man das ganze von ausserhalb ein wenig verändern. Dazu musste ich aber ertsmal in meinem eigenen SDV die Sicherheits und Wertebereichsvorgaben für diese Methoden mal totschalten).

Man lege ein Web UI programm an, ganz primitiv:
Indirekt1.jpg

Das Script ist auch nix wildes, es schreibt nur in das systemsyslog May 12 10:11:42 homematic-ccu2 daemon.info cuxd[2304]: CUX2801001:1 TestTrigger ausgelöst mit Bedingung True wenn der wen teil erfüllt war, bzw May 12 10:11:42 homematic-ccu2 daemon.info cuxd[2304]: CUX2801001:1 TestTrigger ausgelöst mit Bedingung False, wenn der wenn teil nicht erfüllt war.

das dingen kann nun natürlich nur die testen werte 10 und 20 überwachen... immerhin etwas, aber nicht ausreichend.

wir wollen nun variable grenzen einbauen. dazu legen wir 2 systemvariablen an typ zahl hier TestGrenzeMin und testgrenzeMax

ab hier nun zur besseren übersicht und weils schneller und sicherer geht mit meinem SDV.

Als erstes brauchen wir nachher die IseIDs der beiden Systemvariablen.
IndirektSsVar.jpg

Wir merken uns: in meinem Fall hier die 10188 für die Min variable und die 10189 für die Max Variable

nun machen wir das programm im SDV auf

IndirektSsVar2.jpg
Interessant sind nun die 4 Werte ab RightVal1ValType. diejenigen, die mein programm kennen, erkennen nun hier die bedingung aus dem WebUI programm wieder, ein Vergleich (Typ 6 - von xxx bis kleine yy) mit den zahlen von 10 bis 20.

Typ 4 (ivtFloat) beschreibt den zu Interpretieren wert, also das die 10 als float zu bewerten ist.

indirekt2SCND1.jpg

Ums nun Variable zu machen, machen wir nun aus dem Typ ivt_float den Typ ivt_SystemID, welcher beschreibt, das der nachfolgende wert nicht als konstante, sondern als ID zu berwerten ist und dieser nachfolgende wert wird dan.. richtig .. die 10188, welche die Systemvariable min beschreibt.

hier ist es recht einfach möglich (den komplatten change kann immo nur meine Testversion !!)

indirekt2SCND2.jpg

und dann die ID der Systemvariablen händishc UND richtig eintragen
indirekt2SCND3.jpg

und das gleich noch mit dem MaxWert
indirekt2SCND4.jpg
Nun haben wir ein Synthetisch manipuliertes programm. In der WebUI schaut es nun so aus:

WebUI2.jpg

Wobei aber VORSICHT, die 10188 und 10189 sind nun keine Konstanten, sondern die IDs der beiden Systemvariablen, aber das programm übersteht in der mir vorliegenden raspberrymatik Version auch ein Speichern in der WebUI.

nun bisschen testen: min 10, max 50 , Triggerwert 5:
May 12 11:04:52 homematic-ccu2 daemon.info cuxd[2304]: CUX2801001:1 TestTrigger ausgelöst mit Bedingung False
wäre richtig

nun bisschen testen: min 10, max 50 , Triggerwert 20:
May 12 11:06:27 homematic-ccu2 daemon.info cuxd[2304]: CUX2801001:1 TestTrigger ausgelöst mit Bedingung True
wäre auch richtig.

nun die systemvariable max auf 15 geändert
May 12 11:09:15 homematic-ccu2 daemon.info cuxd[2304]: CUX2801001:1 TestTrigger ausgelöst mit Bedingung False
komplett richtig reagiert

Bösartigkeitstest:
Min auf 15, max auf 10, trigger auf 12:
May 12 11:09:15 homematic-ccu2 daemon.info cuxd[2304]: CUX2801001:1 TestTrigger ausgelöst mit Bedingung False
blieb immer false, ich war ja in dem fall absichtlich so blöd, limit min grösser als limit max zu setzen

Mann noch ein paar Gemeinheiten:
Systemvariable manuell gelöscht obwohl einbunden noch im Programm:
May 12 11:13:16 homematic-ccu2 local0.err ReGaHss: ERROR: invalid object for ID = 10189 [GetValData():iseCondition.cpp:693]
May 12 11:13:16 homematic-ccu2 daemon.info cuxd[2304]: CUX2801001:1 TestTrigger ausgelöst mit Bedingung False

Und:
Die so verknüpfte Systemvariable taucht nicht unter der Liste programme auf, das wäre etwas, wo Jens mal in die Codierung schauen müsste.

---


generell müsste es also gehen, die Bedingungen der Rega auch mit Variablen bereichen nutzbar zu machen.

Die Grundlegende verarbeitung funktioniert. Das automatische einhängen in die Listen noch nicht. (obs gehen würde, wenn ich sie ProrammID händisch in die DPEnumUsagePrograms gezwungen hätte weiss ich noch nicht.

Und es bräuchte einen , der die WebUi an der Stelle patchen könnte, ich kanns net und wills auch nimmer lernen. ^^ kann dafür andere Dinge,


So schönen Sonntag noch allen, Black
Dateianhänge
indirekt2SCND3.jpg
Zuletzt geändert von Black am 05.12.2020, 09:24, insgesamt 2-mal geändert.
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Benutzeravatar
jmaus
Beiträge: 9846
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 462 Mal
Danksagung erhalten: 1863 Mal
Kontaktdaten:

Re: Programmtrigger nicht mehr mit Konstanten, sondern mit Werten aus Systemvariablen

Beitrag von jmaus » 12.05.2019, 11:24

Black hat geschrieben:
12.05.2019, 11:20
generell müsste es also gehen, die Bedingungen der Rega auch mit Variablen bereichen nutzbar zu machen.

Die Grundlegende verarbeitung funktioniert. Das automatische einhängen in die Listen noch nicht. (obs gehen würde, wenn ich sie ProrammID händisch in die DPEnumUsagePrograms gezwungen hätte weiss ich noch nicht.

Und es bräuchte einen , der die WebUi an der Stelle patchen könnte, ich kanns net und wills auch nimmer lernen. ^^ kann dafür andere Dinge,
Und genau da komme ich wieder zu dem Punkt wo ich mir wünschen würde wenn du dazu ein entsprechendes "Ticket" im RaspberryMatic GitHub aufmachen würdest, dann könnte man das dort auf "Entwicklerebene" diskutieren ud dann findest sich vielleicht jemand der das dann für die WebUI umsetzt – es gab ja bereits die einen oder anderen Personen die dort etwas umgesetzt haben. Aber super das du dir das bereits prinzipiell einmal angeschaut hast und es wohl die ReGa bereits intern kann (wovon ich eigentlich auch schon ausgegangen war).
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Benutzeravatar
Black
Beiträge: 5471
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1071 Mal
Kontaktdaten:

Re: Programmtrigger nicht mehr mit Konstanten, sondern mit Werten aus Systemvariablen

Beitrag von Black » 12.05.2019, 11:30

@Jens,

dann guck du auch schon mal im Vorfeld da mit rein, wo der prizipielle Unterscheid ist, dass da so eingebundene Sstemvariablen nicht in der programmliste auftauchen... Und die Unterscheidung ivt_ObjectID hab ich auch noch nicht berücksichtigr der Einfachheit halber ^^. ist aber nicht die Welt.

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Benutzeravatar
Black
Beiträge: 5471
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1071 Mal
Kontaktdaten:

Re: Programmtrigger nicht mehr mit Konstanten, sondern mit Werten aus Systemvariablen

Beitrag von Black » 12.05.2019, 17:33

und für diejenigem die dies gerne auch selber prüfen und testen möchten...

es braucht 3 systemvariablen typ zahl und es braucht CUXd Exec, damit schreibt er ins Systemlog
TestIndirektTrigger
TestGrenzeMin
TestGrenzeMax


Der Rest sollte Selbsterklärend sein.

"ACHTUNG, DAS PROGRAMM ERZEUGT CODE, DER SO NICHT VON DER WEBUI VORGESEHEN IST ERSTMAL. ALSO BITTE IN EINEM TESTSYSTEM PROBIEREN UND / ODER VORHER BACKUP MACHEN"

Dies ist der Code für mein Testprogramm, erzeugt von meinem Backup Programm.

Code: Alles auswählen

string sPRGName= "testIndirekt";
WriteLine ("Backup/Restore CCU Programme by Black 2019");
WriteLine ("Backup erstellt vom SDV V3.08.05A LCL am 12.05.2019 17:24:33");
WriteLine ("CCU ProgrammName: \"" # sPRGName # "\"");
WriteLine ("CCU ProgrammInfo: \"Vergleich zwischen Indirekt\"");
WriteLine ("----------------------------");
!- Verwendete Kanäle
string sCHNList= "";
!- Verwendete Systemvariablen
string sSYSVARList= "TestIndirektTrigger\tTestGrenzeMin\tTestGrenzeMax";
!- Referenzierung von im Programm verwendeten HSS-Datenpunkten
!- Die Referenzierung erfolgt über den substituierten Kanal und die HSSID 
!- Ab hier bitte die Finger weg !!!
!- ----------------------------
string s= "27|0|4|1089|\t27|1|4|1089|\t27|2|4|1089|";
string sID; object oID; boolean isOK= true; boolean valid; integer idType; string  idName; string okText= "\tOK....\t"; string errText = "\tERROR.\t";
WriteLine ("Test auf Existenz referenzierter Channels");
foreach (sID,sCHNList) {oID=channels.Get(sID); if (oID) { Write (okText);} else {isOK=false; Write (errText); } WriteLine (sID);}  
WriteLine ("Test auf Existenz und Typkonsistenz referenzierter Systemvariablen");
foreach (sID,s) {
 if (sID.StrValueByIndex ("|",0).ToInteger ()==ID_SYSTEM_VARIABLES) {
   idName= sSYSVARList.StrValueByIndex ("\t", ((sID.StrValueByIndex ("|",1)).ToInteger () ));
   oID=dom.GetObject (ID_SYSTEM_VARIABLES).Get (idName); valid= false;
   if (oID) {
     valid= ((oID.Type()== sID.StrValueByIndex ("|",3).ToInteger ()) && (oID.ValueType()== sID.StrValueByIndex ("|",2).ToInteger ()));}
   if (valid) {Write (okText); } else { Write (errText); isOK=false; }
   if (sID.StrValueByIndex ("|",3).ToInteger ()==OT_VARDP) {Write("SYSVAR\t");} else {Write ("ALARM\t");}
   WriteLine (idName);
 }
}
WriteLine ("Test auf Existenz und Typkonsistenz referenzierter Geräte-Datenpunkte");
foreach (sID,s) {
 if (sID.StrValueByIndex ("|",0).ToInteger ()==ID_DATAPOINTS) {
   idName= sCHNList.StrValueByIndex ("\t", ((sID.StrValueByIndex ("|",1)).ToInteger () ));
   oID= channels.Get (idName); valid= false;
   if (oID) {
     oID= oID.DPByHssDP ((sID.StrValueByIndex ("|",4)));
     if (oID) {
       valid= ((oID.Type()== sID.StrValueByIndex ("|",3).ToInteger ()) && (oID.ValueType()== sID.StrValueByIndex ("|",2).ToInteger ()));
     }
   }
   if (valid) {Write (okText); } else { Write (errText); isOK=false; }
   WriteLine (idName #"."# (sID.StrValueByIndex ("|",4)));
 }
}
if (!isOK) {WriteLine ("Startbedingungen nicht erfüllt, Restore wird abgebrochen"); quit;}
object oPRG= dom.GetObject (ID_PROGRAMS).Get (sPRGName);
if (oPRG) {isOK= false; WriteLine ("Programm existiert schon mit dem Namen \"" # oPRG.Name () # "\" --> Abbruch"); quit;}  
oPRG= dom.CreateObject (OT_PROGRAM,sPRGName);
if (!oPRG) {WriteLine ("Programm konnte nicht angelegt werden. --> Abbruch"); quit; }
dom.GetObject (ID_PROGRAMS).Add (oPRG.ID () );
oPRG.PrgInfo ("Vergleich zwischen Indirekt");
oPRG.Active (false);
oPRG.Enabled  (true);
oPRG.Visible  (true);
oPRG.Internal (false);
object oRULE= oPRG.Rule ();
object oCND; object oSCND; object oDST; object oSDST; object oOBJ;
!-------- Rule 0
oRULE.RuleOperatorType (2);
oRULE.ElseIfFlag (true);
oCND=oRULE.RuleAddCondition(); !- Condition 0
oCND.CndOperatorType (2);
oSCND=oCND.CndAddSingle (); !- Single Condition 0
oSCND.ConditionType(6);
oSCND.ConditionType2(13);
oSCND.OperatorType(1);
oSCND.ConditionChannel(65535);
oSCND.LeftValType(19);
oSCND.LeftVal (dom.GetObject (ID_SYSTEM_VARIABLES).Get ((sSYSVARList.StrValueByIndex ("\t",0))).ID () );  !- 0. Element aus SystemvariablenListe [TestIndirektTrigger]
oSCND.RightVal1ValType(19);
oSCND.RightVal2ValType(19);
oSCND.RightVal1 (dom.GetObject (ID_SYSTEM_VARIABLES).Get ((sSYSVARList.StrValueByIndex ("\t",1))).ID () );  !- 1. Element aus SystemvariablenListe [TestGrenzeMin]
oSCND.RightVal2 (dom.GetObject (ID_SYSTEM_VARIABLES).Get ((sSYSVARList.StrValueByIndex ("\t",2))).ID () );  !- 2. Element aus SystemvariablenListe [TestGrenzeMax]
!-------- Rule Destination
oDST=oRULE.RuleDestination();
oDST.BreakOnRestart (true);
oSDST=oDST.DestAddSingle ();
oSDST.DestinationParam(20);
oSDST.DestinationValueType(20);
oSDST.DestinationChannel(65535);
oSDST.DestinationDP(65535);
oSDST.DestinationValueParamType(0);
oSDST.DestinationValue("dom.GetObject(\"CUxD.CUX2801001:1.SYSLOG\").State(\"TestTrigger ausgelöst mit Bedingung True\");\r\n");
oRULE=oRULE.RuleCreateSubRule();
!-------- Rule 1
oRULE.RuleOperatorType (2);
oRULE.ElseIfFlag (false);
!-------- Rule Destination
oDST=oRULE.RuleDestination();
oDST.BreakOnRestart (true);
oSDST=oDST.DestAddSingle ();
oSDST.DestinationParam(20);
oSDST.DestinationValueType(20);
oSDST.DestinationChannel(65535);
oSDST.DestinationDP(65535);
oSDST.DestinationValueParamType(0);
oSDST.DestinationValue("dom.GetObject(\"CUxD.CUX2801001:1.SYSLOG\").State(\"TestTrigger ausgelöst mit Bedingung False\");\r\n");
oPRG.Active (true);
dom.RTUpdate (0);
WriteLine ("Restore Programm von Program \"" # sPRGName # "\" erfolgreich durchgelaufen");

Am Ende also am Besten das Programm dann wieder löschen bzw restore zurückspielen .

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

TinkyWinky
Beiträge: 36
Registriert: 27.08.2019, 12:14
Hat sich bedankt: 18 Mal

Re: ISSUE: WEB-UI Programmtrigger nicht mehr mit Konstanten, sondern mit variablen Werten aus z.B Systemvariablen

Beitrag von TinkyWinky » 14.11.2021, 13:45

Was ist denn dabei rausgekommen? Ich wollte das gerade als Feature Request einstellen.

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

Re: ISSUE: WEB-UI Programmtrigger nicht mehr mit Konstanten, sondern mit variablen Werten aus z.B Systemvariablen

Beitrag von MichaelN » 14.11.2021, 14:41

TinkyWinky hat geschrieben:
14.11.2021, 13:45
als Feature Request einstellen
Gibt es schon:
https://github.com/jens-maus/RaspberryMatic/issues/632
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 +++

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

Re: ISSUE: WEB-UI Programmtrigger nicht mehr mit Konstanten, sondern mit variablen Werten aus z.B Systemvariablen

Beitrag von MichaelN » 28.06.2022, 08:55

Da Jens ja leider immer noch nicht die Möglichkeit in der WebUI geschaffen hat, habe ich das heute mal in meinem Produktivsystem mit Hilfe des SDV umgesetzt.

Und zwar habe ich als Vergleichswert nicht eine Systemvariable, sondern den Datenpunkt eines CUxD Device eingesetzt.
Dafür muss dann unter RightVal1ValType 19 (ivtObjectID) ausgewählt werden und die ISE-ID des Datenpunkts eingetragen werden.

Funktioniert. Mit der kleinen Einschränkung, das nur getriggert wird, wenn sich der Wert auf der linken Seite gegenüber dem Wert auf der rechten Seite ändert. D.h. wenn der linke Wert statisch bleibt und der rechte sich ändert, löst dies keinen Trigger aus!

Das ist bei meinem Anwendungsfall jetzt nicht weiter schlimm, verdeutlicht aber die Schwierigkeiten, wenn man das richtig in der WebUI umsetzen möchte.
Unbenannt2.JPG
Unbenannt.JPG
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 Zentrale (CCU / CCU2 / CCU3 / Charly)“