FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: B.Stromberg am 06 Mai 2019, 05:19:28

Titel: Sekunden in Stunden und Minuten ausgeben
Beitrag von: B.Stromberg am 06 Mai 2019, 05:19:28
Guten Morgen!
Ich bastele schon eine Weile daran herum, ein Reading, welche leider nur in Sekunden ausgegeben wird in Stunden und Minuten umzuwandeln.

Das Reading heißt:
Zitat
status_timer_length 65760

ich habe daraus nun ein Userreading gemacht:


attr anova userReadings laufzeit {sprintf("%.2f",(ReadingsVal($name,"status_timer_length",0)/3600))}


Das Ganze stimmt ja nun nur teilweise.

Ausgehen von 65760 Sekunden, müsste dies durch 3600 geteilt werden und dann die Dezimalzahl hinter dem Komma wieder x 60 multipliziert werden.
Leider habe ich dahingehend nichts gefunden.

Kann mir jemand auf die Sprünge helfen?
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: JoWiemann am 06 Mai 2019, 06:33:55
Hm, und wo hast Du gesucht? Googeln führt zu gaaanz vielen Treffern. Und dann ist da ja noch der Modulo Operator % in Perl.

($Stunden, $Minuten, $Sekunden)=(int($Sekunden/3600), int(($Sekunden % 3600) / 60), $Sekunden % 60);



Gesendet von iPhone mit Tapatalk

Grüße Jörg
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: B.Stromberg am 06 Mai 2019, 12:43:32
Zitat von: JoWiemann am 06 Mai 2019, 06:33:55
Hm, und wo hast Du gesucht? Googeln führt zu gaaanz vielen Treffern. Und dann ist da ja noch der Modulo Operator % in Perl.

($Stunden, $Minuten, $Sekunden)=(int($Sekunden/3600), int(($Sekunden % 3600) / 60), $Sekunden % 60);



Gesendet von iPhone mit Tapatalk

Grüße Jörg

Ja ich weiß, dass ist alles total easy für:

1. Jemand der weiß nach was er überhaupt suchen muss
2. Jemand der sich mit PHP, Perl etc. auskennt

Und du wirst "lachen"

Nicht einmal deine Antwort hilft mir weiter, weil ich 0 Ahnung habe, wie ich diese nun im Attribut umsetze :(

Deshalb poste ich ja auch im Anfänger Forum :'(
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: Frank_Huber am 06 Mai 2019, 12:53:51
In meinen ESP-Easy Geräten habe ich das hier zum Umrechnen der Uptime: (wird in Minuten ausgegeben)
attr ESP106 userReadings Uptime_Calc {sprintf("%d %02d:%02d",SYSMON_decode_time_diff((ReadingsVal($name,"uptime",0))*60))}\

würde für dich dann zu folgendem kommen:
attr anova userReadings laufzeit {sprintf("%d %02d:%02d",SYSMON_decode_time_diff(ReadingsVal($name,"status_timer_length",0)))}\
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: B.Stromberg am 06 Mai 2019, 13:09:22
Zitat von: Frank_Huber am 06 Mai 2019, 12:53:51
In meinen ESP-Easy Geräten habe ich das hier zum Umrechnen der Uptime: (wird in Minuten ausgegeben)
attr ESP106 userReadings Uptime_Calc {sprintf("%d %02d:%02d",SYSMON_decode_time_diff((ReadingsVal($name,"uptime",0))*60))}\

würde für dich dann zu folgendem kommen:
attr anova userReadings laufzeit {sprintf("%d %02d:%02d",SYSMON_decode_time_diff(ReadingsVal($name,"status_timer_length",0)))}\

Vielen Dank, dass du mir helfen möchtest.

ich bekomme nun folgende Fehlermeldung:

Zitat
Error evaluating anova userReading laufzeit: Undefined subroutine &main::SYSMON_decode_time_diff called at (eval 172) line 1.

Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: Frank_Huber am 06 Mai 2019, 13:12:15
ah, dann geht das evtl nur wenn ein Sysmon Gerät angelegt ist.

define sysmon SYSMON 1 1 1 10 Beispiel für RasPi.
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: Christoph Morrison am 06 Mai 2019, 13:19:07
Ich kenne SYSMON_decode_time_diff(), wollte die Funktion aber noch mit ein paar Zückerchen und habe mir deshalb in meiner 99_myUtils.pm folgende Funktion angelegt:


=pod

    Create a human readable representation for a given time t, like x minutes, y seconds, but only
    with the necessary pieces.

    Respects your wishes regarding scalar / list context, e.g.

    # list context
    say Dumper(timediff2str(10000))
        $VAR1 = '1';
        $VAR2 = '3';
        $VAR3 = '46';
        $VAR4 = '40';

    # scalar context
    say Dumper(scalar timediff2str(100000));
        $VAR1 = '1 Tage, 03 Stunden, 46 Minuten, 40 Sekunden';

=cut
sub timediff2str($)
{
    my $s = shift;

    return unless defined wantarray;

    return undef unless defined $s;

    return (
        wantarray
            ?   (0,0,0,$s)
            : sprintf "%02d Sekunden", $s
    ) if $s < 60;

    my $m = $s / 60; $s = $s % 60;
    return (
        wantarray
            ?   (0, 0, POSIX::floor($m), POSIX::floor($s))
            :   sprintf "%02d Minuten, %02d Sekunden", $m, $s
    ) if $m < 60;

    my $h = $m /  60; $m %= 60;
    return (
        wantarray
            ?   (0, POSIX::floor($h), POSIX::floor($m), POSIX::floor($s))
            :   sprintf "%02d Stunden, %02d Minuten, %02d Sekunden", $h, $m, $s
    ) if $h < 24;

    my $d = $h / 24; $h %= 24;
    return (
        wantarray
            ?   ( POSIX::floor($d), POSIX::floor($h), POSIX::floor($m), POSIX::floor($s))
            :   sprintf "%d Tage, %02d Stunden, %02d Minuten, %02d Sekunden", $d, $h, $m, $s
    );
}
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: B.Stromberg am 06 Mai 2019, 13:20:40
Zitat von: Frank_Huber am 06 Mai 2019, 13:12:15
ah, dann geht das evtl nur wenn ein Sysmon Gerät angelegt ist.

define sysmon SYSMON 1 1 1 10 Beispiel für RasPi.

Wieso ist das bloß alles sooooo kompliziert?

Ich habe nun

Zitat
define sysmon SYSMON 1 1 1 10

direkt in der Befehlszeite in FHEM eingegeben.
Es wurde auch sysmon erstellt und liefert Daten (CPU etc.)

Allerdings kommt schon beim Restart von FHEM diese Fehlermeldung:

Zitat
Messages collected while initializing FHEM:
configfile: Please define sysmon 5cd0173b-f33f-0855-e284-3be33f2660f54885 first
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: Frank_Huber am 06 Mai 2019, 13:24:14
Hast Du evtl das speichern vor dem Restart vergessen?
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: B.Stromberg am 06 Mai 2019, 13:29:10
Hmm kann gut sein, FHEM hatte auch das define für den sysmon ins userreading von anova gepackt ?!??!

Hab ich nun korrigiert

Nun kommt im UserReading wieder die Fehlermeldung:

Zitat
Error evaluating anova userReading laufzeit: Undefined subroutine &main::SYSMON_decode_time_diff called at (eval 172) line 1.

Achso
Die 99_myUtils.pm habe ich um den Code von @Christoph ergänzt

Gucke ich mir Sysmon an ist das ein Träumchen!
z. B.

Zitat
fhemstarttime 1557141769
sowie
fhemuptime 720

wird aufgelöst in:

Zitat
fhemstarttime_text 06.05.2019 13:22:49
sowie
fhemuptime_text 0 days, 00 hours, 13 minutes
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: Beta-User am 06 Mai 2019, 13:38:46
Zitat von: B.Stromberg am 06 Mai 2019, 13:20:40
Wieso ist das bloß alles sooooo kompliziert?
Es ist nicht kompliziert, aber dafür ein nicht benötigtes Device zu definieren MACHT es kompliziert...

Du hast doch schon einen Sekunden-Wert (den du bisher eben nur in Stunden umgerechnet hattest). Jetzt erweiterst du die userreadings-sprintf-Anweisung einfach um weitere Angaben und nutzt den Code von JoWiemann.

Eigentlich ganz einfach, wenn man eine Suchmaschine mit perl und sprintf füttert und etwas selber rumspielt statt darauf zu warten, dass einem jemand funktionalen Code vor die Flinte treibt :-* .
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: B.Stromberg am 06 Mai 2019, 13:54:18
Okay, habe mal wieder mein Hirn angeschaltet, kann manchmal nicht falsch sein........lüppt nun wie gewünscht :D

Kann mir hierbei dann auch nochmal jemand einen Denkanstoß geben?

Der Anova gibt die Startzeit mit folgendem Reading aus:

Zitat
status_current_job_job_start_time
2019-05-06T02:53:48.962904Z

Wie kriege ich das so hin gebogen?

Zitat
06.05.  2:53 Uhr



Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: rabehd am 06 Mai 2019, 13:59:57
https://forum.fhem.de/index.php?topic=58059.0 (https://forum.fhem.de/index.php?topic=58059.0)
https://forum.fhem.de/index.php?topic=73190.0 (https://forum.fhem.de/index.php?topic=73190.0)

Das Stichwort split und ein wenig Hirn.
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: Beta-User am 06 Mai 2019, 14:03:21
(schade, zu spät, aber fertig...)
Erst eine Regex drüber hauen, dann $1 usw. verwenden? Würde es aber immer 2-stellig lassen, sonst ist das unnötig kompliziert.

https://regex101.com/
Gib da mal das hier ein (als Teststring deinen Readinginhalt):
[\d]+-([\d]+)-([\d]+)T([\d]+):([\d]+):.*Dann den Kopf eingeschaltet lassen ;) .
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: B.Stromberg am 06 Mai 2019, 14:07:39
Zitat von: rabehd am 06 Mai 2019, 13:59:57
https://forum.fhem.de/index.php?topic=58059.0 (https://forum.fhem.de/index.php?topic=58059.0)
https://forum.fhem.de/index.php?topic=73190.0 (https://forum.fhem.de/index.php?topic=73190.0)

Das Stichwort split und ein wenig Hirn.

Klar
Der geneigte Anfänger such hier im Forum auch nach

Zitat
Zeichenketten beschneden

Ich weiß, dass du "split" meinstes (JETZT). Selbst mit "beschneiden" wäre ich nicht zu Treffer gekommen (und bei Google wäre ich wohl völlig wo anders gelandet beim Wort "beschneiden")  ;D

Nur wie bitte soll ein ANFÄNGER auf split kommen????

Für euch ist PHP und Perl Alltag. Aber bitte denkt mal daran, dass auch IHR mal damit angefangen habt.
Und wenn man schon etwas älter ist, fällt einem das Ganze nicht mehr so leicht!

Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: rabehd am 06 Mai 2019, 14:13:47
Zitatnd bei Google wäre ich wohl völlig wo anders gelandet beim Wort "beschneiden")  ;D

Nur wie bitte soll ein ANFÄNGER auf split kommen????

Meine erste Suche wäre mit folgenden Begriffen "fhem" und "beschneiden".
Und siehe da, genau die Treffer  ;D

Ich bin auch gegen fertige Lösungen und freue mich, dass Du mit einem solchen Tip weiterkommst.  ;)
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: Christoph Morrison am 06 Mai 2019, 14:24:08
Zitat von: B.Stromberg am 06 Mai 2019, 13:54:18
Der Anova gibt die Startzeit mit folgendem Reading aus:
status_current_job_job_start_time
2019-05-06T02:53:48.962904Z

Mal als Stichwort: das ist ein ISO-8601-formatiertes Datum. Das kannst du mit str2time() in eine Zahl konvertieren:


{ use Data::Dumper;; Dumper str2time("2019-05-06T02:53:48.962904Z");; }


ergibt


$VAR1 = '1557111228.9629';


Ein userReadings könnte so aussehen. Korrekt wäre auch 04:53, denn 2:53 ist UTC, nicht lokale Zeit.


uptime_human {
    my $time = str2time(ReadingsVal("$name", "status_current_job_job_start_time", undef));
    return POSIX::strftime("%d.%m.  %H:%M", localtime $time) if $time;
    return "";
}

Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: B.Stromberg am 06 Mai 2019, 14:51:42
Zitat von: Christoph Morrison am 06 Mai 2019, 14:24:08
Mal als Stichwort: das ist ein ISO-8601-formatiertes Datum. Das kannst du mit str2time() in eine Zahl konvertieren:


{ use Data::Dumper;; Dumper str2time("2019-05-06T02:53:48.962904Z");; }


ergibt


$VAR1 = '1557111228.9629';


Ein userReadings könnte so aussehen. Korrekt wäre auch 04:53, denn 2:53 ist UTC, nicht lokale Zeit.


uptime_human {
    my $time = str2time(ReadingsVal("$name", "status_current_job_job_start_time" undef));
    return POSIX::strftime("%d.%m.  %h:%m", localtime $time) if $time;
    return "";
}


Ich gebe mir wirklich Mühe dies nun irgendwie zu verstehen...

Bei diesem UserReading bekomme ich eine Fehlermeldung:

Zitat
Error evaluating anova userReading uptime_human: syntax error at (eval 246) line 1, near ""status_current_job_job_start_time" undef"
Global symbol "$time" requires explicit package name (did you forget to declare "my $time"?) at (eval 246) line 1.
Global symbol "$time" requires explicit package name (did you forget to declare "my $time"?) at (eval 246) line 1.
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: Christoph Morrison am 06 Mai 2019, 14:56:12
Ich hatte den Beitrag noch mal editiert. Du warst zu schnell ;-)
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: B.Stromberg am 06 Mai 2019, 15:00:22
Zitat von: Christoph Morrison am 06 Mai 2019, 14:56:12
Ich hatte den Beitrag noch mal editiert. Du warst zu schnell ;-)

Vielen Dank das du dich hier mit mir "rumschlägst" ;)

Aktualisiert kommt nun diese Fehlermeldung:

Zitat
Error evaluating anova userReading uptime_human: Undefined subroutine &main::str2time called at (eval 159) line 2.
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: Christoph Morrison am 06 Mai 2019, 15:13:17
Ich glaube str2time kommt aus dem Perl-Paket Date::Parse. Das müsstest du dazu nachinstallieren (mit cpan, cpanm oder deinem Paketmanager, z.B. aptitude libdatetime-format-dateparse-perl).
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: Wernieman am 06 Mai 2019, 15:19:19
Wobei mit apt-get besser als mit cpam ist, da updatefest!
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: Beta-User am 06 Mai 2019, 15:20:40
Soweit erkennbar ohne cpan/apt: strftime

{strftime("%H:%M", localtime(ReadingsAge('MYSENSOR_98','state',0)))}
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: B.Stromberg am 06 Mai 2019, 15:34:23
Zitat von: Christoph Morrison am 06 Mai 2019, 15:13:17
Ich glaube str2time kommt aus dem Perl-Paket Date::Parse. Das müsstest du dazu nachinstallieren (mit cpan, cpanm oder deinem Paketmanager, z.B. aptitude libdatetime-format-dateparse-perl).

so
habe ein apt-get install libdatetime-format-dateparse-perl gemacht.

Fehler bleibt leider...
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: Christoph Morrison am 06 Mai 2019, 16:25:26
FHEM neu gestartet?
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: B.Stromberg am 06 Mai 2019, 16:30:06
Zitat von: Christoph Morrison am 06 Mai 2019, 16:25:26
FHEM neu gestartet?

Ja habe ich

Wobei, der Fehler ist wieder ein Anderer:


Error evaluating anova userReading uptime_human: syntax error at (eval 211) line 2, near ""status_current_job_job_start_time" undef"
Global symbol "$time" requires explicit package name (did you forget to declare "my $time"?) at (eval 211) line 3.
Global symbol "$time" requires explicit package name (did you forget to declare "my $time"?) at (eval 211) line 3.


Blödsinn, das war nun mein Fehler

Bleibt bei

Zitat
Error evaluating anova userReading uptime_human: Undefined subroutine &main::str2time called at (eval 146) line 1.
Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: Christoph Morrison am 06 Mai 2019, 20:00:57
Versuch mal


uptime_human {
    use Date::Parse;
    my $time = Date::Parse::str2time(ReadingsVal("$name", "status_current_job_job_start_time", undef));
    return POSIX::strftime("%d.%m.  %H:%M", localtime $time) if $time;
    return "";
}

Titel: Antw:Sekunden in Stunden und Minuten ausgeben
Beitrag von: B.Stromberg am 06 Mai 2019, 20:42:24
Hey cool, dass geht ja :)

Vielen Dank!