Häufig getriggerte Programme listen

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

Moderator: Co-Administratoren

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

Häufig getriggerte Programme listen

Beitrag von MichaelN » 30.07.2021, 12:29

Da vorhin mal wieder die Frage nach dem DC kam und ich mich ärgerte, das man unter Status/Programme die Liste nicht nach dem Zeitstempel sortieren kann, habe ich ein kleines Skript erstellt. Vielleicht kann es ja mal jemand gebrauchen.

Damit kann man sich, ausgeführt unter Programme/Skript testen eine Liste der in den letzten 5 Minuten getriggerten Programme anzeigen lassen:

Wichtig : getriggert bedeutet nicht, dass das Programm auch ausgeführt wurde. Ggf. wurde nur die Bedingungsprüfung durchführt.

Code: Alles auswählen

! Listet alle Programme, die in den letzten x Minuten getriggert wurden V1.0
! MichaelN https://homematic-forum.de/forum/viewtopic.php?f=31&t=68913#p673244
! GPL-3.0-or-later
integer Schwelle = 5*60; ! Hier die Anzahl x Minuten einstellen
! === hier nix mehr aendern ===
string i;
object o;
string slist = "";
string PName;
integer Last;
integer Jetzt = system.Date("%F %T").ToTime().ToInteger();
integer Diff;

foreach(i, dom.GetObject(ID_PROGRAMS).EnumUsedIDs()) {
	o = dom.GetObject (ID_PROGRAMS).Get (i);
    Last = o.ProgramLastExecuteTimeSeconds();
    Diff = Jetzt - Last;
    if ( Diff < Schwelle )
    	{
    	PName = o.Name();
    	WriteLine (PName#" - "#Diff);
        }
}
  
Ich überlege gerade ob man das Versprechen "häufig" aus dem Thread-Titel noch realisieren kann...
siehe übernächsten Beitrag!
Zuletzt geändert von MichaelN am 20.12.2021, 15:40, insgesamt 5-mal geändert.
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 +++

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: Häufig getriggerte Programme listen

Beitrag von dtp » 30.07.2021, 12:59

MichaelN hat geschrieben:
30.07.2021, 12:29
Ich überlege gerade ob man das Versprechen "häufig" aus dem Thread-Titel noch realisieren kann...
Vermutlich nur, indem du die Trigger-Zeitpunkte in eine Liste schreibst, die du in einer entsprechenden Systemvariablen hinterlegst.

Ich habe mal was Ähnliches für eine Anwesenheitssimulation gemacht. Ist aber etwas tricky gewesen, bereits bestehende Listeneinträge zu ergänzen und neue hinzuzufügen.

Könnte den Code mal raussuchen, wenn er dich interessiert.

Bis dann,

Thorsten
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

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

Re: Häufig getriggerte Programme listen

Beitrag von MichaelN » 30.07.2021, 13:45

nächste Ausbaustufe

Dieses Skript speichert das Ergebnis zwischen und gibt dann zusätzlich eine Liste der Programme mit Häufigkeit seit dem ersten Programmlauf aus.
Wenn man ein kleines Programm erstellt, das alle 121 Sekunden aufgerufen wird und dieses Skript mit 120 Sekunden Schwellwert einfügt, dann hat man nach kurzer Zeit einen Überblick über die verdächtigen Kandidaten. Das aufrufende Programm sollte an erster Stelle mit der Anzahl der Programmdurchläufe gelistet sein. Das Ergebnis sieht dann so aus:

Code: Alles auswählen

=== wie häufig getriggert: xxxTest:13x === PGM_Sonnenstand:9x === PGM_Schatten-Level:5x === PGM_CS-Alarm:5x === Tuer_offen_pruefen:2x === PGM_Nachricht_Tuer_offen:1x === PGM_Hide-FW-Updates:1x === 
Dazu muss man im Skript-Code den Namen der Text-Variablen angeben, die als Zwischenspeicher dient! string SVName = "xxx";
Und man gibt den Namen einer Text-Variablen an, die auf "protokolliert" steht. string Logs = "xxx";
Dann findet man das Ergebnis im Systemprotokoll wieder.
Ansonsten steht das Ergebnis nur in der SV zum zwischenspeichern - oder wird ausgegeben wenn man das Skript unter "Skript testen" ausführt.

Man kann den Code natürlich auch weiterhin nur über "Skript testen" ausführen. Die Zwischenspeicher-SV muss man aber in jeden Fall anlegen!
Will man wieder bei "Null" starten - oder enthält die SV noch alte Inhalte, dann muss man die Zwischenspeicher-SV leeren:

Code: Alles auswählen

string SVName = "xxTest"; ! Name der Systemvariablen (Typ Text) zum Zwischenspeichern
dom.GetObject(ID_SYSTEM_VARIABLES).Get(SVName).State(""); 
Hier das Skript:

Code: Alles auswählen

! Listet alle Programme, die in den letzten x Minuten getriggert wurden V2.3
! MichaelN https://homematic-forum.de/forum/viewtopic.php?f=31&t=68913&p=673244#p673252
! GPL-3.0-or-later
integer Schwelle = 2*60; ! Hier die Anzahl x Minuten einstellen
string SVName = "xxTest"; ! Name der Systemvariablen (Typ Text) zum Zwischenspeichern
string Logs = "Protokolleintrag"; ! 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
! === hier nix mehr aendern ===
string i;  string j;  string SVtemp;
object o;  object SV;
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;

foreach(i, dom.GetObject(ID_PROGRAMS).EnumUsedIDs()) {
	o = dom.GetObject (ID_PROGRAMS).Get (i);
    Last = o.ProgramLastExecuteTimeSeconds();
    Diff = Jetzt - Last;
    if ( Diff < Schwelle )
    	{
    	PName = o.Name();
        slist = o#ListTrenner#slist;
    	WriteLine (PName#" - "#Diff);
        }
}

SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SVName);
if (slist && SV)
	{
    output = "=== wie häufig getriggert: "#OutputTrenner;
    SVtemp = SV.Value();
    foreach(i, slist.Split(ListTrenner)) {
      if (!SVtemp) {
      ! Liste leer, neu aufbauen
      output = output#i#":1x "#OutputTrenner;
      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) {
            	j_Zaehler = j_Zaehler + 1;
          		output = output#j_Name#":"#j_Zaehler#"x "#OutputTrenner;
            	slist_neu = slist_neu#j_Name#";"#j_Zaehler#ListTrenner;
                }
        	}
         } else {
                ! Eintrag neu
           		slist_neu = slist_neu#i#";1"#ListTrenner;
                output = output#i#":1x "#OutputTrenner;
         }
    	}
      }
    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
          	output = output#j_Name#":"#j_Zaehler#"x "#OutputTrenner;
            slist_neu = slist_neu#j_Name#";"#j_Zaehler#ListTrenner;
            }
    }

    SV.State(slist_neu);
    WriteLine(output);
	SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(Logs);
	if (SV)	{ SV.State(output); }
    }

V2.3
man kann jetzt zusätzlich einstellen, welche Zeichen zum Trennen der Listeneinträge benutzt werden.
Zum einen für den Output. Hier sind 2 Varianten vordefiniert um eine einzeilige oder mehrzeilige Ausgabe zu erhalten. Einfach die ungewünschte Variante mit ! am Zeilenanfang auskommentieren
Zum anderen für die Zwischenspeicherung. Standardmäßig ist hier das "," eingestellt. Benutzt man das Komma auch in Programmnamen, funktioniert das Skript nicht mehr richtig. Dann kann man für ListTrenner ein anderes Zeichen eintragen. "&" ist erprobt. Was man nicht nehmen sollte ist das ";". Das brauche ich für andere Zwecke und das habe ich jetzt nicht auch noch parametrisierbar gemacht. Generell ist - eben aus solchen Gründen - der Einsatz von Sonderzeichen in Programm- oder anderen Objektnamen nicht empfehlenswert.
Zuletzt geändert von MichaelN am 20.12.2021, 15:40, insgesamt 11-mal geändert.
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
Black
Beiträge: 5471
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1071 Mal
Kontaktdaten:

Re: Häufig getriggerte Programme listen

Beitrag von Black » 30.07.2021, 17:23

Wenn du mitzählen möchtest, müsstest du in jedem Programm welches du überwachen möchtest ein Script in jede Rule reinsetzen, welches dir eine Liste (ich würde diese in den Metatags des Programmes halten) den Zeitpunkt reinschreibt. Dies aber auch sinnig begrenzen auf x Einträge. Da im ersten Moment ohne Auswertung eh nicht menschenlesbar, würde ich die Einträge auch als Timestamp schreiben.

