Hilfen für InternalTimer

Begonnen von CoolTux, 19 März 2018, 15:07:30

Vorheriges Thema - Nächstes Thema

CoolTux

Die hier gezeigten Codebeispiele sind für erfahrende  User die zum mindestens den Code an sich lesen können. Anfängern rate ich von der Verwendung ab.

Die Subroutinen sind für eine 99_myUtils

Auflistung aller aktiven InternalTimer mit ordentlicher Formatierung. Muss aus FHEMWEB aufgerufen werden
Aufruf aus FHEMWEB
{ listInternalTimer() }

sub listInternalTimer(;$) {
    my ($p) = @_;
    my %cop;

    foreach my $e (@intAtA)
    {
        my $name = "";
        if (ref($e->{ARG}) eq "HASH")
        {
            if (exists($e->{ARG}{NAME}))
            {
                $name = $e->{ARG}{NAME};
            }
            elsif (exists($e->{ARG}{arg}))
            {
                $name = $e->{ARG}{arg};
            }           
        }
        elsif ((ref($e->{ARG}) eq "REF") && exists(${$e->{ARG}}->{hash}))
        {
            $name = ${$e->{ARG}}->{hash}{NAME};
        }
        elsif (ref($e->{ARG}) ne "REF")
        {
            $name = $e->{ARG};
        }
        my $time = strftime('%d.%m.%Y %H:%M:%S', localtime($e->{TRIGGERTIME}));
        my $function = sprintf("%-25s %-25s", $name, $e->{FN});
        my $line = "<td>".$e->{atNr}."</td><td>".$time."</td><td>".$function."</td>";

        if ('f' eq $p)
        {
            $cop{$function} = $line;
}
        elsif ('t' eq $p)
        {
            $cop{$time} = $line;
}
        else
        {
            $cop{$name." ".$e->{atNr}} = $line;
}
    }

    my $ret = '<html><table width=50%>';
    $ret .= "<td><b>InternalTimer List</b></td>";
    $ret .= '</tr></tr>';
    $ret .= "<td><b>Number</b></td>";
    $ret .= "<td><b>Date/Time</b></td>";
    $ret .= "<td><b>Function</b></td>";
    $ret .= '</tr>';
   
    foreach my $k (sort keys %cop) {
        $ret .= "$cop{$k}";
        $ret .= '</tr>';
    }

    $ret .= '</table></html>';
    return $ret;
}
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

DS_Starter

#1
Hallo cooltux,

danke für die hilfreiche Anregung !!

Ich habe bei mir die Auflistung aller Timer etwas abgewandelt. Mit dem Aufruf:

{ listInternalTimer("t") }  -> erhält man eine zeitlich sortierte Ausgabe und erkennt schnell welche Timer als nächstes starten bzw.
{ listInternalTimer("f") }  -> ergibt eine nach Funktionsname sortierte Ausgabe
{ listInternalTimer("x") }  -> so wie bisher

hier der etwas abgewandelte Code:


sub listInternalTimer($) {
    my ($arg) = @_;
    my %cop;
    my $m = $arg;
    foreach my $a (keys %intAt) {
        my $nam = "";
        my $aaa = sprintf ("%6d",$a);   # Number
        my $arg = $intAt{$a}{ARG};
        $nam = %{$arg}{NAME} if (ref($arg) eq "HASH" );
        my $tim = strftime('%d.%m.%Y %H:%M:%S',localtime($intAt{$a}{TRIGGERTIME}));
        my $func = sprintf ("%-25s %-25s",$nam,$intAt{$a}{FN});
       
if($m =~ /^f$/) {
            $cop{$func} = "<td>" . $aaa . "</td><td>" . $tim . "</td><td>" . $func . "</td>";
} elsif($m =~ /^t$/) {
            $cop{$tim} = "<td>" . $aaa . "</td><td>" . $tim . "</td><td>" . $func . "</td>";
} else {
            $cop{$nam." ".$aaa} = "<td>" . $aaa . "</td><td>" . $tim . "</td><td>" . $func . "</td>";
}
    }

    my $ret = '<html><table width=50%>';
    $ret .= "<td><b>InternalTimer List</b></td>";
    $ret .= '</tr></tr>';
    $ret .= "<td><b>Number</b></td>";
    $ret .= "<td><b>Date/Time</b></td>";
    $ret .= "<td><b>Function</b></td>";
    $ret .= '</tr>';
   
    foreach my $k (sort keys %cop) {
        $ret .= "$cop{$k}";
        $ret .= '</tr>';
    }

    $ret .= '</table></html>';
    return $ret;
}


