FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: goldii93 am 03 März 2020, 16:48:57

Titel: Anwesenheitserkennung
Beitrag von: goldii93 am 03 März 2020, 16:48:57
Guten Tag,
Ich hoffe mir kann jemand helfen, Ich möchte eine Anwesenheitserkennung über WLAN per Fritzbox machen.
Die Anwesenheitserkennung funktioniert auch soweit, allerdings bekomme Ich es nicht hin, mehrere Abfragen in ein DOIF mit verschiedenen Schaltungsszenarien zu erstellen.

Beispiel:
2 Personen, wenn beide nicht da sind, alles ausschalten.
Wenn Person 1 nicht da ist, nur das und das ausschalten.
Wenn Person 2 nicht da ist, nur Licht in der Küche ausschalten.

Kann man zusätzlich noch regelmäßig ausschalten, z.B. alle 1Stunde wenn beide Personen nicht Anwesend sind ?

Danke schon mal im voraus.
Titel: Antw:Anwesenheitserkennung
Beitrag von: Otto123 am 03 März 2020, 17:01:44
Hi,

so als Grundidee

DOIF (P1 ne "present" and P2 ne "present")(alles ausschalten)
DOELSEIF(P1 ne "present" and P2 eq "present")(nur das und das ausschalten)
DOELSEIF(P1 eq "present" and P2 ne "present")(nur Licht in der Küche ausschalten)
DOELSEIF([+01:00] and P1 ne "present" and P2 eq "present")(alles ausschalten)

Du kannst natürlich auch auf (... eq "absent") testen.

Eine structure über Beide vereinfacht Dir eventuell manche Abfrage. Je nach Einstellungen in den Presence Geräten (event-on-change-reading) wird der letzte Zweig aber obsolete.

Gruß Otto
Titel: Antw:Anwesenheitserkennung
Beitrag von: goldii93 am 03 März 2020, 17:26:14
Danke für die schnelle Antwort.

Ein Structure für beide Personen ist vorhanden nur hab Ich es wie gesagt nicht hinbekommen, die beiden Abfragen für die Anwesenheit einer einzelnen Person hinzubekommen.

Ich teste es, nachher mal und gebe Rückmeldung.

Edit:
Ich habe das jetzt mal so geschrieben:
DOIF ([doif_anwesenheit] eq "absent")(set gesamte_wohnung off)
DOELSEIF([P1] eq "absent" and [P2] eq "present")(set Licht off)
DOELSEIF([+01:00] and [P1] eq "absent" and [P2] eq "absent")(set gesamte_wohnung off)

doif_anwesenheit ist das Structure.

Da scheint aber ein Fehler drin zu sein, es schaltet nämlich nichts.
Titel: Antw:Anwesenheitserkennung
Beitrag von: Otto123 am 04 März 2020, 09:52:59
Dann poste bitte je ein
list vom DOIF
list P1
list doif_anwesenheit

Das bitte in Codetags  siehe auch https://forum.fhem.de/index.php/topic,71806.0.html

Tipp: Wenn Du die Antwort in den alten Post editierst bekommt man keine Info. Man muss den Post wieder anschauen.
Post editieren ist häufig gut, aber nicht um neu zu antworten und vor allem neu zu fragen :)

Titel: Antw:Anwesenheitserkennung
Beitrag von: goldii93 am 04 März 2020, 16:30:15
Hier mal die List von den Devices.
List P1
Internals:
   CHANGED   
   DEF        function {checkAllFritzMACpresent("XX:XX:XX:XX:XX:XX")} 60 60
   FUUID      5e385d2d-f33f-98d4-aea4-9a680b0d9f807b38
   INTERVAL_NORMAL 60
   INTERVAL_PRESENT 60
   MODE       function
   NAME       P1
   NOTIFYDEV  global
   NR         73
   NTFY_ORDER 50-P1
   STATE      absent
   TYPE       PRESENCE
   READINGS:
     2020-03-04 12:00:22   model           function
     2020-03-04 16:21:57   presence        absent
     2020-03-04 16:21:57   state           absent
   helper:
     ABSENT_COUNT 0
     call       {checkAllFritzMACpresent("XX:XX:XX:XX:XX:XX")}
Attributes:
   event-on-change-reading state
   icon       ge_blk_handy
   room       Anwesenheit
   userattr   presence presence_map structexclude


List Structure Anwesenheit
Internals:
   ATTR       presence
   CHANGEDCNT 265
   DEF        presence P1 P2
   FUUID      5e402fda-f33f-98d4-763c-e0693f12844766fa
   NAME       anwesenheit
   NR         77
   NTFY_ORDER 50-anwesenheit
   STATE      present
   TYPE       structure
   READINGS:
     2020-03-04 16:23:57   LastDevice      P2
     2020-03-04 16:23:57   LastDevice_Abs  P2
     2020-03-04 16:23:57   state           present
Attributes:
   clientstate_behavior relative
   clientstate_priority present absent
   room       Anwesenheit


List doif
Internals:
   CFGFN     
   DEF        ([anwesenheit] eq "absent")(set gesamte_wohnung off)
DOELSEIF([P1] eq "absent" and [P2] eq "present")(set gesamte_wohnung_ohne_tv off)
DOELSEIF([+01:00] and [P1] eq "absent" and [P2] eq "absent")(set gesamte_wohnung off)
   FUUID      5e5fc726-f33f-98d4-0de5-c2585b7e762f9be3
   MODEL      FHEM
   NAME       doif_allesaus
   NOTIFYDEV  P1,P2,global,doif_anwesenheit
   NR         1154
   NTFY_ORDER 50-doif_allesaus
   STATE      initialized
   TYPE       DOIF
   VERSION    21224 2020-02-18 18:45:49
   READINGS:
     2020-03-04 16:24:57   Device          P2
     2020-03-04 16:20:24   cmd             0
     2020-03-04 16:20:58   e_doif_anwesenheit_STATE initialized
     2020-03-04 16:22:57   e_P1_STATE present
     2020-03-04 16:24:57   e_P2_STATE absent
     2020-03-04 16:20:24   mode            enabled
     2020-03-04 16:20:24   state           initialized
     2020-03-04 16:20:24   timer_01_c03    04.03.2020 17:20:24
   Regex:
     accu:
     cond:
       doif_anwesenheit:
         0:
           &STATE     ^doif_anwesenheit$
         1:
         2:
       P1:
         0:
         1:
           &STATE     ^P1$
         2:
           &STATE     ^P1$
       P2:
         0:
         1:
           &STATE     ^P2$
         2:
           &STATE     ^P2$
   condition:
     0          ::InternalDoIf($hash,'doif_anwesenheit','STATE') eq "absent"
     1          ::InternalDoIf($hash,'P1','STATE') eq "absent" and ::InternalDoIf($hash,'P2','STATE') eq "present"
     2          ::DOIF_time_once($hash,0,$wday) and ::InternalDoIf($hash,'P1','STATE') eq "absent" and ::InternalDoIf($hash,'P2','STATE') eq "absent"
   days:
   do:
     0:
       0          set gesamte_wohnung off
     1:
       0          set gesamte_wohnung_ohne_tv off
     2:
       0          set gesamte_wohnung off
     3:
   helper:
     DEVFILTER  ^global$|^doif_anwesenheit$|^P2$|^P1$
     NOTIFYDEV  global|doif_anwesenheit|P2|P1
     event      absent,presence: absent
     globalinit 1
     last_timer 1
     sleeptimer -1
     triggerDev P2
     triggerEvents:
       absent
       presence: absent
     triggerEventsState:
       state: absent
       presence: absent
   internals:
     all         doif_anwesenheit:STATE P1:STATE P2:STATE
   intervalfunc:
   localtime:
     0          1583338824
   readings:
   realtime:
     0          17:20:24
   time:
     0          +01:00
   timeCond:
     0          2
   timer:
     0          0
   timers:
     2           0
   trigger:
   triggertime:
     1583338824:
       localtime  1583338824
       hash:
   uiState:
   uiTable:
Attributes:
   room       Anwesenheit

Titel: Antw:Anwesenheitserkennung
Beitrag von: Otto123 am 04 März 2020, 16:40:53
Naja, aus meiner Sicht alles richtig:
    2020-03-04 16:22:57   e_P1_STATE present
    2020-03-04 16:24:57   e_P2_STATE absent

Kein Kriterium erfüllt :)
([anwesenheit] eq "absent") -> false
([P1] eq "absent" and [P2] eq "present") -> false
([+01:00] and [P1] eq "absent" and [P2] eq "absent") -> false

Bei dem letzten Zweig mit dem Timer bin ich etwas unsicher. Den würde ich erstmal weglassen und die anderen Zweige testen.
Titel: Antw:Anwesenheitserkennung
Beitrag von: goldii93 am 04 März 2020, 16:56:52
Zitat von: Otto123 am 04 März 2020, 16:40:53
Naja, aus meiner Sicht alles richtig:
    2020-03-04 16:22:57   e_P1_STATE present
    2020-03-04 16:24:57   e_P2_STATE absent

Kein Kriterium erfüllt :)
([anwesenheit] eq "absent") -> false
([P1] eq "absent" and [P2] eq "present") -> false
([+01:00] and [P1] eq "absent" and [P2] eq "absent") -> false

Bei dem letzten Zweig mit dem Timer bin ich etwas unsicher. Den würde ich erstmal weglassen und die anderen Zweige testen.
Ich hatte einen kleinen Fehler am Anfang, soweit funktioniert das Schalten jetzt.
Allerdings ist mir aufgefallen, dass wenn ich während des Wait-Timers wieder ins WLAN gehe, der Timer nicht resettet wird und das DOIF auch nach dem ersten Command sich nicht neustartet, es also auf dem Command bleibt.

