Userreading Zeitdifferenz in Minuten

Begonnen von stefan-dd, 08 November 2020, 10:45:08

Vorheriges Thema - Nächstes Thema

stefan-dd

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

CoolTux

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

stefan-dd

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.

CoolTux

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

xenos1984

...und nicht mal 60, sondern geteilt durch 60, wenn du Sekunden in Minuten umrechnen willst ;)

stefan-dd

#5
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?



CoolTux

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

Otto123

#7
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

CoolTux

#8

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

Beta-User

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

CoolTux

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

stefan-dd

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?

CoolTux

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

stefan-dd

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"}

Otto123

da fehlt mindestens eine Klammer {rtime("$name","1-6"}
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz