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
Häufig getriggerte Programme listen
Moderator: Co-Administratoren
-
- 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
-------------------------------------------------------------------------------------------
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
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
-
- 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
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 +++
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 +++
- 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
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.
Das Ergebnis sieht dann im Script-Test mit Testflag=true; z.B. so aus:
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.
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); }
}
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
dp_obj.ProgramLastExecuteTime() funktioniert zwar, führt aber seltsamerweise NUR im Log zu Fehlermeldungen:
"ReGaHss: ERROR: ScriptRuntimeError:"
Ggf. ProgramLastExecuteTime() entfernen.