Zeitmoduleinträge auslesen aufarbeiten und ausgeben

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

Moderator: Co-Administratoren

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Zeitmoduleinträge auslesen aufarbeiten und ausgeben

Beitrag von alchy » 08.08.2020, 21:39

Zeitmodule sind für die CCU ein wichtiger Trigger.
Für den ein oder anderen ist es vielleicht hilfreich, sich die Zeitmoduleinträge auf seiner CCU anzuschauen zu können.

Das unten stehende Script erzeugt eine Liste mit Zeitmodulen und die Zuordnung zu einem Programm und vieles mehr.

Zum Testen einfach per Copy & Paste in einen geeigneten Editor kopieren und ausführen.

Alchy

Code: Alles auswählen

! Zeitmoduleinträge auslesen aufarbeiten und ausgeben
! v0.3 (c) by Alchy
! https://homematic-forum.de/forum/viewtopic.php?f=31&t=60258
string sItemId; string slist;
foreach(sItemId,dom.GetObject(ID_CALENDARDPS).EnumIDs() ) {
var oObj = dom.GetObject(sItemId);
      if (oObj) {
          if (oObj.Type() == OT_CALENDARDP) {
            var oObjProg = dom.GetObject(oObj.DPEnumUsagePrograms());
            slist = slist#" \n\n Zeitmoduleintrag ID: " # oObj.ID() #" aus Programm: "#oObjProg.Name() #" - Programm aktiv: "#oObjProg.Active() #"\n\t";
            if (oObj.SunOffsetType() == sotNone) {
              if ( (oObj.CalDuration() == 0) && (oObj.Time() == 0) ) { slist = slist # " Zeit: ganztägig"; }
              else {
                if (oObj.CalDuration() != 0) {
                  slist = slist# " Zeit: Zeitspanne: "#oObj.Time().ToString("%H:%M Uhr") #" bis "#(oObj.Time()+oObj.CalDuration()).ToString("%H:%M Uhr") #" (Dauer: " # oObj.CalDuration() #" Sekunden)";
                }else {
                  slist = slist #" Zeit: Zeitpunkt: " #oObj.Time().ToString("%H:%M Uhr");
                }
              }
            }
            else {
              if (oObj.SunOffsetType() == sotAfterSunrise) { slist = slist# " Zeit: Zeitspanne: Tagsüber";}
              if (oObj.SunOffsetType() == sotAfterSunset) { slist = slist #" Zeit: Zeitspanne: Nachtsüber";}
            }

            string sCalRep = oObj.CalRepeatTime();
            integer iPeriod = oObj.Period();
            integer iRepVal = oObj.CalRepetitionValue();
            integer iWdays = oObj.Weekdays();
            integer iType = oObj.TimerType();

            if (iType == ttCalOnce) {  slist = slist# "\n\t Serienmuster: einmalig am " # sCalRep;}
            if (iType == ttPeriodic) {
              slist = slist# "\n\t Serienmuster: Zeitintervall"; integer iSelIdx = 0; string sVal = "";
              sVal = iPeriod;
              if ( (iPeriod / (3600)) > 0)
              {
                if( (iPeriod % 3600) == 0 ){sVal = iPeriod / (3600); iSelIdx = 0; }
                else {
                  if( (iPeriod % 60) == 0 )
                  { sVal = iPeriod / (60); iSelIdx = 1;
                  } else
                  { sVal = iPeriod; iSelIdx = 2;
                  }
                }
              }
              else
              {
                if ( (iPeriod / 60) > 0)
                {
                  if( (iPeriod % 60) == 0 )
                  {
                    sVal = iPeriod / (60);
                    iSelIdx = 1;
                  }
                  else
                  {
                    sVal = iPeriod;
                    iSelIdx = 2;
                  }
                }
                else
                {
                  sVal = iPeriod;
                  iSelIdx = 2;
                }
              }
              slist = slist# " alle " # sVal # " ";
              if (iSelIdx == 0) { slist = slist# " Stunden ";}
              if (iSelIdx == 1) { slist = slist# " Minuten ";}
              if (iSelIdx == 2) { slist = slist# " Sekunden ";}
            }
            if (iType == ttCalDaily) {
              slist = slist# "\n\t Serienmuster: täglich";
              if (iRepVal != 0) { slist = slist# " - alle " # iRepVal #" Tage "; }
              if (iWdays != 0) {
              if (iWdays == 96) { slist = slist# ", an Wochenenden "; }
                else { slist = slist# ", werktags "; }
              }
              if ((iRepVal == 0) && (iWdays == 0)) { slist = slist# ", jeden Tag";}
            }
            if (iType == ttCalWeekly) {
              slist = slist# "\n\t Serienmuster: wöchentlich";
              if (iRepVal != 0) {
                slist = slist# ", alle " # iRepVal # " Wochen am ";
              } else { slist = slist# " - jede Woche am "; }
              if ( (iWdays & 1) != 0) { slist = slist#" Montag"; }
              if ( (iWdays & 2) != 0) { slist = slist#" Dienstag"; }
              if ( (iWdays & 4) != 0) { slist = slist#" Mittwoch"; }
              if ( (iWdays & 8) != 0) { slist = slist#" Donnerstag"; }
              if ( (iWdays & 16) != 0) { slist = slist# " Freitag"; }
              if ( (iWdays & 32) != 0) { slist = slist# " Samstag"; }
              if ( (iWdays & 64) != 0) { slist = slist# " Sonntag"; }
            }
            if (iType == ttCalMonthly) {
              slist = slist# "\n\t Serienmuster: monatlich ";
              if (iWdays == 0) { slist = slist# " am "#iPeriod#". Tag jedes "#iRepVal#". Monats";
              }else {
               slist = slist# " am "#iPeriod#". ";
                integer iSelIdx = 0;
                 if ( (iWdays & 1) != 0) { slist = slist# " Montag"; }
                 if ( (iWdays & 2) != 0) { slist = slist# " Dienstag"; }
                 if ( (iWdays & 4) != 0) { slist = slist# " Mittwoch"; }
                 if ( (iWdays & 8) != 0) { slist = slist# " Donnerstag"; }
                 if ( (iWdays & 16) != 0) { slist = slist# " Freitag"; }
                 if ( (iWdays & 32) != 0) { slist = slist# " Samstag"; }
                 if ( (iWdays & 64) != 0) { slist = slist# " Sonntag"; }
                slist = slist# " jedes "#iRepVal#". Monats";
              }
            }
            if (iType == ttCalYearly) {
              slist = slist# "\n\t Serienmuster: jährlich ";
              if (iWdays == 0) {
                slist = slist# "am "#iPeriod#"."#iRepVal#".";
              }else {
               slist = slist# "am "#iPeriod#". ";
                if ( (iWdays & 1) != 0) { slist = slist# " Montag"; }
                 if ( (iWdays & 2) != 0) { slist = slist# " Dienstag"; }
                 if ( (iWdays & 4) != 0) { slist = slist# " Mittwoch"; }
                 if ( (iWdays & 8) != 0) { slist = slist# " Donnerstag"; }
                 if ( (iWdays & 16) != 0) { slist = slist# " Freitag"; }
                 if ( (iWdays & 32) != 0) { slist = slist# " Samstag"; }
                 if ( (iWdays & 64) != 0) { slist = slist# " Sonntag"; }
                 slist = slist# " im Monat "#iRepVal;
               }
            }
            time sBegin; time sEnd;
            sBegin = oObj.Begin();
            sEnd = oObj.End();
            integer iCalCount = oObj.CalRepetitionCount();
            slist = slist# "\n\t Gültigkeitsdauer: "#sBegin.ToString("%d.%m.%y") ;

            !--- um den local0.err ReGaHss bei oObj.Next() zu vermeiden nur aktive Programme scannen
            if (oObjProg.Active()==true)
            {
              if ( (iCalCount == 0) && (oObj.EndSeconds() == 0) )
              {
                slist = slist# " - kein Enddatum - nächste Auslösung am: "#oObj.Next().ToString("%d.%m.%y %H:%M Uhr");
              }
              else
              {
                if (iCalCount == 0)
                {
                  slist = slist# " - endet am "#sEnd.ToString("%d.%m.%y") #" - nächste Auslösung am: "#oObj.Next().ToString("%d.%m.%y %H:%M Uhr");
                }
                else
                {
                  slist = slist# " - endet nach "#iCalCount#" Terminen - nächste Auslösung am: "#oObj.Next().ToString("%d.%m.%y %H:%M Uhr");
                }
              }
            }
        }
}}
WriteLine(slist);
Zuletzt geändert von alchy am 09.08.2020, 00:08, insgesamt 1-mal geändert.

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Bari-Home
Beiträge: 5
Registriert: 07.07.2014, 10:55
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wesel

Re: Zeitmoduleinträge auslesen aufarbeiten und ausgeben

Beitrag von Bari-Home » 12.08.2020, 09:08

Danke für dein Script!

Nette Idee, damit bekomme ich schnell einen Überblick über die verwendeten Zeitmodule.

Gruß

Benutzeravatar
Baxxy
Beiträge: 10779
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 604 Mal
Danksagung erhalten: 2205 Mal

Re: Zeitmoduleinträge auslesen aufarbeiten und ausgeben

Beitrag von Baxxy » 21.08.2020, 08:09

Wie immer ein super nützliches Script von Dir!
Im "Script testen" funktioniert es problemlos, wirft aber auf meinem System (RaspberryMatic 3.51.6.20200621) bei jeder Ausführung folgenden Fehler ins Systemprotokoll:

Code: Alles auswählen

Aug 21 07:55:12 Test-CCU-RaspiMatic-Pi4B local0.err ReGaHss: ERROR: interface pointer are not initialized [GetNextTimer():iseDOMdpCal.cpp:99]

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

Re: Zeitmoduleinträge auslesen aufarbeiten und ausgeben

Beitrag von MichaelN » 21.08.2020, 09:07

Interessant. Auf der CCU 3.51.6 wirft es keinen Fehler.
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 +++

Benutzeravatar
Baxxy
Beiträge: 10779
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 604 Mal
Danksagung erhalten: 2205 Mal

Re: Zeitmoduleinträge auslesen aufarbeiten und ausgeben

Beitrag von Baxxy » 21.08.2020, 09:16

MichaelN hat geschrieben:
21.08.2020, 09:07
Auf der CCU 3.51.6 wirft es keinen Fehler.
Ah ok, danke für die Info.
Black deutete im SDV-Thread schon an das es mit den neuen Astro-Offset Funktionen des Zeitmoduls in RM zu tun haben könnte.

Benutzeravatar
Baxxy
Beiträge: 10779
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 604 Mal
Danksagung erhalten: 2205 Mal

Re: Zeitmoduleinträge auslesen aufarbeiten und ausgeben

Beitrag von Baxxy » 21.08.2020, 19:29

Kleines Update:
Black und ich haben das im SDV Thread analysiert.
Der Fehler im Log wird ausgegeben wenn das Zeitmodul in einem inaktiven Programm steckt und nach Zentralenneustart dementsprechend nie ausgeführt wurde. Und bevor jetzt wieder über RaspberryMatic "gemeckert" wird... bei einer CCU3 (3.53.26) tritt das genauso auf.

NickHM
Beiträge: 3733
Registriert: 23.09.2017, 12:04
Hat sich bedankt: 66 Mal
Danksagung erhalten: 120 Mal

Re: Zeitmoduleinträge auslesen aufarbeiten und ausgeben

Beitrag von NickHM » 21.08.2020, 20:07

Sehr schönes Script.
Danke

ottokar200
Beiträge: 36
Registriert: 29.11.2018, 14:44
Hat sich bedankt: 10 Mal

Re: Zeitmoduleinträge auslesen aufarbeiten und ausgeben

Beitrag von ottokar200 » 15.11.2020, 13:57

hier mal eine Version (Anpassung), um den local0.err ReGaHss bei oObj.Next() zu vermeiden.
Die Anpassung ist im letzten Abschnitt des Scriptes, siehe Kommentar im Script.

Code: Alles auswählen

! Zeitmoduleinträge auslesen aufarbeiten und ausgeben
! v0.2 (c) by Alchy
! https://homematic-forum.de/forum/viewtopic.php?f=31&t=60258
string sItemId; string slist;
foreach(sItemId,dom.GetObject(ID_CALENDARDPS).EnumIDs() ) {
var oObj = dom.GetObject(sItemId);
      if (oObj) {
          if (oObj.Type() == OT_CALENDARDP) {
            var oObjProg = dom.GetObject(oObj.DPEnumUsagePrograms());
            slist = slist#" \n\n Zeitmoduleintrag ID: " # oObj.ID() #" aus Programm: "#oObjProg.Name() #" - Programm aktiv: "#oObjProg.Active() #"\n\t";
            if (oObj.SunOffsetType() == sotNone) {
              if ( (oObj.CalDuration() == 0) && (oObj.Time() == 0) ) { slist = slist # " Zeit: ganztägig"; }
              else {
                if (oObj.CalDuration() != 0) {
                  slist = slist# " Zeit: Zeitspanne: "#oObj.Time().ToString("%H:%M Uhr") #" bis "#(oObj.Time()+oObj.CalDuration()).ToString("%H:%M Uhr") #" (Dauer: " # oObj.CalDuration() #" Sekunden)";
                }else {
                  slist = slist #" Zeit: Zeitpunkt: " #oObj.Time().ToString("%H:%M Uhr");
                }
              }
            }
            else {
              if (oObj.SunOffsetType() == sotAfterSunrise) { slist = slist# " Zeit: Zeitspanne: Tagsüber";}
              if (oObj.SunOffsetType() == sotAfterSunset) { slist = slist #" Zeit: Zeitspanne: Nachtsüber";}
            }

            string sCalRep = oObj.CalRepeatTime();
            integer iPeriod = oObj.Period();
            integer iRepVal = oObj.CalRepetitionValue();
            integer iWdays = oObj.Weekdays();
            integer iType = oObj.TimerType();

            if (iType == ttCalOnce) {  slist = slist# "\n\t Serienmuster: einmalig am " # sCalRep;}
            if (iType == ttPeriodic) {
              slist = slist# "\n\t Serienmuster: Zeitintervall"; integer iSelIdx = 0; string sVal = "";
              sVal = iPeriod;
              if ( (iPeriod / (3600)) > 0)
              {
                if( (iPeriod % 3600) == 0 ){sVal = iPeriod / (3600); iSelIdx = 0; }
                else {
                  if( (iPeriod % 60) == 0 )
                  { sVal = iPeriod / (60); iSelIdx = 1;
                  } else
                  { sVal = iPeriod; iSelIdx = 2;
                  }
                }
              }
              else
              {
                if ( (iPeriod / 60) > 0)
                {
                  if( (iPeriod % 60) == 0 )
                  {
                    sVal = iPeriod / (60);
                    iSelIdx = 1;
                  }
                  else
                  {
                    sVal = iPeriod;
                    iSelIdx = 2;
                  }
                }
                else
                {
                  sVal = iPeriod;
                  iSelIdx = 2;
                }
              }
              slist = slist# " alle " # sVal # " ";
              if (iSelIdx == 0) { slist = slist# " Stunden ";}
              if (iSelIdx == 1) { slist = slist# " Minuten ";}
              if (iSelIdx == 2) { slist = slist# " Sekunden ";}
            }
            if (iType == ttCalDaily) {
              slist = slist# "\n\t Serienmuster: täglich";
              if (iRepVal != 0) { slist = slist# " - alle " # iRepVal #" Tage "; }
              if (iWdays != 0) {
              if (iWdays == 96) { slist = slist# ", an Wochenenden "; }
                else { slist = slist# ", werktags "; }
              }
              if ((iRepVal == 0) && (iWdays == 0)) { slist = slist# ", jeden Tag";}
            }
            if (iType == ttCalWeekly) {
              slist = slist# "\n\t Serienmuster: wöchentlich";
              if (iRepVal != 0) {
                slist = slist# ", alle " # iRepVal # " Wochen am ";
              } else { slist = slist# " - jede Woche am "; }
              if ( (iWdays & 1) != 0) { slist = slist#" Montag"; }
              if ( (iWdays & 2) != 0) { slist = slist#" Dienstag"; }
              if ( (iWdays & 4) != 0) { slist = slist#" Mittwoch"; }
              if ( (iWdays & 8) != 0) { slist = slist#" Donnerstag"; }
              if ( (iWdays & 16) != 0) { slist = slist# " Freitag"; }
              if ( (iWdays & 32) != 0) { slist = slist# " Samstag"; }
              if ( (iWdays & 64) != 0) { slist = slist# " Sonntag"; }
            }
            if (iType == ttCalMonthly) {
              slist = slist# "\n\t Serienmuster: monatlich ";
              if (iWdays == 0) { slist = slist# " am "#iPeriod#". Tag jedes "#iRepVal#". Monats";
              }else {
               slist = slist# " am "#iPeriod#". ";
                integer iSelIdx = 0;
                 if ( (iWdays & 1) != 0) { slist = slist# " Montag"; }
                 if ( (iWdays & 2) != 0) { slist = slist# " Dienstag"; }
                 if ( (iWdays & 4) != 0) { slist = slist# " Mittwoch"; }
                 if ( (iWdays & 8) != 0) { slist = slist# " Donnerstag"; }
                 if ( (iWdays & 16) != 0) { slist = slist# " Freitag"; }
                 if ( (iWdays & 32) != 0) { slist = slist# " Samstag"; }
                 if ( (iWdays & 64) != 0) { slist = slist# " Sonntag"; }
                slist = slist# " jedes "#iRepVal#". Monats";
              }
            }
            if (iType == ttCalYearly) {
              slist = slist# "\n\t Serienmuster: jährlich ";
              if (iWdays == 0) {
                slist = slist# "am "#iPeriod#"."#iRepVal#".";
              }else {
               slist = slist# "am "#iPeriod#". ";
                if ( (iWdays & 1) != 0) { slist = slist# " Montag"; }
                 if ( (iWdays & 2) != 0) { slist = slist# " Dienstag"; }
                 if ( (iWdays & 4) != 0) { slist = slist# " Mittwoch"; }
                 if ( (iWdays & 8) != 0) { slist = slist# " Donnerstag"; }
                 if ( (iWdays & 16) != 0) { slist = slist# " Freitag"; }
                 if ( (iWdays & 32) != 0) { slist = slist# " Samstag"; }
                 if ( (iWdays & 64) != 0) { slist = slist# " Sonntag"; }
                 slist = slist# " im Monat "#iRepVal;
               }
            }
            time sBegin; time sEnd;
            sBegin = oObj.Begin();
            sEnd = oObj.End();
            integer iCalCount = oObj.CalRepetitionCount();
            slist = slist# "\n\t Gültigkeitsdauer: "#sBegin.ToString("%d.%m.%y") ;

            !--- um den local0.err ReGaHss bei oObj.Next() zu vermeiden nur aktive Programme scannen
            if (oObjProg.Active()==true)
            {
              if ( (iCalCount == 0) && (oObj.EndSeconds() == 0) )
              {
                slist = slist# " - kein Enddatum - nächste Auslösung am: "#oObj.Next().ToString("%d.%m.%y %H:%M Uhr");
              }
              else
              {
                if (iCalCount == 0)
                {
                  slist = slist# " - endet am "#sEnd.ToString("%d.%m.%y") #" - nächste Auslösung am: "#oObj.Next().ToString("%d.%m.%y %H:%M Uhr");
                }
                else
                {
                  slist = slist# " - endet nach "#iCalCount#" Terminen - nächste Auslösung am: "#oObj.Next().ToString("%d.%m.%y %H:%M Uhr");
                }
              }
            }
        }
}}
WriteLine(slist);
Gruß ottokar200
_______________________________
RaspberryMatic mit Groundplane-Antenne / 57 Geräte

JKDuck
Beiträge: 59
Registriert: 16.05.2019, 12:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 3 Mal

Re: Zeitmoduleinträge auslesen aufarbeiten und ausgeben

Beitrag von JKDuck » 28.07.2023, 18:27

alchy hat geschrieben:
08.08.2020, 21:39
Zum Testen einfach per Copy & Paste in einen geeigneten Editor kopieren und ausführen.
Darf ich fragen, welcher das z.B. sein könnte?
Besten Dank!
Newbee mit Ambition, alles selber zu verstehen 8)
CCU 3 mit
1 xHmIP-ASIR-O - Außensirene
9 x HmIP-SWSD - Rauchwarnmelder
3 x HmIP-SWD - Wassermelder
14 x HmIP-BWTH - Termostat und Luftfeuchtigkeitsmesser zur Steuerung der Fußbodenheizung)
1 x HmIP-SWO-B - Wind- und Helligkeitsmessung
1 x HM-Sen-RD-O - Regensensor
23 x HMIP-SWDO - Fensterkontakt -zur Steuerung der FB-Heizung - "aus" bei geöffentem Fenster
11 x HmIP-SRH - Türgriffstellungssensor - zur Steuerung der FB-Heizung - "aus" bei geöffenter Tür und der Rolladen (nicht schließen wenn göffnet))
8 x HmIP-BROLL - zur Rolladen- oder Marksinsteuerung
12 x HmIP-FROLL - zur Rolladen- oder Marksinsteuerung
Programm zur Meldung von Wasserausstritt per E-Mail,
Programme zum Einfahren von Markisen bei Regen und/oder Wind
Programme zum Herabfahren von Rolläden mit Aussperrschutz


Antworten

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