FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: holle75 am 30 Mai 2018, 14:46:55

Titel: [gelöst] HH:MM:SS in Sekunden
Beitrag von: holle75 am 30 Mai 2018, 14:46:55
Hallo Ihr, seit Stunden an dieser Aufgabe:

Ich möchte ein Reading welches in HH:MM:SS vorliegt in einem DOIF in Sekunden umrechnen und mit > und < Vergleichen. Diese Idee, da ich keine Möglichkeit kenne eine Stundenangabe zu vergleichen.

Ich dachte es sei eine Leichtigkeit, finde aber immer nur Umrechnungen von entweder "letztes mal geschaltet" oder "Timestamp (mit Datum)" oder, oder, oder.

Welcher Perl-Wunderbefehl macht mir aus zB "01:02:01"  -> 3601 Sekunden (seit 00:00:00)?

Die Aufgabenstellung ist ein DOIF welches meine Anwesenheit seit 00:00:00 mit einem bestimmten Wert vergleicht.

Danke euch!
H
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: Thyraz am 30 Mai 2018, 14:53:30
Ist da gar keine Datumsangabe mit in dem Reading?
Was passiert wenn sich das Reading mal einen Tag nicht ändert, woher weiß man auf welchen Tag sich das bezieht?
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: holle75 am 30 Mai 2018, 15:00:16
Das ist eine Hochrechnung mit dem statistics Modul ab zB 00:00:00 (standard). Resettet sich täglich zur definierten Uhrzeit.
Und mich interessiert nur, ob ich/jemand an diesem Tag da war.
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: CoolTux am 30 Mai 2018, 15:07:21
In der 99_myUtils findet sich eine Funktion
time_str2num("YYYY-MM-DD HH:MM:SS") - convert a time string to number of seconds since 1970

meinst Du sowas?
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: pc1246 am 30 Mai 2018, 15:08:39
Moin
Google ist Dein Freund: http://www.aip.de/groups/soe/local/handbuch/html/tecl.htm#a2
Also mit split! BEstimmt gibt es aber noch zwei drei weitere Loesungen.
Und Deine Erwartung ist auch falsch, da das 3721 ergeben wird und nicht 3601.
Gruss Christoph
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: holle75 am 30 Mai 2018, 15:13:32
@Cooltux Hatte ich probiert, Syntax-Error ... und im Weiterforschen hatte ich das Gefühl dass für time_str2num ein Datum im Reading vorhanden sein müßte?
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: Thyraz am 30 Mai 2018, 15:16:05
Ah, es geht also um eine Zeitdauer, nicht um einen Zeitstempel. ;)

Dann würde ich einfach mithilfe den Doppelpunkten splitten und die Werte dann nach dem Schema Stunden*3600 + Minuten*60 + Sekunden verrechnen.

edit: time_str2num kann man sicherlich auch zweckentfremden. Einfach an den String vorne 1970-01-01 anhängen.
Dann sollte die Differenz in Sekunden ja genau die Länge deines Zeitstrings sein.

edit2:
Aber das ist dennoch eine doofe Lösung, da das nur bei Durations kleiner 24h klappt. ;)
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: holle75 am 30 Mai 2018, 15:21:54
@pc1246

Na es ist ja nicht so, dass ich nicht wüßte wie man eine Suchmaschine bedient, aber ohne die entsprechenden Keywords oder mit der zB der Suche nach "HH:MM:SS in Sekunden perl" verschwendet man eben die von mir oben angesprochenen "mehreren Stunden" :D ...

Danke, hab ich mir angeschaut, werde ich versuchen zu verstehen. Scheint komplizierter als ich mir die Aufgabe gedacht hatte.
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: holle75 am 30 Mai 2018, 15:28:31
Zitat von: Thyraz am 30 Mai 2018, 15:16:05
Dann würde ich einfach mithilfe den Doppelpunkten splitten und die Werte dann nach dem Schema Stunden*3600 + Minuten*60 + Sekunden verrechnen.

Uuh, spannender Ansatz. Hast du noch eine Idee wie ich das im "Einzeiler"-DOIF implementiere? Holle hat kein Plan von Perl ;) ... leider!

... und gibt es tatsächlich keinen Perl-Befehl der das macht? Denn genau damit habe ich meine Zeit vertrödelt ... DEN Befehl zu finden.
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: Thyraz am 30 Mai 2018, 15:30:26
Ein Einzeiler ist es nicht geworden, aber ein Dreizeiler. ;)
Hoffe er funktioniert:


my $duration = "01:02:01"; # <- Festen String durch ReadingsVal Aufruf austauschen
my @parts = split(/:/,$duration);
my $seconds = $parts[0]*3600 + $parts[1]*60 + $parts[2];


Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: betateilchen am 30 Mai 2018, 15:32:03
In meiner 99_myUtils.pm gibt es dafür eine Funktion...


sub hms2secs($){
my ($t) = @_;
return substr($t,0,2) * 3600 + substr($t,3,2) * 60 + substr($t,6,2);
}
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: Thyraz am 30 Mai 2018, 15:33:47
Stellt sich die Frage wie der String in dem Reading aussieht falls Duration länger als 24h wird.
Bleibt das statistics Modul dann bei Stunden als größte Einheit, oder ändert sich der String dann nochmal vom Aufbau?

Spätestens wenn die Stundenzahl dreistellig wird ist dann auch betateilchens code überfordert. ;)
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: betateilchen am 30 Mai 2018, 15:39:02
Zitat von: Thyraz am 30 Mai 2018, 15:33:47
Spätestens wenn die Stundenzahl dreistellig wird ist dann auch betateilchens code überfordert.

Die Anforderung hier im Thread war aber, dass die Zeitangabe sich täglich zurückstellt, was dreistellige Stundenwerte ausschließt.

Ausserdem kann man auch bei substr() mit variablen Positionsangaben rechnen. Dann beginnt man eben nicht von links mit der Zählung, sondern von rechts.
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: holle75 am 30 Mai 2018, 15:58:43
Danke euch beiden. Denke, dass mit einer üblichen Zeitangabe von max 23:59:59 ja schon ein Großteil der aufkommenden Anforderungen abgedeckt ist.
Werde betateilchens Sub implementieren. Die Frage ist jetzt, wie würde ich das im DOIF aufrufen?

[{hms2secs(AnwesenheitHaupt,statStateDaypresent,0)}] > 12345

??
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: holle75 am 30 Mai 2018, 16:45:44
Also jetzt wirklich reiner Zufall das gefunden zu haben https://forum.fhem.de/index.php?topic=68705.0 (https://forum.fhem.de/index.php?topic=68705.0)

DOIF (hms2secs([AnwesenheitHaupt:statStateDaypresent]) > 600)

Auf die Klammerlogik wär ich nicht ansatzweise gekommen. Mal schauen obs funktioniert.

Edit: wo/wie kann ich mir das Ergebnis von hsm2secs anzeigen lassen?
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: betateilchen am 30 Mai 2018, 17:46:46
Zitat von: holle75 am 30 Mai 2018, 16:45:44
Edit: wo/wie kann ich mir das Ergebnis von hsm2secs anzeigen lassen?

In der Befehlszeile von FHEM {hms2secs(<hier kommt der Wert rein>)}

Zitat von: holle75 am 30 Mai 2018, 16:45:44
Auf die Klammerlogik wär ich nicht ansatzweise gekommen.

ich auch nicht, ich hätte ReadingsVal() verwendet, das ist nämlich logischer :)
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: holle75 am 30 Mai 2018, 18:10:36
Zitat von: betateilchen am 30 Mai 2018, 17:46:46
In der Befehlszeile von FHEM {hms2secs(<hier kommt der Wert rein>)}
Danke dir

so:
{hms2secs("AnwesenheitHaupt","statStateDaypresent")}
{hms2secs(AnwesenheitHaupt,statStateDaypresent)}



will er nicht. Wie wärs richtig?
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: Damian am 30 Mai 2018, 18:43:36
Warum willst du überhaupt umrechnen, ein Stringvergleich sollte für deinen Zweck ausrechend sein.

Wenn das Format immer HH:MM:SS ist, dann kannst du ganz einfach vergleichen:

([AnwesenheitHaupt:statStateDaypresent] gt "01:02:01")
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: holle75 am 30 Mai 2018, 19:35:26
Oh nee, wirklich jetzt? Hätte nicht gedacht, dass perl/DOIF auch Zeitstrings auf Größe vergleichen kann. Aber was gelernt.

Die Antwort darauf
Zitat von: holle75 am 30 Mai 2018, 18:10:36
Danke dir

so:
{hms2secs("AnwesenheitHaupt","statStateDaypresent")}
{hms2secs(AnwesenheitHaupt,statStateDaypresent)}



will er nicht. Wie wärs richtig?

würde mich aber trotzdem noch sehr interessieren.

Vielen Dank an euch
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: amenomade am 30 Mai 2018, 19:55:49
Zitat von: holle75 am 30 Mai 2018, 19:35:26
Oh nee, wirklich jetzt? Hätte nicht gedacht, dass perl/DOIF auch Zeitstrings auf Größe vergleichen kann. Aber was gelernt.

Die Antwort darauf
würde mich aber trotzdem noch sehr interessieren.

Vielen Dank an euch

{hms2secs(ReadingsVal("AnwesenheitHaupt","statStateDaypresent",0))}
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: holle75 am 30 Mai 2018, 20:01:56
Merci!
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: Per am 04 Juni 2018, 12:05:51
Zitat von: holle75 am 30 Mai 2018, 19:35:26Hätte nicht gedacht, dass perl/DOIF auch Zeitstrings auf Größe vergleichen kann. Aber was gelernt.
Macht es auch nicht, aber im GGsatz zum deutschen Datumsformat passt der Textvergleich bei der Zeit, wenn du mit führender Null bzw. führendem Leerzeichen arbeitest. Sonst musst du auffüllen.
Titel: Antw:HH:MM:SS in Sekunden
Beitrag von: Sailor am 17 April 2020, 13:35:02
Zitat von: betateilchen am 30 Mai 2018, 15:32:03
In meiner 99_myUtils.pm gibt es dafür eine Funktion...


sub hms2secs($){
my ($t) = @_;
return substr($t,0,2) * 3600 + substr($t,3,2) * 60 + substr($t,6,2);
}


Ich habe es mal ein bisschen verfeinert...


sub hms2secs($) {
my ($t) = @_;
my $TimeSec;

### Time: HH:MM:SS
if ($t =~ /^(2[0-3]|[01]?[0-9]):([0-5]?[0-9]):([0-5]?[0-9])$/) {
$TimeSec = substr($t,0,2) * 3600 + substr($t,3,2) * 60 + substr($t,6,2);
}
### Time: HH:MM
elsif ($t =~ /^(2[0-3]|[01]?[0-9]):([0-5]?[0-9])$/) {
$TimeSec = substr($t,0,2) * 3600 + substr($t,3,2) * 60;
}
### Time: HH
elsif ($t =~ /^(2[0-3]|[01]?[0-9])/) {
$TimeSec = substr($t,0,2) * 3600;
}
### Time: Undefined as criteria above
else {
$TimeSec = 0;
}
### For debugging purpose only
Log 5, "mUtils - hms2secs - t                                               : " . $t;
Log 5, "mUtils - hms2secs - TimeSec                                         : " . $TimeSec;

return($TimeSec);
}


Gruß
    Sailor