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 BeobachtungenDas 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
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.
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
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
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