Hallo,
ich möchte ein Userreding erstellen das mit die Zeitdifferenz zur aktuellen Zeit in Minuten darstellt.
Reading in %H:%M - aktuelle Urzeit = Restzeit in Minuten
ich habe schon probiert, bekomme es aber nicht hin.
1_rtime {POSIX::strftime("%H:%M",localtime)-(localtime(ReadingsNum("$NAME","1_time", "0")))},
Kennt sich jemand damit aus und hat ein Beispiel?
Danke
ReadingsNum("$NAME","1_time", "0")
1_time ist Unixformat? Dann nimm von der aktuellen Zeit auf Unixformat und rechne das Ergebnis der Subtraktion dann einfach mal 60. Sollte meiner Meinung dann die Zeitdifferenz in Minuten sein.
Die Zeit in 1_time ist im Format 12:44.
Dies musste ich in Sekunden umrechnen?
Die aktuelle Zeit in Sekunden?
Differenz bilden, mal 60.
Theoretisch ist mir das klar, leider praktisch nicht.
Zitat von: stefan-dd am 08 November 2020, 12:50:15
Die Zeit in 1_time ist im Format 12:44.
Dies musste ich in Sekunden umrechnen?
Die aktuelle Zeit in Sekunden?
Differenz bilden, mal 60.
Theoretisch ist mir das klar, leider praktisch nicht.
Die 12:44 musst Du samt Datum, gehe mal davon aus vom aktuellen Datum, in Unix-Zeit umrechnen. Und die aktuelle Zeit eh in Unix-Time ausgeben lassen. Beides kannst du erstmal versuchen bezüglich Perl zu recherchieren. Und dann schauen wir mal.
Grüße
...und nicht mal 60, sondern geteilt durch 60, wenn du Sekunden in Minuten umrechnen willst ;)
Hallo,
Die unix Zeit in Sekunden bekomme ich damit:
3_rtime {time()},
Die Tagesminuten erhalte ich damit:
4_rtime { my($a,$b) = split(':', ReadingsVal("$name","1_time", '0:0')); return ($a*60)+$b; },
Wie kann ich die Tagesminuten errechen?
(%H*60)+%M
Wie kann ich die aktuelle Zeit in Minuten umrechnen? Wie müsste man den Code gestalten?
Ich müsste mir das auch erst einmal in Ruhe anschauen. Aber nicht mehr heute. Ich schaue die Tage mal. Eventuell hast Du es bis dahin auch schon alleine hinbekommen. Aber ich schaue es mir auf jeden Fall an.
Hi,
Da im Reading eine Zeit ohne Tagesbezug steht, wird es in jedem Fall beim Tageswechsel ein Problem geben?!
Dann würde ich einfach die Stunden mit 60 multiplizieren und gut.
Mal als Beispiel (wie ich das meine) für die FHEM Kommandozeile.
$t1 ist Dein Reading, $t2 wird die aktuelle Zeit.
{my $t1="21:10";;my $t2=POSIX::strftime("%H:%M",localtime(time()));;$t1=~ /(\d\d).(\d\d)/;;my $m1= $1*60+$2;;$t2=~ /(\d\d).(\d\d)/;;my $m2= $1*60+$2;;return $m2-$m1}
Geht vielleicht schöner :)
Hier steht noch ein bisschen was dazu: https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit
Gruß Otto
Internals:
FUUID 5fa81d11-f33f-5153-fe46-625fa209d68e7c10
FVERSION 98_dummy.pm:0.206650/2019-12-06
NAME testZeitUmrechnung
NR 111
STATE ???
TYPE dummy
READINGS:
2020-11-10 04:53:47 1_time 4:52
2020-11-10 04:53:47 min 1438
Attributes:
readingList 1_time
room Test
setList 1_time
userReadings min:1_time:.* {
use Date::Parse;
my $t1 = time();
my $t2 = ( Date::Parse::str2time(POSIX::strftime("%D",localtime(time())) . ' ' . ReadingsVal($name,'1_time','00:00:00')) > $t1
? Date::Parse::str2time(POSIX::strftime("%D",localtime(time())) . ' ' . ReadingsVal($name,'1_time','00:00:00'))
: Date::Parse::str2time(POSIX::strftime("%D",localtime(time())) . ' ' . ReadingsVal($name,'1_time','00:00:00')) + 86400 );
return int(($t2-$t1)/60)
}
Ist aber für mein Geschmack etwas viel für ein userReadings. Würde ich in eine myUtils stecken.
Sind das nicht (indirekt) ein paar viele use-Anweisungen...?
Mehr Optionen bzw. Anregungen:
- localtime()[2] liefert z.B. auch direkt die aktuelle Stunde
- in SUNRISE_EL sind auch ein paar Funktionen drin, mit denen man hh:mm[:ss] - Angaben in n.nn Stunden umrechnen kann (=> diese Werte kann man ganz normal addieren/subtrahieren) und daraus (bzw. der Differenz etc.) wieder einen hh, mm, ss-Rückgabewerte liefern, mit denen man wieder einen formatierten String basteln könnte.
Siehe hms2h() und h2hms().
- Twilight gibt es eine sub secondsSinceMidnight, die evtl. auch interessant ist, wenn man irgendwas über den heutigen Tag wissen will.
sub secondsSinceMidnight {
my $now = shift // time();
my @time = localtime($now);
my $secs = ( $time[2] * 3600 ) + ( $time[1] * 60 ) + $time[0];
return $secs;
}
Im main-Kontext sind dann auch noch ein paar Konstanten vorhanden (HOURSECONDS etc.), mit denen sowas lesbarer wird.
Ist ja nur eine Einzige use Anweisung. Für das use Date::Parse
Möglich das sowas schon in der main geladen wird, hatte ich jetzt nicht probiert.
Der Code funktioniert noch besser, da er den Tageswechsel kompensiert.
userReadings min:1_time:.* {
use Date::Parse;
my $t1 = time();
my $t2 = ( Date::Parse::str2time(POSIX::strftime("%D",localtime(time())) . ' ' . ReadingsVal($name,'1_time','00:00:00')) > $t1
? Date::Parse::str2time(POSIX::strftime("%D",localtime(time())) . ' ' . ReadingsVal($name,'1_time','00:00:00'))
: Date::Parse::str2time(POSIX::strftime("%D",localtime(time())) . ' ' . ReadingsVal($name,'1_time','00:00:00')) + 86400 );
return int(($t2-$t1)/60)
}
Wie bekomme ich das in die myUtils?
https://wiki.fhem.de/wiki/99_myUtils_anlegen
Hier findest Du Infos dazu.
Danke,
das habe ich schon gelesen.
Ich weis leider nicht wo mein Fehler ist.
sub rtime($$$)
{
use Date::Parse;
my ($device) = @_;
my $t1 = time();
my $t2 = ( Date::Parse::str2time(POSIX::strftime("%D",localtime(time())) . ' ' . ReadingsVal("$device",'7-6','00:00:00')) > $t1
? Date::Parse::str2time(POSIX::strftime("%D",localtime(time())) . ' ' . ReadingsVal("$device",'7-6','00:00:00'))
: Date::Parse::str2time(POSIX::strftime("%D",localtime(time())) . ' ' . ReadingsVal("$device",'7-6','00:00:00')) + 86400 );
return int(($t2-$t1)/60)
}
userReadings {rtime("$name","1-6"}
da fehlt mindestens eine Klammer {rtime("$name","1-6"}
Poste bitte einmal die ganze myUtils und dann korrigieren wir zusammen. Da ist einiges.
Jetzt funktioniert es, wie es soll:
sub VVOtime($$)
{
use Date::Parse;
my ($device,$reading) = @_;
my $t1 = time();
my $t2 = ( Date::Parse::str2time(POSIX::strftime("%D",localtime(time())) . ' ' . ReadingsVal("$device","$reading",'00:00:00')) > $t1
? Date::Parse::str2time(POSIX::strftime("%D",localtime(time())) . ' ' . ReadingsVal("$device","$reading",'00:00:00'))
: Date::Parse::str2time(POSIX::strftime("%D",localtime(time())) . ' ' . ReadingsVal("$device","$reading",'00:00:00')) + 86400 );
return int(($t2-$t1)/60)
}
Der Code funktioniert. Hat aber noch ein kleines Problem.
Wenn die aktuelle Zeit, gleich der Abfahrtszeit ist, wenn 0 angezeigt werden sollte, wird 1440 Minuten angezeigt.
Wo kann man da noch was anpassen?