FHEM Forum

FHEM - Hausautomations-Systeme => MAX => Thema gestartet von: habnefrage am 20 Februar 2016, 20:34:20

Titel: MAX FensterKontakte mit DOIF abfragen
Beitrag von: habnefrage am 20 Februar 2016, 20:34:20
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
Titel: Antw:MAX FensterKontakte mit DOIF abfragen
Beitrag von: Rince am 21 Februar 2016, 08:02:18

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.
Titel: Antw:MAX FensterKontakte mit DOIF abfragen
Beitrag von: habnefrage am 21 Februar 2016, 10:23:01
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
Titel: Antw:MAX FensterKontakte mit DOIF abfragen
Beitrag von: habnefrage am 21 Februar 2016, 10:41:50
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
Titel: Antw:MAX FensterKontakte mit DOIF abfragen
Beitrag von: Rince am 21 Februar 2016, 11:53:51
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 (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?
Titel: Antw:MAX FensterKontakte mit DOIF abfragen
Beitrag von: habnefrage am 21 Februar 2016, 12:12:49
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!
Titel: Antw:MAX FensterKontakte mit DOIF abfragen
Beitrag von: TGTTO am 31 März 2016, 20:50:57
Hallo habnefrage,

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

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

Gruss Thomas