Seite 1 von 2
Anwesenheitserkennung umsetzen
Verfasst: 14. Jan 2021 13:08
von MrCrashy
Hallo, ich arbeite derzeit an einer Anwesenheitserkennung. Diese möchte ich über die openhab-App regeln. Meine Rule erkennt zwar, dass sich seine SSID-Änderung ergibt aber es kommt nicht weiter.
Meine Items:
Code: Alles auswählen
String WLAN_Handy1 "WLAN [%s]"
Switch Handy1 "Elias ist [MAP(anwesenheit.map):%s]" <motion> ["Switchable"]
Meine Rule
Code: Alles auswählen
var Timer timer1 = null
rule "Abwesenheit"
when
Item WLAN_Handy1 changed from "WLAN_Handy1" to "UNDEF"
then
if(!WLAN_Handy1.state.equals("WLAN_Handy1")) {
timer1 = createTimer(now.plusSeconds(15), [|
if(!WLAN_Handy1.state.equals("WLAN_Handy1")){
Handy1.postUpdate(OFF)
logInfo("Anwesenheit", "Elias ist unterwegs!")
}
timer1 = null
])
}
end
Nun ist es so, dass "WLAN-Handy1" die SSID ändert. Aber weder der Schalter "Handy1" noch die logInfo wird weitergeführt und mir ist nicht ganz klar wieso. Weiß jemand darüber bescheid?
Re: Anwesenheitserkennung umsetzen
Verfasst: 14. Jan 2021 13:56
von udo1toni
Dein Trigger ist zu sehr eingeschränkt. Lass einfach alles nach changed weg und entscheide innerhalb des Rule Codes, wie reagiert werden soll.
Tipp: oldState hält den alten Status, newState hält den neuen Status des Items welches per changed die Rule getriggert hat.
Gesendet von iPad mit Tapatalk
Re: Anwesenheitserkennung umsetzen
Verfasst: 14. Jan 2021 15:10
von MrCrashy
Also das "verlassen" geht. Leider funktioniert das "ankommen" nicht wirklich. Ich denke ich habe da einen Fehler mit der SSID.
Code: Alles auswählen
rule "Abwesenheit Elias"
when
Item WLAN_Handy1 changed
then
if(!WLAN_Handy1.state.equals("WLAN_Handy1")) {
timer1 = createTimer(now.plusSeconds(15), [|
if(!WLAN_Handy1.state.equals("WLAN_Handy1")){
Handy1.postUpdate(OFF)
logInfo("Anwesenheit", "Elias ist unterwegs!")
WLAN_Handy1.oldState
}
timer1 = null
])
}
end
rule "Anwesenheit Elias"
when
Item WLAN_Handy1 changed
then
if(WLAN_Handy1.state.equals(WLAN_Handy1.oldState)){
Handy1.postUpdate(ON)
}
end
Bekomme auch folgenden Fehler beim benutzen von old.State : 'oldState' is not a member of 'org.eclipse.smarthome.core.library.items.StringItem'; line 22, column 8, length 20
Re: Anwesenheitserkennung umsetzen
Verfasst: 14. Jan 2021 16:32
von int5749
udo1toni hat geschrieben: ↑14. Jan 2021 13:56
Tipp: oldState hält den alten Status, newState hält den neuen Status des Items welches per changed die Rule getriggert hat.
Wurde previousState für triggered Item abgelöst, oder wäre es sinnvoller item.oldState zu nutzen??
Viele Grüße
Jörg
Re: Anwesenheitserkennung umsetzen
Verfasst: 14. Jan 2021 16:39
von int5749
Ich habe die derzeit über das TR064 Binding umgesetzt, da müsstest Du den Trigger des Items ändern.
Da ich nicht immer sicherstellen kann, mit welcher MAC ich gerade nach Hause komme, habe ich dies zudem über eine Gruppe verschachtel.
Items
Code: Alles auswählen
Group:Switch:OR(ON, OFF) sFboxPapaiPhoneOnline "Papa iPhone [MAP(presence.map):%s]" <man_3> (GhostMode, Parents, NetDevices)
Switch sFboxPapaiPhonePhysic "Papa iPhone Physic [MAP(presence.map):%s]" <man_3> (sFboxPapaiPhoneOnline) { channel="tr064:subdeviceLan:fb7590:fritzboxLAN:macOnline_xxxxx"} // iPhone XS Physic
Switch sFboxPapaiPhonePrivate "Papa iPhone Private [MAP(presence.map):%s]" <man_3> (sFboxPapaiPhoneOnline) { channel="tr064:subdeviceLan:fb7590:fritzboxLAN:macOnline_xxxxx" } // iPhone XS Private for Holodeck
Code: Alles auswählen
rule Papa_Home
when
Item sFboxPapaiPhoneOnline changed
then
if (sFboxPapaiPhoneOnline.state == ON) {
zu Hause (hier Code ersetzen, was passieren soll)
} else if (sFboxPapaiPhoneOnline.state == OFF) {
ist wech (hier Code ersetzen, was passieren soll)
}
end
Ich werde dies aber noch umbauen und weiter zusammenführen, da ich derzeit pro Person eine Regel habe. Dies werde mit hier erlerntem vereinfachen

Re: Anwesenheitserkennung umsetzen
Verfasst: 14. Jan 2021 16:48
von udo1toni
MrCrashy hat geschrieben:Also das "verlassen" geht. Leider funktioniert das "ankommen" nicht wirklich. Ich denke ich habe da einen Fehler mit der SSID.
State' is not a member of 'org.eclipse.smarthome.core.library.items.StringItem'; line 22, column 8, length 20
Der erste Fehler ist mal, dass Du zwei Rules mit identischem Trigger benutzt. Warum? Es reicht doch eine Rule, die alle Möglichkeiten abhandelt.
Der zweite Punkt ist, das newState und previousState (wie komme ich auf oldState? Sorry) kein Bestandteil des Items sind. Es handelt sich um implizite Variablen. Ich hatte ja erwähnt, dass sie mit dem alten bzw. neuen Status des triggernden Items gefüllt sind.
Gesendet von iPad mit Tapatalk
Re: Anwesenheitserkennung umsetzen
Verfasst: 14. Jan 2021 17:14
von MrCrashy
Ok, ich weiß aber um ehrlich zu sein nicht wirklich wie ich mit previousState arbeiten soll.
Re: Anwesenheitserkennung umsetzen
Verfasst: 14. Jan 2021 18:28
von udo1toni
Also, gewöhnlich sollte so eine Rule so aussehen:
Code: Alles auswählen
// globale Variablen zu Beginn der Datei definieren!
var Timer timer1 = null // Timer für Abwesenheitserkennung
rule "Anwesenheitserkennung Elias"
when
Item WLAN_Handy1 changed // Rule triggert bei jeder Änderung
then
timer1?.cancel // timer1 entfernen, falls aktiv
if(WLAN_Handy1.state.toString != "WLAN_Handy1") { // falls Status nicht "WLAN_Handy1"
timer1 = createTimer(now.plusSeconds(15), [| // starte Timer
Handy1.postUpdate(OFF) // setze Item auf OFF
logInfo("Anwesenheit", "Elias ist unterwegs!") // gibt logmeldung aus
])
} else { // falls Status "WLAN_Handy1"
Handy1.postUpdate(ON) // setze Item auf ON
}
end
previousState und newState brauchst Du für die Funktion nicht.
Re: Anwesenheitserkennung umsetzen
Verfasst: 14. Jan 2021 18:44
von MrCrashy
OK, ich habe das mal Angewandt. Das Problem ist aber nun Folgendes: In beiden Situationen sagt er "Ist jetzt unterwegs". Dazu kommt noch folgende Fehlermeldung: 2021-01-14 18:42:45.934 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Abwesenheit Elias': An error occurred during the script execution: Couldn't invoke 'assignValueTo' for feature JvmVoid: (eProxyURI: anwesenheit.rules#|::0.2.0.2.0.0.1.0.0::0::/1)
2021-01-14 18:43:00.932 [INFO ] [e.smarthome.model.script.Anwesenheit] - Elias ist unterwegs!
Code: Alles auswählen
rule "Abwesenheit Elias"
when
Item WLAN_Handy1 changed
then
if(WLAN_Handy1.state.toString != "WLAN_Handy1"){
timer1 = createTimer(now.plusSeconds(15), [|
Handy1.postUpdate(OFF)
logInfo("Anwesenheit", "Elias ist unterwegs!")
])
}else {
logInfo("Anwesenheit", "Elias ist Zuhause!")
Handy1.postUpdate(ON)
}
end
Re: Anwesenheitserkennung umsetzen
Verfasst: 14. Jan 2021 19:19
von udo1toni
Dann ist Handy1 kein Switch Item.
Wenn jeweils die gleiche Log-Meldung ausgegeben wird, triggert beide Male der gleiche Bereich, was dann bedeutet, dass der String ein anderer sein muss. Lass Dir den String mit ins log schreiben, so:
Code: Alles auswählen
rule "Abwesenheit Elias"
when
Item WLAN_Handy1 changed
then
logInfo("Anwesenheit", "Rule getriggert. WLAN_Handy1 Status: {}",WLAN_Handy1.state)
if(WLAN_Handy1.state.toString != "WLAN_Handy1"){
timer1 = createTimer(now.plusSeconds(15), [|
Handy1.postUpdate(OFF)
logInfo("Anwesenheit", "Elias ist unterwegs!")
])
}else {
logInfo("Anwesenheit", "Elias ist Zuhause!")
Handy1.postUpdate(ON)
}
end