Auflistung Programme/Systemvariable nach letzter Ausführung

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Antworten
PaulM
Beiträge: 318
Registriert: 16.02.2015, 17:05
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 129 Mal
Danksagung erhalten: 35 Mal

Auflistung Programme/Systemvariable nach letzter Ausführung

Beitrag von PaulM » 26.06.2022, 23:39

In der WebUI kann ich Programme oder Systemvariablen leider nicht zeitlich sortieren nach letzter Ausführungszeit bzw. Änderung
Um die letzte Ausführung bzw. Änderung zu sehen, muss man alle Programme bzw. Systemvariablen durchblättern.
Bei der Fehlersuche wäre es hilfreich, wenn man über ein Skript eine Auflistung aller Programme sortiert nach dem Zeitpunkt der letzten Ausführung bekäme.
Bei Programmen also "ProgramLastExecuteTime" oder "ProgramLastExecuteTimeSeconds" bzw. "Timestamp", vielleicht auch mit Eingrenzung letzte Stunde oder letzter Tag.
Leider bekomme ich ein solches Skript mit Iteration und Sortierung nicht allein hin.

Hat jemand ein Skript, das sich entsprechend anpassen lässt.

Gruß
PM
Mit Mut und Entschlossenheit gegen Intoleranz

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

Re: Auflistung Programme/Systemvariable nach letzter Ausführung

Beitrag von alchy » 27.06.2022, 10:06


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.

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

Re: Auflistung Programme/Systemvariable nach letzter Ausführung

Beitrag von MichaelN » 27.06.2022, 10:08

Und hier die komplette Lösung:
viewtopic.php?f=31&t=68913#p673244
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 +++

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Auflistung Programme/Systemvariable nach letzter Ausführung

Beitrag von Tyfys » 27.06.2022, 13:39

Eine weitere Idee wäre z.B. wäre für die Systemvariablen :

Code: Alles auswählen

!Übersicht Systemvariablenänderungen sortiert -by Tyfys
string SysVarList = "";
string SysVarId; 
object arr="";
!Element Art  n=numerisch / a=alphanumerisch
object arrtyp  ="n;a";
!Tauschstrings von > nach
string av;
string an;
!Trennzeichen für Array 1. / 2.Dimension
var sep1=";";
var sep2="[";
var TimeString="";

!Das Array füllen
var SysVarIdsList = dom.GetObject(ID_SYSTEM_VARIABLES).EnumIDs();
foreach(SysVarId, SysVarIdsList) {
    var SysVarObj = dom.GetObject(SysVarId);
    if (SysVarObj.LastTimestamp().ToInteger() == 0) {
        TimeString = "keine Änderung nach CCU-Neustart";
    } else {
        TimeString = SysVarObj.LastTimestamp().Format("%d.%m.%Y %H:%M:%S");
    }
    arr = arr # SysVarObj.LastTimestamp().ToInteger() # sep2 # SysVarObj.Name() # sep2 # TimeString # sep1;
}
arr = arr.RTrim(";");


!Nun Array sortieren
integer len = web.webGetValueListCount(arr).ToInteger() - 1;
boolean swapped = true;
boolean revers = true;
var elemart = "a";
string index;
integer von = 0;
integer bis = 1;
foreach(index, system.GenerateEnum(von, bis)) {
    integer x = (von + bis) - index.ToInteger();
    elemart = arrtyp.StrValueByIndex(sep1, x);
    swapped = true;
    while (swapped) {
        integer i = 1;
        swapped = false;
        while (i <= len) {
            if (((elemart <> "n") && ((arr.StrValueByIndex(sep1, i).StrValueByIndex(sep2, x)) < (arr.StrValueByIndex(sep1, i - 1).StrValueByIndex(sep2, x))))
                 || ((elemart == "n") && ((arr.StrValueByIndex(sep1, i).StrValueByIndex(sep2, x).ToFloat()) < (arr.StrValueByIndex(sep1, i - 1).StrValueByIndex(sep2, x).ToFloat())))) {
                av = arr.StrValueByIndex(sep1, i - 1) # sep1 # arr.StrValueByIndex(sep1, i);
                an = arr.StrValueByIndex(sep1, i) # sep1 # arr.StrValueByIndex(sep1, i - 1);
                arr = arr.Replace(av, an);
                swapped = true;
            }
            i = i + 1;
        }
    }
}

