MAX FensterKontakte mit DOIF abfragen

Begonnen von habnefrage, 20 Februar 2016, 20:34:20

Vorheriges Thema - Nächstes Thema

habnefrage

Hi, ich lese mich seit ein paar Tagen ins DOIF ein.
Wenn ich es einigermaßen verstanden habe, will ich einen Alarm erhalten, wenn das Fenster zu lange offen ist. (Gibts schon tausend mal im Forum, aber ich will ja auch ein wenig verstehen von dem was ich da abtippe)

Mein erstes Problem habe ich mit den Unterschieden zwischen Status, Event, Reading, Internals.
Laut FHEM Referenz kann man die auf unterschiedliche Arten abfragen.
ZitatStati werden mit [<devicename>], Readings mit [<devicename>:<readingname>], Internals mit [<devicename>:&<internal>] angegeben.

FK ist mein Fensterkontakt.
define FK MAX ShutterContact 00ff222

Daraus interpretiere ich, dass das in SourceCode so aussehen müsste. (Als Action mal nur ein Eintrag ins Logfile)
Status
define di DOIF ([FK] eq "opened")({Log 3,"cmd1"})  ##Irgendwie scheint der das 'eq "opened"' aber nicht korrekt zu sein bzw. interpretiert zu werden.

Status
define di DOIF ([FK:state: opened])({Log 3,"cmd1"})  ##geht nicht sowas wie [FK:state] eq "opened"???

Internals
define di DOIF ([FK:&type: ShutteContact])({Log 3,"cmd1"})  ##Klappt bei mir überhaupt nicht

Könntet ihr mir bzgl. der Bedingungen ein wenig auf die Sprünge helfen?

vielen Dank,
Christian

Rince


define di_haustuer_hinweis DOIF ([fl_TK_Haustuer] eq "opened") (say Bitte denkt daran die Haustüre wieder zu schließen)

Als attr noch ein wait 120


Das funktioniert bei mir sehr gut.

say ist bei mir ein cmdalias, das den ganzen TTS Befehl abkürzt.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

habnefrage

Hallo und danke...

Ja, so funktioniert es auch bei mir.
Nun möchte ich aber erreichen, dass ich mit diesem DOIF alle Fensterkontakte abfackeln kann.

Kann ich dann soetwas machen wie:
define Fenster MAX ShutterContact 00ff22
define Tuer MAX ShutterContact 00ff221
define di_anyWindow DOIF ([.*] eq "opened") ({Log 3,"cmd1 $DEVICE:$EVENT"}) DOELSE ({Log 3,"cmd2 $DEVICE:$EVENT"})
attr di_anyWindow do always


Und wenn das klappt, dann will ich ja nur auf Fenster reagieren. Türen sollen sich anders verhalten.
Daher dann noch die Erweiterung mit einem UserReading "isFenster"
define Fenster MAX ShutterContact 00ff222
attr Fenster userReadings isFenster { "JA";; }

define Tuer MAX ShutterContact 00ff221
attr Tuer userReadings isFenster { "NEIN";; }

define di_anyWindow DOIF (([.*] eq "opened") &&  [".*:isFenster: JA"]) ({Log 3,"cmd1 $DEVICE:$EVENT"}) DOELSE ({Log 3,"cmd2 $DEVICE:$EVENT"})
attr di_all_events do always


Ist das der richtige Ansatz?
Stimmt evtl. nur etwas mit meinem Code nicht?

Gruß,
Christian

habnefrage

Hier mal ein Test-Log mit dem aktuellen Code dazu.


Problem:
- Es wird immer nur in den DOELSE gesprungen.
- Und das auch noch vier mal.

Meine Erklärung dafür:
- Die Abfrage des Events ist nicht korrekt.
- Ich will nicht auf Battery oder sonst ein Event reagieren sondern nur auf "opened"

Hinweis:
FK_EG_WZ_Tuer ist ein Kontakt bei dem ich zu Testzwecken das UserReading isFenster auf JA gestellt habe.


das ist der codedefine di_anyWindow DOIF (([.*]) eq "opened" &&  [".*:isFenster: JA"]) ({Log 3,"cmd1 $DEVICE:$EVENT"}) DOELSE ({Log 3,"cmd2 $DEVICE:$EVENT"})
attr di_anyWindow do always



Hier das Log
2016.02.21 10:38:37 3: cmd2 FK_EG_WZ_Tuer:battery: ok,onoff: 0,closed,RSSI: -73.5,isFenster: JA
2016.02.21 10:38:37 3: cmd2 FK_EG_WZ_Tuer:battery: ok,onoff: 0,closed,RSSI: -73,isFenster: JA
2016.02.21 10:38:37 3: cmd2 FK_EG_WZ_Tuer:battery: ok,onoff: 0,closed,RSSI: -73,isFenster: JA
2016.02.21 10:38:37 3: cmd2 FK_EG_WZ_Tuer:battery: ok,onoff: 0,closed,RSSI: -73,isFenster: JA

Rince

Sorry, dafür verstehe ich zu wenig.
Evtl. solltest du den Thread ins DOIF Forum schieben!

Hast du diesen Thread mal angesehen?
http://forum.fhem.de/index.php/topic,46327.0.html

Wenn sich Fenster und Türen anders verhalten sollen, würde ich ja eher mit dem Namen spielen.
Dann könntest du einfach 2 DOIFs anlegen, eines für Fenster, eines für Türen?
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

habnefrage

Ich glaube, ich habe es hinbekommen.

define di_anyWindow DOIF (([$DEVICE] eq "opened") and ([".*:isFenster: JA"]) and ([MyWetter:temp_c] < 16)) \
({Log 3,"Benachrichtugung rausschicken $DEVICE:$EVENT"}) \
DOELSEIF (([$DEVICE] eq "opened") and ([".*:isFenster: JA"])) \
({Log 3,"Keine Benachrichtigung ist zawr ein Fenster, aber draußen ist es warm $DEVICE:$EVENT"}) \
DOELSEIF (([$DEVICE] eq "opened") and ([".*:isFenster: NEIN"])) \
({Log 3,"Keine Benachrichtigung da kein Fenster, wird wohl ne Tür sein $DEVICE:$EVENT"}) \
DOELSE \
({Log 3,"OK, Fenster wieder geschlossen $DEVICE:$EVENT"})



Ich beobachte das mal ein paar Tage, ob es evtl Seiteneffekte gibt, aber die ersten Tests zeigen, dass es klappt.

schönes Wochenende!

TGTTO

Hallo habnefrage,

ich erledige das mit folgender Lösung, einfach klasse.

https://forum.fhem.de/index.php/topic,36504.0.html

Gruss Thomas
1 x Raspberry Pi 3 inkl HMUARTLGW ,
1 x CUL868 V 1.61 für  MAX, 1 x CUL868 V 1.61 für  FS20
1 x CUL433 1.05.04 a-culfw Build: 151 für IT  
1 x Max Cube geflasht für Homematic Modus
Max-Komponenten, HM,FS20,IT