Hallo Damian,
die Idee ist folgende: für die Vereinigung von einem Dummy und einer DOIF-Definition wäre es schön, wenn bei dem set DOIF disable das DOIF ein letztes mal aufgerufen würde, um darauf triggern zu können, um eine Ende-Aktion durchzuführen. Ein DOIF kann sich beim Initialisieren offensichtlich selbst triggern, beim Disablen aber nicht.
Beispiel:
Internals:
CFGFN
DEF ([Ambientelicht_Automatik_Test] eq "on") ({Log 3,"an"}) DOELSEIF ([Ambientelicht_Automatik_Test] eq "off") ({Log 3,"aus"})
NAME Ambientelicht_Automatik_Test
NR 3313
NTFY_ORDER 50-Ambientelicht_Automatik_Test
STATE off
TYPE DOIF
CHANGETIME:
Helper:
Dblog:
Device:
Eventlog:
TIME 1441464419.32019
VALUE Ambientelicht_Automatik_Test
Cmd_event:
Eventlog:
TIME 1441464263.14614
VALUE Ambientelicht_Automatik_Test
Cmd_nr:
Eventlog:
TIME 1441464263.14614
VALUE 1
E_ambientelicht_automatik_test_state:
Eventlog:
TIME 1441464419.32019
VALUE on
Mode:
Eventlog:
TIME 1441464504.13084
VALUE disabled
State:
Eventlog:
TIME 1441464504.13084
VALUE disabled
Readings:
2015-09-05 16:48:24 mode disabled
2015-09-05 16:48:24 state disabled
Condition:
0 InternalDoIf('Ambientelicht_Automatik_Test','STATE','') eq "on"
1 InternalDoIf('Ambientelicht_Automatik_Test','STATE','') eq "off"
Devices:
0 Ambientelicht_Automatik_Test
1 Ambientelicht_Automatik_Test
all Ambientelicht_Automatik_Test
Do:
0:
0 {Log 3,"an"}
1:
0 {Log 3,"aus"}
Helper:
globalinit 1
last_timer 0
sleeptimer -1
Internals:
0 Ambientelicht_Automatik_Test:STATE
1 Ambientelicht_Automatik_Test:STATE
all Ambientelicht_Automatik_Test:STATE
Itimer:
State:
Timerfunc:
Attributes:
devStateIcon on:general_an_fuer_zeit off:general_aus_fuer_zeit
eventMap disable:off initialize:on
room Einstellungen
stateFormat {ReadingsVal("Ambientelicht_Automatik_Test","state","") eq "disabled"?"off":"on"}
webCmd on:off
Klicke ich im Webfrontend auf "on", erhält das DOIF den STATE an und es führt auch eine entsprechende Aktion aus. Klicke ich im Webfrontend auf "off", erhält das DOIF den korrekten STATE, führt aber nicht mehr die Schlussaktion aus.
Oder könnte ich das bereits jetzt anders realisieren und ich habe einen Denkfehler?
Zitat von: Ralli am 05 September 2015, 16:54:47
Hallo Damian,
die Idee ist folgende: für die Vereinigung von einem Dummy und einer DOIF-Definition wäre es schön, wenn bei dem set DOIF disable das DOIF ein letztes mal aufgerufen würde, um darauf triggern zu können, um eine Ende-Aktion durchzuführen. Ein DOIF kann sich beim Initialisieren offensichtlich selbst triggern, beim Disablen aber nicht.
Beispiel:
Internals:
CFGFN
DEF ([Ambientelicht_Automatik_Test] eq "on") ({Log 3,"an"}) DOELSEIF ([Ambientelicht_Automatik_Test] eq "off") ({Log 3,"aus"})
NAME Ambientelicht_Automatik_Test
NR 3313
NTFY_ORDER 50-Ambientelicht_Automatik_Test
STATE off
TYPE DOIF
CHANGETIME:
Helper:
Dblog:
Device:
Eventlog:
TIME 1441464419.32019
VALUE Ambientelicht_Automatik_Test
Cmd_event:
Eventlog:
TIME 1441464263.14614
VALUE Ambientelicht_Automatik_Test
Cmd_nr:
Eventlog:
TIME 1441464263.14614
VALUE 1
E_ambientelicht_automatik_test_state:
Eventlog:
TIME 1441464419.32019
VALUE on
Mode:
Eventlog:
TIME 1441464504.13084
VALUE disabled
State:
Eventlog:
TIME 1441464504.13084
VALUE disabled
Readings:
2015-09-05 16:48:24 mode disabled
2015-09-05 16:48:24 state disabled
Condition:
0 InternalDoIf('Ambientelicht_Automatik_Test','STATE','') eq "on"
1 InternalDoIf('Ambientelicht_Automatik_Test','STATE','') eq "off"
Devices:
0 Ambientelicht_Automatik_Test
1 Ambientelicht_Automatik_Test
all Ambientelicht_Automatik_Test
Do:
0:
0 {Log 3,"an"}
1:
0 {Log 3,"aus"}
Helper:
globalinit 1
last_timer 0
sleeptimer -1
Internals:
0 Ambientelicht_Automatik_Test:STATE
1 Ambientelicht_Automatik_Test:STATE
all Ambientelicht_Automatik_Test:STATE
Itimer:
State:
Timerfunc:
Attributes:
devStateIcon on:general_an_fuer_zeit off:general_aus_fuer_zeit
eventMap disable:off initialize:on
room Einstellungen
stateFormat {ReadingsVal("Ambientelicht_Automatik_Test","state","") eq "disabled"?"off":"on"}
webCmd on:off
Klicke ich im Webfrontend auf "on", erhält das DOIF den STATE an und es führt auch eine entsprechende Aktion aus. Klicke ich im Webfrontend auf "off", erhält das DOIF den korrekten STATE, führt aber nicht mehr die Schlussaktion aus.
Oder könnte ich das bereits jetzt anders realisieren und ich habe einen Denkfehler?
Beim set ... initialize wird einfach nur der Status auf initialize gesetzt, der Mode disable und cmd_nr gelöscht, damit führt der nächster Trigger zur Ausführung, weil der vorherige Zustand gelöscht wurde.
DOIF triggert sich nicht selbst. Wenn der Mode disable gesetzt ist werden keine Trigger ausgewertet, die Timer laufen weiter.
Mit der Abfrage auf sich selbst bildest du eine Rekursion, die von FHEM beim zweiten Durchlauf unterbunden wird, da habe ich selbst nichts dazu programmiert. Das sind Mechanismen außerhalb von DOIF.
Gruß
Damian