Bitte um Hilfe bei IF-Bedingung (Info über noch offene Fenster bei Tür-Öffnung)

Begonnen von MaJu, 22 April 2014, 22:59:54

Vorheriges Thema - Nächstes Thema

MaJu

Hallo zusammen, ich stehe auf dem Schlauch und bitte um Hilfe.

Ich habe ein Info-Display im Flur hängen (siehe http://forum.fhem.de/index.php/topic,22336.0.html).
Sobald ich die Wohnungstür öffne, soll es eine sofortige Ansage geben, wenn vergessen wurde ein Fenster zu schließen.

Randbedingungen: Alle Fenster (FHEM-Bezeichnungen: Fenster_Wohnzimmer und Fenster_Schlafzimmer und Fenster_Katzenzimmer) und die Wohnungstür (FHEM: Wohnungstuer) haben jeweils einen Türsensor Homematic HM-SEC-SC. Dieser meldet den Status "open" wenn etwas geöffnet wird.

Die Ansage wird gesteuert mit "set ttsSay Flurtablet [Nachricht]"

Ziel:
Wenn bei "Wohnungstuer" der Status "open" ist, soll eine Ansage kommen (und zwar nur dann), wenn einer der 3 Fenster-Sensoren den Status "open" hat. Dabei sollte auch das entsprechende Zimmer mit genannt werden. Beispiel: "Achtung! Fenster Schlafzimmer offen!" Oder bei mehreren dann beispielsweise "Achtung! Fenster Schlafzimmer und Wohnzimmer offen!"

Aber wie komme ich dahin? Ich habe irgendwo den folgenden Codeschnipsel gefunden, der allerdings NICHT hilft:define Ansage_Wohnzimmer notify Wohnungstuer
IF ([Wohnungstuer] eq "open") (

    IF ([Fenster_Wohnzimmer] eq "open")
        (set Flurtablet ttsSay Achtung! Fenster Wohnzimmer ist noch offen!)
    ELSE
        (set Flurtablet toastMessage Fenster Wohnzimmer ist geschlossen.)

) ELSE

    (set Flurtablet toastMessage Fenster Wohnzimmer geöffnet.)

Die "toastMessage" sind kurze Einblendtexte auf dem Display, die ich einfach reingeschrieben habe damit überhaupt was bei ELSE steht, dies brauche ich aber nicht.

FHEM gibt mir folgende Fehlermeldung:Error messages while initializing FHEM:
configfile: Usage: define notify
IF: no right bracket: (
IF: no left bracket:
Unknown command (set, try help.
Unknown command ELSE, try help.
Unknown command (set, try help.
Unknown command ), try help.
Unknown command (set, try help.


Mir fehlt der richtige Anstoß. Wer hilft mir, bitte?
Erlebnisreiche Grüße aus Leipzig!

der-Lolo

Der Code-Schnipsel schaut auf den ersten Blick gut aus - wo hast du das denn eingetragen?

Beim anlegen solcher notifys gehe ich so vor:

Zitatdefine blabla notify blubblub IF ()

in die Befehlszeile eingeben!

Dann landest du im Screen des notifys - hier kannst Du auf DEF klicken, dort steht dann bereits
Zitatblubblub IF ()
Wenn Du dann deinen Schnipsel in die () des IFs setzt sollte das ganze funktionieren.
Lediglich Dein letztes ELSE erscheint mir nicht gerade sinnvoll.


MaJu

Der Schnipsel ist so wie er da steht in der fhem.cfg.
Benötige ich zu einem IF denn zwingen ein ELSE?

Ich werde es heute Abend nach der Arbeit weiter testen.

Danke! :-)
Erlebnisreiche Grüße aus Leipzig!

Bennemannc

Hallo,

zu einem IF wird nicht zwingend ein ELSE benötigt. Das geht auch ohne, dann wird eben nichts gemacht, wenn die Bedingung nicht erfüllt ist.

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

Puschel74

Moin,

http://fhem.de/commandref_DE.html#IF
Hier steht:
ZitatGeschachtelte Angabe von zwei IF-Befehlen (kann in mehreren Zeilen mit Einrückungen zwecks übersichtlicher Darstellung in der DEF-Eingabe eingegeben werden):

Ich sehe aber nichts von Leerzeilen oder das das direkt in die fhem.cfg geschrieben werden kann.
Weiters würde ich, mal wieder, davon abraten die fhem.cfg selbst zu bearbeiten.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

MaJu

Danke Puschel74, das war ein wichtiger Denkanstoß! Ich habe es tatsächlich nicht als Define geschrieben, sondern in die fhem.cfg. Werde es heute Abend testen.

Ich müsste also mit define Ansage_Wohnzimmer notify Wohnungstuer
das Notify definieren und darin dann IF ([Wohnungstuer] eq "open") (

    IF ([Fenster_Wohnzimmer] eq "open")
        (set Flurtablet ttsSay Achtung! Fenster Wohnzimmer ist noch offen!)
    )

?

Oder habe ich noch einen Denkfehler?
Damit würde ich zwar für jedes Fenster ein eigenes Notify erstellen, daber das wäre nicht tragisch, da wird die Ansage einfach länger.
Erlebnisreiche Grüße aus Leipzig!

Puschel74

Hallo,

hier
http://forum.fhem.de/index.php/topic,17496.msg115065.html#msg115065
wird kurz erklärt wie ein at, notify angelegt werden kann ohne die fhem.cfg überhaupt zu beachten.

Zu IF kann ich dir leider nur das sagen was in der commandref steht bzw. was sich im Forum dazu tummelt - mehr aber auch nicht da ich IF nicht verwende.

Du musst auch nicht für jedes Fenster ein eigenes notify machen.

Versuch mal
define Ansage_Wohnzimmer notify (Wohnungstuer|Fenster_.*)
So löst das notify aus wenn Wohnungstuer ODER ein Fenster einen Status sendet.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

MaJu

Danke. Bisher war FHEM für mich ein reines "Anzeigeprogramm" für das Tablet im Flur. Jetzt gehts ans "basteln", hier fällt mir mein fehlendes Programmierverständnis auf die Füße. Ich versuche es zu verstehen und umzusetzen.

Ich möchte jedoch nicht immer eine Ansage erhalten, wenn sie eine Fenster- oder Türstatus ändert. Es soll lediglich eine Warn-Ansage sein, die man hört, wenn ein Fenster vergessen wurde zu schließen und man die Wohnung verlassen möchte.
Also nur wenn die Tür geöffnet wird, sind die Fenster-Stati relevant und es soll nur etwas ausgelöst werden, wenn neben der Tür auch ein Fenster geöffnet ist.

Oder ist "IF" hier der Holzweg und etwas anderes besser?
Erlebnisreiche Grüße aus Leipzig!

Bennemannc

Hallo,

wenn Du das notify von Puschel74 nimmst und das ganze mit UND verknüpfst, hast Du doch eigentlich das was Du möchtest. Wenn Fenster und Türe auf = Meldung.

Gruß Chrsitoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

Puschel74

Hallo,

"Holzwege" gibt es in FHEM nicht  ;D
Nur Umwege  ;)

Ok. Hab grad nochmal "Ziel:" in deinem ersten Beitrag durchgelesen.
Ob und wie das mit IF machbar ist kann ich dir nicht sagen.
Wie geschrieben - ich verwende IF nicht.

Ich hab mit if noch nie Probleme gehabt oder bin irgendwie an "Leistungsgrenzen" gekommen.
Daher besteht für mich keine Notwendigkeit hier umzudenken.

Ich kann dir später mal versuchen ein kleines Stückchen Code zu posten das deine Anforderungen erfüllen sollte.
Kann aber noch etwas dauern also bitte ein kleines bischen Geduld.

Aber vielleicht ist ja jemand anders schneller mit dem Code  ;D

Grüße

Edith: @Christoph
Ich weiß nicht ob im regexp ein & möglich ist. Das habe ich noch nie versucht.
Das ODER habe ich hier eigentlich nur als Trenner verstanden für unterschiedliche Auslösekriterien und nicht als ODER in diesem Sinne.
Ich kann mich hier aber natürlich auch täuschen.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

mi.ke

Ich bin auch noch Anfänger und wahrscheinlich sind Fehler drin...

aber von Ansatz her würd ich das so machen.

Aber mit "normalem" if, weil ich das IF nicht verstanden habe

ungetestet: 8)
define Wohnungstuer_n notify Wohnungstuer:open {
if (Value ("Fenster_Katzenzimmer") eq "open") {fhem ("set Flurtablet ttsSay Achtung! Fenster im Katzenzimmer ist noch offen");}
if (Value ("Fenster_Wohnzimmer") eq "open") {fhem ("set Flurtablet ttsSay Achtung! Fenster im Wohnzimmer ist noch offen");}
if (Value ("Fenster_Schlafzimmer") eq "open") {fhem ("set Flurtablet ttsSay Achtung! Fenster im Wohnzimmer ist noch offen");}
}




ODER



ungetestet: 8)
define FensterTEST_n notify Fenster_.*:offen {
if ((Value ("Wohnungstuer") eq "open") && ("@" eq "Fenster_Katzenzimmer")) {fhem ("set Flurtablet ttsSay Achtung! Fenster im Katzenzimmer ist noch offen");}
if ((Value ("Wohnungstuer") eq "open") && ("@" eq "Fenster_Wohnzimmer")) {fhem ("set Flurtablet ttsSay Achtung! Fenster im Wohnzimmerzimmer ist noch offen");}
if ((Value ("Wohnungstuer") eq "open") && ("@" eq "Fenster_Schlafzimmer")) {fhem ("set Flurtablet ttsSay Achtung! Fenster im Schlafzimmer ist noch offen");}
}



Cheers
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

Damian

Zitat von: mi.ke am 23 April 2014, 08:10:20
define Wohnungstuer_n notify Wohnungstuer:open {
if (Value ("Fenster_Katzenzimmer") eq "open") {fhem ("set Flurtablet ttsSay Achtung! Fenster im Katzenzimmer ist noch offen");}
if (Value ("Fenster_Wohnzimmer") eq "open") {fhem ("set Flurtablet ttsSay Achtung! Fenster im Wohnzimmer ist noch offen");}
if (Value ("Fenster_Schlafzimmer") eq "open") {fhem ("set Flurtablet ttsSay Achtung! Fenster im Wohnzimmer ist noch offen");}
}


Und so würde es dann mit IF aussehen:
define Wohnungstuer_n notify Wohnungstuer:open \
IF ([Fenster_Katzenzimmer] eq "open") (set Flurtablet ttsSay Achtung! Fenster im Katzenzimmer ist noch offen) ELSE (\
IF ([Fenster_Wohnzimmer] eq "open") (set Flurtablet ttsSay Achtung! Fenster im Wohnzimmer ist noch offen) ELSE (\
IF ([Fenster_Schlafzimmer] eq "open") (set Flurtablet ttsSay Achtung! Fenster im Wohnzimmer ist noch offen)))


