FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: traxanos am 12 September 2015, 20:29:46

Titel: DOIF verhält sich merkwürdig
Beitrag von: traxanos am 12 September 2015, 20:29:46
An diesem Wochenende spielt mir DOIF einen streich nach dem anderen. Es sieht so aus, als würden die waits nicht mehr so arbeiten wie sonst.
Meine Statuserkennungen laufen alle nicht mehr. Hier von der Waschmaschine und vom Trockner.


Internals:
   DEF        ([Waschmaschine.Status:power] < AttrVal("Waschmaschine.Status", "configPowerOff", 1)) (

  set Waschmaschine.Status off,
  setreading Waschmaschine.Status preEnergy 0

) DOELSEIF ([Waschmaschine.Status:power] >= AttrVal("Waschmaschine.Status", "configPowerOff", 1) and [Waschmaschine.Status:state] eq 'off') (

  set Waschmaschine.Status on,
  setreading Waschmaschine.Status preEnergy [Waschmaschine.Status:energy]

) DOELSEIF ([Waschmaschine.Status:power] >= AttrVal("Waschmaschine.Status", "configPowerDone", 3)) (

  set Waschmaschine.Status running

) DOELSEIF ([Waschmaschine.Status:power] < AttrVal("Waschmaschine.Status", "configPowerDone", 3) and [Waschmaschine.Status:state] eq 'running') (

  set Waschmaschine.Status done,
  setreading Waschmaschine.Status lastEnergy {([Waschmaschine.Status:energy]-[Waschmaschine.Status:preEnergy])},
  setreading Waschmaschine.Status totalEnergy {([Waschmaschine.Status:totalEnergy]+[Waschmaschine.Status:lastEnergy])},
  setreading Waschmaschine.Status lastCost {([Waschmaschine.Status:lastEnergy]/1000*0.25)},
  setreading Waschmaschine.Status totalCost {([Waschmaschine.Status:totalEnergy]/1000*0.25)},
  setreading Waschmaschine.Status preEnergy [Waschmaschine.Status:energy]

)
   NAME       Programm.Waschmaschine.Status
   NR         174
   NTFY_ORDER 50-Programm.Waschmaschine.Status
   STATE      cmd_3
   TYPE       DOIF
   Readings:
     2015-09-12 20:25:20   Device          Waschmaschine.Status
     2015-09-12 18:46:42   cmd_event       Waschmaschine.Status
     2015-09-12 18:46:42   cmd_nr          3
     2015-09-12 20:25:20   e_Waschmaschine.Status_power 30.87
     2015-09-12 20:25:20   e_Waschmaschine.Status_state running
     2015-09-12 18:46:42   state           cmd_3
     2015-09-12 19:26:35   wait_timer      no timer
   Condition:
     0          ReadingValDoIf('Waschmaschine.Status','power','') < AttrVal("Waschmaschine.Status", "configPowerOff", 1)
     1          ReadingValDoIf('Waschmaschine.Status','power','') >= AttrVal("Waschmaschine.Status", "configPowerOff", 1) and ReadingValDoIf('Waschmaschine.Status','state','') eq 'off'
     2          ReadingValDoIf('Waschmaschine.Status','power','') >= AttrVal("Waschmaschine.Status", "configPowerDone", 3)
     3          ReadingValDoIf('Waschmaschine.Status','power','') < AttrVal("Waschmaschine.Status", "configPowerDone", 3) and ReadingValDoIf('Waschmaschine.Status','state','') eq 'running'
   Devices:
     0           Waschmaschine.Status
     1           Waschmaschine.Status
     2           Waschmaschine.Status
     3           Waschmaschine.Status
     all         Waschmaschine.Status
   Do:
     0:
       0              set Waschmaschine.Status off,  setreading Waschmaschine.Status preEnergy 0
     1:
       0            set Waschmaschine.Status on,  setreading Waschmaschine.Status preEnergy [Waschmaschine.Status:energy]
     2:
       0            set Waschmaschine.Status running
     3:
       0            set Waschmaschine.Status done,  setreading Waschmaschine.Status lastEnergy {([Waschmaschine.Status:energy]-[Waschmaschine.Status:preEnergy])},  setreading Waschmaschine.Status totalEnergy {([Waschmaschine.Status:totalEnergy]+[Waschmaschine.Status:lastEnergy])},  setreading Waschmaschine.Status lastCost {([Waschmaschine.Status:lastEnergy]/1000*0.25)},  setreading Waschmaschine.Status totalCost {([Waschmaschine.Status:totalEnergy]/1000*0.25)},  setreading Waschmaschine.Status preEnergy [Waschmaschine.Status:energy]
   Helper:
     globalinit 1
     last_timer 0
     sleepdevice Waschmaschine.Status
     sleepsubtimer 0
     sleeptimer -1
   Internals:
   Itimer:
   Readings:
     0           Waschmaschine.Status:power
     1           Waschmaschine.Status:power Waschmaschine.Status:state
     2           Waschmaschine.Status:power
     3           Waschmaschine.Status:power Waschmaschine.Status:state
     all         Waschmaschine.Status:power Waschmaschine.Status:state
   State:
   Trigger:
Attributes:
   alias      Zustandserkennung der Waschmaschine
   group      Waschmaschine
   icon       im_code
   room       Programme
   wait       5:0:0:60



Internals:
   DEF        ([Trockner.Status:power] < AttrVal("Trockner.Status", "configPowerOff", 1) and [Trockner.Status:state] ne 'running') (

  set Trockner.Status off,
  setreading Trockner.Status preEnergy 0

) DOELSEIF ([Trockner.Status:power] >= AttrVal("Trockner.Status", "configPowerOff", 1) and [Trockner.Status:state] eq 'off') (

  set Trockner.Status on,
  setreading Trockner.Status preEnergy [Trockner.Status:energy]

) DOELSEIF ([Trockner.Status:power] >= AttrVal("Trockner.Status", "configPowerDone", 3)) (

  set Trockner.Status running

) DOELSEIF ([Trockner.Status:power] < AttrVal("Trockner.Status", "configPowerDone", 3) and [Trockner.Status:state] eq 'running') (

  set Trockner.Status done,
  setreading Trockner.Status lastEnergy {([Trockner.Status:energy]-[Trockner.Status:preEnergy])},
  setreading Trockner.Status totalEnergy {([Trockner.Status:totalEnergy]+[Trockner.Status:lastEnergy])},
  setreading Trockner.Status lastCost {([Trockner.Status:lastEnergy]/1000*0.25)},
  setreading Trockner.Status totalCost {([Trockner.Status:totalEnergy]/1000*0.25)},
  setreading Trockner.Status preEnergy [Trockner.Status:energy]

)
   NAME       Programm.Trockner.Status
   NR         213
   NTFY_ORDER 50-Programm.Trockner.Status
   STATE      cmd_3
   TYPE       DOIF
   Readings:
     2015-09-12 20:24:08   Device          Trockner.Status
     2015-09-12 20:24:08   cmd_event       Trockner.Status
     2015-09-12 20:24:08   cmd_nr          3
     2015-09-12 20:24:08   e_Trockner.Status_power 1.25
     2015-09-12 20:24:08   e_Trockner.Status_state running
     2015-09-12 20:24:08   state           cmd_3
     2015-09-12 20:24:08   wait_timer      no timer
   Condition:
     0          ReadingValDoIf('Trockner.Status','power','') < AttrVal("Trockner.Status", "configPowerOff", 1) and ReadingValDoIf('Trockner.Status','state','') ne 'running'
     1          ReadingValDoIf('Trockner.Status','power','') >= AttrVal("Trockner.Status", "configPowerOff", 1) and ReadingValDoIf('Trockner.Status','state','') eq 'off'
     2          ReadingValDoIf('Trockner.Status','power','') >= AttrVal("Trockner.Status", "configPowerDone", 3)
     3          ReadingValDoIf('Trockner.Status','power','') < AttrVal("Trockner.Status", "configPowerDone", 3) and ReadingValDoIf('Trockner.Status','state','') eq 'running'
   Devices:
     0           Trockner.Status
     1           Trockner.Status
     2           Trockner.Status
     3           Trockner.Status
     all         Trockner.Status
   Do:
     0:
       0              set Trockner.Status off,  setreading Trockner.Status preEnergy 0
     1:
       0            set Trockner.Status on,  setreading Trockner.Status preEnergy [Trockner.Status:energy]
     2:
       0            set Trockner.Status running
     3:
       0            set Trockner.Status done,  setreading Trockner.Status lastEnergy {([Trockner.Status:energy]-[Trockner.Status:preEnergy])},  setreading Trockner.Status totalEnergy {([Trockner.Status:totalEnergy]+[Trockner.Status:lastEnergy])},  setreading Trockner.Status lastCost {([Trockner.Status:lastEnergy]/1000*0.25)},  setreading Trockner.Status totalCost {([Trockner.Status:totalEnergy]/1000*0.25)},  setreading Trockner.Status preEnergy [Trockner.Status:energy]
     4:
   Helper:
     globalinit 1
     last_timer 0
     sleepdevice Trockner.Status
     sleepsubtimer -1
     sleeptimer -1
   Internals:
   Itimer:
   Readings:
     0           Trockner.Status:power Trockner.Status:state
     1           Trockner.Status:power Trockner.Status:state
     2           Trockner.Status:power
     3           Trockner.Status:power Trockner.Status:state
     all         Trockner.Status:power Trockner.Status:state
   State:
   Trigger:
Attributes:
   alias      Zustandserkennung des Trockners
   group      Trockner
   icon       im_code
   room       Programme
   wait       5:0:180:15


Zum Beispiel
Der Trockner meldet alle paar Minuten das sie fertig ist, da der Status dauernd zwischen running und done springt. Dabei habe ich ein wait von 5:0:60:15 (testweise auch mal mit 180) drinne. Daher dürfte der Nachlaufen der kurzfristig den Verbrauch erhöht für paar Sekunden erhöht nicht wieder auf Running laufen.

Damian hast du da irgend etwas umgebaut? Ich dreht hier durch :D
Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: Damian am 12 September 2015, 21:34:01
Zitat von: traxanos am 12 September 2015, 20:29:46
An diesem Wochenende spielt mir DOIF einen streich nach dem anderen. Es sieht so aus, als würden die waits nicht mehr so arbeiten wie sonst.
Meine Statuserkennungen laufen alle nicht mehr. Hier von der Waschmaschine und vom Trockner.


Internals:
   DEF        ([Waschmaschine.Status:power] < AttrVal("Waschmaschine.Status", "configPowerOff", 1)) (

  set Waschmaschine.Status off,
  setreading Waschmaschine.Status preEnergy 0

) DOELSEIF ([Waschmaschine.Status:power] >= AttrVal("Waschmaschine.Status", "configPowerOff", 1) and [Waschmaschine.Status:state] eq 'off') (

  set Waschmaschine.Status on,
  setreading Waschmaschine.Status preEnergy [Waschmaschine.Status:energy]

) DOELSEIF ([Waschmaschine.Status:power] >= AttrVal("Waschmaschine.Status", "configPowerDone", 3)) (

  set Waschmaschine.Status running

) DOELSEIF ([Waschmaschine.Status:power] < AttrVal("Waschmaschine.Status", "configPowerDone", 3) and [Waschmaschine.Status:state] eq 'running') (

  set Waschmaschine.Status done,
  setreading Waschmaschine.Status lastEnergy {([Waschmaschine.Status:energy]-[Waschmaschine.Status:preEnergy])},
  setreading Waschmaschine.Status totalEnergy {([Waschmaschine.Status:totalEnergy]+[Waschmaschine.Status:lastEnergy])},
  setreading Waschmaschine.Status lastCost {([Waschmaschine.Status:lastEnergy]/1000*0.25)},
  setreading Waschmaschine.Status totalCost {([Waschmaschine.Status:totalEnergy]/1000*0.25)},
  setreading Waschmaschine.Status preEnergy [Waschmaschine.Status:energy]

)
   NAME       Programm.Waschmaschine.Status
   NR         174
   NTFY_ORDER 50-Programm.Waschmaschine.Status
   STATE      cmd_3
   TYPE       DOIF
   Readings:
     2015-09-12 20:25:20   Device          Waschmaschine.Status
     2015-09-12 18:46:42   cmd_event       Waschmaschine.Status
     2015-09-12 18:46:42   cmd_nr          3
     2015-09-12 20:25:20   e_Waschmaschine.Status_power 30.87
     2015-09-12 20:25:20   e_Waschmaschine.Status_state running
     2015-09-12 18:46:42   state           cmd_3
     2015-09-12 19:26:35   wait_timer      no timer
   Condition:
     0          ReadingValDoIf('Waschmaschine.Status','power','') < AttrVal("Waschmaschine.Status", "configPowerOff", 1)
     1          ReadingValDoIf('Waschmaschine.Status','power','') >= AttrVal("Waschmaschine.Status", "configPowerOff", 1) and ReadingValDoIf('Waschmaschine.Status','state','') eq 'off'
     2          ReadingValDoIf('Waschmaschine.Status','power','') >= AttrVal("Waschmaschine.Status", "configPowerDone", 3)
     3          ReadingValDoIf('Waschmaschine.Status','power','') < AttrVal("Waschmaschine.Status", "configPowerDone", 3) and ReadingValDoIf('Waschmaschine.Status','state','') eq 'running'
   Devices:
     0           Waschmaschine.Status
     1           Waschmaschine.Status
     2           Waschmaschine.Status
     3           Waschmaschine.Status
     all         Waschmaschine.Status
   Do:
     0:
       0              set Waschmaschine.Status off,  setreading Waschmaschine.Status preEnergy 0
     1:
       0            set Waschmaschine.Status on,  setreading Waschmaschine.Status preEnergy [Waschmaschine.Status:energy]
     2:
       0            set Waschmaschine.Status running
     3:
       0            set Waschmaschine.Status done,  setreading Waschmaschine.Status lastEnergy {([Waschmaschine.Status:energy]-[Waschmaschine.Status:preEnergy])},  setreading Waschmaschine.Status totalEnergy {([Waschmaschine.Status:totalEnergy]+[Waschmaschine.Status:lastEnergy])},  setreading Waschmaschine.Status lastCost {([Waschmaschine.Status:lastEnergy]/1000*0.25)},  setreading Waschmaschine.Status totalCost {([Waschmaschine.Status:totalEnergy]/1000*0.25)},  setreading Waschmaschine.Status preEnergy [Waschmaschine.Status:energy]
   Helper:
     globalinit 1
     last_timer 0
     sleepdevice Waschmaschine.Status
     sleepsubtimer 0
     sleeptimer -1
   Internals:
   Itimer:
   Readings:
     0           Waschmaschine.Status:power
     1           Waschmaschine.Status:power Waschmaschine.Status:state
     2           Waschmaschine.Status:power
     3           Waschmaschine.Status:power Waschmaschine.Status:state
     all         Waschmaschine.Status:power Waschmaschine.Status:state
   State:
   Trigger:
Attributes:
   alias      Zustandserkennung der Waschmaschine
   group      Waschmaschine
   icon       im_code
   room       Programme
   wait       5:0:0:60



Internals:
   DEF        ([Trockner.Status:power] < AttrVal("Trockner.Status", "configPowerOff", 1) and [Trockner.Status:state] ne 'running') (

  set Trockner.Status off,
  setreading Trockner.Status preEnergy 0

) DOELSEIF ([Trockner.Status:power] >= AttrVal("Trockner.Status", "configPowerOff", 1) and [Trockner.Status:state] eq 'off') (

  set Trockner.Status on,
  setreading Trockner.Status preEnergy [Trockner.Status:energy]

) DOELSEIF ([Trockner.Status:power] >= AttrVal("Trockner.Status", "configPowerDone", 3)) (

  set Trockner.Status running

) DOELSEIF ([Trockner.Status:power] < AttrVal("Trockner.Status", "configPowerDone", 3) and [Trockner.Status:state] eq 'running') (

  set Trockner.Status done,
  setreading Trockner.Status lastEnergy {([Trockner.Status:energy]-[Trockner.Status:preEnergy])},
  setreading Trockner.Status totalEnergy {([Trockner.Status:totalEnergy]+[Trockner.Status:lastEnergy])},
  setreading Trockner.Status lastCost {([Trockner.Status:lastEnergy]/1000*0.25)},
  setreading Trockner.Status totalCost {([Trockner.Status:totalEnergy]/1000*0.25)},
  setreading Trockner.Status preEnergy [Trockner.Status:energy]

)
   NAME       Programm.Trockner.Status
   NR         213
   NTFY_ORDER 50-Programm.Trockner.Status
   STATE      cmd_3
   TYPE       DOIF
   Readings:
     2015-09-12 20:24:08   Device          Trockner.Status
     2015-09-12 20:24:08   cmd_event       Trockner.Status
     2015-09-12 20:24:08   cmd_nr          3
     2015-09-12 20:24:08   e_Trockner.Status_power 1.25
     2015-09-12 20:24:08   e_Trockner.Status_state running
     2015-09-12 20:24:08   state           cmd_3
     2015-09-12 20:24:08   wait_timer      no timer
   Condition:
     0          ReadingValDoIf('Trockner.Status','power','') < AttrVal("Trockner.Status", "configPowerOff", 1) and ReadingValDoIf('Trockner.Status','state','') ne 'running'
     1          ReadingValDoIf('Trockner.Status','power','') >= AttrVal("Trockner.Status", "configPowerOff", 1) and ReadingValDoIf('Trockner.Status','state','') eq 'off'
     2          ReadingValDoIf('Trockner.Status','power','') >= AttrVal("Trockner.Status", "configPowerDone", 3)
     3          ReadingValDoIf('Trockner.Status','power','') < AttrVal("Trockner.Status", "configPowerDone", 3) and ReadingValDoIf('Trockner.Status','state','') eq 'running'
   Devices:
     0           Trockner.Status
     1           Trockner.Status
     2           Trockner.Status
     3           Trockner.Status
     all         Trockner.Status
   Do:
     0:
       0              set Trockner.Status off,  setreading Trockner.Status preEnergy 0
     1:
       0            set Trockner.Status on,  setreading Trockner.Status preEnergy [Trockner.Status:energy]
     2:
       0            set Trockner.Status running
     3:
       0            set Trockner.Status done,  setreading Trockner.Status lastEnergy {([Trockner.Status:energy]-[Trockner.Status:preEnergy])},  setreading Trockner.Status totalEnergy {([Trockner.Status:totalEnergy]+[Trockner.Status:lastEnergy])},  setreading Trockner.Status lastCost {([Trockner.Status:lastEnergy]/1000*0.25)},  setreading Trockner.Status totalCost {([Trockner.Status:totalEnergy]/1000*0.25)},  setreading Trockner.Status preEnergy [Trockner.Status:energy]
     4:
   Helper:
     globalinit 1
     last_timer 0
     sleepdevice Trockner.Status
     sleepsubtimer -1
     sleeptimer -1
   Internals:
   Itimer:
   Readings:
     0           Trockner.Status:power Trockner.Status:state
     1           Trockner.Status:power Trockner.Status:state
     2           Trockner.Status:power
     3           Trockner.Status:power Trockner.Status:state
     all         Trockner.Status:power Trockner.Status:state
   State:
   Trigger:
Attributes:
   alias      Zustandserkennung des Trockners
   group      Trockner
   icon       im_code
   room       Programme
   wait       5:0:180:15


Zum Beispiel
Der Trockner meldet alle paar Minuten das sie fertig ist, da der Status dauernd zwischen running und done springt. Dabei habe ich ein wait von 5:0:60:15 (testweise auch mal mit 180) drinne. Daher dürfte der Nachlaufen der kurzfristig den Verbrauch erhöht für paar Sekunden erhöht nicht wieder auf Running laufen.

Damian hast du da irgend etwas umgebaut? Ich dreht hier durch :D

Das aktuelle Modul sollte sich genauso verhalten wie das vorherige. Was mich irritiert ist die Tatsache, dass cmd_3 ohne Verzögerung ausgelöst wurde. Leider kann ich bei mir das Verhalten nicht reproduzieren. Man müsste eine nachvollziehbare Konstruktion mit Dummys nachbauen, wo ich dieses Verhalten reproduzieren kann. um das Problem zu beheben.

Gruß

Damian

Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: traxanos am 12 September 2015, 21:36:06
komme ich an das alte modul dran um es zu testen. der trocker läuft gerade und könnte das nachher testen

PS: Auf Wunsch kann ich dir auch Zugriff geben. Brauche aber einen SSH PubKey.
Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: Damian am 12 September 2015, 22:08:53
Zitat von: traxanos am 12 September 2015, 21:36:06
komme ich an das alte modul dran um es zu testen. der trocker läuft gerade und könnte das nachher testen

PS: Auf Wunsch kann ich dir auch Zugriff geben. Brauche aber einen SSH PubKey.

Ich habe falsch geschaut. Man kann aus dem List kein Fehlverhalten erkennen.

Ich habe keinen SSH PubKey.

Gruß

Damian

Das war die letzte eingecheckte Version von April.

Edit: ich sehe gerade du hast zwei verschiedene Lists, das Fehlverhalten ist im zweiten zu sehen: events e_... und state cmd_3 haben die gleiche Zeit, obwohl sie eine Differenz von 180 Sekunden haben sollten.
Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: traxanos am 12 September 2015, 22:26:25
Ich habe gerade mit einer älteren Version das Verhalten nicht mehr.

Zitat75K 28 Jul 21:10 98_DOIF.pm

Es muss also eine Änderung ca der letzten 14 Tage sein.
Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: traxanos am 12 September 2015, 22:29:30
Mist geht doch nicht. Hast nur länger gebraucht. Verda.....
Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: Damian am 12 September 2015, 22:51:08
Zitat von: traxanos am 12 September 2015, 22:29:30
Mist geht doch nicht. Hast nur länger gebraucht. Verda.....

Wenn die Zeitdifferenz zwischen state und dem ausgelösten Event mit der Wait-Verzögerung übereinstimmt, dann verhält sich das Modul wie programmiert. Ich habe gesehen, dass du mit den Waits gespielt hast, daher könnte es sein, dass die Angabe von 180 Sekunden im zweiten List von dir zum späteren Zeitpunkt vorgenommen wurde und zum Zeitpunkt des Schaltens auf cmd_3 wait für cmd_3 auf Null stand, dann wäre es kein Fehlverhalten.

Gruß

Damian

Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: traxanos am 12 September 2015, 22:59:57
Wenn innerhalb des wait_timer die Condition nicht mehr zu trifft, wird dann der timer auch resetet oder nicht? Aktuell nicht. Meiner Meinung nach müsste er das aber und hat es meiner Meinung nach auch.
Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: Damian am 12 September 2015, 23:40:45
Zitat von: traxanos am 12 September 2015, 22:59:57
Wenn innerhalb des wait_timer die Condition nicht mehr zu trifft, wird dann der timer auch resetet oder nicht? Aktuell nicht. Meiner Meinung nach müsste er das aber und hat es meiner Meinung nach auch.

Ein laufender Timer wird dann gelöscht (nicht ausgelöst), wenn während der Timer läuft ein Trigger für die Bedingung des aktuellen Status wieder kommt.

Beispiel:

aktueller Status: cmd_1

1. Trigger für cmd_2 mit wait 10 Sekunden -> Timer läuft für 10 Sekunden

2. Trigger für cmd_1 während der 10 Sekunden,

3. Timer wird gelöscht, der Zustand bleibt auf cmd_1 und ändert sich nicht.

Gruß

Damian
Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: traxanos am 13 September 2015, 01:39:10
Mhhh also aktuell wird bei mir cmd_3 durch power > 5 ausgelöst. Damit startet Timer mit 3 Minuten. Nun fällt power < 5 wodurch ich der Auffassung war, dass der Timer unterbrochen wird. Das wird er aber nicht. Davon bin ich immer ausgegangen und hat imho funktioniert. Jetzt auf einmal geht es nicht mehr.

Übrigens findest du hier das komplette Script
http://forum.fhem.de/index.php/topic,39498.msg316928.html
Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: Damian am 13 September 2015, 08:16:39
Zitat von: traxanos am 13 September 2015, 01:39:10
Mhhh also aktuell wird bei mir cmd_3 durch power > 5 ausgelöst. Damit startet Timer mit 3 Minuten. Nun fällt power < 5 wodurch ich der Auffassung war, dass der Timer unterbrochen wird. Das wird er aber nicht. Davon bin ich immer ausgegangen und hat imho funktioniert. Jetzt auf einmal geht es nicht mehr.

Übrigens findest du hier das komplette Script
http://forum.fhem.de/index.php/topic,39498.msg316928.html