Gibt es dafür noch eine Lösung ?
Titel: Antw:Anwesenheitserkennung
Beitrag von: Otto123 am 04 März 2020, 17:20:40
Das versteh ich nicht, welcher wait Timer? Ich sehe keinen.  :-[
DOIF hat die Grundeigenschaft den Ausführungsteil nicht zu wiederholen, wenn sich der Zustand nicht ändert.
Wenn Du das willst musst Du mit do always arbeiten.

Gruß Otto
Titel: Antw:Anwesenheitserkennung
Beitrag von: goldii93 am 04 März 2020, 17:29:39
Zitat von: Otto123 am 04 März 2020, 17:20:40
Das versteh ich nicht, welcher wait Timer? Ich sehe keinen.  :-[
DOIF hat die Grundeigenschaft den Ausführungsteil nicht zu wiederholen, wenn sich der Zustand nicht ändert.
Wenn Du das willst musst Du mit do always arbeiten.

Gruß Otto

Ich habe einen wait-timer hinzugefügt, damit bei WLAN verlusst, z.B. Müll rausbringen nicht sofort, alles ausgeschaltet wird.
Ich werde es mal mit do always testen.

Vielen vielen Dank bis hierhin !
Titel: Antw:Anwesenheitserkennung
Beitrag von: Otto123 am 04 März 2020, 21:30:53
Das gehört aber an die Anwesenheit und nicht an die Auswertung. Ich fahre dazu ein Mehrstufiges Konstrukt.
Geräte -> DOIF -> Person

Das DOIF dazu sieht so aus:
defmod di_Dev_Otto DOIF ([st_Dev_Otto] eq "absent")(set PersonOtto absent) DOELSEIF ([st_Dev_Otto] eq "present")(set PersonOtto present)
attr di_Dev_Otto room Status
attr di_Dev_Otto wait 300


Sofort present, erst nach 5 min absent.
Titel: Antw:Anwesenheitserkennung
Beitrag von: goldii93 am 05 März 2020, 16:42:58
Zitat von: Otto123 am 04 März 2020, 21:30:53
Das gehört aber an die Anwesenheit und nicht an die Auswertung. Ich fahre dazu ein Mehrstufiges Konstrukt.
Geräte -> DOIF -> Person

Das DOIF dazu sieht so aus:
defmod di_Dev_Otto DOIF ([st_Dev_Otto] eq "absent")(set PersonOtto absent) DOELSEIF ([st_Dev_Otto] eq "present")(set PersonOtto present)
attr di_Dev_Otto room Status
attr di_Dev_Otto wait 300


Sofort present, erst nach 5 min absent.

Was passiert, wenn du innerhalb der 5min wieder Anwesend bist, löscht sich der Timer dann ?
Titel: Antw:Anwesenheitserkennung
Beitrag von: Otto123 am 05 März 2020, 16:49:38
Ich sage mal ja, der Status des DOIFs ändert sich ja wieder.

ich kann beliebig oft weg sein jeweils für weniger als 5 min, da ändert sich mein Status nicht
Titel: Antw:Anwesenheitserkennung
Beitrag von: goldii93 am 05 März 2020, 16:52:14
Zitat von: Otto123 am 05 März 2020, 16:49:38
Ich sage mal ja, der Status des DOIFs ändert sich ja wieder.

ich kann beliebig oft weg sein jeweils für weniger als 5 min, da ändert sich mein Status nicht
Ist jetzt vllt eine blöde Frage aber PersonOtto ist ein dummy device oder ?
Titel: Antw:Anwesenheitserkennung
Beitrag von: Otto123 am 05 März 2020, 22:27:02
Ja :D
Ansonsten habe ich mir seinerzeit Gedanken drum gemacht:  ;)
https://heinz-otto.blogspot.com/2016/01/anwesenheitserkennung.html

PresenceDevice->structureDevices->DOIF->Person->structureBewohner

Gruß Otto
Titel: Antw:Anwesenheitserkennung
Beitrag von: xenos1984 am 06 März 2020, 06:20:20
Wäre es von Vorteil, statt des Dummy für die Person ROOMMATE zu verwenden?

http://fhem.de/commandref.html#ROOMMATE
Titel: Antw:Anwesenheitserkennung
Beitrag von: goldii93 am 11 März 2020, 14:44:08
Zitat von: Otto123 am 05 März 2020, 22:27:02
Ja :D
Ansonsten habe ich mir seinerzeit Gedanken drum gemacht:  ;)
https://heinz-otto.blogspot.com/2016/01/anwesenheitserkennung.html

PresenceDevice->structureDevices->DOIF->Person->structureBewohner

Gruß Otto
Also mit deiner Hilfestellung funktioniert es bis jetzt ohne Probleme und genau nach meinem Wunsch.

Vielen vielen Dank nochmal !