Ich möchte eine Statusanzeige der Alarmanlage realisieren, bei der der aktuell wichtigste Zustand angezeigt wird.
Leider scheint das DOIF aber falsch zu schalten.
Wenn sich der state von Alarmanlage_in0 auf "off" ändert wird, obwohl der state von Alarmanlage_in1 vorher bereits auf "yes" stand, als DOIF state "cmd_8" ausgegeben. Müsste hier nicht "cmd_7" korrekt sein?
Mein DOIF:
define di_alarmanlage_summary DOIF ([Alarmanlage_in3] eq "yes")
DOELSEIF ([Alarmanlage_in2] eq "yes")
DOELSEIF ([Alarmanlage_in6] eq "yes")
DOELSEIF ([Alarmanlage_in4] eq "yes")
DOELSEIF ([Alarmanlage_in5] eq "yes")
DOELSEIF ([Alarmanlage_in0] eq "on")
DOELSEIF ([Alarmanlage_in1] eq "yes")
DOELSEIF ([Alarmanlage_in0] eq "off")
Zitat von: rrr am 01 April 2016, 23:05:40
Ich möchte eine Statusanzeige der Alarmanlage realisieren, bei der der aktuell wichtigste Zustand angezeigt wird.
Leider scheint das DOIF aber falsch zu schalten.
Wenn sich der state von Alarmanlage_in0 auf "off" ändert wird, obwohl der state von Alarmanlage_in1 vorher bereits auf "yes" stand, als DOIF state "cmd_8" ausgegeben. Müsste hier nicht "cmd_7" korrekt sein?
Mein DOIF:
define di_alarmanlage_summary DOIF ([Alarmanlage_in3] eq "yes")
DOELSEIF ([Alarmanlage_in2] eq "yes")
DOELSEIF ([Alarmanlage_in6] eq "yes")
DOELSEIF ([Alarmanlage_in4] eq "yes")
DOELSEIF ([Alarmanlage_in5] eq "yes")
DOELSEIF ([Alarmanlage_in0] eq "on")
DOELSEIF ([Alarmanlage_in1] eq "yes")
DOELSEIF ([Alarmanlage_in0] eq "off")
Bitte Ausgabe von "list di_alarmanlage_summary" von diesem Vorfall posten.
Gruß
Damian
Internals:
CFGFN /opt/fhem/FHEM/misc.cfg
DEF ([Alarmanlage_in3] eq "yes")
DOELSEIF ([Alarmanlage_in2] eq "yes")
DOELSEIF ([Alarmanlage_in6] eq "yes")
DOELSEIF ([Alarmanlage_in4] eq "yes")
DOELSEIF ([Alarmanlage_in5] eq "yes")
DOELSEIF ([Alarmanlage_in0] eq "on")
DOELSEIF ([Alarmanlage_in1] eq "yes")
DOELSEIF ([Alarmanlage_in0] eq "off")
NAME di_alarmanlage_summary
NR 993
NTFY_ORDER 50-di_alarmanlage_summary
STATE inaktiv
TYPE DOIF
Readings:
2016-04-01 22:04:50 Device Alarmanlage_in0
2016-04-01 22:04:50 cmd_event Alarmanlage_in0
2016-04-01 22:04:50 cmd_nr 8
2016-04-01 22:04:50 e_Alarmanlage_in0_STATE off
2016-04-01 22:04:44 e_Alarmanlage_in1_STATE yes
2016-04-01 03:16:07 e_Alarmanlage_in2_STATE no
2016-04-01 03:16:07 e_Alarmanlage_in3_STATE no
2016-04-01 03:16:07 e_Alarmanlage_in4_STATE no
2016-04-01 03:16:07 e_Alarmanlage_in5_STATE no
2016-04-01 03:16:07 e_Alarmanlage_in6_STATE no
2016-04-01 22:04:50 state inaktiv
Condition:
0 InternalDoIf($hash,'Alarmanlage_in3','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "yes"
1 InternalDoIf($hash,'Alarmanlage_in2','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "yes"
2 InternalDoIf($hash,'Alarmanlage_in6','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "yes"
3 InternalDoIf($hash,'Alarmanlage_in4','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "yes"
4 InternalDoIf($hash,'Alarmanlage_in5','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "yes"
5 InternalDoIf($hash,'Alarmanlage_in0','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "on"
6 InternalDoIf($hash,'Alarmanlage_in1','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "yes"
7 InternalDoIf($hash,'Alarmanlage_in0','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "off"
Devices:
0 Alarmanlage_in3
1 Alarmanlage_in2
2 Alarmanlage_in6
3 Alarmanlage_in4
4 Alarmanlage_in5
5 Alarmanlage_in0
6 Alarmanlage_in1
7 Alarmanlage_in0
all Alarmanlage_in3 Alarmanlage_in2 Alarmanlage_in6 Alarmanlage_in4 Alarmanlage_in5 Alarmanlage_in0 Alarmanlage_in1
Do:
0:
0
1:
0
2:
0
3:
0
4:
0
5:
0
6:
0
7:
0
8:
Helper:
event off
globalinit 1
last_timer 0
sleeptimer -1
timerdev Alarmanlage_in0
timerevent off
triggerDev Alarmanlage_in0
timerevents:
off
triggerEvents:
off
Internals:
0 Alarmanlage_in3:STATE
1 Alarmanlage_in2:STATE
2 Alarmanlage_in6:STATE
3 Alarmanlage_in4:STATE
4 Alarmanlage_in5:STATE
5 Alarmanlage_in0:STATE
6 Alarmanlage_in1:STATE
7 Alarmanlage_in0:STATE
all Alarmanlage_in3:STATE Alarmanlage_in2:STATE Alarmanlage_in6:STATE Alarmanlage_in4:STATE Alarmanlage_in5:STATE Alarmanlage_in0:STATE Alarmanlage_in1:STATE
Itimer:
Readings:
Regexp:
0:
1:
2:
3:
4:
5:
6:
7:
All:
State:
Trigger:
Attributes:
alias Alarmanlage
do always
group Alarmanlage
icon secur_alarm
room Wohnung
ich sehe:
ZitatInternals:
CFGFN /opt/fhem/FHEM/misc.cfg
DEF ([Alarmanlage_in3] eq "yes")
DOELSEIF ([Alarmanlage_in2] eq "yes")
DOELSEIF ([Alarmanlage_in6] eq "yes")
DOELSEIF ([Alarmanlage_in4] eq "yes")
DOELSEIF ([Alarmanlage_in5] eq "yes")
DOELSEIF ([Alarmanlage_in0] eq "on")
DOELSEIF ([Alarmanlage_in1] eq "yes")
DOELSEIF ([Alarmanlage_in0] eq "off")
...
2016-04-01 22:04:50 Device Alarmanlage_in0
2016-04-01 22:04:50 cmd_event Alarmanlage_in0
2016-04-01 22:04:50 cmd_nr 8
2016-04-01 22:04:50 e_Alarmanlage_in0_STATE off
Also cmd_8. Kann keinen Fehler erkennen.
Gruß
Damian
Kurz vorher passerte aber doch dies:
2016-04-01 22:04:44 e_Alarmanlage_in1_STATE yes
müsste dann nicht, da sich "DOELSEIF ([Alarmanlage_in1] eq "yes")" vor "DOELSEIF ([Alarmanlage_in0] eq "off")" befindet, cmd_7 rauskommen?
Zitat von: rrr am 02 April 2016, 17:24:48
Kurz vorher passerte aber doch dies:
2016-04-01 22:04:44 e_Alarmanlage_in1_STATE yes
müsste dann nicht, da sich "DOELSEIF ([Alarmanlage_in1] eq "yes")" vor "DOELSEIF ([Alarmanlage_in0] eq "off")" befindet, cmd_7 rauskommen?
Klar, deswegen war zuvor für 6 Sekunden (von 22:04:44 bis 22:04:50) cmd_7.
Edit: Dein Verständnisproblem ist das hier (Auszug aus der DOIF-Doku):
Die Angaben werden immer von links nach rechts abgearbeitet.
Zu beachten ist, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten. Kommt ein Device in mehreren Bedingungen vor, so wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist.
Das habe ich wohl übersehen...
Gibt es denn keine Möglichkeit dass ein DOIF bei Ausführung sämtliche Bedingungen überprüft?
Zitat von: rrr am 02 April 2016, 19:15:20
Das habe ich wohl übersehen...
Gibt es denn keine Möglichkeit dass ein DOIF bei Ausführung sämtliche Bedingungen überprüft?
Noch nicht. Ich werde aber mal, weil die Frage öfters kommt, ein Attribut
checkall einbauen.
Ein Attribut ist nicht notwendig, CheckAll klappt auch ohne ;)
(["^(du1|du2|du3)$"] and $cmd =~ "0|8") ## Starttrigger: alle im DOIF triggernden Geräte und initialized oder Endzustand
##Erster CheckAll-Abschnitt
DOELSEIF ([$SELF:cmd] =~ "1" and [du1] eq "on" ) ## Zustand 1 und Bedingung ist wahr, triggert
DOELSEIF ([$SELF:cmd] =~ "1" and !([du1] eq "on")) ##Zustand 1 und Bedingung ist unwahr, triggert
##Zweiter CheckAll-Abschnitt
DOELSEIF ([$SELF:cmd] =~ "2|3" and [du2] eq "x1" ) ##Zustand 2 o. 3 und Bedingung ist wahr, triggert
DOELSEIF ([$SELF:cmd] =~ "2|3" and !([du2] eq "x1")) ##Zustand 2 o. 3 und Bedingung ist unwahr, triggert
##Dritter CheckAll-Abschnitt
DOELSEIF ([$SELF:cmd] =~ "4|5" and [du3] eq "x1" ) ##Der vorhergehende Zustand des CheckAll-Abschnitts für wahr o. unwahr und Bedingung ist wahr, triggert
DOELSEIF ([$SELF:cmd] =~ "4|5" and !([du3] eq "x1")) ##Der vorhergehende Zustand des CheckAll-Abschnitts für wahr o. unwahr und Bedingung ist unwahr, triggert
##ggf. weitere CheckAll-Abschnitte
DOELSEIF ([$SELF:cmd] =~ "6|7") ##Endzustand nach CheckAll, es triggern die beiden Bedingungszweige des letzten CheckAll-Abschnittes
## du1, du2, du3 sind Dummys, stellvertretend für eigene triggernde Geräte. Den Bedingungen sollten nur Befehle folgen, die nicht in die Selbsttriggerung eingreifen
## Die Bedingungen, wie im ersten CheckAll-Abschnitt [du1] eq "on" und die komplementäre Bedingung !([du1] eq "on"), stehen für beliebige eigene Bedingungen und deren Komplement.
## Die komplemantäre Bedingung ist erforderlich, damit im Falle einer unwahren Bedingung weitergeschaltet wird.
## Für dieses DOIF muss die Selbsttriggerung eingeschaltet sein und für jeden Bedingungszweig muss ein Wait-Timer gesetzt werden.
## selftrigger 1
## wait .1:.1:.1:.1:.1:.1:.1:.1