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
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
(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...)?
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.
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.
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
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.
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 ;)
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 (https://forum.fhem.de/index.php/topic,104573.msg984533.html#msg984533)
Ich danke euch beiden. 8)
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}
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
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}