Seite 1 von 1

HowTo - Zeitmodule von einem Script heraus verändern

Verfasst: 01.05.2019, 22:31
von Black
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