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.
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
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.
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 :)
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
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.
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 ?
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
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 !
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.
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 ?
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
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 ?
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
Wäre es von Vorteil, statt des Dummy für die Person ROOMMATE zu verwenden?
http://fhem.de/commandref.html#ROOMMATE
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 !