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;
}
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
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...
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
Ist schon bisschen älter mein Schnipsel. Ich stelle ihn die Tage mal um.
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
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
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;
}
Guten Morgen,
Vielen Dank für Deinen Code.