Ich weiß, die Überschrift klingt seltsam, das Verhalten des DOIF aber auch und ich weiß wirklich nicht, wie ich es kurz beschreiben soll.
Ich habe ein DOIF, das bei Änderung eines eigenen Readings auslösen soll und den Inhalt des Readings an ein anderes Device weitergeben soll. (für Testzwecke hier ein dummy)
Das Reading kann Werte von 0 bis 4 annehmen. Nach Initalizierung reagiert das DOIF auf alle Readingänderungen, inclusive 0. danach aber nur noch auf Änderungen zu 1 - 4.
D.h. Z.B.: 1. Durchgang : Reading wird auf 0 gesetzt - Dummy wird auf 0 gesetzt
2. Durchgang: Reading wird auf 1 gesetzt - Dummy wird auf 1 gesetzt
3. Durchgang: Reading wird auf 0 gesetzt - Dummy ändert sich nicht
4. Durchgang: Reading wird auf 3 gesetzt - Dummy wird auf 3 gesetzt
5. Durchgang : Reding wird auf 0 gesetzt - Dummy ändert sich nicht
Dieses Verhalten ist unabhängig davon, ob nach Initialisierung das Reading erstmal auf 0moder einen anderen Wert gesetzt wird.
Wir gesagt, das Setzen auf 0 löst das DOIF exakt 1 mal aus, das Setzen des Readings auf andere Werte (1-4) löst das DOIF jedesmal aus.
Was übersehe ich?
Anbei ein List
Danke
K-H
Internals:
CFGFN
DEF ([$SELF:Modus]) (set Test [$SELF:Modus])
NAME Test_Doif
NR 6347
NTFY_ORDER 50-Test_Doif
STATE cmd_1
TYPE DOIF
Readings:
2017-01-05 19:12:32 Device Test_Doif
2017-01-05 19:12:32 Modus 0
2017-01-05 19:12:19 cmd 1
2017-01-05 19:12:19 cmd_event Test_Doif
2017-01-05 19:12:19 cmd_nr 1
2017-01-05 19:12:32 e_Test_Doif_Modus 0
2017-01-05 19:12:19 state cmd_1
Condition:
0 ReadingValDoIf($hash,'Test_Doif','Modus')
Devices:
0 Test_Doif
all Test_Doif
Do:
0:
0 set Test [Test_Doif:Modus]
1:
Helper:
event Modus: 0,Device: Test_Doif,e_Test_Doif_Modus: 0
globalinit 1
last_timer 0
sleeptimer -1
timerdev Test_Doif
timerevent Modus: 3,Device: Test_Doif,e_Test_Doif_Modus: 3
triggerDev Test_Doif
timerevents:
Modus: 3
Device: Test_Doif
e_Test_Doif_Modus: 3
cmd_nr: 1
cmd: 1
cmd_event: Test_Doif
cmd_1
timereventsState:
Modus: 3
Device: Test_Doif
e_Test_Doif_Modus: 3
cmd_nr: 1
cmd: 1
cmd_event: Test_Doif
cmd_1
triggerEvents:
Modus: 0
Device: Test_Doif
e_Test_Doif_Modus: 0
triggerEventsState:
Modus: 0
Device: Test_Doif
e_Test_Doif_Modus: 0
Internals:
Itimer:
Readings:
0 Test_Doif:Modus
all Test_Doif:Modus
Regexp:
0:
All:
State:
Trigger:
Attributes:
do always
readingList Modus
room DOIF_Labor
selftrigger all
setList Modus:0,1,2,3,4
userReadings Modus
webCmd Modus
[$SELF:Modus] ist ein Reading. Die Bedingung von DOIF ist gleichzeitig Perl und in Perl ist die Bedingung if ($variable) wahr, wenn $variable (bei dir [$SELF:Modus]) ungleich Null ist.
Zitat von: Damian am 05 Januar 2017, 19:56:27
[$SELF:Modus] ist ein Reading. Die Bedingung von DOIF ist gleichzeitig Perl und in Perl ist die Bedingung if ($variable) wahr, wenn $variable (bei dir [$SELF:Modus]) ungleich Null ist.
Klingt nachvollziehbar, gibt es eine (einfache) Lösung? Das Problem ist, dass ich auf den Wert 0 angewiesen bin. Bin leider in Perl nicht gerade fit
Habe selbst ein Lösung gefunden:
Ich habe beim Reading zusätzlich zu den Zahlen einen Text hinzugefügt, damit funktioniert der Trigger, im set Befehl habe ich dann mit :d die Zahl isoliert
Wenn jemand noch eine andere bessere Lösung kennt:gerne!
Internals:
CFGFN
DEF ([$SELF:Modus])
(set Test [$SELF:Modus:d])
NAME Test_Doif1
NR 8657
NTFY_ORDER 50-Test_Doif1
STATE cmd_1
TYPE DOIF
Readings:
2017-01-05 20:34:20 Device Test_Doif1
2017-01-05 20:34:13 Eingabe 0
2017-01-05 20:34:20 Modus 1=Tag
2017-01-05 20:34:20 cmd 1
2017-01-05 20:34:20 cmd_event Test_Doif1
2017-01-05 20:34:20 cmd_nr 1
2017-01-05 20:34:20 e_Test_Doif1_Modus 1=Tag
2017-01-05 20:34:20 state cmd_1
Condition:
0 ReadingValDoIf($hash,'Test_Doif1','Modus')
Devices:
0 Test_Doif1
all Test_Doif1
Do:
0:
0 set Test [Test_Doif1:Modus:d]
Helper:
event Modus: 1=Tag,Device: Test_Doif1,e_Test_Doif1_Modus: 1=Tag
globalinit 1
last_timer 0
sleeptimer -1
timerdev Test_Doif1
timerevent Modus: 1=Tag,Device: Test_Doif1,e_Test_Doif1_Modus: 1=Tag
triggerDev Test_Doif1
timerevents:
Modus: 1=Tag
Device: Test_Doif1
e_Test_Doif1_Modus: 1=Tag
cmd_nr: 1
cmd: 1
cmd_event: Test_Doif1
cmd_1
timereventsState:
Modus: 1=Tag
Device: Test_Doif1
e_Test_Doif1_Modus: 1=Tag
cmd_nr: 1
cmd: 1
cmd_event: Test_Doif1
cmd_1
triggerEvents:
Modus: 1=Tag
Device: Test_Doif1
e_Test_Doif1_Modus: 1=Tag
cmd_nr: 1
cmd: 1
cmd_event: Test_Doif1
cmd_1
triggerEventsState:
Modus: 1=Tag
Device: Test_Doif1
e_Test_Doif1_Modus: 1=Tag
cmd_nr: 1
cmd: 1
cmd_event: Test_Doif1
cmd_1
Internals:
Itimer:
Readings:
0 Test_Doif1:Modus
all Test_Doif1:Modus
Regexp:
0:
All:
State:
Trigger:
Attributes:
do always
readingList Modus
room DOIF_Labor
selftrigger all
setList Modus:0=Auto,1=Tag,2=Nacht
webCmd Modus
Zitat von: Garbsen am 05 Januar 2017, 20:06:00
Klingt nachvollziehbar, gibt es eine (einfache) Lösung? Das Problem ist, dass ich auf den Wert 0 angewiesen bin. Bin leider in Perl nicht gerade fit
Ganz einfach, dann musst du nach Ereignissen und nicht nach Readings triggern:
[$SELF:"Modus"]