Häufig getriggerte Programme listen

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

Moderator: Co-Administratoren

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Häufig getriggerte Programme listen

Beitrag von Xel66 » 08.09.2021, 09:32

Hmmm... Komische Inhalte? Eher nicht. In dieser Variable legt Alchys Triggerscript lediglich den Namen des Triggers eines Programms ab. Also nur Sachen, mit denen die CCU definitiv zurecht kommt. Ich benutze auch keine Sonderzeichen in Bezeichnungen. Diese Trigger lasse ich mir im Systemprotokoll hinterlegen. Ich benutze das, um in verschiedenen Programmen den Trigger zu loggen um die korrekten Funktionen zu überwachen (ich will z.B. wissen, welcher Auslöser am Abend meine Beschattung zurückgesetzt hat). Aber ja, geleert war sie vorher nicht. Aber ich habe jetzt eine neue Variable angelegt und protokolliere diese nicht. Somit habe ich kein Problem mehr damit.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Häufig getriggerte Programme listen

Beitrag von MichaelN » 08.09.2021, 10:23

schlichi hat geschrieben:
08.09.2021, 00:52
Es gibt eben gute Gründe die gegen Sonderzeichen in Objektnamen sprechen.
... und die Gründe sind vor allen Dingen die Programmierer :wink:
Ich habe deine Anregung aufgenommen und die Trennzeichen - auch für die Ausgabe - parametrisiert.
Siehe neue Version 2.3 in viewtopic.php?f=31&t=68913&p=673252#p673252
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
GoSh
Beiträge: 62
Registriert: 30.09.2019, 19:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 15 Mal
Danksagung erhalten: 3 Mal

Re: Häufig getriggerte Programme listen

Beitrag von GoSh » 18.02.2023, 23:04

Das Script von MichaelN hilft wirklich gut bei der Eingrenzung von Fehlern. Für meine Fehlersuche habe ich den Output ergänzt um Programm-ID, LastExec. Mit Testflag=true wird WriteLine für den Script-Test eingeschaltet. Einrückungen habe ich angepasst und zur besseren Lesbarkeit noch ein paar Kommentare ergänzt.

Code: Alles auswählen

! Listet alle Programme, die in den letzten x Minuten getriggert wurden V2.3b
! MichaelN https://homematic-forum.de/forum/viewtopic.php?f=31&t=68913&p=673244#p673252
! GPL-3.0-or-later
! GoSh - 19.02.2023 - Ergänzung beim Output um Programm-ID, optional mit ProgramLastExecuteTime()
integer Schwelle = 4*60; ! Hier die Anzahl x Minuten einstellen
string SVName = "Status_Prg_Exec"; ! Name der Systemvariablen (Typ Text) zum Zwischenspeichern
string Logs = "Script_Infos"; ! Name der Systemvariablen (Typ Text) zum Protokollieren
string OutputTrenner;
!OutputTrenner = "=== "; ! Wie soll die Auflistung formatiert werden? In einer Zeile
OutputTrenner = "\n";   ! Oder lieber untereinander - unerwünschtes auskommentieren
string ListTrenner ="|"; ! Zeichen zum Trennen der Listeneinträge - darf nicht mit Sonderzeichen im Programmnamen kollidieren
boolean Testflag=false; ! true/false; ! WriteLine für Script-Test
! === hier nix mehr aendern ===
string i;  string j;  string SVtemp;
object o;  object SV; object dp_obj;
string slist = ""; string output = ""; string slist_neu ="";
string PName;
integer Last;
integer Jetzt = system.Date("%F %T").ToTime().ToInteger();
integer Diff;
integer Zaehler = 0;
string j_Name; integer j_Zaehler;

if (Testflag==true) {WriteLine ("==== Programm-Ausfuehrungen am "#system.Date("%F %T").ToTime().ToString()#" :");}

! Aktuelle Programm-Ausfuehrungen ermitteln
foreach(i, dom.GetObject(ID_PROGRAMS).EnumUsedIDs())
  {
    o = dom.GetObject (ID_PROGRAMS).Get (i);
    Last = o.ProgramLastExecuteTimeSeconds();
    Diff = Jetzt - Last;
    ! Programm-Ausfuehrung innerhalb Schwelle => slist
    if ( Diff < Schwelle ) 
    {
      PName = o.Name(); 
      slist = o#ListTrenner#slist; 
      if (Testflag==true) {WriteLine (PName#" - vor "#Diff#" Sekunden");} 
    }
  }

if (Testflag==true) {WriteLine ("");}

SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SVName);

if (slist && SV)
  {
    output = "==== Häufigkeit getriggerter Programme seit "#Schwelle#" Sekunden:"#OutputTrenner#OutputTrenner;
    
    SVtemp = SV.Value();
    
    ! Aktuelle Prg.Ausführungen übertragen: slist => slist_neu
    foreach(i, slist.Split(ListTrenner))
      {
        if (!SVtemp)
        {
          ! Liste leer, neu aufbauen
          slist_neu = slist_neu#i#";1"#ListTrenner;
        }
        else
        {
          j_Zaehler = 0;
          if ( SVtemp.Contains(i) )
          {
          foreach(j, SVtemp.Split(ListTrenner))
            {
              j_Name = web.webGetValueFromList(j,0);
              j_Zaehler = web.webGetValueFromList(j,1).ToInteger();
              if (i == j_Name)
                {
                  ! Anzahl Prg.Exec + 1
                  j_Zaehler = j_Zaehler + 1;
                  slist_neu = slist_neu#j_Name#";"#j_Zaehler#ListTrenner;
                }
            }
          }
          else
          {
            ! Eintrag neu
            slist_neu = slist_neu#i#";1"#ListTrenner;
          }
        }
      }
    
    ! Fehlende Einträge ergänzen: SVtemp => slist_neu
    foreach(j, SVtemp.Split(ListTrenner))
      {
        j_Name = web.webGetValueFromList(j,0);
        j_Zaehler = web.webGetValueFromList(j,1).ToInteger();
        if ( !slist_neu.Contains(j_Name) )
        {
          ! Eintrag unverändert übernehmen
          slist_neu = slist_neu#j_Name#";"#j_Zaehler#ListTrenner;
        }
      }

    ! Alle Einträge in slist_neu => output
    foreach(j, slist_neu.Split(ListTrenner))
      {
        j_Name = web.webGetValueFromList(j,0);
        j_Zaehler = web.webGetValueFromList(j,1).ToInteger();
        dp_obj = dom.GetObject(j_Name);
        if (dp_obj)
        {
          ! dp_obj.ProgramLastExecuteTime() funktioniert zwar, führt aber seltsamerweise NUR im Log zu Fehlermeldungen:  "ReGaHss: ERROR: ScriptRuntimeError:"
          output = output#j_Zaehler#" x "#j_Name#" (ID="#dp_obj.ID()#")"#" Last="#dp_obj.ProgramLastExecuteTime()#OutputTrenner;
          ! output = output#j_Zaehler#" x "#j_Name#" (ID="#dp_obj.ID()#")"#" Last="#OutputTrenner; ! Liste erstellen ohne dp_obj.ProgramLastExecuteTime()
        }
      }

  }
    
    !WriteLine(output);
    if (Testflag==true) {WriteLine(output);}
    
    ! Ergebnis  Protokollieren in SV
    SV.State(slist_neu);
    SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(Logs);
    if (SV)	{ SV.State(output); }
    
  }
Das Ergebnis sieht dann im Script-Test mit Testflag=true; z.B. so aus:

Code: Alles auswählen

==== Programm-Ausfuehrungen am 2023-02-18 22:39:37 :
Anwesenheit - vor 56 Sekunden
Licht_Nacht_Flur - vor 56 Sekunden
Licht_Nacht_Hausflur - vor 236 Sekunden

==== Häufigkeit getriggerter Programme seit 240 Sekunden:

6 x Licht_Nacht_Treppe (ID=20383) Last=2023-02-18 22:38:41
6 x Licht_Nacht_Kellereingang (ID=8535) Last=2023-02-18 22:38:41
3 x Licht_Nacht_Hausflur (ID=21592) Last=2023-02-18 22:35:41
6 x Licht_Nacht_Flur (ID=13872) Last=2023-02-18 22:38:41
Einen Schönheitsfehler hab ich im Nachgang entdeckt, obwohl das Script fehlerfrei läuft:
dp_obj.ProgramLastExecuteTime() funktioniert zwar, führt aber seltsamerweise NUR im Log zu Fehlermeldungen:
"ReGaHss: ERROR: ScriptRuntimeError:"
Ggf. ProgramLastExecuteTime() entfernen.

Antworten

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