LG,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

KernSani

Hi Heiko,

Ich habe mir das jetzt nicht komplett angesehen, aber ist dir bewusst, dass %intAt rgedwann das Zeitliche segnen wird?Nachfolger ist @intAtA, das bereits sortiert ist...




Kurz, weil mobil...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

DS_Starter

Hi Oli,

ja ich weiß, habe das verfolgt. Habe den Schnipsel von CoolTux nur mal eben schnell umgestrickt weil ich den nächsten Timer sehen wollte.
Kann man natürlich gleich auf "modern" umarbeiten  :)

LG,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

CoolTux

Ist schon bisschen älter mein Schnipsel. Ich stelle ihn die Tage mal um.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

DS_Starter

ZitatIst schon bisschen älter mein Schnipsel. Ich stelle ihn die Tage mal um.
Macht nichts, ist ja hifreich  :)

Aber Oli ... wäre die Ausgabe der laufenden Timer nicht ein schönes Add-On für dein  freezemon ?
Also so etwas wie

get <freezemon> showAllTimers

Evtl. noch mit unterschiedlichen Sortierungen bzw. einem Regex um nur Timer von bestimmten Devices aufzulisten.
Wäre vielleicht nicht schlecht.

LG,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

KernSani

Zitat von: DS_Starter am 25 März 2018, 19:35:07
Aber Oli ... wäre die Ausgabe der laufenden Timer nicht ein schönes Add-On für dein  freezemon ?
Im Grunde macht er ja genau das (bei einem Freeze), aber könnte man so als zusätzliches Gimmick miteinbauen (aber dann mit @intAtA ;))

Grüße,

Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

mumpitzstuff

#7
sub listInternalTimer(;$) {
    my ($p) = @_;
    my %cop;

    foreach my $e (@intAtA)
    {
        my $name = "";
        if (ref($e->{ARG}) eq "HASH")
        {
            if (exists($e->{ARG}{NAME}))
            {
                $name = $e->{ARG}{NAME};
            }
            elsif (exists($e->{ARG}{arg}))
            {
                $name = $e->{ARG}{arg};
            }           
        }
        elsif ((ref($e->{ARG}) eq "REF") && exists(${$e->{ARG}}->{hash}))
        {
            $name = ${$e->{ARG}}->{hash}{NAME};
        }
        elsif (ref($e->{ARG}) ne "REF")
        {
            $name = $e->{ARG};
        }
        my $time = strftime('%d.%m.%Y %H:%M:%S', localtime($e->{TRIGGERTIME}));
        my $function = sprintf("%-25s %-25s", $name, $e->{FN});
        my $line = "<td>".$e->{atNr}."</td><td>".$time."</td><td>".$function."</td>";

        if ('f' eq $p)
        {
            $cop{$function} = $line;
}
        elsif ('t' eq $p)
        {
            $cop{$time} = $line;
}
        else
        {
            $cop{$name." ".$e->{atNr}} = $line;
}
    }

    my $ret = '<html><table width=50%>';
    $ret .= "<td><b>InternalTimer List</b></td>";
    $ret .= '</tr></tr>';
    $ret .= "<td><b>Number</b></td>";
    $ret .= "<td><b>Date/Time</b></td>";
    $ret .= "<td><b>Function</b></td>";
    $ret .= '</tr>';
   
    foreach my $k (sort keys %cop) {
        $ret .= "$cop{$k}";
        $ret .= '</tr>';
    }

    $ret .= '</table></html>';
    return $ret;
}

CoolTux

Guten Morgen,

Vielen Dank für Deinen Code.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net