Hauptmenü

DOIF arbeitet unerwartet...

Begonnen von Torben80, 31 März 2018, 22:43:40

Vorheriges Thema - Nächstes Thema

Torben80

Hallo Freunde,
ich versuche mein Problem in einfachen Worten zu erklären.

Ausgangssituation:
Alarmanlage mit mehreren Fenster / Türkontakten wird per HTTPMOD ausgelesen. (event-on-change-reading=.*)
Das device hierzu nenne ich "Kontakte". In diesem stehen dann die READINGS (Fenster/Türen mit Zustand Open/Close)
Zusätzlich habe ein per "setreading Kontakte Status_Fenster" und  "setreading Kontakte Status_Tuer" noch zwei Readings angelegt, die ich per DOIF nun befülle.

Das DOIF "Fenster" prüft ob ein Fensterkontakt "Door Open" ist. Ist das der Fall, dann wird das Reading unter Kontakte Status_Fenster auf "Open" gesetzt, bzw. Close.
DAS FUNKTIONIERT.

DOIF ---> Fenster
Internals:
   CFGFN     
   DEF        ([Kontakte:Badezimmer] eq "Door Open" or [Kontakte:Esszimmer] eq "Door Open" or [Kontakte:Flur] eq "Door Open" or [Kontakte:Kueche] eq "Door Open" or [Kontakte:Wohnzimmer_links] eq "Door Open" or [Kontakte:Wohnzimmer_rechts] eq "Door Open")
(setreading Kontakte Status_Fenster Open)
DOELSE
(setreading Kontakte Status_Fenster Close)
   MODEL      FHEM
   NAME       dKontakte_Fenster
   NR         3872
   NTFY_ORDER 50-dKontakte_Fenster
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2018-03-31 19:21:12   Device          Kontakte
     2018-03-31 19:21:12   cmd             2
     2018-03-31 19:21:12   cmd_event       Kontakte
     2018-03-31 19:21:12   cmd_nr          2
     2018-03-31 19:21:12   e_Kontakte_Badezimmer Door Close
     2018-03-31 19:21:12   e_Kontakte_Esszimmer Door Close
     2018-03-31 19:21:12   e_Kontakte_Flur Door Close
     2018-03-31 19:21:12   e_Kontakte_Kueche Door Close
     2018-03-31 19:21:12   e_Kontakte_Wohnzimmer_links Door Close
     2018-03-31 19:21:12   e_Kontakte_Wohnzimmer_rechts Door Close
     2018-03-30 14:20:26   mode            enabled
     2018-03-31 19:21:12   state           cmd_2
   Regex:
   condition:
     0          ReadingValDoIf($hash,'Kontakte','Badezimmer') eq "Door Open" or ReadingValDoIf($hash,'Kontakte','Esszimmer') eq "Door Open" or ReadingValDoIf($hash,'Kontakte','Flur') eq "Door Open" or ReadingValDoIf($hash,'Kontakte','Kueche') eq "Door Open" or ReadingValDoIf($hash,'Kontakte','Wohnzimmer_links') eq "Door Open" or ReadingValDoIf($hash,'Kontakte','Wohnzimmer_rechts') eq "Door Open"
   devices:
     0           Kontakte
     all         Kontakte
   do:
     0:
       0          setreading Kontakte Status_Fenster Open
     1:
       0          setreading Kontakte Status_Fenster Close
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      Haustuer: Door Close
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Kontakte
     timerevent Haustuer: Door Close
     triggerDev Kontakte
     timerevents:
       Haustuer: Door Close
       Status_Tuer: Close
     timereventsState:
       Haustuer: Door Close
       Status_Tuer: Close
     triggerEvents:
       Haustuer: Door Close
       Status_Tuer: Close
     triggerEventsState:
       Haustuer: Door Close
       Status_Tuer: Close
   internals:
   itimer:
   readings:
     0           Kontakte:Badezimmer Kontakte:Esszimmer Kontakte:Flur Kontakte:Kueche Kontakte:Wohnzimmer_links Kontakte:Wohnzimmer_rechts
     all         Kontakte:Badezimmer Kontakte:Esszimmer Kontakte:Flur Kontakte:Kueche Kontakte:Wohnzimmer_links Kontakte:Wohnzimmer_rechts
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   room       Alarmanlage



Das DOIF "Türen" prüft ob ein Türkontakt "Door Open" ist. Ist das der Fall, dann wird das Reading unter Kontakte Status_Tuer auf "Open" gesetzt, bzw. Close.
DAS FUNKTIONIERT EBENFALLS.

DOIF---> Türen
Internals:
   CFGFN     
   DEF        ([Kontakte:Haustuer] eq "Door Open" or [Kontakte:Terassentuer] eq "Door Open" or [Kontakte:Kellertuer] eq "Door Open")
(setreading Kontakte Status_Tuer Open)
DOELSE
(setreading Kontakte Status_Tuer Close)
   MODEL      FHEM
   NAME       dKontakte_Tuer
   NR         3463
   NTFY_ORDER 50-dKontakte_Tuer
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2018-03-31 19:21:12   Device          Kontakte
     2018-03-31 19:21:12   cmd             2
     2018-03-31 19:21:12   cmd_event       Kontakte
     2018-03-31 19:21:12   cmd_nr          2
     2018-03-31 19:21:12   e_Kontakte_Haustuer Door Close
     2018-03-31 19:21:12   e_Kontakte_Kellertuer Door Close
     2018-03-31 19:21:12   e_Kontakte_Terassentuer Door Close
     2018-03-30 14:26:18   mode            enabled
     2018-03-31 19:21:12   state           cmd_2
   Regex:
   condition:
     0          ReadingValDoIf($hash,'Kontakte','Haustuer') eq "Door Open" or ReadingValDoIf($hash,'Kontakte','Terassentuer') eq "Door Open" or ReadingValDoIf($hash,'Kontakte','Kellertuer') eq "Door Open"
   devices:
     0           Kontakte
     all         Kontakte
   do:
     0:
       0          setreading Kontakte Status_Tuer Open
     1:
       0          setreading Kontakte Status_Tuer Close
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      Haustuer: Door Close
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Kontakte
     timerevent Haustuer: Door Close
     triggerDev Kontakte
     timerevents:
       Haustuer: Door Close
       Status_Tuer: Close
     timereventsState:
       Haustuer: Door Close
       Status_Tuer: Close
     triggerEvents:
       Haustuer: Door Close
       Status_Tuer: Close
     triggerEventsState:
       Haustuer: Door Close
       Status_Tuer: Close
   internals:
   itimer:
   readings:
     0           Kontakte:Haustuer Kontakte:Terassentuer Kontakte:Kellertuer
     all         Kontakte:Haustuer Kontakte:Terassentuer Kontakte:Kellertuer
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   room       Alarmanlage



J E T Z T wird es interessant!
Nun will ich mit einem DOIF die beiden STATIS überprüfen (Kontakte:Status_Tuer und Kontakte:Status_Fenster) ob einer der beiden Open ist und somit den STATE eines DUMMYS (Fenster.Tuer)  auf Open oder Close setzen. JETZT kommt das Problem.

Wenn ich ein Fenster öffne wird der STATE auch auf Open gesetzt. Schließe ich das Fenster wird der STATE auf Close gesetzt. S U P E R! Aber dann:
Wenn ich eine Tuer öffne passiert nichts (also die anderen DOIFS laufen und das Reading Kontakte:Status_Tuer wird auch auf Open gesetzt), also der Dummy wird nicht geändert. SCHLIESSE ich nun die Tür, wir der Dummy plötzlich auf Open gesetzt. Also er arbeitet plötzlich falsch herum. Ich stehe auf dem Schlauch.


DOIF ---> KontakteState
Internals:
   CFGFN     
   DEF        ([Kontakte:Status_Tuer] eq "Open" or [Kontakte:Status_Fenster] eq "Open") (set Fenster.Tuer Open) DOELSEIF ([Kontakte:Status_Tuer] eq "Close" and [Kontakte:Status_Fenster] eq "Close") (set Fenster.Tuer Close)
   MODEL      FHEM
   NAME       dKontakte_STATE
   NR         10337
   NTFY_ORDER 50-dKontakte_STATE
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2018-04-01 22:21:05   Device          Kontakte
     2018-04-01 22:20:40   cmd             1
     2018-04-01 22:20:40   cmd_event       Kontakte
     2018-04-01 22:20:40   cmd_nr          1
     2018-04-01 22:20:45   e_Kontakte_Status_Fenster Close
     2018-04-01 21:51:31   e_Kontakte_Status_Tuer Open
     2018-04-01 21:46:28   mode            enabled
     2018-04-01 22:20:40   state           cmd_1
   Regex:
   condition:
     0          ReadingValDoIf($hash,'Kontakte','Status_Tuer') eq "Open" or ReadingValDoIf($hash,'Kontakte','Status_Fenster') eq "Open"
   devices:
     0           Kontakte
     all         Kontakte
   do:
     0:
       0          set Fenster.Tuer Open
     1:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      Haustuer: Door Close
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Kontakte
     timerevent Flur: Door Open,Status_Fenster: Open
     triggerDev Kontakte
     timerevents:
       Flur: Door Open
       Status_Fenster: Open
     timereventsState:
       Flur: Door Open
       Status_Fenster: Open
     triggerEvents:
       Haustuer: Door Close
       Status_Tuer: Close
     triggerEventsState:
       Haustuer: Door Close
       Status_Tuer: Close
   internals:
   itimer:
   readings:
     0           Kontakte:Status_Tuer Kontakte:Status_Fenster
     all         Kontakte:Status_Tuer Kontakte:Status_Fenster
   trigger:
   uiState:
   uiTable:
