Anwesenheitserkennung umsetzen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

MrCrashy
Beiträge: 113
Registriert: 2. Jan 2021 09:53

Anwesenheitserkennung umsetzen

Beitrag 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?

Benutzeravatar
udo1toni
Beiträge: 13854
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Anwesenheitserkennung umsetzen

Beitrag 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
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

MrCrashy
Beiträge: 113
Registriert: 2. Jan 2021 09:53

Re: Anwesenheitserkennung umsetzen

Beitrag 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

int5749
Beiträge: 1161
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Anwesenheitserkennung umsetzen

Beitrag 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
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

int5749
Beiträge: 1161
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Anwesenheitserkennung umsetzen

Beitrag 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 :)
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Benutzeravatar
udo1toni
Beiträge: 13854
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Anwesenheitserkennung umsetzen

Beitrag 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
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

MrCrashy
Beiträge: 113
Registriert: 2. Jan 2021 09:53

Re: Anwesenheitserkennung umsetzen

Beitrag von MrCrashy »

Ok, ich weiß aber um ehrlich zu sein nicht wirklich wie ich mit previousState arbeiten soll.

Benutzeravatar
udo1toni
Beiträge: 13854
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Anwesenheitserkennung umsetzen

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

MrCrashy
Beiträge: 113
Registriert: 2. Jan 2021 09:53

Re: Anwesenheitserkennung umsetzen

Beitrag 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 

Benutzeravatar
udo1toni
Beiträge: 13854
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Anwesenheitserkennung umsetzen

Beitrag 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 
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten