Hauptmenü

[gelöst] HH:MM:SS in Sekunden

Begonnen von holle75, 30 Mai 2018, 14:46:55

Vorheriges Thema - Nächstes Thema

holle75

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

Thyraz

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?
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

holle75

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.

CoolTux

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?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

pc1246

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
HP T610
Onkyo_AVR;Enigma2; SB_Server; SB_Player; HM-USB; PhilipsTV; harmony hub; Jeelink mit PCA301; Somfy; S7-300; LGW; HUE; HM-IP auf Charly; div

holle75

@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?

Thyraz

#6
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. ;)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

holle75

@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.

holle75

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.

Thyraz

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


Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

betateilchen

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);
}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thyraz

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. ;)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

holle75

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

??

holle75

#14
Also jetzt wirklich reiner Zufall das gefunden zu haben 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?