Hallo,
ich habe ein DOIF mit sunrise/sunset, welches noch zusätzlich von einem anderen Device mit dem Wolkenbedeckungsgrad gespeist wird. Ich möchte damit die timespec, in dem sunrise/sunset vorkommt, je nach Bedeckungsgrad leicht variieren, d.h. sunrise soll bei Bedeckung eine spätere Zeit und sunset eine frühere Zeit annehmen.
Ich habe dazu eine periodische Bedingung im letzten Zweig gesetzt, die auch das Reading mit der Wolkenbedeckung neu setzt, aber nicht die timespecs der Bedingungen 1 und 2, in denen sunrise/sunset vorkommt.
Hat jemand eine Idee, wie ich die timespec aktuell halten kann?
Viele Grüße Gisbert
Internals:
CFGFN
DEF ([{sunrise_abs(1800+ReadingsVal('Bewegungsmelder','clouds',''))}])
(set WS_FlurEG day)
(set WS_Garage day)
DOELSEIF ([{sunset_abs(-1800-ReadingsVal('Bewegungsmelder','clouds',''))}])
(set WS_FlurEG night)
(set WS_Garage night)
DOELSEIF ([WS_FlurEG:state]==0
and [?WS_FlurEG:day]==1
and [?WS_FlurEG:mode]==0)
(set WS_FlurEG _off)
DOELSEIF ([WS_FlurEG:state]==0
and [?WS_FlurEG:day]==0
and [?WS_FlurEG:mode]==0)
(set WS_FlurEG _off)
DOELSEIF ([+[1]:10])
FUUID 60170514-f33f-e986-bd02-dfbb4665652e7fc1
MODEL FHEM
NAME Bewegungsmelder
NOTIFYDEV global,WS_FlurEG
NR 1269
NTFY_ORDER 50-Bewegungsmelder_innen
STATE cmd_5
TYPE DOIF
VERSION 23633 2021-01-28 19:10:32
OLDREADINGS:
READINGS:
2021-02-04 08:10:00 clouds 1272
2021-02-04 08:10:00 cmd 5
2021-02-04 08:10:00 cmd_event timer_3
2021-02-04 08:10:00 cmd_nr 5
2021-02-04 08:09:06 mode enabled
2021-02-04 08:10:00 state cmd_5
2021-02-04 08:08:56 timer_01_c01 04.02.2021 08:20:14
2021-02-04 08:08:56 timer_02_c02 04.02.2021 17:11:48
2021-02-04 08:10:00 timer_03_c05 04.02.2021 09:10:00
Regex:
accu:
cond:
WS_FlurEG:
2:
state ^WS_FlurEG$:^state:
3:
state ^WS_FlurEG$:^state:
attr:
cmdState:
wait:
0:
0
0
1:
15
15
2:
120
120
3:
0
waitdel:
condition:
0 ::DOIF_time_once($hash,0,$wday)
1 ::DOIF_time_once($hash,1,$wday)
2 ::ReadingValDoIf($hash,'WS_FlurEG','state')==0 and ::ReadingValDoIf($hash,'WS_FlurEG','day')==1 and ::ReadingValDoIf($hash,'WS_FlurEG','mode')==0
3 ::ReadingValDoIf($hash,'WS_FlurEG','state')==0 and ::ReadingValDoIf($hash,'WS_FlurEG','day')==0 and ::ReadingValDoIf($hash,'WS_FlurEG','mode')==0
4 ::DOIF_time_once($hash,2,$wday)
days:
do:
0:
0 set WS_FlurEG day
1 set WS_Garage day
1:
0 set WS_FlurEG night
1 set WS_Garage night
2:
0 set WS_FlurEG _off
3:
0 set WS_FlurEG _off
4:
0
5:
helper:
DEVFILTER ^global$|^WS_FlurEG$
NOTIFYDEV global|WS_FlurEG
event timer_3
globalinit 1
last_timer 3
sleeptimer -1
timerdev
timerevent timer_3
triggerDev
DOIF_eventa:
cmd_nr: 5
cmd: 5
cmd_event: timer_3
cmd_5
DOIF_eventas:
cmd_nr: 5
cmd: 5
cmd_event: timer_3
state: cmd_5
bm:
DOIF_Get:
cnt 2
dmx -1000
dtot 0
dtotcnt 0
mTS 04.02. 08:09:07
max 3.09944152832031e-05
tot 5.48362731933594e-05
mAr:
HASH(0x56555bbe6978)
Bewegungsmelder
?
DOIF_Notify:
cnt 2
dmx -1000
dtot 0
dtotcnt 0
mTS 04.02. 08:08:59
max 0.000294923782348633
tot 0.000489950180053711
mAr:
HASH(0x56555bbe6978)
HASH(0x56554fb84e60)
DOIF_Set:
cnt 10
dmx -1000
dtot 0
dtotcnt 0
mTS 04.02. 08:09:07
max 0.0243089199066162
tot 0.0252540111541748
mAr:
HASH(0x56555bbe6978)
Bewegungsmelder
enable
timerevents:
timer_3
timereventsState:
timer_3
triggerEvents:
timer_3
triggerEventsState:
timer_3
interval:
intervalfunc:
localtime:
0 1612423214
1 1612455108
2 1612426200
readings:
all WS_FlurEG:state
realtime:
0 08:20:14
1 17:11:48
2 09:10:00
time:
0 {sunrise_abs(1800+ReadingsVal('Bewegungsmelder','clouds',''))}
1 {sunset_abs(-1800-ReadingsVal('Bewegungsmelder','clouds',''))}
2 +[1]:10
timeCond:
0 0
1 1
2 4
timer:
0 0
1 0
2 0
timers:
0 0
1 1
4 2
triggertime:
1612423214:
localtime 1612423214
hash:
1612426200:
localtime 1612426200
hash:
1612455108:
localtime 1612455108
hash:
uiState:
uiTable:
Attributes:
devStateIcon .*:fts_shutter_1w_0
do always
icon weather_night
room CUL_HM
userReadings clouds {3600*2/3/100*ReadingsVal('Leverkusen.DarkSky','cloudCover','')}
wait 0,0:15,15:120,120:0
Hallo,
ich habe noch keine Möglichkeit gefunden, wie es gehen kann. Offensichtlich ist nicht vorgesehen, dass später vorliegende Informationen zur Neuberechnung der nächsten timespec berücksichtigt werden.
Falls jemand eine Idee hat, dann gerne her damit.
Viele Grüße Gisbert
Sowas kann man mit at und notify problemlos lösen. Aber mit DOIF? Keine Ahnung.
Zitat von: Gisbert am 04 Februar 2021, 19:47:32
Hallo,
ich habe noch keine Möglichkeit gefunden, wie es gehen kann. Offensichtlich ist nicht vorgesehen, dass später vorliegende Informationen zur Neuberechnung der nächsten timespec berücksichtigt werden.
Falls jemand eine Idee hat, dann gerne her damit.
Viele Grüße Gisbert
Dafür sind doch indirekte Timer da. Die ändern sich sofort, wenn sich die Zeit ändert.
Zitat von: Damian am 04 Februar 2021, 21:48:38
Dafür sind doch indirekte Timer da. Die ändern sich sofort, wenn sich die Zeit ändert.
Hallo Damian,
damit hat es geklappt.
Ich musste zunächst ein userReading (morning, evenig) erzeugen, um das richtige Format hh:mm:ss zu bekommen. Im DOIF-Zweig gab es sonst eine Fehlermeldung, egal.
So sieht jetzt die Lösung aus:
defmod Bewegungsmelder DOIF ([[Bewegungsmelder:morning]]) \
(set WS_FlurEG day) \
(set WS_Garage day) \
DOELSEIF ([[Bewegungsmelder:evening]]) \
(set WS_FlurEG night) \
(set WS_Garage night) \
DOELSEIF ([WS_FlurEG:state]==0 \
and [?WS_FlurEG:day]==1 \
and [?WS_FlurEG:mode]==0) \
(set WS_FlurEG _off) \
DOELSEIF ([WS_FlurEG:state]==0 \
and [?WS_FlurEG:day]==0 \
and [?WS_FlurEG:mode]==0) \
(set WS_FlurEG _off) \
DOELSEIF ([+[1]:20])
attr Bewegungsmelder comment Bei indirekte Zeitangaben mit doppelten [[]] werden die timespecs \
sofort neu berechnet, wenn sich die Readings ändern. \
Damit kann erreicht werden, dass die Zeiten für sunrise/sunset \
mit dem Grad der Wolkenbedeckung abgewandelt werden können.
attr Bewegungsmelder devStateIcon .*:fts_shutter_1w_0
attr Bewegungsmelder do always
attr Bewegungsmelder icon weather_night
attr Bewegungsmelder room CUL_HM
attr Bewegungsmelder userReadings morning {sunrise_abs(1800+3600*2/3/100*ReadingsVal('Leverkusen.DarkSky','cloudCover',''))},\
evening {sunset_abs(-1800-3600*2/3/100*ReadingsVal('Leverkusen.DarkSky','cloudCover',''))}
attr Bewegungsmelder wait 0,0:15,15:120,120:0
Viele Grüße Gisbert
Ich hätte es statt mit userReading mit DOIF_Reading gemacht, der Trigger wäre dann Leverkusen.DarkSky','cloudCover', eine Triggerung der Art DOELSEIF ([+[1]:20] sollte dann überflüssig sein.
Hallo Damian,
danke, probiere ich aus - ich gehe davon aus, dass ich dies alleine hinbekomme, ansonsten, muss ich dich nochmals belästigen ;)
Viele Grüße Gisbert