Hallo,
ich habe nach einem Neustart von FHEM das Problem, dass die Userreadings im DOIF nicht aktualisiert werden und somit falsche Zeiten im Programm verwendet werden. Ich kann zwar manuell cmd1 (für Tageslicht hell) oder cmd2 (für Tageslicht dunkel) ausführen, die zugehörigen userreadings (sonnenuntergang...) werden aber nicht aktualisiert. Gibt es eine Möglichkeit, diese manuell oder besser automatisiert bei einem Neustart von FHEM (nach Update oder wie heute morgen, als der FI im Erdgeschoß ausgelöst hat) zu aktualisieren?
Anbei das List des DOIF nach einem Neustart heute morgen. SunDownTimeKor und Sonnenuntergang zeigen völlig falsche Werte an. Sonnenuntergang ist die Zeit des Neustarts, SunDownTimeKor die abzgl. 30 Minuten.
Internals:
DEF ([{sunrise("HORIZON=-4")}]) (set du_Tageslicht hell)
DOELSEIF ([{sunset("HORIZON=-3")}]) (set du_Tageslicht dunkel)
FUUID 5c4c3931-f33f-6b6f-479e-df5724a54a7d2405
MODEL FHEM
NAME di_Tageslicht
NOTIFYDEV global
NR 1324
NTFY_ORDER 50-di_Tageslicht
STATE hell
TYPE DOIF
VERSION 24643 2021-06-16 07:26:15
OLDREADINGS:
READINGS:
2021-07-11 17:24:12 Sonnenuntergang 09:50
2021-07-11 17:24:12 SunDownTimeKor 09:20
2021-07-11 17:24:12 SunUpTime 09:50
2021-07-11 17:24:12 cmd 1
2021-07-11 17:24:12 cmd_event set_cmd_1
2021-07-11 17:24:12 cmd_nr 1
2021-03-21 14:28:32 mode enabled
2021-07-11 17:24:12 state hell
2021-07-11 09:50:32 timer_01_c01 12.07.2021 05:08:07
2021-07-11 09:50:32 timer_02_c02 11.07.2021 21:36:14
Regex:
accu:
collect:
attr:
cmdState:
0:
hell
1:
dunkel
condition:
0 ::DOIF_time_once($hash,0,$wday)
1 ::DOIF_time_once($hash,1,$wday)
days:
do:
0:
0 set du_Tageslicht hell
1:
0 set du_Tageslicht dunkel
2:
helper:
DEVFILTER ^global$
NOTIFYDEV global
globalinit 1
last_timer 2
sleeptimer -1
triggerDev
intervalfunc:
localtime:
0 1626059287
1 1626032174
perlblock:
realtime:
0 05:08:07
1 21:36:14
time:
0 {sunrise("HORIZON=-4")}
1 {sunset("HORIZON=-3")}
timeCond:
0 0
1 1
timer:
0 0
1 0
timers:
0 0
1 1
triggertime:
1626032174:
localtime 1626032174
hash:
1626059287:
localtime 1626059287
hash:
uiState:
uiTable:
Attributes:
cmdState hell | dunkel
comment SunDownTimeKor: Sonnenuntergang minus 30 Minuten.
do always
initialize initialized
room 9.8.1_DOIF
userReadings Sonnenuntergang {ReadingsTimestamp($name,"timer_02_c02","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;return "$4";},
SunUpTime {POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name,"timer_01_c01","2000-01-01 00:00:00"))))},
SunDownTimeKor {POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name,"timer_02_c02","2000-01-01 00:00:00"))-30*60))},
verbose 1
Grüße Jürgen
Ergänzung 13.07:
Ich vermute, da es keine Antworten gab, dass entweder die Lösung trivial ist und ich sie nur nicht gefunden habe oder dass es nicht möglich ist, userreadings nach einem reboot automatisch zu aktualisieren.
Bei Möglichkeit 1 (ich habe es nicht gefunden): Kann mir vielleicht jemand einen Tip geben?
Die Timer-Readings des DOIF sind nicht offiziell. Die würde ich als User nicht auswerten.
Besser ist es mit indirekten Zeitangaben im DOIF zu arbeiten: https://fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben
Es schien mir der einfachste Weg und ich dachte, wenn ich die Schaltzeiten nur einmal speichere und mehrfach im Programm verwende ist das zeitsparender, als immer das Modul aufzurufen, um die Zeit zu ermitteln.
Dann mache ich mich auf, die vielen Programmstellen zu ändern und immer die Funktion sunriese oder sunset einzubauen.
Danke
Zitat von: bmwfan am 13 Juli 2021, 20:15:54
Es schien mir der einfachste Weg und ich dachte, wenn ich die Schaltzeiten nur einmal speichere und mehrfach im Programm verwende ist das zeitsparender, als immer das Modul aufzurufen, um die Zeit zu ermitteln.
Genau das kannst du über indirekte Zeiten realisieren, dann brauchst du nur die Zeiten in den Readings anpassen und musst die DOIF-Definitionen nicht anpacken.