Hilfe bei Vereinfachung des DOIF

Begonnen von AmunRe, 16 November 2016, 17:58:12

Vorheriges Thema - Nächstes Thema

AmunRe

Hallo Zusammen,

ich hätte mal eine frage, ich habe da ein doif, mit dem Prüfe ich die fenster ob sie offen sind.
Abhängig ob ich oder meine Freundin daheim sind, bekommen wir eine Nachricht. Wenn wir beide da sind, bekommen wir sie auch beide.

Und jeweils das Fenster welches offen ist.

Ich hab das denk ich ziemlich aufwendig gemacht, da ich immer mehr fenster einbinden will, frag ich mich, ob es einfacher geht.

Hier mal das bisherige:

([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_WZ] eq "open" and [?rr_Torte] eq "home" and [?rr_Steph] ne "home")
(set teleBot msg Das Fenster im Wohnzimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Wohnzimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_SZ] eq "open" and [?rr_Torte] eq "home" and [?rr_Steph] ne "home")
(set teleBot msg Das Fenster im Schlafzimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Schlafzimmerist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_BAD] eq "open" and [?rr_Torte] eq "home" and [?rr_Steph] ne "home")
(set teleBot msg Das Fenster im Badezimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Badezimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_BAD] eq "open" and [?Fenstersensor_WZ] eq "open" and [?rr_Torte] eq "home" and [?rr_Steph] ne "home")
(set teleBot msg Das Fenster im Badezimmer und Wohnzimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Badezimmer und Wohnzimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_SZ] eq "open" and [?Fenstersensor_WZ] eq "open" and [?rr_Torte] eq "home" and [?rr_Steph] ne "home")
(set teleBot msg Das Fenster im Schlafzimmer und Wohnzimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Schlafzimmer und Wohnzimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_SZ] eq "open" and [?Fenstersensor_BAD] eq "open" and [?rr_Torte] eq "home" and [?rr_Steph] ne "home")
(set teleBot msg Das Fenster im Schlafzimmer und Badezimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Schlafzimmer und Badezimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_SZ] eq "open" and [?Fenstersensor_BAD] eq "open" and [?Fenstersensor_WZ] eq "open" and [rr_Torte] eq "home" and [?rr_Steph] ne "home")(set teleBot msg Alle Fenster sind noch offen)(set tabletflur ttsMsg Alle Fenster sind noch offen)


DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_WZ] eq "open" and [?rr_Steph] eq "home" and [?rr_Torte] ne "home")
(set teleBot msg @@freundin Das Fenster im Wohnzimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Wohnzimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_SZ] eq "open" and [?rr_Steph] eq "home" and [?rr_Torte] ne "home")
(set teleBot msg @@freundin Das Fenster im Schlafzimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Schlafzimmerist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_BAD] eq "open" and [?rr_Steph] eq "home" and [?rr_Torte] ne "home")
(set teleBot msg @@freundin Das Fenster im Badezimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Badezimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_BAD] eq "open" and [?Fenstersensor_WZ] eq "open" and [?rr_Steph] eq "home" and [?rr_Torte] ne "home")
(set teleBot msg @@freundin Das Fenster im Badezimmer und Wohnzimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Badezimmer und Wohnzimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_SZ] eq "open" and [?Fenstersensor_WZ] eq "open" and [?rr_Steph] eq "home" and [?rr_Torte] ne "home")
(set teleBot msg @@freundin Das Fenster im Schlafzimmer und Wohnzimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Schlafzimmer und Wohnzimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_SZ] eq "open" and [?Fenstersensor_BAD] eq "open" and [?rr_Steph] eq "home" and [?rr_Torte] ne "home")
(set teleBot msg @@freundin Das Fenster im Schlafzimmer und Badezimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Schlafzimmer und Badezimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_SZ] eq "open" and [?Fenstersensor_BAD] eq "open" and [?Fenstersensor_WZ] eq "open" and [rr_Steph] eq "home")
(set teleBot msg @@freundin Alle Fenster sind noch offen)(set tabletflur ttsMsg Alle Fenster sind noch offen)


DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_WZ] eq "open" and [?rr_Steph] eq "home" and [?rr_Torte] eq "home")
(set teleBot msg Das Fenster im Wohnzimmer ist noch offen)(set teleBot msg @@freundin Das Fenster im Wohnzimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Wohnzimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_SZ] eq "open" and [?rr_Steph] eq "home" and [?rr_Torte] eq "home")
(set teleBot msg Das Fenster im Schlafzimmer ist noch offen)(set teleBot msg @@freundin Das Fenster im Schlafzimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Schlafzimmerist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_BAD] eq "open" and [?rr_Steph] eq "home" and [?rr_Torte] eq "home")
(set teleBot msg Das Fenster im Badezimmer ist noch offen)(set teleBot msg @@freundin Das Fenster im Badezimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Badezimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_BAD] eq "open" and [?Fenstersensor_WZ] eq "open" and [?rr_Steph] eq "home"  and [?rr_Torte] eq "home")
(set teleBot msg Das Fenster im Badezimmer und Wohnzimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Badezimmer und Wohnzimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_SZ] eq "open" and [?Fenstersensor_WZ] eq "open" and [?rr_Steph] eq "home" and [?rr_Torte] eq "home")
(set teleBot msg Das Fenster im Schlafzimmer und Wohnzimmer ist noch offen)(set teleBot msg @@freundin Das Fenster im Badezimmer und Wohnzimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Schlafzimmer und Wohnzimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_SZ] eq "open" and [?Fenstersensor_BAD] eq "open" and [?rr_Steph] eq "home" and [?rr_Torte] eq "home")
(set teleBot msg Das Fenster im Schlafzimmer und Badezimmer ist noch offen)(set teleBot msg @@freundin Das Fenster im Schlafzimmer und Badezimmer ist noch offen)(set tabletflur ttsMsg Das Fenster im Schlafzimmer und Badezimmer ist noch offen)
DOELSEIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?Fenstersensor_SZ] eq "open" and [?Fenstersensor_BAD] eq "open" and [?Fenstersensor_WZ] eq "open" and [rr_Steph] eq "home" and [?rr_Torte] eq "home")(set teleBot msg Alle Fenster sind noch offen)(set teleBot msg @@freundin Alle Fenster sind noch offen)(set tabletflur ttsMsg Alle Fenster sind noch offen)
4 x Echo Dot, HMLAN Gateway, und diverse HM Komponenten, Philips Hue + OSRAM Plugs

Brockmann

Puh, da kommt ja schon einiges zusammen.
Ich denke, für diese Art von Aufgabe gibt es in FHEM bislang noch keine wirklich gute Lösung, lasse mich aber gerne eines besseren belehren.
Ich denke, ich würde mit IF arbeiten, etwa so:

DOIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?rr_Torte] eq "home" and [?rr_Steph] ne "home")
  IF([Fenstersensor_WZ] eq "open")
     (set teleBot msg Das Fenster im Wohnzimmer ist noch offen,set tabletflur ttsMsg Das Fenster im Wohnzimmer ist noch offen),
  IF ([Fenstersensor_SZ] eq "open")
     (set teleBot msg Das Fenster im Schlafzimmer ist noch offen,set tabletflur ttsMsg Das Fenster im Schlafzimmerist noch offen),
...

Das macht es zumindest übersichtlicher und einfacher zu ergänzen.

Was die Benachrichtigungen angeht, solltest Du Dir mal den MSG-Befehl anschauen. Den muss man zwar erstmal ordentlich konfigurieren, aber idealerweise brauchst Du dann einfach nur msg...irgendwas zu sagen und die Benachrichtigungen werden dann automatisch abhängig von Anwesenheitsstatus usw. an den richtigen Stellen zugestellt. Dann würde es sich reduzieren auf

DOIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open")
  IF([Fenstersensor_WZ] eq "open")
     (msg Das Fenster im Wohnzimmer ist noch offen),
  IF ([Fenstersensor_SZ] eq "open")
     (msg Das Fenster im Schlafzimmer ist noch offen),
...


AmunRe

Zitat von: Brockmann am 17 November 2016, 09:00:48
Puh, da kommt ja schon einiges zusammen.
Ich denke, für diese Art von Aufgabe gibt es in FHEM bislang noch keine wirklich gute Lösung, lasse mich aber gerne eines besseren belehren.
Ich denke, ich würde mit IF arbeiten, etwa so:

DOIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open" and [?rr_Torte] eq "home" and [?rr_Steph] ne "home")
  IF([Fenstersensor_WZ] eq "open")
     (set teleBot msg Das Fenster im Wohnzimmer ist noch offen,set tabletflur ttsMsg Das Fenster im Wohnzimmer ist noch offen),
  IF ([Fenstersensor_SZ] eq "open")
     (set teleBot msg Das Fenster im Schlafzimmer ist noch offen,set tabletflur ttsMsg Das Fenster im Schlafzimmerist noch offen),
...

Das macht es zumindest übersichtlicher und einfacher zu ergänzen.

Was die Benachrichtigungen angeht, solltest Du Dir mal den MSG-Befehl anschauen. Den muss man zwar erstmal ordentlich konfigurieren, aber idealerweise brauchst Du dann einfach nur msg...irgendwas zu sagen und die Benachrichtigungen werden dann automatisch abhängig von Anwesenheitsstatus usw. an den richtigen Stellen zugestellt. Dann würde es sich reduzieren auf

DOIF ([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open")
  IF([Fenstersensor_WZ] eq "open")
     (msg Das Fenster im Wohnzimmer ist noch offen),
  IF ([Fenstersensor_SZ] eq "open")
     (msg Das Fenster im Schlafzimmer ist noch offen),
...



Vielen Dank für die Erste Idee. Und den MSG Befehl, den schau ich mir tatsächlich genauer an!

Noch jemand eine Idee?

Select Case wäre hier echt schön denk ich.
4 x Echo Dot, HMLAN Gateway, und diverse HM Komponenten, Philips Hue + OSRAM Plugs

Ellert

Wenn Du die individuellen Ansagen  in ein Schema bringen kannst und der individuelle Teil aus dem Gerät (Fenstersensor) abgeleitet werden kann, dann kannst Du das Beispiel für "Batteriewarnung" aus der Commandref verwenden, http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events

Die individuellen Texte könntest Du aus dem Gerätenamen, dem Aliasnamen und dem Attribut comment bilden.

Beispiel
Zitatset teleBot msg Das {(AttrVal($DEVICE,"comment","none"))} ist noch offen
, wenn das Attribut comment "Fenster im Schlafzimmer" lautet.

Per

Nebenbei hast du mit deinem Konstrukt das Problem, dass, wenn mehr als ein Fenster offen ist, nur das erste gemeldet wird.
Du müsstest die Reihefolge umdrehen (erst 3 x "open", dann 2x "open"...)
Besser wäre es, ein untergeordnetes IF zu verwenden, wie von Brockmann vorgeschlagen.
Noch besser wäre es, du erstellt eine SUB (99_myUtil), welche mit drei if-Abfragen den Text erstellt und in der zweiten Abfrage die Geräte zuweist.
geht zwar auch im DOIF selbst
{my $text;if ([Fenstersensor_SZ] eq "open") ($text = "Text");...}
oder
{my $text=([Fenstersensor_SZ] eq "open") ? "Text" : ""}
wird aber schnell unübersichtlich.

AmunRe

#5
Zitat von: Per am 17 November 2016, 12:13:09
Nebenbei hast du mit deinem Konstrukt das Problem, dass, wenn mehr als ein Fenster offen ist, nur das erste gemeldet wird.
Du müsstest die Reihefolge umdrehen (erst 3 x "open", dann 2x "open"...)
Besser wäre es, ein untergeordnetes IF zu verwenden, wie von Brockmann vorgeschlagen.
Noch besser wäre es, du erstellt eine SUB (99_myUtil), welche mit drei if-Abfragen den Text erstellt und in der zweiten Abfrage die Geräte zuweist.
geht zwar auch im DOIF selbst
{my $text;if ([Fenstersensor_SZ] eq "open") ($text = "Text");...}
oder
{my $text=([Fenstersensor_SZ] eq "open") ? "Text" : ""}
wird aber schnell unübersichtlich.

Das mir auch schon aufgefallen. Das es Falsch rum ist.

Ich kann dir mit der Sub nicht folgen. Und die unter IF abfragen funktionieren bei mir leider nicht.

Finde auch diese Lösung an sich eher schlecht, weil ich nicht jedes offene Fenster abfragen kann.


([?Bewegunsgmelderflur_button_tuer_Motion] eq "motion" and [TuersensorFlur] eq "open")

IF ([?rr_Torte] eq "home" and [?rr_Steph] ne "home")


IF (["^Fenstersensor_:opened"])
(set teleBot msg Das Fenster $Device:klarname ist noch offen)(set tabletflur ttsMsg Das Fenster $Device:klarname ist noch offen);





IF ([?rr_Steph] eq "home" and [?rr_Torte] ne "home")

IF (["^Fenstersensor_:opened"])
(set teleBot msg @@freundin Das Fenster $Device:klarname ist noch offen)(set tabletflur ttsMsg Das Fenster $Device:klarname ist noch offen),



IF([?rr_Steph] eq "home" and [?rr_Torte] eq "home")

IF ([Fenstersensor_WZ] eq "open")
(set teleBot msg Das Fenster $Device:klarname ist noch offen)(set teleBot msg @@freundin Das Fenster $Device:klarname ist noch offen)(set tabletflur ttsMsg Das Fenster $Device:klarname ist noch offen),



Am liebsten wär mir ja, er schreibt einfach jedes offene Fenster in eine Variable und die geb ich dann aus. Aber ich hab keine idee, wie ich das realisieren kann.

Beispiel Variable = Fenster Wohnzimmer,Fenster Bad,Fenster Schlafzimmer
4 x Echo Dot, HMLAN Gateway, und diverse HM Komponenten, Philips Hue + OSRAM Plugs

Brockmann

Zitat von: AmunRe am 17 November 2016, 15:31:01
Am liebsten wär mir ja, er schreibt einfach jedes offene Fenster in eine Variable und die geb ich dann aus. Aber ich hab keine idee, wie ich das realisieren kann.
Beispiel Variable = Fenster Wohnzimmer,Fenster Bad,Fenster Schlafzimmer
Ich weiß nicht, ob das irgendwo hin führt, aber Du kannst jederzeit recht einfach rausfinden, welche Fenster gerade offen sind:
list state=open

Ich wüsste allerdings nicht, wie man die Ausgabe von list innerhalb von FHEM (beispielsweise in einem DOIF) verarbeiten könnte. Vielleicht hat jemand eine Idee dazu...

AmunRe

Zitat von: Brockmann am 18 November 2016, 09:59:46
Ich weiß nicht, ob das irgendwo hin führt, aber Du kannst jederzeit recht einfach rausfinden, welche Fenster gerade offen sind:
list state=open

Ich wüsste allerdings nicht, wie man die Ausgabe von list innerhalb von FHEM (beispielsweise in einem DOIF) verarbeiten könnte. Vielleicht hat jemand eine Idee dazu...

Danke, genau darum hab ich gefragt.

Den Trick kannte ich aber auch noch nicht!
4 x Echo Dot, HMLAN Gateway, und diverse HM Komponenten, Philips Hue + OSRAM Plugs

AmunRe

#8
Ich hatte da noch ne idee, komme jetzt aber nicht weiter.


ich hab ne Lightscene erstellt und alle möglichkeiten dort abgebildet. und mit Follow Device dafür gesort das immer der Status der Frenster mit einer Szene übereinstimmt.


Nun heißen die Szenen aber 01_WZ für nur Wohnzimmer offen

und 05_WZ_SZ für Wohnzimmer und Schlafzimmer.  Wie bekomme ich es nun in einem DOIF hin, das er SZ durch Schlafzimmer und WZ durch Wohnzimmer in einer Ausgabe ersetzt?

das zauberwort könnte Readingsproxy sein, hab ich grad gelesen. Mal sehen ob das klappt.

Hier die Szene:
Internals:
   CFGFN
   DEF        Fenstersensor_BAD Fenstersensor_WZ Fenstersensor_SZ Fenstersensor_Kueche
   HAS_DataDumper 1
   HAS_JSON   1
   NAME       allefenster
   NR         18944
   NTFY_ORDER 50-allefenster
   STATE      08_WZ_KU
   TYPE       LightScene
   followDevices 1
   mayBeVisible 1
   Content:
     Fenstersensor_BAD 1
     Fenstersensor_Kueche 1
     Fenstersensor_SZ 1
     Fenstersensor_WZ 1
   Readings:
     2016-11-18 19:52:20   state           08_WZ_KU
   Scenes:
     01_bad:
       Fenstersensor_BAD open
       Fenstersensor_Kueche closed
       Fenstersensor_SZ closed
       Fenstersensor_WZ closed
     02_ku:
       Fenstersensor_BAD closed
       Fenstersensor_Kueche open
       Fenstersensor_SZ closed
       Fenstersensor_WZ closed
     03_sz:
       Fenstersensor_BAD closed
       Fenstersensor_Kueche closed
       Fenstersensor_SZ open
       Fenstersensor_WZ closed
     04_wz:
       Fenstersensor_BAD closed
       Fenstersensor_Kueche closed
       Fenstersensor_SZ closed
       Fenstersensor_WZ open
     05_bad_ku:
       Fenstersensor_BAD open
       Fenstersensor_Kueche open
       Fenstersensor_SZ closed
       Fenstersensor_WZ closed
     06_bad_wz:
       Fenstersensor_BAD open
       Fenstersensor_Kueche closed
       Fenstersensor_SZ closed
       Fenstersensor_WZ open
     07_bad_sz:
       Fenstersensor_BAD open
       Fenstersensor_Kueche closed
       Fenstersensor_SZ open
       Fenstersensor_WZ closed
     08_wz_ku:
       Fenstersensor_BAD closed
       Fenstersensor_Kueche open
       Fenstersensor_SZ closed
       Fenstersensor_WZ open
     09_sz_ku:
       Fenstersensor_BAD closed
       Fenstersensor_Kueche open
       Fenstersensor_SZ open
       Fenstersensor_WZ closed
     10_bad_ku_wz:
       Fenstersensor_BAD open
       Fenstersensor_Kueche open
       Fenstersensor_SZ closed
       Fenstersensor_WZ open
     11_bad_wz_sz:
       Fenstersensor_BAD open
       Fenstersensor_Kueche closed
       Fenstersensor_SZ open
       Fenstersensor_WZ open
     12_bad_ku_sz:
       Fenstersensor_BAD open
       Fenstersensor_Kueche open
       Fenstersensor_SZ open
       Fenstersensor_WZ closed
     13_wz_sz_ku:
       Fenstersensor_BAD closed
       Fenstersensor_Kueche open
       Fenstersensor_SZ open
       Fenstersensor_WZ open
     14_bad_wz_ku_sz:
       Fenstersensor_BAD open
       Fenstersensor_Kueche open
       Fenstersensor_SZ open
       Fenstersensor_WZ open
     15_zu:
       Fenstersensor_BAD closed
       Fenstersensor_Kueche closed
       Fenstersensor_SZ closed
       Fenstersensor_WZ closed
   devices:
     Fenstersensor_BAD
     Fenstersensor_Kueche
     Fenstersensor_SZ
     Fenstersensor_WZ

4 x Echo Dot, HMLAN Gateway, und diverse HM Komponenten, Philips Hue + OSRAM Plugs