Der SDV beherrschte den Umgang mt den OT_CALENDARDP Objekten schon seit langem, für die schnellen Überblick und Analyse verfügt de SDV auch für die Hint Funktionalität, welche das Methodengemenge in eine schnell menschenlesbare Form umwandelt.
Durch Erweiterungen der Rega durch Jens sind Offsetmöglichkeiten der Astrofunktionen hinzugekommen, so dass ich, auch auf Bitte aus dem Forum, die vom SDV verwendete Auswertemethodiken hier als reines HM Script veröffentliche. Teile davon lagen nur als Pascal Quelltext vor (der SDV arbeitet bekanntlich mit RAW Daten, die dann unter Hochsprache aufgearbeitet werden), so dass für dieses Script hier noch einige Teile von Pascal nach HMScript übersetzt werden mussten
Die Version hier kann auch Filtern:
heisst es lässt sich Programmname - Nur die Zeitmodule eine Programmes werden dargestellt
Timertype: nur zeitmodule it bestimmten Eigenschaften werden dargestellt
Der Filter zwischen den zeilen 15 bis 29 sollte eigentlcih fast sebsterklärend sein aund auch recht einfach erweiterbar (z.B. Filtern nach Nächsten Auslösezeitpunkten innerhalb der nächsten 24 Sunden etc)
Code: Alles auswählen
!- Darstellung der in der Regadom verwendeten Zeitmodulen
!- By Black 2019/2020
!- SDV-Version für Homematik Forum umgeschrieben von Freepascal in HMScript
!- Publiziert: Homematic Forum : https://homematic-forum.de/forum/viewtopic.php?f=31&t=60462
!- ------------------------------------------------------------------------
!--------------------------------------------------------------------------
string SearchProg= ""; !- Leerstring = kein Filtern nach Name
integer iTimertype= -1; !- -1 Keinfiltern nach Typ
!--------------------------------------------------------------------------
string sCal; string sLine; time tSunrise; time tSunset; integer iDauer; string sWeekday;
string sMonat="!!undefiniert!!;Januar;Februar;März;April;Mai;Jni;Juli;August;September;Oktober;November;Dezember";
object eCal= dom.CreateObject (OT_ENUM,"SDVbyBlack");
foreach (sCal,dom.GetObject(ID_CALENDARDPS).EnumIDs() ) {
object oCal = dom.GetObject(sCal);
if (oCal) {
if (oCal.Type() == OT_CALENDARDP) {
boolean isIn= true;
if (SearchProg!="") {
object oPRG = dom.GetObject(oCal.DPEnumUsagePrograms());
if (oPRG) {if (oPRG.Name()!= SearchProg) {isIn= false; }}
}
if ((iTimertype!=-1) && (oCal.TimerType() != iTimertype)) {isIn= false; }
if (isIn) {eCal.Add (sCal);}
}
}
}
foreach(sCal,eCal.EnumIDs() ) {
oCal = dom.GetObject(sCal);
if (oCal) {
if (oCal.Type() == OT_CALENDARDP) {
oPRG = dom.GetObject(oCal.DPEnumUsagePrograms());
sLine= "Zeitmodul ["#oCal.ID()#"] ";
if (oCal.DPEnumUsagePrograms()) {
sLine=sLine # "aus Programm \""# oPRG.Name()#"\"";
if (!oPRG.Active()) {sLine=sLine # " - Programm nicht aktiv"; }
} else {sLine=sLine# "Ungültige Programmreferenz des Zeitmodules !!ERROR!!";}
WriteLine (sLine);
if (!oCal.Enabled()) {WriteLine ("Das Zeitmodul ist Disabled\n"); }
!- Aufdröseln nach den TimerTypen
if (oCal.TimerType()==ttPeriodic) {
WriteLine ("Zeitinterval:\n - alle "# oCal.Period ()# " Sekunden");
} else {
!- WochentagString berechnen
sWeekday="";
integer iWeekday=oCal.Weekdays();
if (iWeekday&1) {sWeekday=sWeekday#",Montag";}
if (iWeekday&2) {sWeekday=sWeekday#",Dienstag";}
if (iWeekday&4) {sWeekday=sWeekday#",Mittwoch";}
if (iWeekday&8) {sWeekday=sWeekday#",Donnerstag";}
if (iWeekday&16) {sWeekday=sWeekday#",Freitag";}
if (iWeekday&32) {sWeekday=sWeekday#",Samstag";}
if (iWeekday&64) {sWeekday=sWeekday#",Sonntag";}
sWeekday=sWeekday.LTrim (",");
if (sWeekday=="") {sWeekday="!! undefiniert !!";}
sLine= "Auslösezeitpunkt\n - ";
if (oCal.SunOffsetType()==sotNone) {
if ((oCal.TimeSeconds()==0) && (oCal.CalDuration()==0)) {sLine=sLine#"ganztägig";}
elseif (oCal.CalDuration()==0) {sLine=sLine#"Zeitpunkt um "#oCal.Time().ToString ("%T");}
else {sLine=sLine#"Zeitspanne von "#oCal.Time ().ToString ("%T")# " bis " # (oCal.Time()+oCal.CalDuration()).ToString ("%T")# " - (Dauer: "# (oCal.CalDuration()/60) # " min)";}
} elseif (oCal.SunOffsetType()==sotBeforeSunrise) {
tSunrise= system.SunriseTime().ToTime ()-oCal.TimeSeconds();
tSunset = system.SunsetTime().ToTime ();
if (oCal.CalDuration()!=0) {tSunset=tSunrise+ oCal.CalDuration(); }
sLine=sLine# "Zeitspanne von ";
if (oCal.TimeSeconds()!=0) { sLine=sLine # (oCal.TimeSeconds()/60) # " Minuten vor ";}
sLine=sLine#"Sonnenaufgang";
if (oCal.CalDuration()!=0) { sLine=sLine # " für " # (oCal.CalDuration()/60) # " Minuten";} else {sLine=sLine#" bis Sonnenuntergang";}
sLine=sLine# "\n Aktuell von " # tSunrise.ToString ("%T") # " bis " # tSunset.ToString ("%T") # " - (Dauer: "# ((tSunset-tSunrise).ToInteger() /60) # " min)";
} elseif (oCal.SunOffsetType()==sotAfterSunrise) {
tSunrise= system.SunriseTime().ToTime ()+oCal.TimeSeconds();
tSunset = system.SunsetTime().ToTime ();
if (oCal.CalDuration()!=0) {tSunset=tSunrise+ oCal.CalDuration(); iDauer= oCal.CalDuration(); } else {iDauer= (tSunset-tSunrise).ToInteger(); }
sLine=sLine# "Zeitspanne von ";
if ((oCal.CalDuration()==0) && (oCal.TimeSeconds()==0)) {sLine=sLine#"Astro tagsüber";}
else {
if (oCal.TimeSeconds()!=0) { sLine=sLine # (oCal.TimeSeconds()/60) # " Minuten nach ";}
sLine=sLine#"Sonnenaufgang";
if (oCal.CalDuration()!=0) { sLine=sLine # " für " # (oCal.CalDuration()/60) # " Minuten";} else {sLine=sLine#" bis Sonnenuntergang";}
}
sLine=sLine# "\n Aktuell von " # tSunrise.ToString ("%T") # " bis " # tSunset.ToString ("%T") # " - (Dauer: " # (iDauer/60) # " min)";
} elseif (oCal.SunOffsetType()==sotBeforeSunset) {
tSunset= system.SunsetTime().ToTime ()-oCal.TimeSeconds();
tSunrise = system.SunriseTime().ToTime ();
if (oCal.CalDuration()!=0) {tSunrise=tSunset+ oCal.CalDuration(); iDauer= oCal.CalDuration(); } else { iDauer=86400+(tSunrise-tSunset).ToInteger();}
sLine=sLine# "Zeitspanne von ";
if (oCal.TimeSeconds()!=0) { sLine=sLine # (oCal.TimeSeconds()/60) # " Minuten vor ";}
sLine=sLine#"Sonnenuntergang";
if (oCal.CalDuration()!=0) { sLine=sLine # " für " # (oCal.CalDuration()/60) # " Minuten";} else {sLine=sLine#" bis Sonnenaufgang";}
sLine=sLine# "\n Aktuell von " # tSunset.ToString ("%T") # " bis " # tSunrise.ToString ("%T") # " - (Dauer: "# (iDauer/60) # " min)";
} elseif (oCal.SunOffsetType()==sotAfterSunset) {
tSunset= system.SunsetTime().ToTime ()+oCal.TimeSeconds();
tSunrise = system.SunriseTime().ToTime ();
if (oCal.CalDuration()!=0) {tSunrise=tSunset+ oCal.CalDuration(); iDauer= oCal.CalDuration(); } else { iDauer=86400+(tSunrise-tSunset).ToInteger();}
sLine=sLine# "Zeitspanne von ";
if ((oCal.CalDuration()==0) && (oCal.TimeSeconds()==0)) {sLine=sLine#"Astro nachts";}
else {
if (oCal.TimeSeconds()!=0) { sLine=sLine # (oCal.TimeSeconds()/60) # " Minuten nach ";}
sLine=sLine#"Sonnenuntergang";
if (oCal.CalDuration()!=0) { sLine=sLine # " für " # (oCal.CalDuration()/60) # " Minuten";} else {sLine=sLine#" bis Sonnenaufgang";}
}
sLine=sLine# "\n Aktuell von " # tSunset.ToString ("%T") # " bis " # tSunrise.ToString ("%T") # " - (Dauer: "# (iDauer/60) # " min)";
}
WriteLine (sLine);
} !- ende TimerType()
Write ("Serienmuster\n - ");
!- Timertype bzw Zeitspannen aufdröseln
if (oCal.TimerType()==ttCalOnce) {
WriteLine ("einmalig am " # oCal.CalRepeatTime ().ToString ("%d.%m.%Y"));
} elseif (oCal.TimerType()==ttCalDaily) {
Write ("täglich - ");
if ((oCal.Weekdays()==0) && (oCal.CalRepetitionValue()==0)) {WriteLine ("jeden Tag");}
elseif (oCal.Weekdays()==96) {WriteLine ("am Wochenende (Sa+So)");}
elseif (oCal.Weekdays()==31) {WriteLine ("Werktags (Mo-Fr)");}
else {WriteLine ("alle " # oCal.CalRepetitionValue() # " Tage");}
} elseif (oCal.TimerType()==ttCalWeekly) {
Write ("wöchentlich - ");
if (oCal.CalRepetitionValue()==0) {WriteLine ("jede Woche jeweils am " # sWeekday);}
else {WriteLine ("alle " # oCal.CalRepetitionValue() # " Wochen jeweils am " # sWeekday);}
} elseif (oCal.TimerType()==ttCalMonthly) {
Write ("monatlich - ");
if (oCal.Weekdays()==0) {WriteLine ("jeweils am " # oCal.Period() # ". Tag jedes " # oCal.CalRepetitionValue() # ". Monats");}
else {WriteLine ("jeweils am " # oCal.Period() # ". " # sWeekday # " jedes " # oCal.CalRepetitionValue() # ". Monats");}
} elseif (oCal.TimerType()==ttCalYearly) {
Write ("jährlich - ");
if (oCal.Weekdays()==0) {WriteLine ("jeweils am " # oCal.Period() # ". " # web.webGetValueFromList (sMonat,oCal.CalRepetitionValue() ));}
else {WriteLine ("jeweils am " # oCal.Period() # ". " # sWeekday # " im " # web.webGetValueFromList (sMonat,oCal.CalRepetitionValue() ));}
}
!- Ende vom Type Gültigkeitsdauer
Write (" - Gültigkeitsdauer: ");
if ((oCal.EndSeconds()==0) && (oCal.CalRepetitionCount()==0)) {WriteLine (" ohne Enddatum");}
elseif (oCal.EndSeconds()!=0) {WriteLine (" bis zum " # oCal.End().ToString ("%d.%m.%Y"));}
else {WriteLine (" nach "# oCal.CalRepetitionCount()# " Terminen");}
!- Nächster Auslösezeitpunkt
Write ("Nächster Auslösezeitpunkt: ");
if (oCal.Next()) {WriteLine (oCal.Next ().ToString ("%d.%m.%Y %T"));} else {WriteLine (" !! unbekannt !!");}
}
WriteLine ("----------------------------------------------------");
}}
dom.DeleteObject (eCal);