Hallo,
ich habe gestern ein Update auf Version
Zitat$Id: 98_DOIF.pm 24595 2021-06-06 17:52:38Z Damian $
durchgeführt und erhalte nun in mehreren Abfragen falsche Zeitberechnungen.
Ich verwende folgende Formel zur Bestimmung der Zeit, um damit stündlich ab Sonnenaufgang zu prüfen, ob die Bedingungen für das Schließen der Jalousien erfüllt sind.
([([[di_Tageslicht:SunUpTime]] + [01:30])-12:00,+[1]:00])
Aktuell ist Sonnenaufgang 04:54. Bis vor dem Update stand dann auch die korrekte Zeit (04:54 + 01:30) im DOIF in den Timern timer_01_c01, timer_04_c02 und timer_07_c03. Nach dem Update aber die Zeit 11:11.
Hier noch das ganze List dieses DOIF (allerdings etwas länger, deshalb habe ich den fraglichen Teil (siehe oben) herausgezogen.
Internals:
DEF (([?Wetter_Pro:fc0_tempMax] >= 20 and ([?Wetter_Pro:fc0_weatherMorning] =~ "sonnig" or [?Wetter_Pro:fc0_weatherMorning] =~ "heiter")) and ($month >= 4 && $month <= 10) and ([([[di_Tageslicht:SunUpTime]] + [01:30])-12:00,+[1]:00]) and [?du_Beschattung_Haus_morgens] ne "ja") (set du_Beschattung_Haus_morgens ja) ## Beschattung notwendig wenn Vorhersage Aussentemp. >= 20 °C UND (heiter oder sonnig) und immer nur zwischen April und Oktober, Überprüfung jede Stunde, wenn Dummy Beschatten nicht auf ja (sonst jede Stunde trigger) Geht nicht ([06:00-12:00,+01:00])
DOELSEIF ((([?Wetter_Pro:fc0_tempMax] > 22 and [?Wetter_Pro:fc0_weatherDay] =~ "unterschiedlich bewölkt") or [?Wetter_Pro:fc0_tempMax] > 23) and ($month >= 4 && $month <= 10) and ([([[di_Tageslicht:SunUpTime]] + [01:30])-12:00,+[1]:00]) and [?du_Beschattung_Haus_morgens] ne "ja") (set du_Beschattung_Haus_morgens ja) ## Beschattung notwendig wenn Vorhersage Aussentemp. > 22 °C UND unterschiedlich bewölkt ODER Aussentemp. > 23 °C und immer nur zwischen April und Oktober, Überprüfung jede Stunde, wenn Dummy Beschatten nicht auf ja (sonst jede Stunde trigger)
DOELSEIF (([?Wetter_Pro:fc0_weatherMorning] =~ "sonnig" or [?Wetter_Pro:fc0_weatherMorning] =~ "heiter" or [?Wetter_Pro:fc0_weatherMorning] =~ "unterschiedlich bewölkt" or [?Wetter_Pro:fc0_weatherMorning] =~ "wolkig") and ($month >= 4 && $month <= 10) and ([([[di_Tageslicht:SunUpTime]] + [01:30])-12:00,+[1]:00]) and [?du_Beschattung_Haus_morgens] eq "nein") (set du_Beschattung_Haus_morgens Fenster) ## Beschattung notwendig wenn Vorhersage Wetter (heiter oder sonnig oder unterschiedlich bewölkt) und immer nur zwischen November und April, Überprüfung jede Stunde Muss noch bei Monaten angepaßt werden
DOELSEIF ([23:59]) (set du_Beschattung_Haus_morgens nein) ## Merker zurücksetzen
FUUID 5c4c3934-f33f-6b6f-15db-69337ccabe962381
MODEL FHEM
NAME di_Beschattung_Haus_morgens
NOTIFYDEV di_Tageslicht,global
NR 1685
NTFY_ORDER 50-di_Beschattung_Haus_morgens
STATE Nur Fenster
TYPE DOIF
VERSION 24595 2021-06-06 17:52:38
READINGS:
2021-06-14 07:33:41 cmd 3
2021-06-14 07:33:41 cmd_event set_cmd_3
2021-06-14 07:33:41 cmd_nr 3
2021-05-31 09:29:03 mode enabled
2021-06-14 07:33:41 state Nur Fenster
2021-06-14 04:54:31 timer_01_c01 14.06.2021 11:11:00
2021-06-13 12:00:00 timer_02_c01 14.06.2021 12:00:00
2021-06-14 04:54:31 timer_04_c02 14.06.2021 11:11:00
2021-06-13 12:00:00 timer_05_c02 14.06.2021 12:00:00
2021-06-14 04:54:31 timer_07_c03 14.06.2021 11:11:00
2021-06-13 12:00:00 timer_08_c03 14.06.2021 12:00:00
2021-06-13 23:59:00 timer_10_c04 14.06.2021 23:59:00
2021-06-13 11:00:01 wait_timer no timer
Regex:
accu:
collect:
itimer:
di_Tageslicht:
itimer:
SunUpTime ^di_Tageslicht$:^SunUpTime:
attr:
cmdState:
0:
Beschatten Alles 20
1:
Beschatten Alles 22
2:
Nur Fenster
3:
Dummy
wait:
0:
rand(5)
1:
rand(5)
2:
rand(5)
3:
0
waitdel:
condition:
0 (::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') >= 20 and (::ReadingValDoIf($hash,'Wetter_Pro','fc0_weatherMorning') =~ "sonnig" or ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weatherMorning') =~ "heiter")) and ($month >= 4 && $month <= 10) and (::DOIF_time($hash,0,1,$wday,$hms)) and ::InternalDoIf($hash,'du_Beschattung_Haus_morgens','STATE') ne "ja"
1 ((::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') > 22 and ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weatherDay') =~ "unterschiedlich bewölkt") or ::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') > 23) and ($month >= 4 && $month <= 10) and (::DOIF_time($hash,3,4,$wday,$hms)) and ::InternalDoIf($hash,'du_Beschattung_Haus_morgens','STATE') ne "ja"
2 (::ReadingValDoIf($hash,'Wetter_Pro','fc0_weatherMorning') =~ "sonnig" or ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weatherMorning') =~ "heiter" or ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weatherMorning') =~ "unterschiedlich bewölkt" or ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weatherMorning') =~ "wolkig") and ($month >= 4 && $month <= 10) and (::DOIF_time($hash,6,7,$wday,$hms)) and ::InternalDoIf($hash,'du_Beschattung_Haus_morgens','STATE') eq "nein"
3 ::DOIF_time_once($hash,9,$wday)
days:
do:
0:
0 set du_Beschattung_Haus_morgens ja
1:
0 set du_Beschattung_Haus_morgens ja
2:
0 set du_Beschattung_Haus_morgens Fenster
3:
0 set du_Beschattung_Haus_morgens nein
4:
helper:
DEVFILTER ^global$|^di_Tageslicht$
NOTIFYDEV global|di_Tageslicht
event timer_10
globalinit 1
last_timer 10
sleepdevice timer_3
sleepsubtimer -1
sleeptimer -1
timerdev
timerevent timer_10
triggerDev
timerevents:
timer_10
timereventsState:
timer_10
internals:
all du_Beschattung_Haus_morgens:STATE
interval:
0 -1
1 0
3 -1
4 3
6 -1
7 6
intervalfunc:
2 ::DOIF_time($hash,0,1,$wday,$hms)
5 ::DOIF_time($hash,3,4,$wday,$hms)
8 ::DOIF_time($hash,6,7,$wday,$hms)
intervaltimer:
0 2
1 2
3 5
4 5
6 8
7 8
localtime:
0 1623661860
1 1623664800
3 1623661860
4 1623664800
6 1623661860
7 1623664800
9 1623707940
perlblock:
realtime:
0 11:11:00
1 12:00:00
3 11:11:00
4 12:00:00
6 11:11:00
7 12:00:00
9 23:59:00
time:
0 ([[di_Tageslicht:SunUpTime]]+[01:30])
1 12:00:00
2 +[1]:00
3 ([[di_Tageslicht:SunUpTime]]+[01:30])
4 12:00:00
5 +[1]:00
6 ([[di_Tageslicht:SunUpTime]]+[01:30])
7 12:00:00
8 +[1]:00
9 23:59:00
timeCond:
0 0
1 0
2 0
3 1
4 1
5 1
6 2
7 2
8 2
9 3
timer:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
timers:
0 0 1 2
1 3 4 5
2 6 7 8
3 9
triggertime:
1623661860:
localtime 1623661860
hash:
1623664800:
localtime 1623664800
hash:
1623707940:
localtime 1623707940
hash:
uiState:
uiTable:
Attributes:
cmdState Beschatten Alles 20 | Beschatten Alles 22 | Nur Fenster | Dummy
comment 09.05: Beschattungsstart immer 90 Min. nach Sonnenaufgang
initialize nein
room 1.2_Kueche,9.8.1_DOIF
timerWithWait 1
wait rand(5):rand(5):rand(5):0
Damit ermittele ich die Zeit des Sonnenaufganges (reading Sonnenaufgang stimmt nicht, wird aber nicht verwendet. Habe es mit SunUpTime dann hinbekommen):
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 24595 2021-06-06 17:52:38
READINGS:
2021-06-14 04:54:31 Sonnenaufgang 14
2021-06-14 04:54:31 Sonnenuntergang 21:38
2021-06-14 04:54:31 SunDownTimeKor 21:08
2021-06-14 04:54:31 SunUpTime 04:54
2021-06-14 04:54:31 cmd 1
2021-06-14 04:54:31 cmd_event timer_1
2021-06-14 04:54:31 cmd_nr 1
2021-03-21 14:28:32 mode enabled
2021-06-14 04:54:31 state hell
2021-06-14 04:54:31 timer_01_c01 15.06.2021 04:54:24
2021-06-13 21:38:21 timer_02_c02 14.06.2021 21:38:53
Regex:
accu:
collect:
attr:
cmdState:
0:
hell
1:
dunkel
waitdel:
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
event timer_1
globalinit 1
last_timer 2
sleeptimer -1
timerdev
timerevent timer_1
triggerDev
timerevents:
timer_1
timereventsState:
timer_1
triggerEvents:
timer_1
triggerEventsState:
timer_1
interval:
intervalfunc:
localtime:
0 1623725664
1 1623699533
perlblock:
realtime:
0 04:54:24
1 21:38:53
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:
1623699533:
localtime 1623699533
hash:
1623725664:
localtime 1623725664
hash:
uiState:
uiTable:
Attributes:
cmdState hell | dunkel
comment SunDownTimeKor: Sonnenuntergang minus 30 Minuten.
do always
initialize hell
room 9.8.1_DOIF
userReadings Sonnenaufgang {ReadingsTimestamp($name,"timer_01_c01","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;return "$3";},
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
Ist jemand bekannt, ob es im DOIF eine Änderung gab, sodaß diese Art der Zeitberechnung nicht mehr funktioniert oder kann mir Tipps geben, worand as liegen kann?
Grüße Jürgen
An dieser Stelle hat sich seit langer Zeit Modul nichts geändert. Nach einem Neustart wird die Zeit neu eingelesen. Vielleicht war sie zu diesem Zeitpunkt anders. Sonst ist eine Analyse im Nachhinein schwierig.
Dann warte ich einmal den Tageswechsel heute Nacht ab und schaue, ob dann die Zeiten wieder stimmen. Ich war der Meinung, dass wegen der stündlichen Aktualisierung auch nach einem Neustart spätestens nach 1 Stunde die Zeiten wieder stimmen, was aber nicht so war.
Danke für die Info
Hallo Jürgen,
Schau mal unter
https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit
Vielleicht kann man davon etwas nutzen zur Vereinfachung.
Die periodische Prüfung würde ich mit einem at device machen.
Grüße
Werner
Zitat von: bmwfan am 14 Juni 2021, 14:15:36
Dann warte ich einmal den Tageswechsel heute Nacht ab und schaue, ob dann die Zeiten wieder stimmen. Ich war der Meinung, dass wegen der stündlichen Aktualisierung auch nach einem Neustart spätestens nach 1 Stunde die Zeiten wieder stimmen, was aber nicht so war.
Danke für die Info
Ich brauche einen nachvollziehbaren Fall, damit ich es analysieren kann.