FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Sheridan am 18 April 2016, 09:17:11

Titel: DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Sheridan am 18 April 2016, 09:17:11
Hallo zusammen,

ich versuche, unser Aussenlicht in Abhängigkeit von Helligkeit, Öffnung der Haustür etc. unterschiedlich lange Leuchten zu lassen. Bereits bei dieser Abfrage habe ich aber ein Problem:

define ifAussenLicht DOIF ([zwvAussenLicht] eq "on") (set zwvAussenLicht off)
attr ifAussenLicht wait 10


Wenn ich das Licht anschalte, erzeugt er einen Ausschalttimer und das Licht geht nach 10 Sekunden aus (wait). Allerdings bleibt das DOIF dann in cmd_1 weil es, aus irgendeinem Grund, nicht mitbekommt, dass zwvAussenLicht:STATE auf "off" gegangen ist (er geht aber wirklich auf "off"!). Somit geht bei dem nächsten Einschalten nichts mehr, das DOIF bleibt immer in cmd_1 und das Licht an. Wenn ich das Licht von Hand ausmache, dann wechselt das DOIF in cmd_2 und beim nächsten Einschalten klappen auch die 10 Sekunden wieder.

zwvAussenLicht ist ein FGS-222 via ZWave.

Hier die Events, man sieht, es wird ein off-Event erzeugt.

2016-04-18 09:09:00.364 DOIF ifAussenLichtTest wait_timer: 18.04.2016 09:09:10 cmd_1 zwvAussenLicht
2016-04-18 09:09:00.369 ZWave zwvAussenLicht on
2016-04-18 09:09:10.366 DOIF ifAussenLichtTest wait_timer: no timer
2016-04-18 09:09:10.384 ZWave zwvAussenLicht off
2016-04-18 09:09:10.408 DOIF ifAussenLichtTest cmd_nr: 1
2016-04-18 09:09:10.408 DOIF ifAussenLichtTest cmd_event: zwvAussenLicht
2016-04-18 09:09:10.408 DOIF ifAussenLichtTest cmd_1


Ich habe das ganze noch mit einem Fritz!DECT-Schalter probiert, da tritt das Problem nicht auf. Ich denke, dass das ZWave-Licht die Statusänderung zu schnell meldet evtl. und das DOIF noch "beschäftigt" ist?

Ich habe außerdem auch direkt die Überprüfung von :state probiert, aber auch das hilft nicht. Das Problem tritt auch ohne wait auf.
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: CoolTux am 18 April 2016, 09:23:22

attr ifAussenLicht do always
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Damian am 18 April 2016, 09:35:08
Zitat von: Sheridan am 18 April 2016, 09:17:11

Ich habe das ganze noch mit einem Fritz!DECT-Schalter probiert, da tritt das Problem nicht auf. Ich denke, dass das ZWave-Licht die Statusänderung zu schnell meldet evtl. und das DOIF noch "beschäftigt" ist?


Das glaube ich nicht, Events gehen in FHEM nicht verloren.

Du hast wahrscheinlich do always gesetzt, dann gibt es auch keinen cmd_2 Fall, wenn man den nicht gesetzt hat, deshalb musst du dann definieren:

define ifAussenLicht DOIF ([zwvAussenLicht] eq "on") (set zwvAussenLicht off) DOELSE

Gruß

Damian

Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Sheridan am 18 April 2016, 13:17:03
Hallo,

danke für die Antworten. do_always habe ich nicht gesetzt, macht in meiner Anwendung meiner Ansicht nach auch keinen Sinn, oder?

Ich habe wirklich nur das wait Attribut gesetzt (bzw. es passiert auch ohne dieses Attribut).

In meinen Tests war es 100% eindeutig: Wenn ich einen FRITZ!Dect-Schalter nehme, ist das DOIF-Modul nachher im richtigen Zustand, bei dem ZWave-Schalter nicht. Im EVENT-Log sehe ich aber, dass auch bei dem ZWave-Schalter ein Event erzeugt wird (und selbiger auch immer den richtigen state anzeigt). Es ist auch so, dass das DOIF-Modul wieder in den richtigen Zustand kommt, wenn ich das Licht noch einmal über FHEM an und aus mache (also während das DOIF "fälschlicherweise" im cmd_1-Zweig hängt). Danach ist es dann auch korrekt im cmd_2-Zweig und der nächste Vorgang klappt dann wieder (also automatisches Abschalten). Es kommt nur dann nicht in den richtigen Zustand, wenn es selbst das Abschalten "verursacht".
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Sheridan am 18 April 2016, 13:37:53
Hallo nochmal,

ich habe noch weitere Tests ausgeführt:
- Verwendung eines KNX/Instabus-Aktors anstelle von Z-Wave: Problem tritt hier ebenfalls auf!
- Verwendung von DOELSE: kein Unterschied. Es gab ja vorher bei mir auch schon cmd_2, nur ist er da nicht reingewechselt, außer ich habe selbst ein weiteres Off-Event provoziert.
- Verwendung von do always (und DOELSE): Dann geht es, aber er bleibt trotzdem immer im cmd_1-Fall und wechselt nach dem Abschalten nicht in den cmd_2-Fall. Das ist für meine komplexere If-Abfrage, wo dann noch weitere Dinge abgeprüft werden, keine Option, weil dann bei jedem Event (auch wenn sich nichts ändert, z.B. twilight o.ä.) ein Schaltvorgang ausgelöst würde.
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Per am 18 April 2016, 13:47:52
Schau mal nach selftrigger...
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Sheridan am 18 April 2016, 14:03:28
Hallo Per,

Danke, ja, ich denke, das erklärt es. Es wirkte eben auch so, als würde das Event "übersehen", demnach also beabsichtigt. Die Version mit "selftrigger" ist aber noch nicht im Repos, daher hatte ich auch nix im Commandref o.ä. gefunden. Mal schauen, ob ich bis zum Release warte oder die Version aus dem entsprechenden Thread (https://forum.fhem.de/index.php/topic,51060.0.html (https://forum.fhem.de/index.php/topic,51060.0.html)) aufspiele.

Viele Grüße!
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Sheridan am 18 April 2016, 14:18:47
Hallo,

jetzt musste ich es doch kurz probieren: Mit selftrigger kommt zwar der "off" state an, trotzdem wechselt das DOIF nicht in cmd_2 (was ich gar nicht verstehe) und es geht dann deswegen leider immer noch nicht. Wenn ich das Licht anmache, wird ein timer angelegt und es geht nach 10s wieder aus. Danach ist der Modulzustand des DOIF-Modules wie unten aufgelistet. Erneutes Einschalten des Lichts führt dann zu keinem neuen Timer. Erst, wenn ich es von Hand ausmache, geht ifTest auf cmd_2 und beim nächsten Anschalten geht das Licht wieder nach 10s aus.


fhem> list ifTest
Internals:
   DEF        ([knxOG7SteckdoseBesprechung] eq "on") (set knxOG7SteckdoseBesprechung off) DOELSE
   NAME       ifTest
   NR         276
   NTFY_ORDER 50-ifTest
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-04-18 14:15:24   Device          knxOG7SteckdoseBesprechung
     2016-04-18 14:15:24   cmd             1
     2016-04-18 14:15:24   cmd_event       knxOG7SteckdoseBesprechung
     2016-04-18 14:15:24   cmd_nr          1
     2016-04-18 14:15:24   e_knxOG7SteckdoseBesprechung_STATE off
     2016-04-18 14:15:24   state           cmd_1
     2016-04-18 14:15:24   wait_timer      no timer
   Condition:
     0          InternalDoIf($hash,'knxOG7SteckdoseBesprechung','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "on"
   Devices:
     0           knxOG7SteckdoseBesprechung
     all         knxOG7SteckdoseBesprechung
   Do:
     0:
       0          set knxOG7SteckdoseBesprechung off
     1:
       0
   Helper:
     event      setG1: off,off
     globalinit 1
     last_timer 0
     sleepdevice knxOG7SteckdoseBesprechung
     sleepsubtimer -1
     sleeptimer -1
     timerdev   knxOG7SteckdoseBesprechung
     timerevent setG1: off,off
     triggerDev knxOG7SteckdoseBesprechung
     timerevents:
       setG1: off
       off
     timereventsState:
       setG1: off
       state: off
     triggerEvents:
       setG1: off
       off
     triggerEventsState:
       setG1: off
       state: off
   Internals:
     0           knxOG7SteckdoseBesprechung:STATE
     all         knxOG7SteckdoseBesprechung:STATE
   Itimer:
   Readings:
   Regexp:
     0:
     All:
   State:
   Trigger:
Attributes:
   selftrigger 1
   wait       10
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: CoolTux am 18 April 2016, 14:27:42

([knxOG7SteckdoseBesprechung] eq "on") (set knxOG7SteckdoseBesprechung off) DOELSE ()
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Sheridan am 18 April 2016, 14:39:33
Hallo Cooltux,

das ändert nichts, habe ich gerade probiert:


fhem> list ifTest
Internals:
   DEF        ([knxOG7SteckdoseBesprechung] eq "on") (set knxOG7SteckdoseBesprechung off) DOELSE ()
   NAME       ifTest
   NR         276
   NTFY_ORDER 50-ifTest
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-04-18 14:37:22   Device          knxOG7SteckdoseBesprechung
     2016-04-18 14:37:22   cmd             1
     2016-04-18 14:37:22   cmd_event       knxOG7SteckdoseBesprechung
     2016-04-18 14:37:22   cmd_nr          1
     2016-04-18 14:37:22   e_knxOG7SteckdoseBesprechung_STATE off
     2016-04-18 14:37:22   state           cmd_1
     2016-04-18 14:37:22   wait_timer      no timer
...


Es gibt, wie gesagt, den cmd_2 state, wenn ich das Licht nochmal von Hand schalte, landet er dort auch:


Internals:
   DEF        ([knxOG7SteckdoseBesprechung] eq "on") (set knxOG7SteckdoseBesprechung off) DOELSE ()
   NAME       ifTest
   NR         276
   NTFY_ORDER 50-ifTest
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2016-04-18 14:38:41   Device          knxOG7SteckdoseBesprechung
     2016-04-18 14:38:41   cmd             2
     2016-04-18 14:38:41   cmd_event       knxOG7SteckdoseBesprechung
     2016-04-18 14:38:41   cmd_nr          2
     2016-04-18 14:38:41   e_knxOG7SteckdoseBesprechung_STATE off
     2016-04-18 14:38:41   state           cmd_2
     2016-04-18 14:37:22   wait_timer      no timer
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Ellert am 19 April 2016, 08:20:46
Zitat von: Sheridan am 18 April 2016, 14:39:33
Hallo Cooltux,

das ändert nichts, habe ich gerade probiert:


fhem> list ifTest
Internals:
   DEF        ([knxOG7SteckdoseBesprechung] eq "on") (set knxOG7SteckdoseBesprechung off) DOELSE ()
   NAME       ifTest
   NR         276
   NTFY_ORDER 50-ifTest
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-04-18 14:37:22   Device          knxOG7SteckdoseBesprechung
     2016-04-18 14:37:22   cmd             1
     2016-04-18 14:37:22   cmd_event       knxOG7SteckdoseBesprechung
     2016-04-18 14:37:22   cmd_nr          1
     2016-04-18 14:37:22   e_knxOG7SteckdoseBesprechung_STATE off
     2016-04-18 14:37:22   state           cmd_1
     2016-04-18 14:37:22   wait_timer      no timer
...


Es gibt, wie gesagt, den cmd_2 state, wenn ich das Licht nochmal von Hand schalte, landet er dort auch:


Internals:
   DEF        ([knxOG7SteckdoseBesprechung] eq "on") (set knxOG7SteckdoseBesprechung off) DOELSE ()
   NAME       ifTest
   NR         276
   NTFY_ORDER 50-ifTest
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2016-04-18 14:38:41   Device          knxOG7SteckdoseBesprechung
     2016-04-18 14:38:41   cmd             2
     2016-04-18 14:38:41   cmd_event       knxOG7SteckdoseBesprechung
     2016-04-18 14:38:41   cmd_nr          2
     2016-04-18 14:38:41   e_knxOG7SteckdoseBesprechung_STATE off
     2016-04-18 14:38:41   state           cmd_2
     2016-04-18 14:37:22   wait_timer      no timer

Du könntest DOELSEIF versuchen, das müsste klappen:
DOELSEIF ([knxOG7SteckdoseBesprechung] eq "off")
oder
DOELSEIF ([$SELF:cmd] == 1)

wait 10:0.1 ergänzen
selftrigger 1 und der DOIF-Testversion 0.12
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Sheridan am 19 April 2016, 09:31:23
Hi,

netter Trick!

Die Variante mit DOELSEIF ([knxOG7SteckdoseBesprechung] eq "off") geht bei mir allerdings nicht, bzw. nicht zuverlässig: Er hängt auch wieder, trotz Zustand "off" im cmd_1-Status:


Internals:
   DEF        ([knxOG7SteckdoseBesprechung] eq "on") (set knxOG7SteckdoseBesprechung off) DOELSEIF ([knxOG7SteckdoseBesprechung] eq "off")
   NAME       ifTest
   NR         276
   NTFY_ORDER 50-ifTest
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-04-19 09:26:29   Device          knxOG7SteckdoseBesprechung
     2016-04-19 09:26:29   cmd             1
     2016-04-19 09:26:29   cmd_event       knxOG7SteckdoseBesprechung
     2016-04-19 09:26:29   cmd_nr          1
     2016-04-19 09:26:29   e_knxOG7SteckdoseBesprechung_STATE off
     2016-04-19 09:26:29   state           cmd_1
     2016-04-19 09:26:29   wait_timer      no timer
   Condition:
     0          InternalDoIf($hash,'knxOG7SteckdoseBesprechung','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "on"
     1          InternalDoIf($hash,'knxOG7SteckdoseBesprechung','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "off"
   Devices:
     0           knxOG7SteckdoseBesprechung
     1           knxOG7SteckdoseBesprechung
     all         knxOG7SteckdoseBesprechung
   Do:
     0:
       0          set knxOG7SteckdoseBesprechung off
     1:
       0
   Helper:
     event      setG1: off,off
     globalinit 1
     last_timer 0
     sleepdevice knxOG7SteckdoseBesprechung
     sleepsubtimer -1
     sleeptimer -1
     timerdev   knxOG7SteckdoseBesprechung
     timerevent setG1: off,off
     triggerDev knxOG7SteckdoseBesprechung
     timerevents:
       setG1: off
       off
     timereventsState:
       setG1: off
       state: off
     triggerEvents:
       setG1: off
       off
     triggerEventsState:
       setG1: off
       state: off
   Internals:
     0           knxOG7SteckdoseBesprechung:STATE
     1           knxOG7SteckdoseBesprechung:STATE
     all         knxOG7SteckdoseBesprechung:STATE
   Itimer:
   Readings:
   Regexp:
     0:
     1:
     All:
   State:
   Trigger:
Attributes:
   selftrigger 1
   wait       10:0.5


Die andere Variante mit der direkten Abfrage von cmd ist in meiner realen Anwendung schwierig, da ich da eh schon mehrere Zweige habe und ja nicht weiss, in welchem er dann "hängt". Ich denke, dass ist wirklich ein kleiner Bug und ich habe im DOIF-Neue-Funktionen-Thread ein Minimalbeispiel mit Dummy-Device gepostet. Mal sehen.
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Ellert am 19 April 2016, 20:25:39
Das ist wohl mein Fehler, es müsste nach DOELSEIF ein Befehl folgen sonst greift vermutlich der wait-Timer nicht.

Folgendes aus der Commandref dazu:
ZitatTriggerung durch selbst ausgelöste Events

Standardmäßig unterbindet das DOIF-Modul Selbsttriggerung. D. h. das Modul reagiert nicht auf Events, die es selbst direkt oder indirekt auslöst. Dadurch werden Endlosschleifen verhindert. Wenn das Attribut selftrigger ungleich Null gesetzt ist, kann das DOIF-Modul auf selbst ausgelöste Events reagieren. Dazu müssen die entsprchenden Kommandos mit wait verzögert werden.

Das bedeutet, der Befehlszweig, der den Selbsttrigger erzeugt und der Zweig, der dadurch ausgeführt wird müssen ein Wait-Timer enthalten.
Das kannst Du bei einem einzeiligen DOIF nicht machen, weil es keinen zweiten Befehlszweig gibt, daher klappt der Selbsttrigger nicht.

mit der Ergänzung eines leeren Befehls müsste es funktionieren:

DOELSEIF ([knxOG7SteckdoseBesprechung] eq "off") ()
oder
DOELSEIF ([$SELF:cmd] == 1) ()

Zitatda ich da eh schon mehrere Zweige habe und ja nicht weiss, in welchem er dann "hängt"

Du kannst auf mehrere Zweige triggern, per Regexp:
DOELSEIF ([$SELF:cmd] =~ "^(1|2)\$) ()
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Sheridan am 20 April 2016, 08:19:52
Hallo Ellert,

danke für den neuen Tipp! Kurioserweise funktioniert es damit einmal. Ich mache die Lampe, sie geht nach 10s aus und DOIF ist in cmd_2. Wenn ich die Lampe nochmal an mache, wird wieder ein Timer gesetzt, die Lampe geht nach 10s aus und DOIF bleibt in cmd_1 (obwohl es den "off" Status bekommen hat, siehe unten). Danach gehts natürlich dann nicht mehr. Ich denke, dass da wirklich noch ein kleiner Bug drin ist.


fhem> list ifTest
Internals:
   DEF        ([knxOG7SteckdoseBesprechung] eq "on") (set knxOG7SteckdoseBesprechung off) DOELSEIF ([knxOG7SteckdoseBesprechung] eq "off") ()
   NAME       ifTest
   NR         276
   NTFY_ORDER 50-ifTest
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-04-20 06:51:13   Device          knxOG7SteckdoseBesprechung
     2016-04-20 06:51:13   cmd             1
     2016-04-20 06:51:13   cmd_event       knxOG7SteckdoseBesprechung
     2016-04-20 06:51:13   cmd_nr          1
     2016-04-20 06:51:13   e_knxOG7SteckdoseBesprechung_STATE off
     2016-04-20 06:51:13   state           cmd_1
     2016-04-20 06:51:13   wait_timer      no timer
   Condition:
     0          InternalDoIf($hash,'knxOG7SteckdoseBesprechung','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "on"
     1          InternalDoIf($hash,'knxOG7SteckdoseBesprechung','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "off"
   Devices:
     0           knxOG7SteckdoseBesprechung
     1           knxOG7SteckdoseBesprechung
     all         knxOG7SteckdoseBesprechung
   Do:
     0:
       0          set knxOG7SteckdoseBesprechung off
     1:
       0
   Helper:
     event      setG1: off,off
     globalinit 1
     last_timer 0
     sleepdevice knxOG7SteckdoseBesprechung
     sleepsubtimer -1
     sleeptimer -1
     timerdev   knxOG7SteckdoseBesprechung
     timerevent setG1: off,off
     triggerDev knxOG7SteckdoseBesprechung
     timerevents:
       setG1: off
       off
     timereventsState:
       setG1: off
       state: off
     triggerEvents:
       setG1: off
       off
     triggerEventsState:
       setG1: off
       state: off
   Internals:
     0           knxOG7SteckdoseBesprechung:STATE
     1           knxOG7SteckdoseBesprechung:STATE
     all         knxOG7SteckdoseBesprechung:STATE
   Itimer:
   Readings:
   Regexp:
     0:
     1:
     All:
   State:
   Trigger:
Attributes:
   selftrigger 1
   wait       10:0.5
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Ellert am 20 April 2016, 10:23:54
Ich hätte erwartet, dass es funktioniert, aber ich nutze den Trigger auf ein Gerät, das ich schalte nicht, ich nutze den DOIF-Status zum selbsttriggern.
Vielleicht ist es ein Timing-Problem, dem könntest Du auf die Spur kommen, wenn Du die Events mitloggst. Das Ergebnis würde mich auch interessieren.

define eventlog notify ifTest|knxOG7SteckdoseBesprechung {Log 1, gettimeofday()." - $NAME: $EVENT"}
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Sheridan am 20 April 2016, 10:32:27
Hi Ellert,

hier ist der Log. Ich habe das ifTest erstmal nochmal definiert, damit es wieder im "Initialized" Zustand ist. Dann ging es beim ersten Mal, beim zweiten Mal ging das Licht auch aus, danach war es dann aber in cmd_1:


2016.04.20 10:28:08.519 1: 1461140888.51931 - ifTest: cmd: 0
2016.04.20 10:28:08.521 1: 1461140888.52132 - ifTest: initialized
==> Hier manuell eingeschaltet (set knxOG7SteckdoseBesprechung on)
2016.04.20 10:28:20.791 5: sending Cw470301
2016.04.20 10:28:20.829 1: 1461140900.82969 - knxOG7SteckdoseBesprechung: setG1: on
2016.04.20 10:28:20.831 1: 1461140900.83145 - knxOG7SteckdoseBesprechung: on
2016.04.20 10:28:20.840 1: 1461140900.84074 - ifTest: wait_timer: 20.04.2016 10:28:30 cmd_1 knxOG7SteckdoseBesprechung
2016.04.20 10:28:30.873 1: 1461140910.87319 - ifTest: wait_timer: no timer
2016.04.20 10:28:30.881 5: sending Cw470300
2016.04.20 10:28:30.890 1: 1461140910.89038 - knxOG7SteckdoseBesprechung: setG1: off
2016.04.20 10:28:30.891 1: 1461140910.89153 - knxOG7SteckdoseBesprechung: off
2016.04.20 10:28:30.897 1: 1461140910.89698 - ifTest: wait_timer: 20.04.2016 10:28:31 cmd_2 knxOG7SteckdoseBesprechung
2016.04.20 10:28:30.906 1: 1461140910.90599 - ifTest: cmd_nr: 1
2016.04.20 10:28:30.907 1: 1461140910.90701 - ifTest: cmd: 1
2016.04.20 10:28:30.907 1: 1461140910.90795 - ifTest: cmd_event: knxOG7SteckdoseBesprechung
2016.04.20 10:28:30.908 1: 1461140910.90879 - ifTest: cmd_1
2016.04.20 10:28:31.398 1: 1461140911.39808 - ifTest: wait_timer: no timer
2016.04.20 10:28:31.405 1: 1461140911.40518 - ifTest: cmd_nr: 2
2016.04.20 10:28:31.406 1: 1461140911.40615 - ifTest: cmd: 2
2016.04.20 10:28:31.407 1: 1461140911.40698 - ifTest: cmd_event: knxOG7SteckdoseBesprechung
2016.04.20 10:28:31.407 1: 1461140911.40776 - ifTest: cmd_2
==> Hier manuell eingeschaltet (set knxOG7SteckdoseBesprechung on)
2016.04.20 10:28:34.791 5: sending Cw470301
2016.04.20 10:28:34.800 1: 1461140914.80024 - knxOG7SteckdoseBesprechung: setG1: on
2016.04.20 10:28:34.802 1: 1461140914.80198 - knxOG7SteckdoseBesprechung: on
2016.04.20 10:28:34.811 1: 1461140914.81142 - ifTest: wait_timer: 20.04.2016 10:28:44 cmd_1 knxOG7SteckdoseBesprechung
2016.04.20 10:28:44.845 1: 1461140924.84538 - ifTest: wait_timer: no timer
2016.04.20 10:28:44.853 5: sending Cw470300
2016.04.20 10:28:44.862 1: 1461140924.86265 - knxOG7SteckdoseBesprechung: setG1: off
2016.04.20 10:28:44.864 1: 1461140924.86435 - knxOG7SteckdoseBesprechung: off
2016.04.20 10:28:44.877 1: 1461140924.87753 - ifTest: cmd_nr: 1
2016.04.20 10:28:44.879 1: 1461140924.87939 - ifTest: cmd: 1
2016.04.20 10:28:44.881 1: 1461140924.88125 - ifTest: cmd_event: knxOG7SteckdoseBesprechung
2016.04.20 10:28:44.882 1: 1461140924.88285 - ifTest: cmd_1
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Ellert am 20 April 2016, 11:10:25
Zitat2016.04.20 10:28:44.862 1: 1461140924.86265 - knxOG7SteckdoseBesprechung: setG1: off
2016.04.20 10:28:44.864 1: 1461140924.86435 - knxOG7SteckdoseBesprechung: off
hier müsste der 2. wait-Timer gesetzt werden
2016.04.20 10:28:44.877 1: 1461140924.87753 - ifTest: cmd_nr: 1
2016.04.20 10:28:44.879 1: 1461140924.87939 - ifTest: cmd: 1
2016.04.20 10:28:44.881 1: 1461140924.88125 - ifTest: cmd_event: knxOG7SteckdoseBesprechung
2016.04.20 10:28:44.882 1: 1461140924.88285 - ifTest: cmd_1

Der zweite Timer wird nicht gesetzt.

Die Bedingungen des DOIF werden bei jedem Geräte-Event geprüft. Es gibt 2 "knxOG7SteckdoseBesprechung: setG1: off" und "knxOG7SteckdoseBesprechung: off".
KNX kenne ich nicht. Ist "setG1" ein Reading oder steht im "state" "setG1: off"?

Um auszuschliessen, dass die beiden Events sich beeinflussen, würde ich mal versuchen auf Events zu triggern

(["^knxOG7SteckdoseBesprechung$:^on$"]) (set knxOG7SteckdoseBesprechung off) DOELSEIF (["^knxOG7SteckdoseBesprechung$:^off$"]) ()
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Sheridan am 20 April 2016, 15:53:04
Hallo Ellert,

setG1 ist ein Reading. KNX ist EIB/KNX/Instabus. Mit dem Events ergibt sich das gleiche Bild: Erstes Mal gehts, dann nicht mehr:


Internals:
   DEF        (["^knxOG7SteckdoseBesprechung$:^on$"]) (set knxOG7SteckdoseBesprechung off) DOELSEIF (["^knxOG7SteckdoseBesprechung$:^off$"]) ()
   NAME       ifTest
   NR         276
   NTFY_ORDER 50-ifTest
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-04-20 15:42:21   Device          knxOG7SteckdoseBesprechung
     2016-04-20 15:42:21   cmd             1
     2016-04-20 15:42:21   cmd_event       knxOG7SteckdoseBesprechung
     2016-04-20 15:42:21   cmd_nr          1
     2016-04-20 15:42:11   matched_event_c1_1 on
     2016-04-20 15:42:21   matched_event_c2_1 off
     2016-04-20 15:42:21   state           cmd_1
     2016-04-20 15:42:21   wait_timer      no timer
   Condition:
     0          EventDoIf('^knxOG7SteckdoseBesprechung$',$hash,'^on$',0)
     1          EventDoIf('^knxOG7SteckdoseBesprechung$',$hash,'^off$',0)
   Devices:
   Do:
     0:
       0          set knxOG7SteckdoseBesprechung off
     1:
       0
   Helper:
     event      off
     globalinit 1
     last_timer 0
     sleepdevice knxOG7SteckdoseBesprechung
     sleepsubtimer -1
     sleeptimer -1
     timerdev   knxOG7SteckdoseBesprechung
     timerevent off
     triggerDev knxOG7SteckdoseBesprechung
     timerevents:
       setG1: off
       off
     timereventsState:
       setG1: off
       state: off
     triggerEvents:
       setG1: off
       off
     triggerEventsState:
       setG1: off
       state: off
   Internals:
   Itimer:
   Readings:
   Regexp:
     0:
       0          ^knxOG7SteckdoseBesprechung$:^on$
     1:
       0          ^knxOG7SteckdoseBesprechung$:^off$
     All:
       0          ^knxOG7SteckdoseBesprechung$:^on$
       1          ^knxOG7SteckdoseBesprechung$:^off$
   State:
   Trigger:
Attributes:
   selftrigger 1
   wait       10:0.5


Vereinfachter Test:


define dmyTest dummy
define ifDmyTest DOIF ([dmyTest] eq "on") (set dmyTest off) DOELSEIF ([dmyTest] eq "off") ()
attr ifDmyTest selftrigger 1
attr ifDmyTest wait 10:0.5
define dmyEventLog notify ifDmyTest|dmyTest {Log 1, "dmyEventLog@".gettimeofday()." - $NAME: $EVENT"}


Dann


set dmyTest on


Warten, bis es aus ist und erneut


set dmyTest on


Danach ist ifDmyTest wieder in cmd_1 trotz off und ein weiteres


set dmyTest on


wird nicht mehr abgeschaltet:

Internals:
   CFGFN
   DEF        ([dmyTest] eq "on") (set dmyTest off) DOELSEIF ([dmyTest] eq "off") ()
   NAME       ifDmyTest
   NR         345
   NTFY_ORDER 50-ifDmyTest
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-04-20 15:51:19   Device          dmyTest
     2016-04-20 15:50:36   cmd             1
     2016-04-20 15:50:36   cmd_event       dmyTest
     2016-04-20 15:50:36   cmd_nr          1
     2016-04-20 15:51:19   e_dmyTest_STATE on
     2016-04-20 15:50:36   state           cmd_1
     2016-04-20 15:50:36   wait_timer      no timer
   Condition:
     0          InternalDoIf($hash,'dmyTest','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "on"
     1          InternalDoIf($hash,'dmyTest','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "off"
   Devices:
     0           dmyTest
     1           dmyTest
     all         dmyTest
   Do:
     0:
       0          set dmyTest off
     1:
       0
   Helper:
     event      on
     globalinit 1
     last_timer 0
     sleepdevice dmyTest
     sleepsubtimer -1
     sleeptimer -1
     timerdev   dmyTest
     timerevent on
     triggerDev dmyTest
     timerevents:
       on
     timereventsState:
       state: on
     triggerEvents:
       on
     triggerEventsState:
       state: on
   Internals:
     0           dmyTest:STATE
     1           dmyTest:STATE
     all         dmyTest:STATE
   Itimer:
   Readings:
   Regexp:
     0:
     1:
     All:
   State:
   Trigger:
Attributes:
   selftrigger 1
   wait       10:0.5



2016.04.20 15:50:01.814 1: dmyEventLog@1461160201.81446 - ifDmyTest: cmd: 0
2016.04.20 15:50:01.815 1: dmyEventLog@1461160201.81549 - ifDmyTest: initialized
2016.04.20 15:50:08.050 1: dmyEventLog@1461160208.05004 - dmyTest: on
2016.04.20 15:50:08.056 1: dmyEventLog@1461160208.0562 - ifDmyTest: wait_timer: 20.04.2016 15:50:18 cmd_1 dmyTest
2016.04.20 15:50:18.072 1: dmyEventLog@1461160218.07244 - ifDmyTest: wait_timer: no timer
2016.04.20 15:50:18.080 1: dmyEventLog@1461160218.0808 - dmyTest: off
2016.04.20 15:50:18.087 1: dmyEventLog@1461160218.08731 - ifDmyTest: wait_timer: 20.04.2016 15:50:18 cmd_2 dmyTest
2016.04.20 15:50:18.098 1: dmyEventLog@1461160218.0982 - ifDmyTest: cmd_nr: 1
2016.04.20 15:50:18.099 1: dmyEventLog@1461160218.09931 - ifDmyTest: cmd: 1
2016.04.20 15:50:18.100 1: dmyEventLog@1461160218.10026 - ifDmyTest: cmd_event: dmyTest
2016.04.20 15:50:18.101 1: dmyEventLog@1461160218.10115 - ifDmyTest: cmd_1
2016.04.20 15:50:18.604 1: dmyEventLog@1461160218.60405 - ifDmyTest: wait_timer: no timer
2016.04.20 15:50:18.612 1: dmyEventLog@1461160218.61276 - ifDmyTest: cmd_nr: 2
2016.04.20 15:50:18.613 1: dmyEventLog@1461160218.61382 - ifDmyTest: cmd: 2
2016.04.20 15:50:18.614 1: dmyEventLog@1461160218.61474 - ifDmyTest: cmd_event: dmyTest
2016.04.20 15:50:18.615 1: dmyEventLog@1461160218.61562 - ifDmyTest: cmd_2
2016.04.20 15:50:26.266 1: dmyEventLog@1461160226.2661 - dmyTest: on
2016.04.20 15:50:26.272 1: dmyEventLog@1461160226.27239 - ifDmyTest: wait_timer: 20.04.2016 15:50:36 cmd_1 dmyTest
2016.04.20 15:50:36.293 1: dmyEventLog@1461160236.29311 - ifDmyTest: wait_timer: no timer
2016.04.20 15:50:36.301 1: dmyEventLog@1461160236.30176 - dmyTest: off
2016.04.20 15:50:36.311 1: dmyEventLog@1461160236.31109 - ifDmyTest: cmd_nr: 1
2016.04.20 15:50:36.312 1: dmyEventLog@1461160236.31212 - ifDmyTest: cmd: 1
2016.04.20 15:50:36.313 1: dmyEventLog@1461160236.31303 - ifDmyTest: cmd_event: dmyTest
2016.04.20 15:50:36.313 1: dmyEventLog@1461160236.31391 - ifDmyTest: cmd_1
2016.04.20 15:51:19.623 1: dmyEventLog@1461160279.62325 - dmyTest: on
Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Ellert am 20 April 2016, 16:47:25
Ich habe es bei mir ausprobiert, es funktioniert auch nicht, gleiches Verhalten wie bei Dir. Mit dem Trigger auf "$SELF" klappt es jedoch:

([dmyTest] eq "on") (set dmyTest off) DOELSEIF ([$SELF] eq "cmd_1")

Da ich immer [$SELF] benutze, war ich sicher, dass auch [<Gerätename>] funktioniert. Ich meine es ging mit einer früheren Version schon.

Titel: Antw:DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?
Beitrag von: Sheridan am 20 April 2016, 20:34:48
Hallo Ellert,

vielen Dank für die Vorschläge. Ich werde es dann mal mit dem $SELF probieren, hoffe aber, dass das in DOIF noch geändert wird und es dann so funktioniert wie es eigentlich "intuitiv" wäre.

Den Thread hier kann man dann aber wohl zumachen.