Dummy Zeitdifferenz berechnen

Begonnen von neyzen, 16 Oktober 2019, 09:35:06

Vorheriges Thema - Nächstes Thema

neyzen

Hallo Forum,

ich habe einen Dummy in der ich einmal am Tag eine Uhrzeit reinschreiben lasse. Diese Uhrzeit steht im state und ändert sich jeden Tag.
Ich möchte gerne so eine Art counter, der mir die verbleibende Zeit bis zu dieser Uhrzeit im Dummy ausrechnet.
Wie kann ich das am einfachsten machen?

Vielen Dank

Otto123

#1
Hallo,

da die Infos zu wenige sind - erstmal dieser aktuelle Fall zum Lesen https://forum.fhem.de/index.php/topic,104521.msg983878.html#msg983878

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

rabehd

(Dummystate in Unix-Zeit) minus (Jetzt in Unix-Zeit)  ist gleich Zeit von jetzt bis zur eingestellten Uhrzeit.

Ein Counter soll sich doch ändern? Wofür  diese Info?

Wie Otto schon schreibt, zu wenig Infos.
Was willst Du , was hast Du (Format...)?
Auch funktionierende Lösungen kann man hinterfragen.

neyzen

Mein Dummy sieht wie folgt aus.

Internals:
   FUUID      5d98904c-f33f-2b39-cdc4-2980959b2414496b
   NAME       Aksam
   NR         151
   STATE      18:41
   TYPE       dummy
   READINGS:
     2019-10-16 20:33:04   state           18:41
   helper:
     bm:
       dummy_Set:
         cnt        22
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        16.10. 20:33:04
         max        0.0145821571350098
         tot        0.0226759910583496
         mAr:
           HASH(0x3d536c8)
           Aksam
           18:41
Attributes:
   room       Namaz
   sortby     05


Die Uhrzeit im state, hier 18:41 schreibe ich mir mit einem at Befehl jeden Tag vom HTTPMOD raus.

Internals:
   COMMAND    set Aksam {(ReadingsVal('Namaz','05_Abendgebet','18:00'))}
   DEF        *02:00:45 set Aksam {(ReadingsVal('Namaz','05_Abendgebet','18:00'))}
   FUUID      5d9903c1-f33f-2b39-3cab-1393bc8a4454e2bf
   NAME       Gebet_Aksam_aktualisieren
   NR         157
   PERIODIC   yes
   RELATIVE   no
   REP        -1
   STATE      Next: 02:00:45
   TIMESPEC   02:00:45
   TRIGGERTIME 1571270445
   TRIGGERTIME_FMT 2019-10-17 02:00:45
   TYPE       at
   READINGS:
     2019-10-16 02:00:45   state           Next: 02:00:45
   helper:
     bm:
       at_Set:
         cnt        17
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        15.10. 21:24:28
         max        0.000164985656738281
         tot        0.00147318840026855
         mAr:
           HASH(0x3d87450)
           Gebet_Aksam_aktualisieren
           ?
Attributes:
   room       Namaz


Diese Uhrzeit ändert sich jeden Tag.
Ich möchte nur die Verbleibende Zeit berechnen. Also JetztZeit - DummyZeit.
Dieses soll später nur als Information dienen die ich auch auf dem FTUI darstellen möchte.


rabehd

Ich denke, dann ist die Frage hier falsch und gehört ins Unterforum FTUI.

Es wäre Unsinn ein Reading jede Sekunde oder Minute zu berechnen und dann in FTUI darzustellen.
Das geht wohl in z.B. Javaskript.
Auch funktionierende Lösungen kann man hinterfragen.

Otto123

#5
Vorschlag userReading
attr Aksam userReadings ZeitSec {time_str2num(strftime("%Y-%m-%d", localtime)." ".ReadingsVal($name,"state",""))-time}
liefert die Zeit bis zum "state" in Sekunden.
Man kann den Perlcode aber anderweitig und in anderen Geräten verwenden, dann ist  $name durch "Aksam" zu ersetzen. Für den "counter" müsste dann der Code geeignet getriggert werden. Da gäbe es sicher viele viele Varianten ...

Vom Rest hab ich keine Ahnung :)

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

rabehd

ZitatVorschlag userReading
War auch meine erste Idee, aber dann braucht man einen Auslöser, der die Neuberechung anstößt und am Ende erzeugt man unnötige Last. Solche Wünsche sollte das Anzeigesystem erfüllen, nicht FHEM.
Auch funktionierende Lösungen kann man hinterfragen.

Otto123

