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.
attr ifAussenLicht do always
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
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".
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.
Schau mal nach selftrigger...
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!
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
([knxOG7SteckdoseBesprechung] eq "on") (set knxOG7SteckdoseBesprechung off) DOELSE ()
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
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
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.
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)\$) ()
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
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"}
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
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$"]) ()
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
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.
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.