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
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
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.
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.
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.
Mist geht doch nicht. Hast nur länger gebraucht. Verda.....
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
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.
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
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
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
@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.
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
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.
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