DOIF bekommt Änderung von state nicht mit, wenn es selbst schaltet?

Begonnen von Sheridan, 18 April 2016, 09:17:11

Vorheriges Thema - Nächstes Thema

Sheridan

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.
FHEM auf RasPi 4 mit CUL (MAX), CUL (IT), JeeLink (LaCrosse), JeeLink (EC3000), DuoFern, Razberry (ZWave) sowie Fritz!Box, Enigma2, Squeezebox, Google Assistant (inkl. Nest Hub 2)
FHEM auf RasPi 3 mit CUL (MAX), TUL (KNX), CUBe (MAX), EnOceanPi (EnOcean)

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

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

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sheridan

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".
FHEM auf RasPi 4 mit CUL (MAX), CUL (IT), JeeLink (LaCrosse), JeeLink (EC3000), DuoFern, Razberry (ZWave) sowie Fritz!Box, Enigma2, Squeezebox, Google Assistant (inkl. Nest Hub 2)
FHEM auf RasPi 3 mit CUL (MAX), TUL (KNX), CUBe (MAX), EnOceanPi (EnOcean)

Sheridan

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.
FHEM auf RasPi 4 mit CUL (MAX), CUL (IT), JeeLink (LaCrosse), JeeLink (EC3000), DuoFern, Razberry (ZWave) sowie Fritz!Box, Enigma2, Squeezebox, Google Assistant (inkl. Nest Hub 2)
FHEM auf RasPi 3 mit CUL (MAX), TUL (KNX), CUBe (MAX), EnOceanPi (EnOcean)

Per


Sheridan

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) aufspiele.

Viele Grüße!
FHEM auf RasPi 4 mit CUL (MAX), CUL (IT), JeeLink (LaCrosse), JeeLink (EC3000), DuoFern, Razberry (ZWave) sowie Fritz!Box, Enigma2, Squeezebox, Google Assistant (inkl. Nest Hub 2)
FHEM auf RasPi 3 mit CUL (MAX), TUL (KNX), CUBe (MAX), EnOceanPi (EnOcean)

Sheridan

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
FHEM auf RasPi 4 mit CUL (MAX), CUL (IT), JeeLink (LaCrosse), JeeLink (EC3000), DuoFern, Razberry (ZWave) sowie Fritz!Box, Enigma2, Squeezebox, Google Assistant (inkl. Nest Hub 2)
FHEM auf RasPi 3 mit CUL (MAX), TUL (KNX), CUBe (MAX), EnOceanPi (EnOcean)

CoolTux


([knxOG7SteckdoseBesprechung] eq "on") (set knxOG7SteckdoseBesprechung off) DOELSE ()
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Sheridan

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
FHEM auf RasPi 4 mit CUL (MAX), CUL (IT), JeeLink (LaCrosse), JeeLink (EC3000), DuoFern, Razberry (ZWave) sowie Fritz!Box, Enigma2, Squeezebox, Google Assistant (inkl. Nest Hub 2)
FHEM auf RasPi 3 mit CUL (MAX), TUL (KNX), CUBe (MAX), EnOceanPi (EnOcean)

Ellert

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

Sheridan

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.
FHEM auf RasPi 4 mit CUL (MAX), CUL (IT), JeeLink (LaCrosse), JeeLink (EC3000), DuoFern, Razberry (ZWave) sowie Fritz!Box, Enigma2, Squeezebox, Google Assistant (inkl. Nest Hub 2)
FHEM auf RasPi 3 mit CUL (MAX), TUL (KNX), CUBe (MAX), EnOceanPi (EnOcean)

Ellert

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)\$) ()

Sheridan

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
FHEM auf RasPi 4 mit CUL (MAX), CUL (IT), JeeLink (LaCrosse), JeeLink (EC3000), DuoFern, Razberry (ZWave) sowie Fritz!Box, Enigma2, Squeezebox, Google Assistant (inkl. Nest Hub 2)
FHEM auf RasPi 3 mit CUL (MAX), TUL (KNX), CUBe (MAX), EnOceanPi (EnOcean)

Ellert

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"}