FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: buzzmain am 28 Februar 2019, 15:13:37

Titel: DoIf soll Dummy für Fenster open/close setzen. Wo ist mein Gedankenfehler?
Beitrag von: buzzmain am 28 Februar 2019, 15:13:37
Hallo Ihr Lieben,
ich verzweifel grad an meiner eigenen Blindheit.
Aber ich bekomme nicht heraus was ich grad falsch mache.

Aufgabe:
Ich möchte einen Dummy der auf open geht sowieein oder mehr Fenster auf sind. Natürlich soll der Dummy auf close wenn kein/e Fenster auf ist.

defmod d_fensterAufZu dummy
attr d_fensterAufZu room Dummy,Fenster
attr d_fensterAufZu setList open closed

setstate d_fensterAufZu closed
setstate d_fensterAufZu 2019-02-28 15:04:08 state closed


Um den Dummy zu "schalten" habe ich mir ein DOIF gebaut:

defmod doif_fensterAufZu DOIF (["^HM_Kontakt_:open"]) (set d_fensterAufZu open) DOELSE (set d_fensterAufZu closed)
attr doif_fensterAufZu checkall event
attr doif_fensterAufZu do always
attr doif_fensterAufZu event-on-change-reading .*
attr doif_fensterAufZu room DoIf,Fenster

setstate doif_fensterAufZu cmd_2
setstate doif_fensterAufZu 2019-02-28 09:38:00 Device HM_Kontakt_EG_Bad
setstate doif_fensterAufZu 2019-02-28 15:05:08 cmd 2
setstate doif_fensterAufZu 2019-02-28 15:05:08 cmd_event doif_fensterAufZu
setstate doif_fensterAufZu 2019-02-28 15:05:08 cmd_nr 2
setstate doif_fensterAufZu 2019-02-24 12:05:05 mode enabled
setstate doif_fensterAufZu 2019-02-28 15:05:08 state cmd_2



Klappt beim öffnen von den Fenstern auch super ABER ... beim schliessen nicht.
Wenn alle fenster zu sind zeigt das doif immernoch cmd1 an :(

Also habe ich einen AT gebaut um im Minutentakt einen Refresh zu machen:
defmod at_fensterAufZu at +*00:01:00 set doif_fensterAufZu checkall
attr at_fensterAufZu room Fenster,at

setstate at_fensterAufZu Next: 15:08:08
setstate at_fensterAufZu 2019-02-28 15:07:08 state Next: 15:08:08



Jetzt das Problem:
Selbst wenn ein oder mehrere Fenster open sind, wird bei dem doif immer cmd2 gewählt beim refresh.

Wo ist mein Gedankenfehler?



Titel: Antw:DoIf soll Dummy für Fenster open/close setzen. Wo ist mein Gedankenfehler?
Beitrag von: Beta-User am 28 Februar 2019, 15:41:06
Schon mal was von "structure" (Modul) gehört? Das könnte hier einfacher sein...
Titel: Antw:DoIf soll Dummy für Fenster open/close setzen. Wo ist mein Gedankenfehler?
Beitrag von: buzzmain am 01 März 2019, 00:26:32
https://wiki.fhem.de/wiki/Structure
Das?
War mir neu. Klingt schon recht gut.
probiere ich direkt aus wenn ich wieder @home bin
Danke Dir
Titel: Antw:DoIf soll Dummy für Fenster open/close setzen. Wo ist mein Gedankenfehler?
Beitrag von: Ellert am 01 März 2019, 12:25:06
Zitat von: buzzmain am 28 Februar 2019, 15:13:37
Hallo Ihr Lieben,
ich verzweifel grad an meiner eigenen Blindheit.
Aber ich bekomme nicht heraus was ich grad falsch mache.

Aufgabe:
Ich möchte einen Dummy der auf open geht sowieein oder mehr Fenster auf sind. Natürlich soll der Dummy auf close wenn kein/e Fenster auf ist.

defmod d_fensterAufZu dummy
attr d_fensterAufZu room Dummy,Fenster
attr d_fensterAufZu setList open closed

setstate d_fensterAufZu closed
setstate d_fensterAufZu 2019-02-28 15:04:08 state closed


Um den Dummy zu "schalten" habe ich mir ein DOIF gebaut:

defmod doif_fensterAufZu DOIF (["^HM_Kontakt_:open"]) (set d_fensterAufZu open) DOELSE (set d_fensterAufZu closed)
attr doif_fensterAufZu checkall event
attr doif_fensterAufZu do always
attr doif_fensterAufZu event-on-change-reading .*
attr doif_fensterAufZu room DoIf,Fenster

setstate doif_fensterAufZu cmd_2
setstate doif_fensterAufZu 2019-02-28 09:38:00 Device HM_Kontakt_EG_Bad
setstate doif_fensterAufZu 2019-02-28 15:05:08 cmd 2
setstate doif_fensterAufZu 2019-02-28 15:05:08 cmd_event doif_fensterAufZu
setstate doif_fensterAufZu 2019-02-28 15:05:08 cmd_nr 2
setstate doif_fensterAufZu 2019-02-24 12:05:05 mode enabled
setstate doif_fensterAufZu 2019-02-28 15:05:08 state cmd_2



Klappt beim öffnen von den Fenstern auch super ABER ... beim schliessen nicht.
Wenn alle fenster zu sind zeigt das doif immernoch cmd1 an :(

Also habe ich einen AT gebaut um im Minutentakt einen Refresh zu machen:
defmod at_fensterAufZu at +*00:01:00 set doif_fensterAufZu checkall
attr at_fensterAufZu room Fenster,at

setstate at_fensterAufZu Next: 15:08:08
setstate at_fensterAufZu 2019-02-28 15:07:08 state Next: 15:08:08



Jetzt das Problem:
Selbst wenn ein oder mehrere Fenster open sind, wird bei dem doif immer cmd2 gewählt beim refresh.

Wo ist mein Gedankenfehler?

Wozu benötigst Du den Dummy? Was der kann, geht auch mit DOIF.
defmod allclosed DOIF init {set_State([#"^HM_Kontakt_":state:"open"] ? "open":"closed")}

Damit wird der Status des DOIF auf "open" oder "closed" gesetzt, so wie Du es beabsichtigst.
Hier wird die Aggregation verwendet, um zu entscheiden ob state auf  "open" oder "closed" gesetzt wird, s. https://commandref.fhem.de/commandref_DE.html#DOIF_aggregation
setList usw. funktioniert auch im DOIF, s. https://commandref.fhem.de/commandref_DE.html#DOIF_setList__readingList ist aber für das setzen des Status nicht erforderlich.

Es würde auch über das Attribut state funktionieren, wenn es um eine reine Statusanzeige geht.
defmod allclosed2 DOIF (1)
attr allclosed2 state {([#"^HM_Kontakt_":state:"open"]?"open":"closed")}
Titel: Antw:DoIf soll Dummy für Fenster open/close setzen. Wo ist mein Gedankenfehler?
Beitrag von: buzzmain am 01 März 2019, 23:09:19
@Ellert
Danke Dir das war genau was ich wollte.
Perfekt.

Scheint gut zu funktionieren.
Habe es noch durch ein setList ergänzt. Irgentwie ist der nach einiger Zeit umgesprungen auf state cmd1 bzw cmd2.

Echt ein mächtiges Tool das DOIF
Danke
@ Beta-User structur werde ich auch nochmal ausprobieren, nur um einfach was dazu zu lernen. Das scheint auch ne coole Lösung zu sein.

So sieht es jetzt final aus:

defmod doif_fensterAufZu DOIF init {set_State([#"^HM_Kontakt_":state:"open"] ? "open":"closed")}
attr doif_fensterAufZu checkall event
attr doif_fensterAufZu do always
attr doif_fensterAufZu room DoIf,Fenster
attr doif_fensterAufZu setList open closed

Titel: Antw:DoIf soll Dummy für Fenster open/close setzen. Wo ist mein Gedankenfehler?
Beitrag von: Ellert am 01 März 2019, 23:45:04
50% der von Dir gesetzten Attribute sind im Perl-Mode wirkungslos, s. https://commandref.fhem.de/commandref_DE.html#DOIF_Attribute_Perl_Modus