Hauptmenü

DOIF schaltet falsch

Begonnen von rrr, 01 April 2016, 23:05:40

Vorheriges Thema - Nächstes Thema

rrr

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

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rrr

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

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rrr

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?

Damian

#5
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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rrr

Das habe ich wohl übersehen...

Gibt es denn keine Möglichkeit dass ein DOIF bei Ausführung sämtliche Bedingungen überprüft?

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

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