[GELÖST] kompliziertes DOIF brauche Hilfe!

Begonnen von meddie, 27 März 2016, 00:11:47

Vorheriges Thema - Nächstes Thema

meddie

Hallo zusammen,

ich habe ein KeyMatic und möchte eine Art Alarmschaltung damit bauen. Dazu muss ich die IF Abfrage etwas verschachteln. Ich möchte folgendes realisieren:

Wenn niemand zu Hause ist und die KeyMatic manuell geöffnet wird, dann soll ein Befehl ausgeführt wird.
Ab 21 Uhr soll auch dieser Befehl ausgeführt werden wenn  jemand zu Hause ist.

Die Anwesenheit prüfe ich über Handies angemeldet an der FritzBox. Ich habe zwei Smartphones, wenn eines Anwesend ist wird ein DOIF namens Anwesend den Status Anwesend bekommen.

Könnt Ihr mir da helfen, wie ich das am Besten mache? 
Danke
Gruß Eddie

Ellert

Du hast die Bedingungen ja schon formuliert, dann ist nur noch das DOIF zu beschreiben, etwa so:

(([?Anwesend] ne "Anwesend" or [?21:00-23:59]) and [Keymatic:"manual_opened"]) (<Befehl ausführen>)
DOELSE


Da ich Keymatic nicht kenne, muss Du das Keymatic-Ereignis entsprechend anpassen.

meddie

Hi,

vielen Dank für Deine Hilfe. Leider klappt es noch nicht. Ich habe aber die Schleife noch etwas angepasst, denn die KeyMatic hat zwei Zustände die nicht definiert sind. So sieht sie im Moment aus:

(([?Anwesend] ne "Anwesend" or [?21:00-23:59]) and ([Tuerschloss:"unlocked (uncertain)"] or [Tuerschloss:"locked (uncertain)"])) (set WhatsApp send HANDYNR Das Tuerschloss wurde manuell gedreht, {DebianMail('mailadresse','Das Tuerschloss wurde manuell gedreht!','das Tuerschloss wurde manuell gedreht. Es befindet sich im undefinierten Zustand!')})

Aber ich habe gleich ein paar Fragen, wofür steht das ? vor Anwesend und Uhrzeit?
ne bedeutet wahrscheinlich NICHT oder?

Vielen Dank
Gruß Eddie

Morgennebel

Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Ellert

Zitat von: meddie am 28 März 2016, 13:05:41
Hi,

vielen Dank für Deine Hilfe. Leider klappt es noch nicht. Ich habe aber die Schleife noch etwas angepasst, denn die KeyMatic hat zwei Zustände die nicht definiert sind. So sieht sie im Moment aus:

(([?Anwesend] ne "Anwesend" or [?21:00-23:59]) and ([Tuerschloss:"unlocked (uncertain)"] or [Tuerschloss:"locked (uncertain)"])) (set WhatsApp send HANDYNR Das Tuerschloss wurde manuell gedreht, {DebianMail('mailadresse','Das Tuerschloss wurde manuell gedreht!','das Tuerschloss wurde manuell gedreht. Es befindet sich im undefinierten Zustand!')})

Aber ich habe gleich ein paar Fragen, wofür steht das ? vor Anwesend und Uhrzeit?
ne bedeutet wahrscheinlich NICHT oder?

Vielen Dank
Gruß Eddie
Du triggerst mit [Tuerschloss:"unlocked (uncertain)"] auf ein Ereignis, Die Angaben zwischen den Anführungszeichen sind ein regulärer Ausdruck zum Filtern des Ereignisses. In einem regulären Ausdruck haben runde Klammern eine besondere Bedeutung, deshalb müssen Sie maskiert werden, also so:

[Tuerschloss:"unlocked \(uncertain\)"].

Es ist natürlich auch möglich einen vereinfachten Filter zu nutzen, das setzt natürlich voraus, dass es keine weiteren Türschlossereignisse mit "uncertain" gibt, etwa so:

[Tuerschloss:"uncertain"]

"ne" ist ein Perl-Operator,  die Bedeutung siehe z.B. hier: http://www.tutorialspoint.com/perl/perl_operators.htm

Bei der Verwendung des von Morgennebel vorgeschlagenen Teilausdrucks müsstest Du ggf. noch das Attribut "do always" setzen.

meddie

OK, vielen dank für die Tipps.

Eine Frage, bei den meisten Programmiersprachen gibt es ja so eine MessageBox wo man sich etwas ausgeben kann. Um zum kontrollieren wo etwas schief läuft.
Wenn zum Beispiel die DOIF Schleife nicht greift, dann gehe ich davon aus, das der State des Devices wahrscheinlich nicht dem entspricht wonach ich vergleichen lasse.

Mein DOIF für Anwesenheit hat den State Abwesend, das Türschloss hat den State unlocked trotzdem wird das DOIF nicht ausgeführt, wie kann ich mir es ausgeben um raus zu finden was nicht greift.

Danke
Gruß Eddie

Ellert

ZitatEine Frage, bei den meisten Programmiersprachen gibt es ja so eine MessageBox wo man sich etwas ausgeben kann. Um zum kontrollieren wo etwas schief läuft.
Dafür ist das Logfile.
Die Geräte haben ein Attribut "verbose" zur Ausgabesteuerung.
In der Detailansicht des DOIF stehen die beteiligten Stati und Events.
Zusätzlich könntest Du ein notify auf die beteiligten Geräte ansetzen:
define Lauscher notify Anwesend|<Dein DOIF Name>|Tuerschloss {Log 1, "Gerät: $NAME Ereignis: $EVENT"}

Mein DOIF für Anwesenheit hat den State Abwesend, das Türschloss hat den State unlocked trotzdem wird das DOIF nicht ausgeführt
Ich vermute das Ereignis "unlocked" ist nicht nach dem Status "Abwesend" aufgetreten.

Brockmann

Ist nicht ganz trivial, beim HM_SEC manuelle Betätigung zuverlässig zu erkennen und von Steuerung durch FHEM zu unterscheiden. Ich benutze dafür folgendes DOIF:

([HM_SEC_Haustuer:direction] eq "undef" and Value("HM_SEC_Haustuer") !~ /set_/ and OldValue("HM_SEC_Haustuer") !~ /set_/)
(
    ({getCamPicSave("Kamera_Haustuer")}),
    set MESSAGE Haustuer wird geöffnet)

meddie

Hallo Zusammen,

also mein DOIF sieht jetzt so aus, funktioniert aber noch nicht ganz so richtig.

So sieht sie nun aus:
(([Anwesend] eq "Anwesend" and [21:00] and [Tuerschloss] =~ "unlocked") or ([Anwesend] eq "Abwesend" and [Tuerschloss:"unlocked"])) (set Tuerschloss lock)

Mein Ziel: (wenn jemand zu Hause ist UND es 21:00 Uhr ist UND die Tür offen ist) ODER (wenn niemand zu Hause ist UND die Tür offen ist) (sperre die Tür zu)

Der erste Teil greift nun die Tür wird um 21 Uhr versperrt. Der zweite Teil nach dem ODER greift komischerweise nur wenn sich der Status vm Tuerschloss ändert.
Ich habe versucht bei beiden Smartphones das W-LAN ausgeschaltet nach einigen Minuten ging dann mein DOIF für Anwesendheit auf den State Abwesend. Aber das interssierte Mein DOIF für das zusperren nicht. Als ich aber das Schloss manuell geschlossen habe und auf öffnen geklick habe wurde das DOIF ausgeführt.

Irgendwas mache ich doch noch falsch oder?

Danke Euch für die Geduld mit mir.

Gruß Eddie

Brockmann

Zitat von: meddie am 29 März 2016, 22:38:16
(([Anwesend] eq "Anwesend" and [21:00] and [Tuerschloss] =~ "unlocked") or ([Anwesend] eq "Abwesend" and [Tuerschloss:"unlocked"])) (set Tuerschloss lock)
[Tuerschloss:"unlocked"] reagiert auf ein Ereignis, ist also nur in dem Moment wahr, wo das Ereignis auftritt. Wenn Anwesend auf "Abwesend" wechselt, wird das Tuerschloss-Ereignis niemals gleichzeitig wahr sein. Du könntest aber wie in der ersten Bedingung [Tuerschloss] =~ "unlocked" verwenden, dann sollte es klappen.

Anmerkung: HM_Sec hat noch andere Statusvariante wie beispielsweise "locked (uncertain)". Ich bin deshalb relativ rigoros und prüfe auf [Tuerschloss] ne "locked". Dann wird verriegelt, wann immer das Tuerschloss nicht ohnhin schon "locked" - also definitiv verriegelt - ist.

meddie

Hallo zusammen,

vielen vielen Dank für Eure Hilfe. Jetzt scheint es zu gehen!!! (auch wenn ich jetzt ein anderes Problem habe)
Die Anwesenheit wird mittels FritzBox festgestellt, heute als meine Frau nach Hause kam und die Tür öffnete versuchte FHEM sie wieder zu verschließen, denn die Anwesenheit war noch nicht soweit.
Da muss ich mir noch etwas überlegen, wie ich die Schleife anpassen kann, dass wenn die Tür manuell geöffnet wurde das DOIF mit sagen wir 5 - 10 Minuten später ausgeführt wird (wenn die Bedingungen noch passen)

vielen Dank noch mal an Euch!!!
Gruß Eddie

Brockmann

Zitat von: meddie am 30 März 2016, 13:30:13
Da muss ich mir noch etwas überlegen, wie ich die Schleife anpassen kann, dass wenn die Tür manuell geöffnet wurde das DOIF mit sagen wir 5 - 10 Minuten später ausgeführt wird (wenn die Bedingungen noch passen)
Dafür kannst Du bei DOIF das Attribut wait setzen, beispielsweise
attr <DOIF-Name> wait 600
Dann wird die Aktion erst 600 Sekunden nach Eintreten der Bedingung ausgeführt, wenn die Bedingung dann immer noch gilt.

Falls Du noch mehr Fragen zu D(einem) DOIF hast, mach am Besten immer ein list <DOIF-Name> und füge die Ausgabe von FHEM hier als Code ein. Ist dann etwas einfacher, Dir zu helfen.