Attributes:
   checkReadingEvent 1
   do         always
   room       Alarmanlage




DUMMY ---> Fenster.Tuer (im STATE anzeigen ob OPEN oder CLOSE)
Internals:
   CFGFN     
   NAME       Fenster.Tuer
   NR         10325
   STATE      Open
   TYPE       dummy
   READINGS:
     2018-03-31 19:21:12   state           Open
Attributes:
   room       Alarmanlage




Hat jemand eine Idee?

Warum habe ich das alles so gebaut?

Ich habe mir mit nem WEMOS eine LED-Anzeige gebaut, diese zeigt mir an ob ein Fenster oder eine Tür auf ist, sowie den Zustand der Alarmanlage.
Das einzige was ich jetzt wollte, ist eine Anzeige im die mir beide STATIS (Fenster und Tür) zusammenfasst. Komisch...

Schöne OSTERN!!!! Und danke für eure Hilfe!

Gruß Torben

eisman

#1
hi,

ist es da nicht besser mit structure zu arbeiten,
ich habe mit dem mehrfachen or auch immer Probleme.

für Fenster habe ich das so gemacht



([RA01:window] eq "closedclosed" and [RA02:window] eq "closedclosed" and [RA03:window] eq "closedclosed" and
[RA04:window] eq "closedclosed" and [RA05:window] eq "closed")
(set $SELF Alarm 0,set Melder.01 blink 0 0,set Melder.01 off)
DOELSE (set $SELF Alarm 1,set Melder.01 blink 1000 1,trigger WEB JS:FW_okDialog("ACHTUNG<br><br>Fenster offen"))


gruss
1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 7x ESP
1x FHEM Debian, Homematic,Z2M             / 1X Raspberry, ConBee / 6x ESP
1x FHEM Debian,MQTT2                             / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

Torben80

Zitat von: eisman am 31 März 2018, 23:37:35
hi,

ist es da nicht besser mit structure zu arbeiten,
ich habe mit dem mehrfachen or auch immer Probleme.

für Fenster habe ich das so gemacht



([RA01:window] eq "closedclosed" and [RA02:window] eq "closedclosed" and [RA03:window] eq "closedclosed" and
[RA04:window] eq "closedclosed" and [RA05:window] eq "closed")
(set $SELF Alarm 0,set Melder.01 blink 0 0,set Melder.01 off)
DOELSE (set $SELF Alarm 1,set Melder.01 blink 1000 1,trigger WEB JS:FW_okDialog("ACHTUNG<br><br>Fenster offen"))


gruss

Ich habe aber nur ein Device, was alle Daten ausließt. Das HTTPMOD Kontakte.
So wie ich das lese brauche ich für ,,structure" mehrere devices. Und das ist ja gerade das Problem, dass die DOIFs komisch sind bei mir und ich deshalb ja nicht einmal Ben dummy befüllen kann.

Gruß Torben


Gesendet von iPhone mit Tapatalk

eisman

Hi,

deswegen habe ich bei meinen Fenster auf Status geschlossen geprüft.
da konnte ich mit and arbeiten. wenn also ein Fenster nicht geschlossen ist
wird der Status auf offen gesetzt, Klappt mit der anzeige offen (LED rot) sonst grün

structure habe ich mir grade angeschaut (eigenlich nutze ich die nicht) bin auf die schnelle
auch nicht ganz zufrieden, geht aber.

gruss
1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 7x ESP
1x FHEM Debian, Homematic,Z2M             / 1X Raspberry, ConBee / 6x ESP
1x FHEM Debian,MQTT2                             / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

Frank_Huber

   DEF        ([Kontakte:Status_Tuer] eq "Open" or [Kontakte:Status_Fenster] eq "Open") (set Fenster.Tuer Open) DOELSEIF ([Kontakte:Status_Tuer] eq "Close" and [Kontakte:Status_Fenster] eq "Close") (set Fenster.Tuer Close)

So würde ich das machen.
Für jeden Zweig definierte Zustände.

Torben80

Zitat von: Frank_Huber am 01 April 2018, 00:16:02
   DEF        ([Kontakte:Status_Tuer] eq "Open" or [Kontakte:Status_Fenster] eq "Open") (set Fenster.Tuer Open) DOELSEIF ([Kontakte:Status_Tuer] eq "Close" and [Kontakte:Status_Fenster] eq "Close") (set Fenster.Tuer Close)


Funktioniert nicht.

Echt komisch. Das DOELSEIF kommt nicht zur Geltung. Obwohl beide Zustände definitiv Close sind, reagiert das DOELSEIF nicht.

Frank_Huber

Zitat von: Torben80 am 01 April 2018, 21:12:49
Funktioniert nicht.

Echt komisch. Das DOELSEIF kommt nicht zur Geltung. Obwohl beide Zustände definitiv Close sind, reagiert das DOELSEIF nicht.
Do always gesetzt?
Poste mal ein ein list

Mit dem Handy online, daher kurz gefasst...


Torben80

Zitat von: Frank_Huber am 01 April 2018, 21:27:28
Do always gesetzt?
Poste mal ein ein list

Mit dem Handy online, daher kurz gefasst...

Sind alle im ersten Beitrag "gelistet".
Danke :-)

Frank_Huber

Zitat von: Torben80 am 01 April 2018, 21:29:53
Sind alle im ersten Beitrag "gelistet".
Danke :-)
Das I'm ersten Post ist "nutzlos".
Das list beinhaltet auch die aktuellen stati der Readings.
Daher wäre es im aktuellen Zustand interessant. ;-)

Mit dem Handy online, daher kurz gefasst...


Torben80

Internals:
   CFGFN     
   DEF        ([Kontakte:Status_Tuer] eq "Open" or [Kontakte:Status_Fenster] eq "Open") (set Fenster.Tuer Open) DOELSEIF ([Kontakte:Status_Tuer] eq "Close" and [Kontakte:Status_Fenster] eq "Close") (set Fenster.Tuer Close)
   MODEL      FHEM
   NAME       dKontakte_STATE
   NR         10337
   NTFY_ORDER 50-dKontakte_STATE
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2018-04-01 21:36:40   Device          Kontakte
     2018-04-01 21:36:40   cmd             1
     2018-04-01 21:36:40   cmd_event       Kontakte
     2018-04-01 21:36:40   cmd_nr          1
     2018-04-01 21:36:40   e_Kontakte_Status_Fenster Close
     2018-04-01 21:36:40   e_Kontakte_Status_Tuer Open
     2018-04-01 08:29:20   mode            enabled
     2018-04-01 21:36:40   state           cmd_1
   Regex:
   condition:
     0          ReadingValDoIf($hash,'Kontakte','Status_Tuer') eq "Open" or ReadingValDoIf($hash,'Kontakte','Status_Fenster') eq "Open"
     1          ReadingValDoIf($hash,'Kontakte','Status_Tuer') eq "Close" and ReadingValDoIf($hash,'Kontakte','Status_Fenster') eq "Close"
   devices:
     0           Kontakte
     1           Kontakte
     all         Kontakte
   do:
     0:
       0          set Fenster.Tuer Open
     1:
       0          set Fenster.Tuer Close
     2:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      Terassentuer: Door Close
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Kontakte
     timerevent Terassentuer: Door Close
     triggerDev Kontakte
     timerevents:
       Terassentuer: Door Close
       Status_Tuer: Close
     timereventsState:
       Terassentuer: Door Close
       Status_Tuer: Close
     triggerEvents:
       Terassentuer: Door Close
       Status_Tuer: Close
     triggerEventsState:
       Terassentuer: Door Close
       Status_Tuer: Close
   internals:
   itimer:
   readings:
     0           Kontakte:Status_Tuer Kontakte:Status_Fenster
     1           Kontakte:Status_Tuer Kontakte:Status_Fenster
     all         Kontakte:Status_Tuer Kontakte:Status_Fenster
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   room       Alarmanlage


Bitteschön ;-)

Der Dummy ist derzeit auf Open obwohl alles zu ist. Wenn ich ein Fenster öffne und wieder schließe, ist alles so wie es soll. Dummy Open und dann wieder Close.

Öffne ich die Tür, dann passiert erst nichts (also alle readings werden richtig gesetzt, aber beim Schließen arbeitet plötzlich das STATE-DoIf falsch herum, macht also auf.

Kann es hiermit etwas zu tun haben?
https://forum.fhem.de/index.php/topic,80749.msg728102.html#msg728102

Frank_Huber

Also der doif arbeitet dem list nach richtig.

Vorschlag :
Liste mal alle doif im "fehlerzustand"
Denke der Fehler ist woanders.

Mit dem Handy online, daher kurz gefasst...


Pfriemler

Frage mich, ob eines der Events verschluckt wird: Im list des DOIF stehen als Ausgangswerte für die Auswertung
     2018-04-01 21:36:40   e_Kontakte_Status_Fenster Close
     2018-04-01 21:36:40   e_Kontakte_Status_Tuer Open

also reagiert das DOIF richtig.
Wahrscheinlich wird es aber bei der Änderung irgendeines Readings vom Dummy Kontakte und verpasst die letzte Änderung? Klingt blöd, aber ... versuche doch mal

ZitatReadingauswertung nur beim Event des jeweiligen Readings...
Standardmäßig werden angegebene Readings ausgewertet, wenn irgendein Event des angegebenen Devices triggert. Möchte man gezielt nur dann ein angegebenes Reading auswerten, wenn sich nur dieses ändert, so lässt sich das mit dem Attribut checkReadingEvent einschränken. Das ist insb. dann interessant, wenn ein Modul verschiedene Readings zu unterschiedlichen Zeitpunkten aktualisiert.
...
also
attr dKontakte_STATE checkReadingEvent 1
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Damian

Du scheinst da noch eine Abhängigkeit zu haben(notify oder anderes DOIF), denn um 21:36:40 gab es sowohl das Event Fenster "Close", als auch Tuer "Open".

     2018-04-01 21:36:40   e_Kontakte_Status_Fenster Close
     2018-04-01 21:36:40   e_Kontakte_Status_Tuer Open


damit sind nicht beide "Close" -> cmd_1
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Torben80

@Damian

Ja, ich habe zwei NOFIFYs, die mein LED-Display befeuern.

LED für FENSTER:
Internals:
   CFGFN     
   DEF        Kontakte:Status_Fenster:.* {if (ReadingsVal("Kontakte","Status_Fenster",0) eq "Open") {fhem ("set LED_Rahmen pixel 6 25 0 0");} else {if (ReadingsVal("Kontakte","Status_Fenster",0) eq "Close") {fhem ("set LED_Rahmen pixel 6 0 25 0");}}}
   NAME       led_alarm_konFens
   NOTIFYDEV  Kontakte
   NR         3698
   NTFY_ORDER 50-led_alarm_konFens
   REGEXP     Kontakte:Status_Fenster:.*
   STATE      2018-04-01 21:51:11
   TYPE       notify
   READINGS:
     2018-03-29 23:32:57   state           active
Attributes:
   room       Alarmanlage



Uuuuund LED für Tür:
Internals:
   CFGFN     
   DEF        Kontakte:Status_Tuer:.* {if (ReadingsVal("Kontakte","Status_Tuer",0) eq "Open") {fhem ("set LED_Rahmen pixel 5 25 0 0");} else {if (ReadingsVal("Kontakte","Status_Tuer",0) eq "Close") {fhem ("set LED_Rahmen pixel 5 0 25 0");}}}
   NAME       led_alarm_konTuer
   NOTIFYDEV  Kontakte
   NR         3702
   NTFY_ORDER 50-led_alarm_konTuer
   REGEXP     Kontakte:Status_Tuer:.*
   STATE      2018-04-01 21:51:31
   TYPE       notify
   READINGS:
     2018-03-29 23:34:31   state           active
Attributes:
   room       Alarmanlage


Meinst, da mein NOTIFY schon drauf zugreift, kann das DOIF das nicht auch noch verarbeiten?

Damian

Zustände abfragen ist kein Problem, Zustände Ändern ist hier das Problem.

Schließe das Fenster und schaue im Eventmonitor, ob gleichzeitig etwas zu Tuer kommt und dann schließt du die Tuer und schaust, ob etwas zu Fenster kommt, wenn ja dann musst du im System schauen, wer da wohl den Zustand des anderen ändert. Denn eigentlich sollen es ja zwei unabhängige Devices sein.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF