DOIF: DOELSEIF wird nicht ausgeführt

Begonnen von heikoh81, 02 Januar 2016, 12:33:42

Vorheriges Thema - Nächstes Thema

heikoh81

Hallo zusammen,

ich habe mehrere Homematic-Fenstersensoren im Einsatz.
Mittels DOIF überwache ich, ob ein Fenster in der Heizperiode zu lange offen ist - wenn ja, werden Statuslichter als Erinnerung aktiviert.

  • Die Homematic-Fenstersensoren schalten über ein notify zunächst einmal Dummies auf den Zustand "offen"/"geschlossen" - dies funktioniert.
  • Das DOIF funktioniert immer zuverlässig.
  • Wird das Fenster aber wieder geschlossen, so bleibt die in DOELSEIF definierte Aktion aus.
  • Setze ich nun aber den Dummy manuell nochmal auf "geschlossen", dann werden die Aktionen in DOELSEIF ausgeführt.
  • attr do always funktiniert ebenfalls nicht, d.h. erst beim 2. Mal setzen von "geschlossen" wird das DOELSEIF ausgeführt

Update nach weiteren Versuchen und Beobachtungen
Das DOELSEIF scheint cmd_2_1 (set NAME=PollinWohnTVSim:FILTER=STATE=on off) zu überspringen.
Der Dummy "PollinWohnTVSim" ist aber zu diesem Zeitpunkt "on".
Beim ersten "geschlossen" erscheint im DOIF direkt cmd_2_2 mit dem korrekten Wait-Interval.
cmd_2_1 erscheint gar nicht.

Update 2:
Es scheint am attr wait zu liegen.
Setze ich "36,300" statt "36,300:15,5", werden sowohl cmd_2_1 als auch cmd_2_2 beim ersten "geschlossen" ausgeführt.
Wo liegt mein Fehler?


([Fenster03Zustand_GaesteWC:state] eq "offen"
  and [?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on"
  and [?VaillantAussentemperaturDummy] < 14)
(set NAME=PollinWohnTVSim:FILTER=STATE=off on)
(set NAME=PollinSchlaf3TVSim:FILTER=STATE=off on)
    DOELSEIF (([Fenster03Zustand_GaesteWC:state] eq "geschlossen")
  and ([?Fenster04Zustand_Waschraum] eq "geschlossen")
  and ([?Fenster05Zustand_Hobbykeller] eq "geschlossen")  
  and ([?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on"))
(set NAME=PollinWohnTVSim:FILTER=STATE=on off)
(set NAME=PollinSchlaf3TVSim:FILTER=STATE=on off)


Update 3:
Füge ich eine leere cmd_2_1 () ein, so klappt die Ausführung von cmd_2_2 und cmd_2_3 immer zuverlässig.
Das attr wait scheint also cmd_2_1 komplett zu irgnorieren, warum?

wait = 5,300:5,15,15


([Fenster03Zustand_GaesteWC:state] eq "offen"
  and [?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on"
  and [?VaillantAussentemperaturDummy] < 14)
(set NAME=PollinWohnTVSim:FILTER=STATE=off on)
(set NAME=PollinSchlaf3TVSim:FILTER=STATE=off on)
    DOELSEIF (([Fenster03Zustand_GaesteWC:state] eq "geschlossen")
  and ([?Fenster04Zustand_Waschraum] eq "geschlossen")
  and ([?Fenster05Zustand_Hobbykeller] eq "geschlossen")  
  and ([?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on"))
()
(set NAME=PollinWohnTVSim:FILTER=STATE=on off)
(set NAME=PollinSchlaf3TVSim:FILTER=STATE=on off)




list des DOIF bei Zustand "offen":

Internals:
   DEF        ([Fenster03Zustand_GaesteWC:state] eq "offen"
  and [?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on"
  and [?VaillantAussentemperaturDummy] < 14)
(set NAME=PollinWohnTVSim:FILTER=STATE=off on)
(set NAME=PollinSchlaf3TVSim:FILTER=STATE=off on)
    DOELSEIF (([Fenster03Zustand_GaesteWC:state] eq "geschlossen")
  and ([?Fenster04Zustand_Waschraum] eq "geschlossen")
  and ([?Fenster05Zustand_Hobbykeller] eq "geschlossen")
  and ([?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on"))
(set NAME=PollinWohnTVSim:FILTER=STATE=on off)
(set NAME=PollinSchlaf3TVSim:FILTER=STATE=on off)
   NAME       di_Fenster03_GaesteWC_benachrichtigen
   NR         2737
   NTFY_ORDER 50-di_Fenster03_GaesteWC_benachrichtigen
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-01-02 12:15:01   Device          Fenster03Zustand_GaesteWC
     2016-01-02 12:20:40   cmd_event       Fenster03Zustand_GaesteWC
     2016-01-02 12:20:40   cmd_nr          1
     2016-01-02 12:20:40   cmd_seqnr       2
     2016-01-02 12:15:01   e_Fenster03Zustand_GaesteWC_state offen
     2016-01-02 12:20:40   state           cmd_1
     2016-01-02 12:20:39   wait_timer      no timer
   Condition:
     0          ReadingValDoIf('Fenster03Zustand_GaesteWC','state','') eq "offen"  and InternalDoIf('GaesteWC_Benachrichtigen_wenn_Fenster_offen','STATE','') eq "on"  and InternalDoIf('VaillantAussentemperaturDummy','STATE','') < 14
     1          (ReadingValDoIf('Fenster03Zustand_GaesteWC','state','') eq "geschlossen")   and (InternalDoIf('Fenster04Zustand_Waschraum','STATE','') eq "geschlossen")   and (InternalDoIf('Fenster05Zustand_Hobbykeller','STATE','') eq "geschlossen")     and (InternalDoIf('GaesteWC_Benachrichtigen_wenn_Fenster_offen','STATE','') eq "on")
   Devices:
     0           Fenster03Zustand_GaesteWC
     1           Fenster03Zustand_GaesteWC
     all         Fenster03Zustand_GaesteWC
   Do:
     0:
       0          set NAME=PollinWohnTVSim:FILTER=STATE=off on
       1          set NAME=PollinSchlaf3TVSim:FILTER=STATE=off on
     1:
       0          set NAME=PollinWohnTVSim:FILTER=STATE=on off
       1          set NAME=PollinSchlaf3TVSim:FILTER=STATE=on off
   Helper:
     globalinit 1
     last_timer 0
     sleepdevice Fenster03Zustand_GaesteWC
     sleepsubtimer -1
     sleeptimer -1
   Internals:
   Itimer:
   Readings:
     0           Fenster03Zustand_GaesteWC:state
     1           Fenster03Zustand_GaesteWC:state
     all         Fenster03Zustand_GaesteWC:state
   State:
   Timerfunc:
   Trigger:
Attributes:
   do         always
   room       Fenster
   wait       36,300:15,5


Auszug list nach dem 1. Trigger "geschlossen":

   Readings:
     2016-01-02 12:35:21   Device          Fenster03Zustand_GaesteWC
     2016-01-02 12:35:45   cmd_event       Fenster03Zustand_GaesteWC
     2016-01-02 12:35:45   cmd_nr          2
     2016-01-02 12:35:45   cmd_seqnr       2
     2016-01-02 12:35:21   e_Fenster03Zustand_GaesteWC_state geschlossen
     2016-01-02 12:35:45   state           cmd_2
     2016-01-02 12:35:43   wait_timer      no timer

==> bleibt bei cmd_nr 2 stehen, aber die Befehle werden nicht ausgeführt.

Wieso also führt erst das erneute Setzen der Dummies auf "geschlossen" die DOELSEIF-Aktion aus?
Ich stehe hier auf dem Schlauch.

Vielen Dank für eure Hilfe,
viele Grüße,

Heiko

Amenophis86

#1
Ich versuche mal vorne anzufangen:

1. Deine Struktur?
Gibt es einen Grund, dass die Fensterkontakte einen Dummy mit offen/geschlossen schalten? Ich meine die Kontakte selbst zeigen dies doch schon an, oder kann der Dummy noch mehr?

2. Deine 1. DOIF Definition:


([Fenster03Zustand_GaesteWC:state] eq "offen"
  and [?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on"
  and [?VaillantAussentemperaturDummy] < 14)
(set NAME=PollinWohnTVSim:FILTER=STATE=off on)
(set NAME=PollinSchlaf3TVSim:FILTER=STATE=off on)
    DOELSEIF (([Fenster03Zustand_GaesteWC:state] eq "geschlossen")
  and ([?Fenster04Zustand_Waschraum] eq "geschlossen")
  and ([?Fenster05Zustand_Hobbykeller] eq "geschlossen")  
  and ([?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on"))
(set NAME=PollinWohnTVSim:FILTER=STATE=on off)
(set NAME=PollinSchlaf3TVSim:FILTER=STATE=on off)


2.1 Was genau ist PollinWohnTVSim und PollinSchlaf3TVSim was geschaltet werden soll? Und wieso ist deine Ausführungen nicht einfach "set PollinWohnTVSim off" bzw. "set PollinWohnTVSim on" wenn die sie aus bzw an schalten willst? Oder ist das Modulspezifisch, dass ich es nicht kenne?
EDIT: Hab es eben verstanden. Du hast ein devspec hinterlegt. Ok, dann kannst du es natürlich so lassen. Zum testen würde ich aber mal auf ein bestimmtes Device wechseln, auch, wenn hier der Fehler aktuell nicht vermutet wird. Haben unten mal auf ein Device geändert, wobei ich natürlich nicht weiß, ob es dieses Device bei dir gibt. Daher prüfen und anpassen.

2.2 Wenn du auf das Reading State zugreifen willst bei DOIF, dann kannst du den Teil ":state" weglassen. Diesen brauchst du nur, wenn du auf ein anderes Reading zugreifen willst.


3. Deine Code würde dann erst mal so aussehen:


([Fenster03Zustand_GaesteWC] eq "offen"
  and [?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on"
  and [?VaillantAussentemperaturDummy] < 14)
(set PollinWohnTVSim on)
(set PollinSchlaf3TVSim on)
    DOELSEIF (([Fenster03Zustand_GaesteWC] eq "geschlossen")
  and ([?Fenster04Zustand_Waschraum] eq "geschlossen")
  and ([?Fenster05Zustand_Hobbykeller] eq "geschlossen")  
  and ([?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on"))
(set PollinWohnTVSim off)
(set PollinSchlaf3TVSim:FILTER off)


4. Lösungsfindung Schritt für Schritt:
4.1 Lass mal alle wait weg. Wird dann beim Öffnen cmd 1_1 und 1_2 ausgeführt (natürlich müssen die anderen Bedingungen erfüllt sein)
4.2 Lass mal alle wait weg. Wird dann beim Schließen cmd 2_1 und 2_2 ausgeführt (natürlich müssen die anderen Bedingungen erfüllt sein)
4.3 Setz mal ans Ende ein DOELSE (set TESTDUMMY on) -- natürlich musst du diesen vorher definieren. Jetzt schaust du mal, ob der Testdummy geschaltet wird und nicht eins deiner anderen Bedingungen, dann siehst du schon mal, dass eine Bedingung nicht wahr wirst und musst schauen wieso. (Beim Test nicht vergessen den Dummy immer wieder auf off zu setzen vorher)

Sollte 4.1 - 4.3 richtig klappen, dann schauen wir uns das wait nochmal genauer an. Aber mein Vorschlag wäre, dass wir erst Mal bis hier testen.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

heikoh81

Danke für deine Antwort.

Aus meinen Update-Berichten wurde deutlich, dass das Problem offensichtlich durch das wait-attr verursacht wird, d.h. bei setzen des wait-attr wird der erste Befehl der DOELSEIF-Sequenz nicht bearbeitet.
Füge ich einen leeren Befehl () ein, so wird dieser nicht bearbeitet, aber cmd_2_2 und cmd_2_3 werden dafür korrekt ausgeführt.

Vielleicht kann sich das Damian als Modus-Verantwortlicher mal anschauen?

In diesem vereinfachten DOELSEIF wird definitiv der cmd_2_1
bei Vorhandensein des wait-attr "5,300:15,15" NICHT ausgeführt.
cmd_2_2 dagegen wird korrekt ausgeführt.

Lösche ich das attr wait, werden BEIDE DOELSEIF-Befehle korrekt ausgeführt.

In allen Fällen schalte ich übrigens von "offen" auf "geschlossen" um, noch bevor cmd_1_2 ausgeführt wurde (hier habe ich mit 300s ja eine recht lange Verzögerung, was meinem Anwendungserfordernis entspricht).
Könnte das vielleicht der Grund sein?

([Fenster03Zustand_GaesteWC] eq "offen"
  and [?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on"
  and [?VaillantAussentemperaturDummy] < 14)
(set PollinWohnTVSim on)
(set PollinSchlaf3TVSim on)
    DOELSEIF ([Fenster03Zustand_GaesteWC] eq "geschlossen"
  and [?Fenster04Zustand_Waschraum] eq "geschlossen"
  and [?Fenster05Zustand_Hobbykeller] eq "geschlossen"  
  and [?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on")
(set PollinWohnTVSim off)
(set PollinSchlaf3TVSim off)


list des vereinfachten DOIF:

Internals:
   DEF        ([Fenster03Zustand_GaesteWC] eq "offen"
  and [?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on"
  and [?VaillantAussentemperaturDummy] < 14)
(set PollinWohnTVSim on)
(set PollinSchlaf3TVSim on)
    DOELSEIF ([Fenster03Zustand_GaesteWC] eq "geschlossen"
  and [?Fenster04Zustand_Waschraum] eq "geschlossen"
  and [?Fenster05Zustand_Hobbykeller] eq "geschlossen"
  and [?GaesteWC_Benachrichtigen_wenn_Fenster_offen] eq "on")
(set PollinWohnTVSim off)
(set PollinSchlaf3TVSim off)
   NAME       di_Fenster03_GaesteWC_benachrichtigen
   NR         2737
   NTFY_ORDER 50-di_Fenster03_GaesteWC_benachrichtigen
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2016-01-02 19:23:32   Device          Fenster03Zustand_GaesteWC
     2016-01-02 19:23:49   cmd_event       Fenster03Zustand_GaesteWC
     2016-01-02 19:23:49   cmd_nr          2
     2016-01-02 19:23:49   cmd_seqnr       2
     2016-01-02 19:23:32   e_Fenster03Zustand_GaesteWC_STATE geschlossen
     2016-01-02 19:23:49   state           cmd_2
     2016-01-02 19:23:47   wait_timer      no timer
   Condition:
     0          InternalDoIf('Fenster03Zustand_GaesteWC','STATE','') eq "offen"  and InternalDoIf('GaesteWC_Benachrichtigen_wenn_Fenster_offen','STATE','') eq "on"  and InternalDoIf('VaillantAussentemperaturDummy','STATE','') < 14
     1          InternalDoIf('Fenster03Zustand_GaesteWC','STATE','') eq "geschlossen"   and InternalDoIf('Fenster04Zustand_Waschraum','STATE','') eq "geschlossen"   and InternalDoIf('Fenster05Zustand_Hobbykeller','STATE','') eq "geschlossen"     and InternalDoIf('GaesteWC_Benachrichtigen_wenn_Fenster_offen','STATE','') eq "on"
   Devices:
     0           Fenster03Zustand_GaesteWC
     1           Fenster03Zustand_GaesteWC
     all         Fenster03Zustand_GaesteWC
   Do:
     0:
       0          set PollinWohnTVSim on
       1          set PollinSchlaf3TVSim on
     1:
       0          set PollinWohnTVSim off
       1          set PollinSchlaf3TVSim off
   Helper:
     globalinit 1
     last_timer 0
     sleepdevice Fenster03Zustand_GaesteWC
     sleepsubtimer -1
     sleeptimer -1
   Internals:
     0           Fenster03Zustand_GaesteWC:STATE
     1           Fenster03Zustand_GaesteWC:STATE
     all         Fenster03Zustand_GaesteWC:STATE
   Itimer:
   Readings:
   State:
   Timerfunc:
   Trigger:
Attributes:
   room       Fenster
   wait       5,300:15,15


Nun noch zu deinen Fragen:
1.) Dummies der Übersichtlichkeit wegen. Das Homematic-Device hat recht viele Readings, deshalb möchte ich die im normalen Betrieb möglichst nicht sehen.
2.) PollinWohnTVSim sind einfach Dummies on/off, an denen wieder ein notify hängt, das einen system-Befehl ausführt (konkret pilight für 433 Mhz-Sender). Den Filter verwende ich, weil der Dummy nur geschaltet werden soll, wenn dieser noch nicht den gewünschten Zustand hat. Hierdurch möchte ich unnötige Funkbefehle vermeiden, falls zwischenzeitlich der Dummy warum auch immer manuell geschaltet wurde.
4.3.) Aus meiner Sicht ist ein DOELSE hier nicht relevant, da das DOELSEIF bei "geschlossen" korrekt angesteuert wird. Nur innerhalb des DOELSEIF wird der erste von einer Reihe von Befehlen nicht ausgeführt. Aber gerade diese einfache Auflistung von fhem-Befehlen sind aus meiner Sicht der Reiz von DOIF.

Viele Grüße,
Heiko

Damian

Zitat von: heikoh81 am 02 Januar 2016, 19:31:09
Danke für deine Antwort.

Aus meinen Update-Berichten wurde deutlich, dass das Problem offensichtlich durch das wait-attr verursacht wird, d.h. bei setzen des wait-attr wird der erste Befehl der DOELSEIF-Sequenz nicht bearbeitet.
Füge ich einen leeren Befehl () ein, so wird dieser nicht bearbeitet, aber cmd_2_2 und cmd_2_3 werden dafür korrekt ausgeführt.

Vielleicht kann sich das Damian als Modus-Verantwortlicher mal anschauen?

In diesem vereinfachten DOELSEIF wird definitiv der cmd_2_1
bei Vorhandensein des wait-attr "5,300:15,15" NICHT ausgeführt.
cmd_2_2 dagegen wird korrekt ausgeführt.

Lösche ich das attr wait, werden BEIDE DOELSEIF-Befehle korrekt ausgeführt.


It´s not a feature, it´s a bug ;)

Morgen per Update korrigiert verfügbar.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

heikoh81

Zitat von: Damian am 02 Januar 2016, 23:16:22
It´s not a feature, it´s a bug ;)
Morgen per Update korrigiert verfügbar.

Coole Sache, danke für den schnellen Bugfix.

Viele Grüße,
Heiko