Fenstersensor und LED-Gong - DOIF/IF einfacher lösbar?

Begonnen von link611, 07 Januar 2019, 11:52:19

Vorheriges Thema - Nächstes Thema

link611

Hallali,

ich habe einen Homematic MP3/ LED Gong, der mir per DOIF mitteilt, wenn Fenster (Bad, Kinderzimmer (+ Tür), Schlafzimmer) länger als 15 Minuten offen sind:

z.B.
([BZ.Fenster1] eq "open") (set HF.Gong_Mp3 press, set HF.Gong_red press) DOELSEIF ([BZ.Fenster1] ne "open") ()
attr wait 900:0
attr do resetwait


Bei einem Close bei einem der Fenster wird die LED dann per notify abgeschalten:

(SZ|KiZ|BZ).Fenster(1|2):closed set HF.Gong_Led off


bzw.

KiZ.Tuer:closed set HF.Gong_Led off



Nun meine Frage:
aktuell ist es ja so, wenn z.B. SZ.Fenster1 und KiZ.Fenster1 beide länger als 15 Minuten offen sind, die LED anspringt. Wenn nun eins der beiden Fenster geschlossen wird, geht die LED durch das Notify aus.
Ich hätte gerne, dass die LED nur aus geht, wenn alle Fenster/ Türen geschlossen sind.
Einzige Möglichkeit die mir da jetzt eingefallen wäre, eine rießige verschachtelte IF.
Gibt es dafür eine einfachere Möglichkeit?


pcbastler

Ich hätte einen Ansatz, allerdings ohne Code.
Für jedes Fenster eine "OpenTime" definieren, dann minütlich über alle max(opentime) ermitteln -> wenn mind. eins länger als 15min ofeen -> LED an

Damian

Zitat von: link611 am 07 Januar 2019, 11:52:19
Hallali,

ich habe einen Homematic MP3/ LED Gong, der mir per DOIF mitteilt, wenn Fenster (Bad, Kinderzimmer (+ Tür), Schlafzimmer) länger als 15 Minuten offen sind:

z.B.
([BZ.Fenster1] eq "open") (set HF.Gong_Mp3 press, set HF.Gong_red press) DOELSEIF ([BZ.Fenster1] ne "open") ()
attr wait 900:0
attr do resetwait


Bei einem Close bei einem der Fenster wird die LED dann per notify abgeschalten:

(SZ|KiZ|BZ).Fenster(1|2):closed set HF.Gong_Led off


bzw.

KiZ.Tuer:closed set HF.Gong_Led off



Nun meine Frage:
aktuell ist es ja so, wenn z.B. SZ.Fenster1 und KiZ.Fenster1 beide länger als 15 Minuten offen sind, die LED anspringt. Wenn nun eins der beiden Fenster geschlossen wird, geht die LED durch das Notify aus.
Ich hätte gerne, dass die LED nur aus geht, wenn alle Fenster/ Türen geschlossen sind.
Einzige Möglichkeit die mir da jetzt eingefallen wäre, eine rießige verschachtelte IF.
Gibt es dafür eine einfachere Möglichkeit?

Du benutzt bereits DOIF. Warum definierst du nicht die Ausschaltbedingung mit and in einem weiteren DOELESEIF-Zweig?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MadMax-FHEM

Die Fenster/Tür in eine Structure.
Damit lässt sich das leicht ermitteln (soweit ich weiß, nutze es aber selber nicht)...

Allerdings (und darauf zielt wohl pcbastler ab): die LED geht doch (nur) an, wenn BZ.Fenster1 offen ist:


[BZ.Fenster1] eq "open"


Oder ist das nicht das (ganze) DOIF?
Oder hast du auch mehrere?

(Besser [statt "Ausschnitt" aus der cfg] ein list)


Zur Abfrage "wie lange ein Reading schon gesetzt ist": ReadingsAge("DeviceName", "ReadingName", Ersatzwert)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MadMax-FHEM

Zitat von: Damian am 07 Januar 2019, 21:10:57
Du benutzt bereits DOIF. Warum definierst du nicht die Ausschaltbedingung mit and in einem weiteren DOELESEIF-Zweig?

Das wollte ich auch schon anregen ;)

Mache/nutze aber DOIF nicht (wirklich) und hätte daher dann nicht weiter helfen können...
...gut mit Structure auch nicht ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

roedert

Zitat von: link611 am 07 Januar 2019, 11:52:19

Eine Schleife über alle Fenster-Devices sollte sinnvoller sein ... such mal nach devspec2array

Ansonsten schau dir das monitoring-modul an ... https://forum.fhem.de/index.php?topic=68765.0

Damian

ZitatFenster Status/Meldung:

define di_Fenster DOIF (["^Window:open"])
(push "Fenster $DEVICE wurde geöffnet. Es sind folgende Fenster offen: [@"^Window":state:"open"]")
DOELSEIF ([#"^Window:closed":state:"open"] == 0)
(push "alle Fenster geschlossen")

attr di_Fenster do always
attr di_Fenster cmdState [$SELF:Device] zuletzt geöffnet|alle geschlossen

aus https://fhem.de/commandref_DE.html#DOIF_aggregation
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

link611

So viele Antworten, Danke....

Zitat von: Damian am 07 Januar 2019, 21:10:57
Du benutzt bereits DOIF. Warum definierst du nicht die Ausschaltbedingung mit and in einem weiteren DOELESEIF-Zweig?

Ich nutze zwar DOIF, auch schon seit langem, aber hab bisher nichts komplizierteres damit gebaut als sowas wie oben... wüsste aus dem Stehgreif nicht wie ich das bewerkstelligen kann... +  siehe unten.


Zitat von: MadMax-FHEM am 07 Januar 2019, 21:14:48
Die Fenster/Tür in eine Structure.
Damit lässt sich das leicht ermitteln (soweit ich weiß, nutze es aber selber nicht)...

Allerdings (und darauf zielt wohl pcbastler ab): die LED geht doch (nur) an, wenn BZ.Fenster1 offen ist:


[BZ.Fenster1] eq "open"


Oder ist das nicht das (ganze) DOIF?
Oder hast du auch mehrere?

(Besser [statt "Ausschnitt" aus der cfg] ein list)


Zur Abfrage "wie lange ein Reading schon gesetzt ist": ReadingsAge("DeviceName", "ReadingName", Ersatzwert)

Gruß, Joachim

Das mit der Structure könnte tatsächlich gehen... werde ich mir mal ansehen...

Und ja, es gibt nicht nur beim BZ.Fenster ein open (war nur ein Beispiel), es gibt sozusagen für jedes Zimmer eine eigene DOIF, weil bei jedem Zimmer die LED eine andere Farbe anzeigt, da wird sozusagen am Gong ein anderer Button betätigt. - Als ich das hier schreibe merke ich, dass ein DOELSEIF da wohl nicht funktionieren wird oder? - Sorry, hätte ich dazu schreiben sollen...


link611

Zur Info:

hab' eben die Structure eingebaut. scheint zu funktionieren wie ich es gerne möchte :) Herzlichen Dank für den Denkanstoß!

Damian

oder aus dem Aggregationsbeispiel entnommen:

DOIF ([#"Fenster:closed":state:"open"] == 0)

attr cmdState alle zu|nicht alle zu


Bedeutet:

Wenn ein Device, welches im Namen "Fenster" hat "closed" sendet, dann wird geschaut wie viele Devices mit "Fenster" im Namen "open" sind, wenn 0 dann cmd1 (alle zu) sonst cmd2 (nicht alle zu).
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

link611

Zitat von: Damian am 08 Januar 2019, 10:43:31
oder aus dem Aggregationsbeispiel entnommen:

DOIF ([#"Fenster:closed":state:"open"] == 0)

attr cmdState alle zu|nicht alle zu


Bedeutet:

Wenn ein Device, welches im Namen "Fenster" hat "closed" sendet, dann wird geschaut wie viele Devices mit "Fenster" im Namen "open" sind, wenn 0 dann cmd1 (alle zu) sonst cmd2 (nicht alle zu).

Habe eben feststellen müssen, dass das mit der Structure nicht sauber läuft... anscheinend setzt die irgendwie öfter den state auf closed sodass das Notify das darauf lauscht all 5-10 Minuten mehrmals ausgeführt wird....

Wie würde das Aggregationsbeispiel denn aussehen, wenn ich nicht alle Fenster sondern nur bestimmte überwachen will? also z.B. (BZ|SZ|KiZ).Fenster(1|2)

MadMax-FHEM

event-on-change-reading gesetzt!?

Kurz da mobil...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

link611

Zitat von: MadMax-FHEM am 08 Januar 2019, 20:53:00
event-on-change-reading gesetzt!?

Kurz da mobil...

Gruß, Joachim

bei der Structure? nein, war nicht gesetzt.

MadMax-FHEM

Zitat von: link611 am 08 Januar 2019, 20:56:40
bei der Structure? nein, war nicht gesetzt.

Entweder bei der Structure wenn du ein Event von dort nutzt oder direkt bei den Fenstersensoren.

Weil wozu willst du alle paar Minuten den bekannten Zustand jedes Fensters als Event?

In dem Zusammenhang auch die anderen event-on- Attribute anschauen/beachten.

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

link611

Zitat von: MadMax-FHEM am 08 Januar 2019, 21:00:57
Entweder bei der Structure wenn du ein Event von dort nutzt oder direkt bei den Fenstersensoren.

Weil wozu willst du alle paar Minuten den bekannten Zustand jedes Fensters als Event?

In dem Zusammenhang auch die anderen event-on- Attribute anschauen/beachten.

Gruß, Joachim

Ich muss ehrlich gestehen, mit den event-on- Attributen hab' ich mich noch nie auseinander gesetzt.... obwohl ich FHEM schon lange nutze...
auf was setze ich denn das event-on-change-reading bei der Structure? einfach auf .* oder auf state

MadMax-FHEM

Je nachdem was du erreichen willst..

Wenn du beispielsweise nichts loggst (also länger keine Änderung egal ist) und dich nur die Änderung eines Readings interessiert ist .* vermutlich was du brauchst...

Ansonsten halt genau setzen oder die Readiings wo dich auch Events interessieren ohne dass sich der Wert ändert durch andere event-on- Attribute wieder "reinholen"...

Je weniger Events durch's System "rasen" desto weniger Last...

Öffne doch einfach mal den Eventmonitor und schau was da alles kommt (und vielleicht überlegen was davon du tatsächlich brauchst aber aufpassen wegen Logging/Plots andere Automatismen wie Notify/DOIF die auf Events angewiesen sind)...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Damian

Zitat von: link611 am 08 Januar 2019, 20:49:24
Habe eben feststellen müssen, dass das mit der Structure nicht sauber läuft... anscheinend setzt die irgendwie öfter den state auf closed sodass das Notify das darauf lauscht all 5-10 Minuten mehrmals ausgeführt wird....

Wie würde das Aggregationsbeispiel denn aussehen, wenn ich nicht alle Fenster sondern nur bestimmte überwachen will? also z.B. (BZ|SZ|KiZ).Fenster(1|2)

Entsprechend deiner Regex-Vorgabe:

DOIF ([#"^(BZ|SZ|KiZ).Fenster(1|2)$:closed":state:"open"] == 0)

^ bedeutet Anfang, $ Ende
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: Damian am 08 Januar 2019, 21:39:30
Entsprechend deiner Regex-Vorgabe:

DOIF ([#"^(BZ|SZ|KiZ).Fenster(1|2)$:closed":state:"open"] == 0)

^ bedeutet Anfang, $ Ende

Da fällt mir gerade ein, man sollte auch auf open reagieren, damit man mitbekommt, wenn ein Fenster geöffnet wird, daher:

DOIF ([#"^(BZ|SZ|KiZ).Fenster(1|2)$:closed|open":state:"open"] == 0)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF