Vereinigung Dummy und DOIF -> Aktion bei set DOIF disable

Begonnen von Ralli, 05 September 2015, 16:54:47

Vorheriges Thema - Nächstes Thema

Ralli

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?
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF