HowTo - Zeitmodule von einem Script heraus verändern

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

Moderator: Co-Administratoren

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

HowTo - Zeitmodule von einem Script heraus verändern

Beitrag von Black » 01.05.2019, 22:31

Die meisten verwenden Zeitmodule, um in einem Programm auf Zeitpunkte / Zeitspannen zu reagieren.
Diese Module sind leider unflexible wie ein betonklotz, wenn es darum geht, diese zur Laufzeit von einem anderen Programm heraus anzupassen.
(Astrooffset ist eines der möglischen Schlagworte)
Diese Zeitmodule waren und sind natürlich veränderbar. Der ehemalige User teddy278 und auch badenpower hatten damals Lösungsansätze angerissen.
Mit entsprechenden Werkzeugen lässt sich gut hinter die interne Struktur der Objekte schauen und beim Programmieren des SDV fielen da so einige Ansätz als "Nebenprodukt" ab.

Kommen wir mal dazu, wie kann man ein Zeitmodul verändern.
Zu ersteinmal müssen wir es packen können, als wir müssen das Programm, die Rule, die Condition und die Singlecondition wissen.
Ums mehr Anfängertauglich zu machen , beschränken wir uns auf zeitmodule im Ersten Anweisungsblock (die erste Rule). Ich weiss, wies auch auf den Anderen Rules geht, der SDV kann die auch greifen, ist aber dann nicht grade Anfängertauglich.

Wir postulieren also, das Zeitmodul muss in der 1. Rule sitzen.
Dann gibts noch die beiden Angaben:
RuleCondition (0) : wobei die 0 den 1. Anweisungsblock beschreibt, 1 würde den zweiten beschreiben etc.
CndSingleCondition (0): wobei die 0 den 1. Bedingung beschreibt, 1 würde die zweite beschreiben etc.

ProgramRules.jpg
Schematische darstellung

Wenn man also ein Programm hätte, wo das Zeitmodul die erste Angabe ist, ist der Greifpunkt
object oZM= oPRG.Rule().RuleCondition (0).CndSingleCondition (0);

zeitmodul simple.jpg

Mit diesen Angaben ist das Zeitmodul schon mal packbar.
Dann müssen noch die Werte angepasst werden.
Dazu gibts hier 2 Strings:
string tStart= "21:59:20";
string tEnde = "21:59:40";
Bitte den String korrekt schreiben, sonst gibts Müll bzw Scriptruntimeerror:
Ist tEnde ein Leerstring, wird das Modul als Zeitpunkt ausgeführt, gibts eine Endzeit, so wird eine Dauer berechnet.
Liegt die Endzeit unter Startzeit, so wird ein Datumssprung postuliert und intern 86400 Sekunden dazuaddiert.

Das Script, welches ein Zeitmodul verändern kann, schaut entsprechend so aus:

Code: Alles auswählen

!- Zeitmodule verändern by Black in Mai 2019
!-------------------------------------------
!- Angepasst werden muss:
!- Der ProgrammName, RuleCondition (0) = Nummer der Condition,  CndSingleCondition (0) = Nummer der SingleCondition
!- Vereinfacht, ist dies die allererste Bedingung der programms, ist der Aufruf mit 0 / 0 richtig
object oPRG= dom.GetObject (ID_PROGRAMS).Get ("Alarmtest");
if (!oPRG) {WriteLine ("Der Programmname sollte schon richtig sein, Abbruch"); quit;}
string tStart= "22:27:00";         !- <<--- StartZeit anüpassen, auf Schreibweise achten HH:MM:SS
string tEnde = "22:29:00";         !- <<--- EndZeit anüpassen, auf Schreibweise achten HH:MM:SS   Leerstring ist zeitpunkt, zeit ist Zeitspanne
object oZM= oPRG.Rule().RuleCondition (0).CndSingleCondition (0);
!- Ab hier mal Fingers weg
integer IcalDuration=0;
if (oZM.LeftValType () == ivtCurrentDate) { !- Wir sind ein Zeitmodul
   oZM = dom.GetObject (oZM.RightVal1 () );
   oZM.Time (("2007-01-01 "# tStart ).ToTime () );
   if (tEnde != "") {
       IcalDuration= (("2007-01-01 " # tEnde).ToTime ()- oZM.Time () ).ToInteger ();
       if (IcalDuration<=0) {IcalDuration= IcalDuration + 86400;}
   }
   oZM.CalDuration (IcalDuration);
   WriteLine ("Zeitmodul gesetzt");
} else { WriteLine ("WAR NIX, ich bin kein zeitmodul"); }
dom.RTUpdate (2); 
verändern lassen sich theroretisch alle Parameter des Zeitmoduls (man sollte dann aber wissen was), zum Probieren lässt sich in entsprechenden Hilfsprogrammen die Veränderung und die Reaktion analysieren.

Beispiel des Zeitmoduls aus diesem Testprogramm:

zeitmodul simple2.jpg
Zeitpunkt Zeitspanne sollte aber den üblichen meist genutzem Anwendungsfall entsprechen



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

Antworten

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