meddie

OK,
vielen Dank!
Ich habe nun das wait Attribut gesetzt und werde es heute Abend testen.

Vielen Dank für Die Hilfe
Gruß Eddie

meddie

irgendwie mag mich dieses DOIF einfach nicht  :-[

ich habe das Wait Attribut gesetzt aber die Tür wurde ohne Verzögerung verschlossen.
Bei Abwesenheit wurde die Tür zwar verschlossen aber als diese geöffnet wurde verschloss sie fhem sofort wieder.

Hier ist ein List des DOIFs
Internals:
   DEF        (([Anwesend] eq "Anwesend" and [20:55] and [Tuerschloss] =~ "unlocked") or ([Anwesend] eq "Abwesend" and [Tuerschloss] =~ "unlocked")) (set Tuerschloss lock, {DebianMail('e@ma.il','Die Tuer wurde verriegelt!','Die Tuer wurde automatisch verriegelt!')})
   NAME       KeyMatic_Zusperautomatik
   NR         82
   NTFY_ORDER 50-KeyMatic_Zusperautomatik
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2016-03-30 20:55:05   Device          Tuerschloss
     2016-03-30 20:55:00   cmd_event       Tuerschloss
     2016-03-30 20:55:00   cmd_nr          2
     2016-03-30 17:24:43   e_Anwesend_STATE Anwesend
     2016-03-30 20:55:05   e_Tuerschloss_STATE locked
     2016-03-30 20:55:00   state           cmd_2
     2016-03-30 20:55:00   timer_1_c1      31.03.2016 20:55:00
     2016-03-30 17:24:43   wait_timer      no timer
   Condition:
     0          (InternalDoIf($hash,'Anwesend','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "Anwesend" and DOIF_time_once($hash,$hash->{timer}{0},$wday,"") and InternalDoIf($hash,'Tuerschloss','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) =~ "unlocked") or (InternalDoIf($hash,'Anwesend','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "Abwesend" and InternalDoIf($hash,'Tuerschloss','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) =~ "unlocked")
   Days:
   Devices:
     0           Anwesend Tuerschloss
     all         Anwesend Tuerschloss
   Do:
     0:
       0          set Tuerschloss lock, {DebianMail('e@ma.il','Die Tuer wurde verriegelt!','Die Tuer wurde automatisch verriegelt!')}
     1:
   Helper:
     event      battery: ok,direction: none,error: none,Zu: locked,locked,uncertain: no
     globalinit 1
     last_timer 1
     sleepdevice Tuerschloss
     sleepsubtimer 0
     sleeptimer -1
     timerdev   Tuerschloss
     timerevent battery: ok,direction: none,error: none,Zu: locked,locked,uncertain: no
     triggerDev Tuerschloss
     timerevents:
       battery: ok
       direction: none
       error: none
       Zu: locked
       locked
       uncertain: no
     triggerEvents:
       battery: ok
       direction: none
       error: none
       Zu: locked
       locked
       uncertain: no
   Internals:
     0           Anwesend:STATE Tuerschloss:STATE
     all         Anwesend:STATE Tuerschloss:STATE
   Interval:
   Itimer:
   Localtime:
     0          1459450500
   Readings:
   Realtime:
     0          20:55:00
   Regexp:
     0:
     All:
   State:
   Time:
     0          20:55:00
   Timecond:
     0          0
   Timer:
     0          0
   Timers:
     0           0
   Trigger:
   Triggertime:
     1459450500:
       localtime  1459450500
       Hash:
Attributes:
   wait       300


danke im Voraus

Brockmann

Zitat von: meddie am 30 März 2016, 21:11:15
ich habe das Wait Attribut gesetzt aber die Tür wurde ohne Verzögerung verschlossen.
Bei Abwesenheit wurde die Tür zwar verschlossen aber als diese geöffnet wurde verschloss sie fhem sofort wieder.
Falls Du Dich auf das Verriegeln um 21:00 Uhr (bzw. 20:55 beziehst): Die wait-Angabe wirkt sich nicht auf Zeitangaben aus, nur auf Ereignisse.
Die Verriegelung wird also pünktlich um 20:55 Uhr erfolgen bzw. Du kannst es da bei 21:00 Uhr belassen und musst die Verzögerung nicht mit einberechnen.

Wurde die Tür bei Abwesenheit denn mit Verzögerung verriegelt?
Warum das DOIF sie beim öffnen direkt wieder verriegeln sollte, kann ich nicht nachvollziehen, da es in dieser Form grundsätzlich nur mit fünf Minuten Verzögerung verriegeln sollte oder gar nicht.

Am Besten machst Du das list in dem Moment, wo etwas nicht wie vorgesehen funktioniert.
Also beispielsweise:
Setz Anwesend auf Abwesend.
Warte, bis das DOIF die Tür verriegelt hat.
Dann sperr die Tür auf.
Wenn die Tür nun sofort wieder verriegelt wird, mach sofort ein list KeyMatic-Zusperrautomatik.
Dann kann man in den Readings halbwegs nachvollziehen, was passiert ist.