In der DEF-Eingabe kannst du Backslash \ am Ende der Zeile weglassen. Wichtig ist, dass hinter open ein Leerzeichen ist.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

mi.ke

ahh, okay...

bei IF müsste dann also das ELSE (IF zwingend rein . . .
Ich hatte das in der Vergangenheit ausprobiert, bin aber mit IF am ODER immer gescheitert . . .
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

Puschel74

Hallo,

mal kurz nicht da und schon wuppt es - sehr schön Leute  ;D

OT
@mi.ke
if ((Value ("Wohnungstuer") eq "open") && ("@" eq "Fenster_Katzenzimmer"))
das @ gegen $DEVICE tauschen und du bist zukunftssicher.
Ebenso, hier jetzt nicht benutzt, kann % gegen $EVENT getauscht werden.
if ((Value ("Wohnungstuer") eq "open") && ($DEVICE eq "Fenster_Katzenzimmer"))
Wobei ich das ganze zwar noch etwas umstellen würde aber es gibt ja genug Wege zum Ziel  8)
Sorry für OT

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Damian

Zitat von: mi.ke am 23 April 2014, 09:25:40
ahh, okay...

bei IF müsste dann also das ELSE (IF zwingend rein . . .
Ich hatte das in der Vergangenheit ausprobiert, bin aber mit IF am ODER immer gescheitert . . .

In diesem konkreten Fall wäre der else-Fall gar nicht erforderlich, weil die einzelnen if-Abfragen sich gegenseitig ausschließen. Es hätte also auch so funktioniert:

define Wohnungstuer_n notify Wohnungstuer:open
IF ([Fenster_Katzenzimmer] eq "open") (set Flurtablet ttsSay Achtung! Fenster im Katzenzimmer ist noch offen);;
IF ([Fenster_Wohnzimmer] eq "open") (set Flurtablet ttsSay Achtung! Fenster im Wohnzimmer ist noch offen);;
IF ([Fenster_Schlafzimmer] eq "open") (set Flurtablet ttsSay Achtung! Fenster im Wohnzimmer ist noch offen)


Und auch hier: funktioniert so in der DEF-Eingabe. Hinter open muss ein Leerzeichen (in der cfg kommen noch die Backslashes \ am Zeilenende) - das sind aber FHEM-Eigenschaften und haben mit IF nichts zu tun.

Diese Abfrage kostet ein paar Millisekunden mehr, weil hier im Gegensatz zum Beispiel mit ELSE immer alle Abfragen durchlaufen werden. ;)

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF