FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Gunther am 29 Oktober 2017, 21:16:49

Titel: [gelöst] bei mehreren Befehlen für einen davon eine Ausnahme setzen
Beitrag von: Gunther am 29 Oktober 2017, 21:16:49
Folgendes DOIF funktioniert gut (der Dummy vorne ist eigentlich meine Haustür... die Inhalte noch zu Testzwecken etwas komisch)

([testdummy:"2"] and [haus_Status:state] < 3 and [structure_fensterstatus_eg] eq "offen" and [ttsMsg_an_aus] eq "an")
(set eg_wz_Tablet10Zoll volume 10)
(set eg_wz_Tablet10Zoll ttsMsg Es sind noch Fenster offen)
(set eg_wz_Tablet10Zoll screenMsg Es sind noch Fenster offen)
DOELSEIF
([testdummy:"2"] and [haus_Status:state] < 3 and [structure_fensterstatus_eg] eq "alle_geschlossen" and [ttsMsg_an_aus] eq "an")
(set eg_wz_Tablet10Zoll screenMsg OK: Alle Fenster geschlossen)


Der Dummy ttsMsg_an_aus schaltet Audioansagen auf dem Tablet an und aus.
Allerdings möchte ich das nur für die Zeile
(set eg_wz_Tablet10Zoll ttsMsg Es sind noch Fenster offen)

ausführen. Kann ich das ohne zusätzliches DOELSEIF machen?
Titel: Antw:bei mehreren Befehlen für einen davon eine Ausnahme setzen
Beitrag von: Gunther am 29 Oktober 2017, 21:28:44
Ich habe es nun so gelöst:

([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "offen" and [ttsMsg_an_aus] eq "an")
(set eg_wz_Tablet10Zoll volume 10)
(set eg_wz_Tablet10Zoll ttsMsg Es sind noch Fenster offen)
(set eg_wz_Tablet10Zoll screenMsg Es sind noch Fenster offen)
DOELSEIF
([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "offen")
(set eg_wz_Tablet10Zoll screenMsg Es sind noch Fenster offen)
DOELSEIF
([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "alle_geschlossen" and [ttsMsg_an_aus] eq "an")
(set eg_wz_Tablet10Zoll volume 10)
(set eg_wz_Tablet10Zoll ttsMsg OK)
(set eg_wz_Tablet10Zoll screenMsg OK: Alle Fenster geschlossen)
DOELSEIF
([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "alle_geschlossen")
(set eg_wz_Tablet10Zoll screenMsg OK: Alle Fenster geschlossen)
Titel: Antw:[gelöst] bei mehreren Befehlen für einen davon eine Ausnahme setzen
Beitrag von: Damian am 29 Oktober 2017, 21:38:44
Hast du das wait-Attribut benutzt?
Titel: Antw:[gelöst] bei mehreren Befehlen für einen davon eine Ausnahme setzen
Beitrag von: Gunther am 29 Oktober 2017, 21:43:14
ja, so:

define doif_fensterstatus_pruefen_haustuer DOIF ([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "offen" and [ttsMsg_an_aus] eq "an") \
(set eg_fl_Tablet10Zoll volume 10)\
(set eg_fl_Tablet10Zoll ttsMsg Es sind noch Fenster offen)\
(set eg_fl_Tablet10Zoll screenMsg Es sind noch Fenster offen)\
DOELSEIF\
([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "offen") \
(set eg_fl_Tablet10Zoll screenMsg Es sind noch Fenster offen)\
DOELSEIF\
([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "alle_geschlossen" and [ttsMsg_an_aus] eq "an") \
(set eg_fl_Tablet10Zoll volume 10)\
(set eg_fl_Tablet10Zoll ttsMsg OK)\
(set eg_fl_Tablet10Zoll screenMsg OK: Alle Fenster geschlossen)\
DOELSEIF\
([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "alle_geschlossen") \
(set eg_fl_Tablet10Zoll screenMsg OK: Alle Fenster geschlossen)
attr doif_fensterstatus_pruefen_haustuer do always
attr doif_fensterstatus_pruefen_haustuer room G_Fensterkontakte,Logik
attr doif_fensterstatus_pruefen_haustuer wait 0,0.7,2:0:0,0.7,2:0


Trotzdem wäre nochmal interessant, ob ich eine Chance hätte in einen einzelnen Befehl eine Bedingung einzubauen.

Das hätte den Charme nicht ein riesiges DOIF aufzubauen, indem man durch jeweils einen Dummy Benachrichtigunen aktivieren und deaktivieren kann, z. B. mit

Vielleicht gibt es ja etwas (per Perl?)
Titel: Antw:[gelöst] bei mehreren Befehlen für einen davon eine Ausnahme setzen
Beitrag von: Damian am 29 Oktober 2017, 21:51:01
OK. Dann macht die Aufteilung der set-Befehle Sinn.

Wenn du Perl genauer studierst, kannst du alles machen, was du willst. DOIF hilft dir dabei auf Ereignisse und Timer zu reagieren, der Rest liegt in deiner Hand bzw. hängt deinen Fähigkeiten ab.
Titel: Antw:[gelöst] bei mehreren Befehlen für einen davon eine Ausnahme setzen
Beitrag von: Gunther am 29 Oktober 2017, 22:13:09
Ich fuchse mich gerade erstmal in die tollen FHEM Werkzeuge rein. Macht Mega-Spaß.
Perl wird noch etwas dauern.

Magst Du mir für mein Beispiel zeigen, wie ich mit Perl
die Zeilen
ttsMsg
nur bei
[ttsMsg_an_aus] eq "an"
ausführe?
Titel: Antw:[gelöst] bei mehreren Befehlen für einen davon eine Ausnahme setzen
Beitrag von: Damian am 29 Oktober 2017, 22:30:30
Zitat von: Gunther am 29 Oktober 2017, 22:13:09
Ich fuchse mich gerade erstmal in die tollen FHEM Werkzeuge rein. Macht Mega-Spaß.
Perl wird noch etwas dauern.

Magst Du mir für mein Beispiel zeigen, wie ich mit Perl
die Zeilen
ttsMsg
nur bei
[ttsMsg_an_aus] eq "an"
ausführe?

{if (Value("ttsMsg_an_aus") eq "an") {fhem"set ... ttsMsg...";}}

da du aber einen FHEM-Befehl ausführen willst, kannst du es auch gleich mit FHEM-Mitteln machen:

IF ([ttsMsg_an_aus] eq "an") (set ... ttsMsg....)

das dürfte für die einfache Anforderung kürzer und damit einfacher sein.
Titel: Antw:[gelöst] bei mehreren Befehlen für einen davon eine Ausnahme setzen
Beitrag von: Gunther am 29 Oktober 2017, 22:35:31
Danke Dir. Das kann ich dann wie folgt einbauen?:

define doif_fensterstatus_pruefen_haustuer DOIF ([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "offen" \
[b]IF ([ttsMsg_an_aus] eq "an")[/b](set eg_fl_Tablet10Zoll volume 10)\
[b]IF ([ttsMsg_an_aus] eq "an")[/b](set eg_fl_Tablet10Zoll ttsMsg Es sind noch Fenster offen)\
(set eg_fl_Tablet10Zoll screenMsg Es sind noch Fenster offen)\
DOELSEIF\
([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "offen") \
(set eg_fl_Tablet10Zoll screenMsg Es sind noch Fenster offen)\
DOELSEIF\
([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "alle_geschlossen"  \
[b]IF ([ttsMsg_an_aus] eq "an")[/b](set eg_fl_Tablet10Zoll volume 10)\
[b]IF ([ttsMsg_an_aus] eq "an")[/b](set eg_fl_Tablet10Zoll ttsMsg OK)\
(set eg_fl_Tablet10Zoll screenMsg OK: Alle Fenster geschlossen)
Titel: Antw:[gelöst] bei mehreren Befehlen für einen davon eine Ausnahme setzen
Beitrag von: Damian am 29 Oktober 2017, 22:49:58
Zitat von: Gunther am 29 Oktober 2017, 22:35:31
Danke Dir. Das kann ich dann wie folgt einbauen?:

define doif_fensterstatus_pruefen_haustuer DOIF ([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "offen" \
[b]IF ([ttsMsg_an_aus] eq "an")[/b](set eg_fl_Tablet10Zoll volume 10)\
[b]IF ([ttsMsg_an_aus] eq "an")[/b](set eg_fl_Tablet10Zoll ttsMsg Es sind noch Fenster offen)\
(set eg_fl_Tablet10Zoll screenMsg Es sind noch Fenster offen)\
DOELSEIF\
([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "offen") \
(set eg_fl_Tablet10Zoll screenMsg Es sind noch Fenster offen)\
DOELSEIF\
([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "alle_geschlossen"  \
[b]IF ([ttsMsg_an_aus] eq "an")[/b](set eg_fl_Tablet10Zoll volume 10)\
[b]IF ([ttsMsg_an_aus] eq "an")[/b](set eg_fl_Tablet10Zoll ttsMsg OK)\
(set eg_fl_Tablet10Zoll screenMsg OK: Alle Fenster geschlossen)


Die IF-Anweisungen gehören in den Ausführungsbereich, nicht in die Bedingung des DOIF-Moduls, daher

           DOIF ([eg_fl_tuer:"open"] and [haus_Status:state] > 2 and [structure_fensterstatus_eg] eq "offen")
(IF ([ttsMsg_an_aus] eq "an")(set eg_fl_Tablet10Zoll volume 10))
(IF ([ttsMsg_an_aus] eq "an")(set eg_fl_Tablet10Zoll ttsMsg Es sind noch Fenster offen))
(set eg_fl_Tablet10Zoll screenMsg Es sind noch Fenster offen)
...




Titel: Antw:[gelöst] bei mehreren Befehlen für einen davon eine Ausnahme setzen
Beitrag von: Gunther am 29 Oktober 2017, 22:55:37
verstanden. Das hilft mir ein paar Schalter einfacher einzubauen! Danke!