Sekunden in Stunden und Minuten ausgeben

Begonnen von B.Stromberg, 06 Mai 2019, 05:19:28

Vorheriges Thema - Nächstes Thema

B.Stromberg

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?

JoWiemann

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
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

B.Stromberg

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 :'(

Frank_Huber

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)))}\

B.Stromberg

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.


Frank_Huber

ah, dann geht das evtl nur wenn ein Sysmon Gerät angelegt ist.

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

Christoph Morrison

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
    );
}

B.Stromberg

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

Frank_Huber

Hast Du evtl das speichern vor dem Restart vergessen?

B.Stromberg

#9
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

Beta-User

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 :-* .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

B.Stromberg

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




rabehd

Auch funktionierende Lösungen kann man hinterfragen.

Beta-User

(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 ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

B.Stromberg

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=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!