!Liste ausgeben
string ix;
WriteLine("Liste Systemvariablen nach Änderungsdatum aufsteigend sortiert");
foreach(ix, system.GenerateEnum(0, len)) {
    WriteLine((ix.ToInteger() + 1) # ".  " # (arr.StrValueByIndex(sep1, ix).StrValueByIndex(sep2, 2)) # ": " # (arr.StrValueByIndex(sep1, ix).StrValueByIndex(sep2, 1)));
}

!Falls absteigend
if (revers) {
    object arr2 = "";
    string elem;
    foreach(elem, arr.Split(";")) {
        arr2 = elem # sep1 # arr2;
    }
    arr = arr2;
    WriteLine(" ");
    WriteLine("**********************");
    WriteLine("Liste Systemvariablen nach Änderungsdatum absteigend sortiert");
    foreach(ix, system.GenerateEnum(0, len)) {
        WriteLine((ix.ToInteger() + 1) # ".  " # (arr.StrValueByIndex(sep1, ix).StrValueByIndex(sep2, 2)) # ": " # (arr.StrValueByIndex(sep1, ix).StrValueByIndex(sep2, 1)));
    }
}
oder für Programmausführungen angepasst:

Code: Alles auswählen

!Übersicht Programmausführungen sortiert  -by Tyfys
string PgmList = "";
string PgmId; 
object arr="";
!Element Art n = numerisch / a = alphanumerisch
object arrtyp = "n;a";
!Tauschstrings von > nach
string av;
string an;
!Trennzeichen für Array 1. / 2.Dimension
var sep1 = ";";
var sep2 = "[";
var TimeString = "";

!Das Array füllen
var PgmIdsList = dom.GetObject(ID_PROGRAMS).EnumIDs();
foreach(PgmId, PgmIdsList) {
    var PgmObj = dom.GetObject(PgmId);

    if (PgmObj.ProgramLastExecuteTime().ToInteger() == 0) {
        TimeString = "keine Ausführung nach CCU-Neustart";
    } else {
        TimeString = PgmObj.ProgramLastExecuteTime().Format("%d.%m.%Y %H:%M:%S");
    }
    arr = arr # PgmObj.ProgramLastExecuteTime().ToInteger() # sep2 # PgmObj.Name() # sep2 # TimeString # sep1;
}
arr = arr.RTrim(";");

!Nun Array sortieren
integer len = web.webGetValueListCount(arr).ToInteger() - 1;
boolean swapped = true;
boolean revers = true;
var elemart = "a";
string index;
integer von = 0;
integer bis = 1;
foreach(index, system.GenerateEnum(von, bis)) {
    integer x = (von + bis) - index.ToInteger();
    elemart = arrtyp.StrValueByIndex(sep1, x);
    swapped = true;
    while (swapped) {
        integer i = 1;
        swapped = false;
        while (i <= len) {
            if (((elemart <> "n") && ((arr.StrValueByIndex(sep1, i).StrValueByIndex(sep2, x)) < (arr.StrValueByIndex(sep1, i - 1).StrValueByIndex(sep2, x))))
                 || ((elemart == "n") && ((arr.StrValueByIndex(sep1, i).StrValueByIndex(sep2, x).ToFloat()) < (arr.StrValueByIndex(sep1, i - 1).StrValueByIndex(sep2, x).ToFloat())))) {
                av = arr.StrValueByIndex(sep1, i - 1) # sep1 # arr.StrValueByIndex(sep1, i);
                an = arr.StrValueByIndex(sep1, i) # sep1 # arr.StrValueByIndex(sep1, i - 1);
                arr = arr.Replace(av, an);
                swapped = true;
            }
            i = i + 1;
        }
    }
}

!Liste ausgeben
string ix;
WriteLine("Liste Programme nach Ausführungsdatum aufsteigend sortiert");
foreach(ix, system.GenerateEnum(0, len)) {
    WriteLine((ix.ToInteger() + 1) # ".  " # (arr.StrValueByIndex(sep1, ix).StrValueByIndex(sep2, 2)) # ": " # (arr.StrValueByIndex(sep1, ix).StrValueByIndex(sep2, 1)));
}

!Falls absteigend
if (revers) {
    object arr2 = "";
    string elem;
    foreach(elem, arr.Split(";")) {
        arr2 = elem # sep1 # arr2;
    }

    arr = arr2;
    WriteLine(" ");
    WriteLine("**********************");
    WriteLine("Liste Programme nach Ausführungsdatum absteigend sortiert");
    foreach(ix, system.GenerateEnum(0, len)) {
        WriteLine((ix.ToInteger() + 1) # ".  " # (arr.StrValueByIndex(sep1, ix).StrValueByIndex(sep2, 2)) # ": " # (arr.StrValueByIndex(sep1, ix).StrValueByIndex(sep2, 1)));
    }
}
Evtl. ist es ja für deine Zwecke passender.........
Gruß
Harry

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“