DoIf soll Dummy für Fenster open/close setzen. Wo ist mein Gedankenfehler?

Begonnen von buzzmain, 28 Februar 2019, 15:13:37

Vorheriges Thema - Nächstes Thema

buzzmain

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?



... And on the 8th Day God Created The Homeautomation.

Beta-User

Schon mal was von "structure" (Modul) gehört? Das könnte hier einfacher sein...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

buzzmain

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
... And on the 8th Day God Created The Homeautomation.

Ellert

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

buzzmain

@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

... And on the 8th Day God Created The Homeautomation.

Ellert