Leider habe ich nicht die Zeit alle erdenklichen Fälle durchzuspielen, zu mal du in den letzten beiden Lists schon unterschiedliche Wait-Definitionen hattest. Probiere die Version aus dem 4. Post. Diese Version ist stabil und seit April eingecheckt gewesen. Wenn das Verhalten gleich ist, dann brauche ich nicht weiter zu suchen, in diesem Fall musst du die Logik deiner Definition noch mal überprüfen.

Gruß

Damian
Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: Brockmann am 15 September 2015, 09:10:27
@traxanos: Hast Du das Problem lösen können?

Ansonsten:
Ich habe auch die Erfahrung gemacht, dass durch ein Update der letzten Wochen das Verhalten von DOIFs verändert wurde. Ich konnte bei mir das betroffene DOIF modifizieren, so dass der Effekt nicht mehr auftritt, kann aber nicht behaupten, ganz verstanden zu haben, wo das Problem genau liegt. Es scheint mir aufzutreten, wenn ein DOIF sich durch eine Aktion selbst wieder triggern kann, also beispielsweise den Status eines Device verändert und dieses Device wiederum als Trigger verwendet. Und das passiert bei Deinem Code ja auch.

Wenn ich es richtig verstanden habe, hat Damian in letzter Zeit das Verhalten von DOIF dahingehend verändert, dass die Readings eines DOIFs aktualisiert werden, bevor die Aktion ausgeführt wird. Vorher wurden die erst nach den Aktionen aktualisiert. Das könnte sich hier auswirken.

Vorher: Wenn das DOIF sich selbst triggert, hat es noch die alten Readings, also auch noch den alten, quasi vorherigen state.
Jetzt: Wenn das DOIF sich selbst triggert, hat es schon die neuen Readings, also auch den neuen, aktuellen state.

Und da es ja vom state abhängt, ob eine Statusänderung eintritt und dementsprechend eine Aktion ausgeführt wird, könnte sich hier durchaus eine Verhaltensänderung ergeben.

Das ist aber nur eine Theorie, abgeleitet von meinen Beobachtungen am eigenen Problem-DOIF. Das ganze lässt sich schlecht debuggen. Aber vielleicht hilft es Dir ja, das Problem unter diesem Gesichtspunkt nochmal zu überdenken.
Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: Damian am 15 September 2015, 09:56:02
Zitat von: Brockmann am 15 September 2015, 09:10:27
@traxanos: Hast Du das Problem lösen können?

Ansonsten:
Ich habe auch die Erfahrung gemacht, dass durch ein Update der letzten Wochen das Verhalten von DOIFs verändert wurde. Ich konnte bei mir das betroffene DOIF modifizieren, so dass der Effekt nicht mehr auftritt, kann aber nicht behaupten, ganz verstanden zu haben, wo das Problem genau liegt. Es scheint mir aufzutreten, wenn ein DOIF sich durch eine Aktion selbst wieder triggern kann, also beispielsweise den Status eines Device verändert und dieses Device wiederum als Trigger verwendet. Und das passiert bei Deinem Code ja auch.

Wenn ich es richtig verstanden habe, hat Damian in letzter Zeit das Verhalten von DOIF dahingehend verändert, dass die Readings eines DOIFs aktualisiert werden, bevor die Aktion ausgeführt wird. Vorher wurden die erst nach den Aktionen aktualisiert. Das könnte sich hier auswirken.

Vorher: Wenn das DOIF sich selbst triggert, hat es noch die alten Readings, also auch noch den alten, quasi vorherigen state.
Jetzt: Wenn das DOIF sich selbst triggert, hat es schon die neuen Readings, also auch den neuen, aktuellen state.

Und da es ja vom state abhängt, ob eine Statusänderung eintritt und dementsprechend eine Aktion ausgeführt wird, könnte sich hier durchaus eine Verhaltensänderung ergeben.

Das ist aber nur eine Theorie, abgeleitet von meinen Beobachtungen am eigenen Problem-DOIF. Das ganze lässt sich schlecht debuggen. Aber vielleicht hilft es Dir ja, das Problem unter diesem Gesichtspunkt nochmal zu überdenken.

Ich habe lediglich ein Reading namens Device hinzugefügt, welches im Ausführungsteil abgefragt werden kann. Die anderen Readings haben Ihren Aktualisierungszeitpunkt nicht geändert bekommen.

Da ich die Wait-Auswertung überarbeitet habe, ist durchaus möglich, dass es irgendeine Kombination gibt, wo sich das Modul möglicherweise anders verhält. Die Standardfälle habe ich alle durchgetestet. Für eine Korrektur müsste ich einen reproduzierbaren Fall haben, den ich bisher nicht gesehen habe.

Edit: Es wurde schon vor längerer Zeit das Verhalten bzgl. des DOELSE-Falls geändert (diese Änderungen waren also schon vorher drin gewesen):

http://forum.fhem.de/index.php/topic,39070.msg329125.html#msg329125

Gruß

Damian
Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: Brockmann am 15 September 2015, 12:20:31
Zitat von: Damian am 15 September 2015, 09:56:02
Ich habe lediglich ein Reading namens Device hinzugefügt, welches im Ausführungsteil abgefragt werden kann. Die anderen Readings haben Ihren Aktualisierungszeitpunkt nicht geändert bekommen.
Ah, OK, dann habe ich das falsch verstanden.
Möglicherweise liegt/lag dann einfach ein Timingproblem vor, dass genausogut von einem anderen Modul verursacht sein kann.
Mit WAIT bzw. DOELSE kann das Problem bei mir eigentlich nicht zu tun gehabt haben.

Es geht darum, dass eine Bedingung eines DOIF in einem bestimmten, täglich eintretenden Szenario früher nie erfüllt war und nach dem Update plötzlich jedes Mal eintrat. Teil der Bedingung ist der Status des DOIF selbst (nicht-triggernd). Abhilfe war, als zusätzliche Bedingung einzufügen, dass die letzte Änderung beim Status des DOIFs mindestens x Sekunden zurückliegen musss (ebenfalls nicht-triggernd). Damit läuft das DOIF wieder wie gewohnt.
Das führte mich dann in Verbindung mit solidem Halbwissen (s. o.) zu meiner Theorie, dass sich der Aktualisierungszeitpunkt verschoben hat.

Aber da es eben zeitkritisch ist, kann die Verschiebung auch aus einem anderen Modul kommen und ich hatte vorher nur Glück, dass es funktioniert hat.
Titel: Antw:DOIF verhält sich merkwürdig
Beitrag von: Damian am 15 September 2015, 13:37:16
Zitat von: Brockmann am 15 September 2015, 12:20:31
Ah, OK, dann habe ich das falsch verstanden.
Möglicherweise liegt/lag dann einfach ein Timingproblem vor, dass genausogut von einem anderen Modul verursacht sein kann.
Mit WAIT bzw. DOELSE kann das Problem bei mir eigentlich nicht zu tun gehabt haben.

Es geht darum, dass eine Bedingung eines DOIF in einem bestimmten, täglich eintretenden Szenario früher nie erfüllt war und nach dem Update plötzlich jedes Mal eintrat. Teil der Bedingung ist der Status des DOIF selbst (nicht-triggernd). Abhilfe war, als zusätzliche Bedingung einzufügen, dass die letzte Änderung beim Status des DOIFs mindestens x Sekunden zurückliegen musss (ebenfalls nicht-triggernd). Damit läuft das DOIF wieder wie gewohnt.
Das führte mich dann in Verbindung mit solidem Halbwissen (s. o.) zu meiner Theorie, dass sich der Aktualisierungszeitpunkt verschoben hat.

Aber da es eben zeitkritisch ist, kann die Verschiebung auch aus einem anderen Modul kommen und ich hatte vorher nur Glück, dass es funktioniert hat.

ja, die Abfrage des einen Status ist immer kritisch, weil der Status erst später gesetzt wird. Ein weiteres Problem, welches ich wieder nach hinten geschoben habe, ist die Tatsache, dass die Reihenfolge der Abarbeitung von Zeittriggern mit der gleichen Zeit nicht gewährleistet ist und es wird mehrfach getriggert.  Z. B. bei DOIF ([10:00]) (...) DOELSEIF ([10:00]) (...) kann zuerst der zweiter DO-Fall zuschlagen und gleich danach noch mal der erste - allerdings ist es auch kein neues Problem.

Naja, solange keiner etwas Reproduzierbares liefert, werde ich nichts ändern.


Gruß

Damian