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