#7
Hast ja zu 100% Recht. Aber genau genommen war die Aktualisierung nicht gefragt :) oder nur "versteckt" formuliert. Und von Aktualisierungsfrequenz war gar keine Rede. "Nur als Information und später ..." - alles sehr wage :)

Wenn der Lösungsansatz nicht genannt wird,... - Dann versuch ich einfach nur die Frage zu beantworten ;)
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

rabehd

#8
Den Lösungsansatz finde ich schon im Eröffungsbeitrag, sogar das Wort "counter".
Was fehlt ist der Anwendungsfall, von FTUI war am Anfang auch nicht die Rede.
Ich sehe es wie Du, zu wenig Info.
Man kann eine schnelle Antwort geben, die zwar die Frage beantwortet, aber nicht das wirkliche Problem löst.

Wir haben beide unser bestes getan und ihm ist hoffentlich geholfen.
Was wären die vielen Nutzer ohne Deine Aktivität hier. Ich schätze Deine Beiträge sehr.

Da wäre noch einer mit dem Problem https://forum.fhem.de/index.php/topic,104573.msg984533.html#msg984533
Auch funktionierende Lösungen kann man hinterfragen.

neyzen


neyzen

Zitat von: Otto123 am 16 Oktober 2019, 21:14:47
Vorschlag userReading
attr Aksam userReadings ZeitSec {time_str2num(strftime("%Y-%m-%d", localtime)." ".ReadingsVal($name,"state",""))-time}
liefert die Zeit bis zum "state" in Sekunden.
Man kann den Perlcode aber anderweitig und in anderen Geräten verwenden, dann ist  $name durch "Aksam" zu ersetzen. Für den "counter" müsste dann der Code geeignet getriggert werden. Da gäbe es sicher viele viele Varianten ...

Vom Rest hab ich keine Ahnung :)

Gruß Otto

Leider bin ich erst jetzt dazu gekommen das einzupflegen.
Otto nochmals Danke für deinen Code, funktioniert!
Allerdings, wie bekomme ich diese Zahl als Uhrzeit dargestellt in HH:MM Format?

Internals:
   FUUID      5d98904c-f33f-2b39-cdc4-2980959b2414496b
   NAME       Aksam
   NR         151
   STATE      20:34
   TYPE       dummy
   READINGS:
     2019-10-18 20:02:42   ZeitSec         1878
     2019-10-18 20:02:42   state           20:34
   helper:
     bm:
       dummy_Set:
         cnt        85
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        16.10. 20:33:04
         max        0.0145821571350098
         tot        0.0981221199035645
         mAr:
           HASH(0x3d536c8)
           Aksam
           18:41
Attributes:
   room       Namaz
   sortby     05
   userReadings ZeitSec {time_str2num(strftime("%Y-%m-%d", localtime)." ".ReadingsVal($name,"state",""))-time}

Otto123

#11
Dazu brauchst Du z.B. int() und % (modulo)
Nach folgendem Schema, probier es einfach aus:
{my $var=7322;;int($var/3600)}
{my $var=7322;;$var%3600}
Tipp
Die Stunde hat 3600 sec
Die Minute hat 60 sec
;D
Hab noch sowas gefunden:
{my $sec=7322;; my $min=$sec/60;;my $st=int($min/60);;my $restmin=$min%60;; my $restsec=$sec%60;; my $ergebnis="$st h $restmin min $restsec sek";; return $ergebnis}

Ob es eine einfachere Gesamtfunktion gibt weiß ich nicht :-[

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

neyzen

Otto, vielen vielen Dank. 8)

Internals:
   FUUID      5d98904c-f33f-2b39-cdc4-2980959b2414496b
   NAME       Aksam
   NR         151
   STATE      22:33
   TYPE       dummy
   READINGS:
     2019-10-18 21:45:18   RestZeit        0 h 47 min 42 sek
     2019-10-18 21:45:18   ZeitSec         2862
     2019-10-18 21:45:18   state           22:33
   helper:
     bm:
       dummy_Set:
         cnt        342
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        18.10. 21:18:32
         max        0.0289838314056396
         tot        0.536463975906372
         mAr:
           HASH(0x3d536c8)
           Aksam
           21:33
Attributes:
   room       Namaz
   sortby     05
   userReadings ZeitSec {time_str2num(strftime("%Y-%m-%d", localtime)." ".ReadingsVal($name,"state",""))-time},
RestZeit {my $sec=ReadingsVal("Aksam","ZeitSec",0);; my $min=$sec/60;;my $st=int($min/60);;my $restmin=$min%60;; my $restsec=$sec%60;; my $ergebnis="$st h $restmin min $restsec sek";; return $ergebnis}