Dann lassen sich in epischer Tiefe Auswertescripte Formulieren, die Iterieren und diese metaliste auswerten und ergebnisse auswerfen. Damit lassen sich Aussagen zu Zeitpunkt und häufigkeit bzw Häufigkeit ineinem Zeitraum treffen.


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

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

Re: Häufig getriggerte Programme listen

Beitrag von MichaelN » 30.07.2021, 17:27

Black hat geschrieben:
30.07.2021, 17:23
Wenn du mitzählen möchtest, müsstest du in jedem Programm welches du überwachen möchtest ein Script in jede Rule reinsetzen
Der Aufwand erscheint mir recht hoch.

Ich weiß nicht, wie dein SDV mit der CCU kommuniziert. Aber Du hast ja eine vernünftige Programmiersprache zur Hand.
Nur mal wieder so als Idee ins Unreine gesprochen:
Man startet im SDV einen Überwachungsmodus. Der SDV liest jede Minute die Timestamps aller Programme aus und gibt nach dem Stop der Überwachung aus, wie oft jedes Programm getriggert wurde...
:wink:
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
GEVJan
Beiträge: 101
Registriert: 28.04.2021, 18:40
System: CCU und Access Point
Wohnort: Köln
Hat sich bedankt: 30 Mal
Danksagung erhalten: 16 Mal

Re: Häufig getriggerte Programme listen

Beitrag von GEVJan » 30.07.2021, 18:17

Hi,
vielleicht denke ich zu simpel, aber kann man nicht einfach pro zu überwachendem Programm zwei SV(Zahl) anlegen:
1. Zähler
2. Zähler Vergleich

Dann einfach bei Programmausführung zusätzlich den Zähler um eins erhöhen.
Zähler Vergleich übernimmt dann alle x Minuten/Stunden/Tage/Wochen den Stand der 1. SV.
Anschließend kann man die Zählerstande vergleichen.

Klar, wenn man alles überwachen möchte zu aufwendig, aber wenn es nur um ein paar "Verdächtige" geht kann man sich so doch schnell und einfach einen Überblick verschaffen.

Gruß, Jan
CCU3 mit Raspberrymatic -> Eingebunden: HUE-Bridge, Tasmota-Sonoffs, Alexa, Open Weather Map, Tasker, LG-TV

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

Re: Häufig getriggerte Programme listen

Beitrag von MichaelN » 30.07.2021, 18:24

Das wäre dann aber kaum universell einsetzbar.
Realisieren kann das natürlich, siehe dtp.Aber mit HM Skript ist das :evil:
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 +++

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

Re: Häufig getriggerte Programme listen

Beitrag von MichaelN » 31.07.2021, 13:51

Mir hat das Thema keine Ruhe gelassen und ich habe nochmal etwas rumgespielt.
Ergebnis ist das Skript in Beitrag 3

Dies zählt nun bei jedem Programmdurchlauf, wie oft jedes Programm dabei war.

Das sieht im Systemprotokoll dann so aus: (xxxTest ist das Programm, das das Skript regelmäßig ausführt)

Code: Alles auswählen

=== wie häufig getriggert: xxxTest:1x === PGM_Sonnenstand:1x === PGM_Schatten-Level:1x ===
=== wie häufig getriggert: xxxTest:2x === PGM_Sonnenstand:2x === PGM_CS-Alarm:1x === PGM_Schatten-Level:1x ===
=== wie häufig getriggert: xxxTest:3x === PGM_Hide-FW-Updates:1x === PGM_Sonnenstand:2x === PGM_CS-Alarm:1x === PGM_Schatten-Level:1x ===
=== wie häufig getriggert: xxxTest:4x === PGM_Sonnenstand:3x === PGM_Schatten-Level:2x === PGM_Hide-FW-Updates:1x === PGM_CS-Alarm:1x ===
=== wie häufig getriggert: xxxTest:5x === Tuer_offen_pruefen:1x === PGM_Sonnenstand:4x === PGM_Nachricht_Tuer_offen:1x === PGM_CS-Alarm:2x === PGM_Schatten-Level:2x === PGM_Hide-FW-Updates:1x ===
=== wie häufig getriggert: xxxTest:6x === Tuer_offen_pruefen:2x === PGM_Schatten-Level:3x === PGM_Sonnenstand:4x === PGM_Nachricht_Tuer_offen:1x === PGM_CS-Alarm:2x === PGM_Hide-FW-Updates:1x ===
=== wie häufig getriggert: xxxTest:7x === PGM_Sonnenstand:5x === PGM_CS-Alarm:3x === Tuer_offen_pruefen:2x === PGM_Schatten-Level:3x === PGM_Nachricht_Tuer_offen:1x === PGM_Hide-FW-Updates:1x ===
=== wie häufig getriggert: xxxTest:8x === PGM_Sonnenstand:6x === PGM_CS-Alarm:3x === Tuer_offen_pruefen:2x === PGM_Schatten-Level:3x === PGM_Nachricht_Tuer_offen:1x === PGM_Hide-FW-Updates:1x ===
=== wie häufig getriggert: xxxTest:9x === PGM_Schatten-Level:4x === PGM_Sonnenstand:6x === PGM_CS-Alarm:3x === Tuer_offen_pruefen:2x === PGM_Nachricht_Tuer_offen:1x === PGM_Hide-FW-Updates:1x ===
=== wie häufig getriggert: xxxTest:10x === PGM_Sonnenstand:7x === PGM_CS-Alarm:4x === PGM_Schatten-Level:4x === Tuer_offen_pruefen:2x === PGM_Nachricht_Tuer_offen:1x === PGM_Hide-FW-Updates:1x ===
=== wie häufig getriggert: xxxTest:11x === PGM_Sonnenstand:8x === PGM_CS-Alarm:4x === PGM_Schatten-Level:4x === Tuer_offen_pruefen:2x === PGM_Nachricht_Tuer_offen:1x === PGM_Hide-FW-Updates:1x ===
=== wie häufig getriggert: xxxTest:12x === PGM_Schatten-Level:5x === PGM_CS-Alarm:5x === PGM_Sonnenstand:8x === Tuer_offen_pruefen:2x === PGM_Nachricht_Tuer_offen:1x === PGM_Hide-FW-Updates:1x ===
=== wie häufig getriggert: xxxTest:13x === PGM_Sonnenstand:9x === PGM_Schatten-Level:5x === PGM_CS-Alarm:5x === Tuer_offen_pruefen:2x === PGM_Nachricht_Tuer_offen:1x === PGM_Hide-FW-Updates:1x ===
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 +++

HMNutzer
Beiträge: 708
Registriert: 24.10.2016, 17:18
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 150 Mal
Danksagung erhalten: 22 Mal

Re: Häufig getriggerte Programme listen

Beitrag von HMNutzer » 05.09.2021, 11:06

Hallo Michael,

vielen Dank für das Script.
Eine DAU Frage: gibt es eine andere Möglichkeit außer unter "Script testen" bzw. Sysvar anschauen die Ausgabe zu sehen? Ich denke so an eine Art serieller Monitor wie beim Arduino.
Viele Grüße

Martin

RaspberryMatic auf ESXi 7 mit RPI-RF-MOD/HB-RF-ETH. Div. HM und HMIP Funkkomponenten im Holzständerhaus

schlichi
Beiträge: 387
Registriert: 26.08.2016, 19:26
System: Alternative CCU (auf Basis OCCU)
Wohnort: Erding
Hat sich bedankt: 60 Mal
Danksagung erhalten: 28 Mal

Re: Häufig getriggerte Programme listen

Beitrag von schlichi » 07.09.2021, 16:17

Hallo Michael,

erst mal vielen Dank für Deine Bereitschaft das Programm mit uns zu teilen. Meine "Benamsung" mag es aber nicht, bzw. es kommt mit Kommata im Programmnamen nicht klar.

Code: Alles auswählen

Licht, Loggia-, Boden-, auto - 93
System Fenster - 93
=== wie häufig getriggert: System Fenster:5x === Licht:2x ===  Loggia-:1x ===  Boden-:1x ===  auto:2x ===  Dusche-:1x ===  bew:1x === ???:0x === 
Programmnamen.JPG
Gruß
schlichi
... inzwischen autodidakter, fortgeschrittener Anfänger mit bestandener Einstiegsprüfung für den Expertenmodus Teil 3 (erfahrener Anwender) :roll:

Antworten

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