Abfrage auf Anwesenheiten von Personen (presence)

Begonnen von desmoloch, 20 November 2018, 09:00:04

Vorheriges Thema - Nächstes Thema

desmoloch

Hallo zusammen,

ich dachte ich bastel mal wieder etwas rum und baue mir ein DOIF welches auf die beiden "Bewohner" Simone und Jan auslöst. Soll heißen: Nachricht per Telegramm wenn einer daheim ist, wenn beide daheim sind und wenn keiner mehr zu Hause ist.
Die Anwesenheit läuft über presence und wird mittels der Anfrage der MAC's auf der Fritzbox ermittelt (eigene sub in der myutils).
Für die gemeinsame Anwesenheit habe ich mir eine Structure angelegt:
Internals:
   ATTR       presence
   CFGFN     
   CHANGEDCNT 5953
   DEF        presence Handy_Jan Handy_Simone
   NAME       Struc_Anwesenheit
   NR         31897
   NTFY_ORDER 50-Struc_Anwesenheit
   STATE      present
   TYPE       structure
   READINGS:
     2018-11-20 08:45:36   LastDevice      Handy_Jan
     2018-11-20 08:45:36   LastDevice_Abs  Handy_Jan
     2018-11-20 08:45:36   state           present
Attributes:
   clientstate_behavior relative
   clientstate_priority attr Anwesenheit clientstate_priority present absent
   room       zAnwesenheit

Soweit alles gut. Leider wird bei meinem Handy (Jan) relativ schnell auf der Fritzbox ein "inactive" gesetzt. Dieses geht nach ein paar Minuten aber wieder af angemeldet zurück (ein Event mit Sendestärke wird ausgelöst). Somit darf ein "Jan ist nicht mehr daheim" nur verzögert ausgelöst werden.

Hier nun mein Versuch des DOIF's:
Internals:
   CFGFN     
   DEF        ([Struc_Anwesenheit] eq "absent") (set SteuerBot _msg Es ist keiner mehr zu Hause!)
DOELSEIF ([Struc_Anwesenheit] eq "present") (set SteuerBot _msg einer ist daheim!)
DOELSEIF (([Handy_Jan] eq "present") and ([Handy_Simone] eq "absent")) (set SteuerBot _msg Jan ist jetzt daheim!)
DOELSEIF (([Handy_Jan] eq "absent") and ([Handy_Simone] eq "present")) (set SteuerBot _msg Simone ist jetzt daheim!)
   MODEL      FHEM
   NAME       di_Anwesenheit
   NR         31934
   NTFY_ORDER 50-di_Anwesenheit
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2018-11-20 08:50:37   Device          Handy_Jan
     2018-11-19 22:07:16   cmd             2
     2018-11-19 22:07:16   cmd_event       Struc_Anwesenheit
     2018-11-19 22:07:16   cmd_nr          2
     2018-11-20 08:50:37   e_Handy_Jan_STATE absent
     2018-11-20 08:50:37   e_Struc_Anwesenheit_STATE present
     2018-11-19 22:06:40   mode            enabled
     2018-11-19 22:07:16   state           cmd_2
     2018-11-20 08:50:37   wait_timer      20.11.2018 09:05:37 cmd_4 Handy_Jan
   Regex:
   attr:
     cmdState:
     wait:
       0:
         0
       1:
         0
       2:
         900
       3:
         900
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'Struc_Anwesenheit','STATE') eq "absent"
     1          ::InternalDoIf($hash,'Struc_Anwesenheit','STATE') eq "present"
     2          (::InternalDoIf($hash,'Handy_Jan','STATE') eq "present") and (::InternalDoIf($hash,'Handy_Simone','STATE') eq "absent")
     3          (::InternalDoIf($hash,'Handy_Jan','STATE') eq "absent") and (::InternalDoIf($hash,'Handy_Simone','STATE') eq "present")
   devices:
     0           Struc_Anwesenheit
     1           Struc_Anwesenheit
     2           Handy_Jan Handy_Simone
     3           Handy_Jan Handy_Simone
     all         Struc_Anwesenheit Handy_Jan Handy_Simone
   do:
     0:
       0          set SteuerBot _msg Es ist keiner mehr zu Hause!
     1:
       0          set SteuerBot _msg einer ist daheim!
     2:
       0          set SteuerBot _msg Jan ist jetzt daheim!
     3:
       0          set SteuerBot _msg Simone ist jetzt daheim!
     4:
   helper:
     event      absent,presence: absent
     globalinit 1
     last_timer 0
     sleepdevice Handy_Jan
     sleepsubtimer 0
     sleeptimer 3
     timerdev   Handy_Jan
     timerevent absent,presence: absent
     triggerDev Handy_Jan
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: Struc_Anwesenheit
       state: cmd_2
     timerevents:
       absent
       presence: absent
     timereventsState:
       state: absent
       presence: absent
     triggerEvents:
       absent
       presence: absent
     triggerEventsState:
       state: absent
       presence: absent
   internals:
     0           Struc_Anwesenheit:STATE
     1           Struc_Anwesenheit:STATE
     2           Handy_Jan:STATE Handy_Simone:STATE
     3           Handy_Jan:STATE Handy_Simone:STATE
     all         Struc_Anwesenheit:STATE Handy_Jan:STATE Handy_Simone:STATE
   itimer:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   room       zDo_if
   wait       0:0:900:900


Ergebnis: ich bekomme alle paar Minuten Nachrichten "Simone ist jetzt daheim"  und "beide sind daheim". Ist ja auch klar, mein Handy switched ja immer mal für ein paar Minuten auf " Absent"
Wie kann ich das nun anders lösen? Ich möchte ja nur eine Nachricht, wenn sich der Status für längere Zeit ändert. Ein Wechsel von present auf absent , der sich innerhalb weniger Minuten wieder zurückändert, soll keine Nachrich auslösen.
Ideen? :)

Danke!

der-Lolo

Entweder passt Du Dein konstrukt an und benutzt zusätzlich einen watchdog, oder Du veränderst das DOIF so das wiederholtes Triggern der Presence Devices nicht zum auslösen führt...
( event-on-change )

desmoloch

Zitat von: der-Lolo am 20 November 2018, 09:13:40
Entweder passt Du Dein konstrukt an und benutzt zusätzlich einen watchdog, oder Du veränderst das DOIF so das wiederholtes Triggern der Presence Devices nicht zum auslösen führt...
( event-on-change )

Super danke für die fixe Antwort. Ich würde das gerne möglichst mit einem Konstrukt (in diesem Fall DOIF) lösen (falls möglich).
Den Hinweis mit event-on-change verstehe ich nicht. Wie kann ich das nutzen um das wiederholte Triggern zu verhindern? Denn event-on-change-reading .* habe ich schon bei presence gesetzt. Trotzdem switched mein Handy ja alle paar Minuten kurz auf absent, dass lässt sich ja nicht verhindern. Ich möchte halt das mein DOIF nur dann reagiert, wenn es innerhalb von X Sekunden wieder auf den alten wert geht (hatte da mal mit wait experimentiert).

Gruß

Neuhier


desmoloch

Zitat von: Neuhier am 20 November 2018, 09:47:29
Könnte event-min-interval helfen?

Nein. Damit kann ich ja events erzeugen.

ZitatMit dem Attribut event-min-interval kann für Readings eines Gerätes festgelegt werden, dass nach einer bestimmten Zeit ein Event, auch ohne Wertänderung ausgelöst wird.

Ellert

PRESENCE hat Attribute mit dem Schwellen fürs Umschalten festgelegt werden können.

desmoloch

Zitat von: Ellert am 20 November 2018, 13:19:14
PRESENCE hat Attribute mit dem Schwellen fürs Umschalten festgelegt werden können.
Danke das hat mir geholfen :)