FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Ellert am 13 Januar 2017, 10:15:21

Titel: DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Ellert am 13 Januar 2017, 10:15:21
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
Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Damian am 13 Januar 2017, 15:21:48
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.
Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag 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?
Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Damian am 13 Januar 2017, 17:44:52
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.
Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag 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?
Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Damian am 14 Januar 2017, 09:53:21
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.
Titel: Antw:[gelöst] DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag 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?
Titel: Antw:[gelöst] DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Damian am 14 Januar 2017, 15:55:33
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 timerWithWait

Die 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

Titel: Antw:[gelöst] DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag 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.
Titel: Antw:[gelöst] DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Damian am 14 Januar 2017, 16:43:38
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.

Titel: Antw:[gelöst] DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Ellert am 27 Januar 2017, 07:17:03
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.

Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Damian am 27 Januar 2017, 14:14:09
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.
Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Damian am 27 Januar 2017, 15:29:10
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.
Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Ellert am 27 Januar 2017, 16:01:31
Wenn ich etwas tun kann, sag bitte was.
Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Damian am 27 Januar 2017, 18:17:51
Das Problem waren indirekte Timer, des eigenen Moduls.

Du kannst schon mal diese Version testen.

Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag 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.
Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Damian am 27 Januar 2017, 20:17:09
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.
Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: gloob am 27 Januar 2017, 22:09:30
Vielen Dank für die schnelle Lösung des Problems
Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Damian am 27 Januar 2017, 23:02:58
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:

Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag 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

Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Damian am 28 Januar 2017, 09:19:59
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.
Titel: Antw:DOIF schaltet mit falschem Timer ? TimerNr. versetzt um 1
Beitrag von: Ellert am 28 Januar 2017, 09:40:53
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.