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?
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
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 :'(
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)))}\
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.
ah, dann geht das evtl nur wenn ein Sysmon Gerät angelegt ist.
define sysmon SYSMON 1 1 1 10
Beispiel für RasPi.
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
);
}
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
Hast Du evtl das speichern vor dem Restart vergessen?
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
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 :-* .
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
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.
(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 ;) .
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!
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. ;)
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 "";
}
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.
Ich hatte den Beitrag noch mal editiert. Du warst zu schnell ;-)
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.
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).
Wobei mit apt-get besser als mit cpam ist, da updatefest!
Soweit erkennbar ohne cpan/apt: strftime
{strftime("%H:%M", localtime(ReadingsAge('MYSENSOR_98','state',0)))}
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...
FHEM neu gestartet?
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.
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 "";
}
Hey cool, dass geht ja :)
Vielen Dank!