FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: CoolTux am 19 März 2018, 15:07:30

Titel: Hilfen für InternalTimer
Beitrag von: CoolTux am 19 März 2018, 15:07:30
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;
}
Titel: Antw:Hilfen für InternalTimer
Beitrag von: DS_Starter am 25 März 2018, 18:36:39
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
Titel: Antw:Hilfen für InternalTimer
Beitrag von: KernSani am 25 März 2018, 19:19:44
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...
Titel: Antw:Hilfen für InternalTimer
Beitrag von: DS_Starter am 25 März 2018, 19:25:54
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
Titel: Antw:Hilfen für InternalTimer
Beitrag von: CoolTux am 25 März 2018, 19:28:04
Ist schon bisschen älter mein Schnipsel. Ich stelle ihn die Tage mal um.
Titel: Antw:Hilfen für InternalTimer
Beitrag von: DS_Starter am 25 März 2018, 19:35:07
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
Titel: Antw:Hilfen für InternalTimer
Beitrag von: KernSani am 25 März 2018, 19:52:10
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
Titel: Antw:Hilfen für InternalTimer
Beitrag von: mumpitzstuff am 05 April 2018, 23:52:40
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;
}
Titel: Antw:Hilfen für InternalTimer
Beitrag von: CoolTux am 06 April 2018, 06:48:50
Guten Morgen,

Vielen Dank für Deinen Code.