Zeitmodule filtern, auflisten und aufbereiten - SDV V4 Hint-Version mit Berücksichtigung der Astro-Offsets

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

Moderator: Co-Administratoren

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

Zeitmodule filtern, auflisten und aufbereiten - SDV V4 Hint-Version mit Berücksichtigung der Astro-Offsets

Beitrag von Black » 21.08.2020, 14:13

Zeitmodule sind (normalerweise) eine häufig genutze Art, Programme zu triggern bzw Zeitbereiche zu überprüfen. Leider sind die Zeitmodule nicht direkt über die WebUi zugänglich, so das Auswertung und Analsyse entweder über Scripts oder mit Externen Programmen wie z.B. dem SDV gemacht werden müssen.

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.
Zeitmodul.png
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
ZM1.JPG

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);
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!“