Das DOIF erhöht morgens (## 1 bsaso, ## 2 bmofr) und abends (## 3 esaso, ## 4 emofr) nach Plan die Temperatur im Bad.
Morgens manuell auch früher (## 5 bsaso, ## 6 bmofr).
Scheinbar nach dem Update (wochentagabhängige Bedingungspfüfung) wird zum falschen Zeitpunkt geschaltet.
## 4 emofr wird auch morgens geschaltet um
05:01, das ist der Timer von
## 5, der aber
? und
|7 enthält
[?05:01|7].
Mir scheint die Timer-Nummerierung versetzt zu sein.
Es triggert
cmd_event: timer_4 und führt
cmd_4_1 aus.
timer_4 ist "
4 05:01:00" und "
timer_04_c04 13.01.2017 21:55:01|8".
Liege ich mit meiner Vermutung richtig?
Zitat
2017-01-13_05:01:00.222 DOIFtoolsLog +++++ Listing ventilBad_di:cmd: 4.1 +++++
Internals:
DEF ## 1
([([$SELF:P_bsaso_hm]-300)|7] and [?$SELF] !~ "cmd_5" and [?Heizperiode])
(IF ([RTDN1_Bad:measured-temp:d] <= [$SELF:P_HeizTmo] and [heizplanThreshold_di])
({SetValvesBad("Tag")}))
()
({SetValvesBad("Nacht")})
## 2
DOELSEIF ([([$SELF:P_bmofr_hm]-301)|8] and [?$SELF] !~ "cmd_6" and [?Heizperiode])
(IF ([RTDN1_Bad:measured-temp:d] <= [$SELF:P_HeizTmo] and [heizplanThreshold_di])
({SetValvesBad("Tag")}))
()
({SetValvesBad("Nacht")})
## 3
DOELSEIF ([([$SELF:P_esaso_hm]-298)|7] and [?Heizperiode])
(IF ([RTDN1_Bad:measured-temp:d] <= [$SELF:P_HeizTab] and [heizplanThreshold_di])
({SetValvesBad("Tag")}))
()
(set RTDN1_Bad_Clima controlMode auto)
## 4
DOELSEIF ([([$SELF:P_emofr_hm]-299)|8] and [?Heizperiode])
(IF ([RTDN1_Bad:measured-temp:d] <= [$SELF:P_HeizTab] and [heizplanThreshold_di])
({SetValvesBad("Tag")}))
()
(set RTDN1_Bad_Clima controlMode auto)
## 5
DOELSEIF ([?05:01-([$SELF:P_bsaso_hm]-302)|7] and ["^HM_3E00A9_light$:^Short \(to VCCU\)$"] and [?AnwStatus_di] and ![?alStatus_di] and [?Heizperiode])
(IF ([RTDN1_Bad:measured-temp:d] <= [$SELF:P_HeizTmo] and [heizplanThreshold_di])
({SetValvesBad("Tag")}))
()
({SetValvesBad("Nacht")})
## 6
DOELSEIF ([?05:02-([$SELF:P_bmofr_hm]-303)|8] and ["^HM_3E00A9_light$:^Short \(to VCCU\)$"] and [?AnwStatus_di] and ![?alStatus_di] and [?Heizperiode])
(IF ([RTDN1_Bad:measured-temp:d] <= [$SELF:P_HeizTmo] and [heizplanThreshold_di])
({SetValvesBad("Tag")}))
()
({SetValvesBad("Nacht")})
## AufEin
INTRIGGER 1
NAME ventilBad_di
NR 189
NTFY_ORDER 50-ventilBad_di
NTFY_TRIGGERTIME 2017-01-13 05:01:00
STATE cmd_4_1
TYPE DOIF
CHANGED:
cmd_nr: 4
cmd_seqnr: 1
cmd: 4.1
cmd_event: timer_4
cmd_4_1
CHANGEDWITHSTATE:
cmd_nr: 4
cmd_seqnr: 1
cmd: 4.1
cmd_event: timer_4
state: cmd_4_1
Readings:
2016-11-28 17:07:08 P_HeizTab 18.5
2016-11-28 17:07:16 P_HeizTmo 18.5
2016-12-17 10:56:43 P_bmofr -30
2017-01-13 03:50:29 P_bmofr_hm 08:08
2016-12-17 11:25:02 P_bmofrdur 80
2017-01-13 03:50:29 P_bmofrdur_hm 09:28
2016-11-28 18:39:44 P_bsaso -30
2017-01-13 03:50:29 P_bsaso_hm 07:45
2016-12-17 08:57:46 P_bsasodur 80
2017-01-13 03:50:29 P_bsasodur_hm 09:05
2016-12-08 18:50:35 P_emofr -60
2017-01-13 03:50:26 P_emofr_hm 22:00
2016-12-08 18:50:43 P_esaso -60
2017-01-13 03:50:26 P_esaso_hm 22:11
2017-01-13 05:01:00 cmd 4.1
2017-01-13 05:01:00 cmd_event timer_4
2017-01-13 05:01:00 cmd_nr 4
2017-01-13 05:01:00 cmd_seqnr 1
2017-01-13 05:01:00 state cmd_4_1
2017-01-13 03:50:29 timer_01_c01 13.01.2017 07:40:00|7
2017-01-13 03:50:29 timer_02_c02 13.01.2017 08:02:59|8
2017-01-13 03:50:29 timer_03_c03 13.01.2017 22:06:02|7
2017-01-13 03:50:29 timer_04_c04 13.01.2017 21:55:01|8
2017-01-12 21:37:28 timer_05_c05 13.01.2017 05:01:00|7
2017-01-13 03:50:29 timer_06_c05 13.01.2017 07:39:58|7
2017-01-12 21:37:28 timer_07_c06 13.01.2017 05:02:00|8
2017-01-13 03:50:29 timer_08_c06 13.01.2017 08:02:57|8
2017-01-12 22:49:02 wait_timer no timer
Condition:
0 DOIF_time_once($hash,0,$wday,"7") and InternalDoIf($hash,'ventilBad_di','STATE') !~ "cmd_5" and InternalDoIf($hash,'Heizperiode','STATE')
1 DOIF_time_once($hash,1,$wday,"8") and InternalDoIf($hash,'ventilBad_di','STATE') !~ "cmd_6" and InternalDoIf($hash,'Heizperiode','STATE')
2 DOIF_time_once($hash,2,$wday,"7") and InternalDoIf($hash,'Heizperiode','STATE')
3 DOIF_time_once($hash,3,$wday,"8") and InternalDoIf($hash,'Heizperiode','STATE')
4 DOIF_time($hash,4,5,$wday,$hms,"7") and EventDoIf('^HM_3E00A9_light$',$hash,'^Short \(to VCCU\)$',0) and InternalDoIf($hash,'AnwStatus_di','STATE') and !InternalDoIf($hash,'alStatus_di','STATE') and InternalDoIf($hash,'Heizperiode','STATE')
5 DOIF_time($hash,6,7,$wday,$hms,"8") and EventDoIf('^HM_3E00A9_light$',$hash,'^Short \(to VCCU\)$',0) and InternalDoIf($hash,'AnwStatus_di','STATE') and !InternalDoIf($hash,'alStatus_di','STATE') and InternalDoIf($hash,'Heizperiode','STATE')
Days:
0 7
1 8
2 7
3 8
4 7
5 7
6 8
7 8
Devices:
Do:
0:
0 IF ([RTDN1_Bad:measured-temp:d] <= [ventilBad_di:P_HeizTmo] and [heizplanThreshold_di]) ({SetValvesBad("Tag")})
1
2 {SetValvesBad("Nacht")}
1:
0 IF ([RTDN1_Bad:measured-temp:d] <= [ventilBad_di:P_HeizTmo] and [heizplanThreshold_di]) ({SetValvesBad("Tag")})
1
2 {SetValvesBad("Nacht")}
2:
0 IF ([RTDN1_Bad:measured-temp:d] <= [ventilBad_di:P_HeizTab] and [heizplanThreshold_di]) ({SetValvesBad("Tag")})
1
2 set RTDN1_Bad_Clima controlMode auto
3:
0 IF ([RTDN1_Bad:measured-temp:d] <= [ventilBad_di:P_HeizTab] and [heizplanThreshold_di]) ({SetValvesBad("Tag")})
1
2 set RTDN1_Bad_Clima controlMode auto
4:
0 IF ([RTDN1_Bad:measured-temp:d] <= [ventilBad_di:P_HeizTmo] and [heizplanThreshold_di]) ({SetValvesBad("Tag")})
1
2 {SetValvesBad("Nacht")}
5:
0 IF ([RTDN1_Bad:measured-temp:d] <= [ventilBad_di:P_HeizTmo] and [heizplanThreshold_di]) ({SetValvesBad("Tag")})
1
2 {SetValvesBad("Nacht")}
Helper:
cur_cmd_nr timer 1484280060
event timer_4
globalinit 1
last_timer 8
sleepdevice timer_4
sleepsubtimer -1
sleeptimer -1
timerdev
timerevent timer_4
timereventsState
triggerDev
triggerEventsState
timerevents:
timer_4
triggerEvents:
timer_4
Internals:
0 ventilBad_di:STATE Heizperiode:STATE
1 ventilBad_di:STATE Heizperiode:STATE
2 Heizperiode:STATE
3 Heizperiode:STATE
4 AnwStatus_di:STATE alStatus_di:STATE Heizperiode:STATE
5 AnwStatus_di:STATE alStatus_di:STATE Heizperiode:STATE
all ventilBad_di:STATE Heizperiode:STATE AnwStatus_di:STATE alStatus_di:STATE
Interval:
4 -1
5 4
6 -1
7 6
Itimer:
all ventilBad_di
Localtime:
0 1484289600
1 1484290979
2 1484341562
3 1484340901
4 1484280060
5 1484289598
6 1484280120
7 1484290977
Readings:
Realtime:
0 07:40:00
1 08:02:59
2 22:06:02
3 21:55:01
4 05:01:00
5 07:39:58
6 05:02:00
7 08:02:57
Regexp:
4:
0 ^HM_3E00A9_light$:^Short \(to VCCU\)$
5:
0 ^HM_3E00A9_light$:^Short \(to VCCU\)$
All:
0 ^HM_3E00A9_light$:^Short \(to VCCU\)$
State:
Time:
0 ([ventilBad_di:P_bsaso_hm]-300)
1 ([ventilBad_di:P_bmofr_hm]-301)
2 ([ventilBad_di:P_esaso_hm]-298)
3 ([ventilBad_di:P_emofr_hm]-299)
4 05:01:00
5 ([ventilBad_di:P_bsaso_hm]-302)
6 05:02:00
7 ([ventilBad_di:P_bmofr_hm]-303)
Timecond:
0 0
1 1
2 2
3 3
4 4
5 4
6 5
7 5
Timer:
0 0
1 0
2 0
3 1
4 0
5 0
6 0
7 0
Timers:
0 0
1 1
2 2
3 3
Triggertime:
1484280120:
localtime 1484280120
Hash:
1484289598:
localtime 1484289598
Hash:
1484289600:
localtime 1484289600
Hash:
1484290977:
localtime 1484290977
Hash:
1484290979:
localtime 1484290979
Hash:
1484340901:
localtime 1484340901
Hash:
1484341562:
localtime 1484341562
Hash:
Attributes:
alias 000_Ventilplan_Bad
do always
group 0_Raumklimastatus
icon time_note
initialize cmd_1
readingList P_bmofr P_emofr P_bmofrdur P_bsaso P_esaso P_bsasodur P_HeizTab P_HeizTmo
room 5_Heizung
setList P_bmofr:0,-5,-10,-15,-20,-25,-30,-35,-40,-45,-50,-55,-60,-65,-70,-75,-80,-85,-90,-95,-100,-105,-110,-115,-120
P_emofr:0,-5,-10,-15,-20,-25,-30,-35,-40,-45,-50,-55,-60,-65,-70,-75,-80,-85,-90,-95,-100,-105,-110,-115,-120
P_bsaso:60,55,50,45,40,35,30,25,20,15,10,5,0,-5,-10,-15,-20,-25,-30,-35,-40,-45,-50,-55,-60
P_esaso:60,55,50,45,40,35,30,25,20,15,10,5,0,-5,-10,-15,-20,-25,-30,-35,-40,-45,-50,-55,-60
P_bmofrdur:0,10,20,30,40,50,60,70,80,90,100,110,120,140,150,160,170,180
P_bsasodur:0,10,20,30,40,50,60,70,80,90,100,110,120,140,150,160,170,180
P_HeizTmo:14.0,14.5,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0
P_HeizTab:14.0,14.5,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0
userReadings P_bmofr_hm:P_bmofr.* {addMin(ReadingsVal("AufEin","amofr","06:00"),ReadingsVal($name,"P_bmofr","0"))},
P_bmofrdur_hm:P_bmofrdur.* {addMin(ReadingsVal("AufEin","amofr","06:00"),ReadingsVal($name,"P_bmofrdur","0")+ReadingsVal($name,"P_bmofr","0"))},
P_bsaso_hm:P_bsaso.* {addMin(ReadingsVal("AufEin","asaso","06:00"),ReadingsVal($name,"P_bsaso","0"))},
P_bsasodur_hm:P_bsasodur.* {addMin(ReadingsVal("AufEin","asaso","06:00"),ReadingsVal($name,"P_bsasodur","0")+ReadingsVal($name,"P_bsaso","0"))},
P_emofr_hm:P_emofr.* {addMin(ReadingsVal("AufEin","emofr","22:00"),ReadingsVal($name,"P_emofr","0"))},
P_esaso_hm:P_esaso.* {addMin(ReadingsVal("AufEin","esaso","22:00"),ReadingsVal($name,"P_esaso","0"))}
wait 0,300,[$SELF:P_bsasodur]*60:
0,300,[$SELF:P_bmofrdur]*60:
0,300,abs([$SELF:P_esaso])*60:
0,300,abs([$SELF:P_emofr])*60:
0,300,[$SELF:P_bsasodur]*60:
0,300,[$SELF:P_bmofrdur]*60
widgetOverride (setList|readingList|wait):textField-long
2017-01-13_05:01:00.322 ventilBad_di cmd_nr: 4
2017-01-13_05:01:00.322 ventilBad_di cmd_seqnr: 1
2017-01-13_05:01:00.322 ventilBad_di cmd: 4.1
2017-01-13_05:01:00.322 ventilBad_di cmd_event: timer_4
2017-01-13_05:01:00.322 ventilBad_di cmd_4_1
ich kann dieses Verhalten bei mir nicht nachstellen, ich habe folgendes getestet:
([+5|8])
DOELSEIF([+7|7])
DOELSEIF([?+13-+15|8])
DOELSEIF([+17|7])
DOELSEIF([+18|8])
DOELSE
hier wird immer nur cmd_1 mit Timer_1 und cmd_5 mit Timer_6 geschaltet.
Das Nachstellen, ist mir auch noch nicht gelungen. Aber das in meinem DOIF etwas nicht stimmt, siehst Du doch auch so?
Zitat von: Ellert am 13 Januar 2017, 17:26:03
Das Nachstellen, ist mir auch noch nicht gelungen. Aber das in meinem DOIF etwas nicht stimmt, siehst Du doch auch so?
sieht zumindest so aus. Vielleicht hängt es irgendwie mit indirekten Zeitangaben zusammen.
Es lag an dem nicht gesetzten Attribut timerWithWait, das ich nicht so richtig auf der Rechnung habe.
Wann muss das Attribut genau gesetzt werden?
Wenn eine Zeitspanne oder ein Zeitpunkt in einem Bedingungszweig und ein Wait-Timer für den dazu gehörenden Befehlszweig gesetzt ist? Ist das richtig?
Kann DOIF das nicht selbst erkennen?
Zitat von: Ellert am 14 Januar 2017, 09:05:16
Es lag an dem nicht gesetzten Attribut timerWithWait, das ich nicht so richtig auf der Rechnung habe.
Wann muss das Attribut genau gesetzt werden?
Wenn eine Zeitspanne oder ein Zeitpunkt in einem Bedingungszweig und ein Wait-Timer für den dazu gehörenden Befehlszweig gesetzt ist? Ist das richtig?
Kann DOIF das nicht selbst erkennen?
Normalerweise gilt die wait-Verzögerung nur auf Ereignisse, bei einer Definition eines Timers kann man ja direkt die Verzögerung berücksichtigen (wenn man möchte) und den Timer entsprechend (zeitlich verschoben) definieren. Im Laufe der Zeit kamen indirekte Timer dazu und da machte auch die Kombination mit wait ggf. Sinn, daher das Attribut.
Mein Attribut wait sieht für alle Bedingungszweige so aus:
0,300,[$SELF:P_bsasodur]*60:
Die erste Sequenz hat keinen Timer, daher dachte ich "timerWithWait" wäre nicht notwendig, das ist wohl falsch.
Könnte man ein fehlendes Attribut "timerWithWait" ermitteln, indem verglichen wird, ob eine Bedingung einen Timer hat und gleichzeitig für den Befehlszweig ein Attribut "wait" gesezt ist?
Muss timerWithWait auch gesetzt werden für "repeatcmd" oder andere Attribute?
Zitat von: Ellert am 14 Januar 2017, 12:39:29
Mein Attribut wait sieht für alle Bedingungszweige so aus:
0,300,[$SELF:P_bsasodur]*60:
Die erste Sequenz hat keinen Timer, daher dachte ich "timerWithWait" wäre nicht notwendig, das ist wohl falsch.
Könnte man ein fehlendes Attribut "timerWithWait" ermitteln, indem verglichen wird, ob eine Bedingung einen Timer hat und gleichzeitig für den Befehlszweig ein Attribut "wait" gesezt ist?
Muss timerWithWait auch gesetzt werden für "repeatcmd" oder andere Attribute?
timerWithWait hat nur Einfluss auf Timer und nicht auf Ereignisse, wenn deine Bedingung keinen Timer hat, dann hat das Attribut für diese Bedingung auch keine Bedeutung.
Bsp.
([dummy] eq "on" or [10:00])(set lamp on) DOELSE (set lamp off)
wait 30:50
Die Lampe wird eingeschaltet: 30 Sekunden nach dem dummy mit "on" triggert und um 10:00 Uhr
Die Lampe wird ausgeschaltet: 50 Sekunden nach dem dummy ungleich "on" triggert
mit
timerWithWaitDie Lampe wird eingeschaltet: 30 Sekunden nach dem dummy triggert und um 10:00:
30 Uhr
Die Lampe wird ausgeschaltet: 50 Sekunden nach dem dummy ungleich "on" triggert
Also wird bei timerWithWait der erste Wait-Timer einer Sequenz zum Timer addiert.
Dann dürfte timerWithWait keine Auswirkungen auf mein Problem haben, denn der erste Wait-Timer einer Sequenz ist in dem DOIF immer 0.
Geholfen hat es trotzdem. Eine Kopie des DOIF hat auf einem TestPi heute das Fehlverhalten gezeigt. Im Wirksystem hatte ich gestern noch timerWithWait gesetzt und dort ist der Fehler verschwunden.
Ich werde es weiter beobachten.
Zitat von: Ellert am 14 Januar 2017, 16:24:03
Also wird bei timerWithWait der erste Wait-Timer einer Sequenz zum Timer addiert.
Dann dürfte timerWithWait keine Auswirkungen auf mein Problem haben, denn der erste Wait-Timer einer Sequenz ist in dem DOIF immer 0.
Geholfen hat es trotzdem. Eine Kopie des DOIF hat auf einem TestPi heute das Fehlverhalten gezeigt. Im Wirksystem hatte ich gestern noch timerWithWait gesetzt und dort ist der Fehler verschwunden.
Ich werde es weiter beobachten.
timerWithWait wirkt natürlich nur auf die erste Wait-Angabe einer Sequenz, die folgenden Angaben beziehen sich ja auf den Sequenz-Vorgänger und das ist ja nicht mehr der Timer.
Wenn die erste Wait-Angabe 0 ist, dann gibt es natürlich keine Verzögerung, logischerweiser auch nicht beim Timer.
Wenn du ein nachvollziehbares (möglichst einfaches) Testszenario für ein Fehlverhalten findest, dann kannst du es hier posten.
ZitatWenn du ein nachvollziehbares (möglichst einfaches) Testszenario für ein Fehlverhalten findest, dann kannst du es hier posten.
Das Verhalten kann im nachstehenden DOIF beobachtet werden (für Raw definition)
defmod testdi DOIF ([([$SELF:P_a_hms,"07:00"]+45)])\
(setreading $SELF P_a_hms {(localtime(time+15) =~ m/(\d\d:\d\d:\d\d)/,$1)})\
DOELSEIF([?([$SELF:P_a_hms,"07:00"]+15)-([$SELF:P_a_hms,"07:00"]+30)])\
attr testdi do always
attr testdi readingList P_a_hms
attr testdi setList P_a_hms:time
attr testdi webCmd P_a_hms
Es muss eine Startzeit gesetzt werden.
Danach löst das DOIF alle 15s aus, auf timer_02_c02
Eigentlich sollte das DOIF nur auf timer_01_c01 auslösen, alle 60s.
Das nächste Beispiel ist ein vereinfachtes DOIF des ersten Beitrages. Auch hier löst ein Timer unerwartet aus.
defmod ventilBad_di3 DOIF ## 1\
([[$SELF:P_bmofr_hm,"08:01"]] and [?$SELF] !~ "cmd_3")\
()\
()\
()\
## 2\
DOELSEIF ([[$SELF:P_emofr_hm,"22:03"]])\
()\
()\
()\
## 3\
DOELSEIF ([?05:02-([$SELF:P_bmofr_hm,"08:05"]-1)])\
()\
()\
()
attr ventilBad_di3 do always
attr ventilBad_di3 group 0_Raumklimastatus
attr ventilBad_di3 icon time_note
attr ventilBad_di3 room 5_Heizung
attr ventilBad_di3 wait 0,300,[$SELF:P_bmofrdur,60]*60:\
0,300,abs([$SELF:P_emofr,-70])*60:\
0,300,[$SELF:P_bmofrdur,60]*60
attr ventilBad_di3 widgetOverride wait:textField-long
setstate ventilBad_di3 2017-01-26 09:59:57 P_bmofr_hm 08:33
setstate ventilBad_di3 2017-01-19 12:22:23 P_bmofrdur 65
setstate ventilBad_di3 2017-01-23 09:18:13 P_emofr -65
setstate ventilBad_di3 2017-01-26 09:51:57 P_emofr_hm 22:30
Hier das Listing dazu:
2017-01-27_05:02:00.408 DOIFtoolsLog [3] +++++ Listing ventilBad_di3:cmd: 2.1 +++++
jump to: prev next Listing
DOIF-Version: 98_DOIF.pm 12961 2017-01-04 22:23:57Z Damian
Internals:
DEF ## 1
([[$SELF:P_bmofr_hm,"08:01"]] and [?$SELF] !~ "cmd_3")
()
()
()
## 2
DOELSEIF ([[$SELF:P_emofr_hm,"22:03"]])
()
()
()
## 3
DOELSEIF ([?05:02-([$SELF:P_bmofr_hm,"08:05"]-1)])
()
()
()
INTRIGGER 1
NAME ventilBad_di3
NR 74
NTFY_ORDER 50-ventilBad_di3
NTFY_TRIGGERTIME 2017-01-27 05:02:00
STATE cmd_2_1
TYPE DOIF
CHANGED:
cmd_nr: 2
cmd_seqnr: 1
cmd: 2.1
cmd_event: timer_2
cmd_2_1
CHANGEDWITHSTATE:
cmd_nr: 2
cmd_seqnr: 1
cmd: 2.1
cmd_event: timer_2
state: cmd_2_1
Readings:
2017-01-26 09:59:57 P_bmofr_hm 08:33
2017-01-19 12:22:23 P_bmofrdur 65
2017-01-23 09:18:13 P_emofr -65
2017-01-26 09:51:57 P_emofr_hm 22:30
2017-01-27 05:02:00 cmd 2.1
2017-01-27 05:02:00 cmd_event timer_2
2017-01-27 05:02:00 cmd_nr 2
2017-01-27 05:02:00 cmd_seqnr 1
2017-01-27 05:02:00 state cmd_2_1
2017-01-26 23:40:00 timer_01_c01 27.01.2017 08:33:00
2017-01-26 23:40:00 timer_02_c02 27.01.2017 22:30:00
2017-01-26 17:30:11 timer_03_c03 27.01.2017 05:02:00
2017-01-26 23:40:00 timer_04_c03 27.01.2017 08:32:59
2017-01-26 23:40:00 wait_timer no timer
Condition:
0 DOIF_time_once($hash,0,$wday) and InternalDoIf($hash,'ventilBad_di3','STATE') !~ "cmd_3"
1 DOIF_time_once($hash,1,$wday)
2 DOIF_time($hash,2,3,$wday,$hms)
Days:
Devices:
Do:
0:
0
1
2
1:
0
1
2
2:
0
1
2
Helper:
cur_cmd_nr timer 1485489720
event timer_2
globalinit 1
last_timer 4
sleepdevice timer_2
sleepsubtimer -1
sleeptimer -1
timerdev
timerevent timer_2
timereventsState
triggerDev
triggerEventsState
timerevents:
timer_2
triggerEvents:
timer_2
Internals:
0 ventilBad_di3:STATE
all ventilBad_di3:STATE
Interval:
2 -1
3 2
Itimer:
all ventilBad_di3
Localtime:
0 1485502380
1 1485552600
2 1485489720
3 1485502379
Readings:
Realtime:
0 08:33:00
1 22:30:00
2 05:02:00
3 08:32:59
Regexp:
State:
Time:
0 [ventilBad_di3:P_bmofr_hm,"08:01"]
1 [ventilBad_di3:P_emofr_hm,"22:03"]
2 05:02:00
3 ([ventilBad_di3:P_bmofr_hm,"08:05"]-1)
Timecond:
0 0
1 1
2 2
3 2
Timer:
0 0
1 1
2 1
3 0
Timers:
0 0
1 1
Triggertime:
1485502379:
localtime 1485502379
Hash:
1485502380:
localtime 1485502380
Hash:
1485552600:
localtime 1485552600
Hash:
Attributes:
do always
group 0_Raumklimastatus
icon time_note
room 5_Heizung
wait 0,300,[$SELF:P_bmofrdur,60]*60:
0,300,abs([$SELF:P_emofr,-70])*60:
0,300,[$SELF:P_bmofrdur,60]*60
widgetOverride wait:textField-long
2017-01-27_05:02:00.438 ventilBad_di3 cmd_nr: 2
2017-01-27_05:02:00.438 ventilBad_di3 cmd_seqnr: 1
2017-01-27_05:02:00.438 ventilBad_di3 cmd: 2.1
2017-01-27_05:02:00.438 ventilBad_di3 cmd_event: timer_2
2017-01-27_05:02:00.438 ventilBad_di3 cmd_2_1
Hier sind alle Timer statisch, sie werden nicht im DOIF selbst gesetzt, wie im oberen Beispiel.
timer_2 löst aus und setzt cmd_2_1 um 05:02 das sollte nicht möglich sein, da die Zeitspanne nicht triggernd gekennzeichnet ist.
Ich habe noch keine Erklärung gefunden.
Also das erste Beispiel führt beim mir leider nicht zu einem Fehlverhalten:
Internals:
CFGFN
DEF ([([$SELF:P_a_hms,"07:00"]+45)])
(setreading $SELF P_a_hms {(localtime(time+15) =~ m/(\d\d:\d\d:\d\d)/,$1)})
DOELSEIF([?([$SELF:P_a_hms,"07:00"]+15)-([$SELF:P_a_hms,"07:00"]+30)])
NAME testdi
NR 1142
NTFY_ORDER 50-testdi
STATE cmd_1
TYPE DOIF
Readings:
2017-01-27 14:12:15 P_a_hms 14:12:30
2017-01-27 14:12:15 cmd 1
2017-01-27 14:12:15 cmd_event timer_1
2017-01-27 14:12:15 cmd_nr 1
2017-01-27 14:12:15 state cmd_1
2017-01-27 14:12:15 timer_01_c01 27.01.2017 14:13:15
2017-01-27 14:12:15 timer_02_c02 27.01.2017 14:12:45
2017-01-27 14:12:15 timer_03_c02 27.01.2017 14:13:00
Condition:
0 DOIF_time_once($hash,0,$wday)
1 DOIF_time($hash,1,2,$wday,$hms)
Days:
Devices:
Do:
0:
0 setreading testdi P_a_hms {(localtime(time+15) =~ m/(\d\d:\d\d:\d\d)/,$1)}
1:
0
Helper:
event timer_1
globalinit 1
last_timer 3
sleeptimer -1
timerdev
timerevent timer_1
timereventsState
triggerDev
timerevents:
timer_1
triggerEvents:
timer_1
Internals:
Interval:
1 -1
2 1
Itimer:
all testdi
Localtime:
0 1485522795
1 1485522765
2 1485522780
Readings:
Realtime:
0 14:13:15
1 14:12:45
2 14:13:00
Regexp:
State:
Time:
0 ([testdi:P_a_hms,"07:00"]+45)
1 ([testdi:P_a_hms,"07:00"]+15)
2 ([testdi:P_a_hms,"07:00"]+30)
Timecond:
0 0
1 1
2 1
Timer:
0 1
1 1
2 0
Timers:
0 0
Triggertime:
1485522765:
localtime 1485522765
Hash:
1485522780:
localtime 1485522780
Hash:
1485522795:
localtime 1485522795
Hash:
Attributes:
do always
readingList P_a_hms
setList P_a_hms:time
webCmd P_a_hms
Ich werde das zweite auch noch ausprobieren.
Ich habe bei dir eine Inkonsistenz gefunden:
Timer:
0 0
1 1
2 1
3 0
dieser Hash sollte nur zum Triggerzeitpunkt 1 sein, nach der Auswertung der Bedingung muss er wieder 0 sein. Jetzt muss ich noch herausfinden, warum die nicht zurückgesetzt werden.
Wenn ich etwas tun kann, sag bitte was.
Das Problem waren indirekte Timer, des eigenen Moduls.
Du kannst schon mal diese Version testen.
Mit dieser Version sieht es erstmal gut aus, das erste Beispiel von heute läuft wie erwartet,
auch das Beispiel mit der Schaltuhr läuft wieder (da hast Du schon einen Link hier her gepostet)
auch das Beispiel mit den Tageszeiten https://forum.fhem.de/index.php/topic,65744.0.html ist davon betroffen, jedenfalls bei mir.
Zitat von: Ellert am 27 Januar 2017, 19:20:50
Mit dieser Version sieht es erstmal gut aus, das erste Beispiel von heute läuft wie erwartet,
auch das Beispiel mit der Schaltuhr läuft wieder (da hast Du schon einen Link hier her gepostet)
auch das Beispiel mit den Tageszeiten https://forum.fhem.de/index.php/topic,65744.0.html ist davon betroffen, jedenfalls bei mir.
Ich habe eine korrigierte Version eingecheckt.
Vielen Dank für die schnelle Lösung des Problems
In diesem Zusammenhang ist mir aufgefallen, dass durch die Nutzung indirekter Timer mit eigenen Readings des selben Moduls zum unnötigen Triggern des Moduls führt.
Beispiel:
DOIF ([[$SELF:P_a_hms,"07:00"]])
DOELSEIF ([([$SELF:P_a_hms,"07:00"]+15)])
alleine die Zustandsänderung des Moduls sowie das Setzen eines beliebigen Readings des Moduls führt zum Neusetzen beider Timer, weil Standardmäßig auf jeden Trigger eines Devices reagiert wird.
Aus diesem Grund plane ich checkReadingEvent für indirekte Timer intern als default zu setzen. Das hätte den positiven Nebeneffekt, dass die oft benutzten twilight-Readings standardmäßig nicht alle fünf Minuten zum Neusetzen der Timer führen würden, weil wohl die wenigsten an der Stelle an das Attribut checkReadingEvent denken.
Indirekte Timer auf Stati z. B. [[my_dummy]] würden weiterhin auf alle Trigger reagieren, wie bisher. Wenn man nur auf den Status reagieren möchte dann kann man [[my_dummy:state]] angeben - das funktioniert sogar ohne das Setzen des addStateEvent Attributs.
Für allgemeine Events soll checkReadingEvent natürlich weiterhin nicht als default gelten (das habe ich bereits aus Kompatibilitätsgründen schon früher verworfen), das Attribut kann bei bedarf für Events wie bisher gesetzt werden.
hier eine Version zum Testen:
Das funktioniert dann nicht mehr:
defmod Pumpe_Labor DOIF ([$SELF:Laufzeit]) (set Pumpe on) (set Pumpe off)\
DOELSE (set Pumpe off)
attr Pumpe_Labor readingList Laufzeit
attr Pumpe_Labor room DOIF_Labor
attr Pumpe_Labor setList Laufzeit:0,0.5,1,1.5,2,2.5,3
attr Pumpe_Labor wait 0,[$SELF:Laufzeit] * 3600:0
attr Pumpe_Labor webCmd Laufzeit
defmod Pumpe dummy
attr Pumpe room DOIF_Labor
Zitat von: Ellert am 28 Januar 2017, 07:56:52
Das funktioniert dann nicht mehr:
defmod Pumpe_Labor DOIF ([$SELF:Laufzeit]) (set Pumpe on) (set Pumpe off)\
DOELSE (set Pumpe off)
attr Pumpe_Labor readingList Laufzeit
attr Pumpe_Labor room DOIF_Labor
attr Pumpe_Labor setList Laufzeit:0,0.5,1,1.5,2,2.5,3
attr Pumpe_Labor wait 0,[$SELF:Laufzeit] * 3600:0
attr Pumpe_Labor webCmd Laufzeit
defmod Pumpe dummy
attr Pumpe room DOIF_Labor
Warum nicht? Ich sehe hier keine indirekten Timer. Bei mir funktioniert es, würde mich auch wundern wenn nicht.
Das war mein Fehler das DOIF stand noch auf cmd_1_1, warum auch immer und der wait_timer war none.
Ohne do always und ohne zu initialisieren ist garnichts passiert und ich hatte es so interpretiert als wäre das DOIF bei cmd_1_1 stehen geblieben.
Es funktioniert nach Initialisierung normal.