See:
or
and
My items:
Group:Switch:OR(ON, OFF) Presence (Persist)
Group gPresence (Persist)
Group:Switch:AND(OFF, ON) gPresence_Vincent (gPresence)
Group:Switch:AND(OFF, ON) gPresence_Sadaf (gPresence)
Group:Switch:AND(OFF, ON) gPresence_Ayesha (gPresence)
Switch Presence_Vincent "Vincent [MAP(presence.map):%s]" <parents> (Presence)
Switch Presence_Sadaf "Sadaf [MAP(presence.map):%s]" <parents> (Presence)
Switch Presence_Ayesha "Ayesha [MAP(presence.map):%s]" (Presence)
Switch Presence_Vincent_PhoneWifiHome (gPresence_Vincent) { channel="network:pingdevice:192_168_0_25:online" }
Switch Presence_Sadaf_PhoneWifiHome (gPresence_Sadaf) { channel="network:pingdevice:192_168_0_6:online" }
Switch Presence_Ayesha_PhoneWifiHome (gPresence_Ayesha) { channel="network:pingdevice:192_168_0_7:online" }
Switch Presence_Vincent_Timer { expire="7m,command=OFF"}
Switch Presence_Sadaf_Timer { expire="7m,command=OFF"}
Switch Presence_Ayesha_Timer { expire="7m,command=OFF"}
//linking switch item to regionTrigger channel. assuming the Home distance channel is defined in the binding config (see above)
Switch Presence_Vincent_Owntracks (gPresence_Vincent) { channel="gpstracker:tracker:vr:regionTrigger" [profile="gpstracker:trigger-geofence", regionName="Home"] }
Switch Presence_Sadaf_Owntracks (gPresence_Sadaf) { channel="gpstracker:tracker:sh:regionTrigger" [profile="gpstracker:trigger-geofence", regionName="Home"] }
Switch Presence_Ayesha_Owntracks (gPresence_Ayesha) { channel="gpstracker:tracker:ar:regionTrigger" [profile="gpstracker:trigger-geofence", regionName="Home"] }
My rules:
// *******************************************
// * PRESENCE RULES *
// *******************************************
rule "gPresence Item updated"
when
Member of gPresence changed
then
val state = triggeringItem.state.toString // to force item update
val name = triggeringItem.name.split("_").get(1)
var timerString = "Presence_" + name + "_Timer"
val SwitchItem presenceItem = Presence.members.filter[ i | i.name.contains(name) ].head as SwitchItem
if (state == "ON") {
postUpdate(timerString, "OFF") // cancel the timer if necessary
if (presenceItem.state != ON) {
sendCommand(presenceItem.name, "ON")
}
}
// Not at home
if (state == "OFF" && presenceItem.state != OFF) {
sendCommand(timerString, "ON") // start the timer
}
end
rule "Presence Timer expired"
when
Item Presence_Vincent_Timer received command OFF or
Item Presence_Sadaf_Timer received command OFF
then
var String itemName = triggeringItem.name.split("_").get(0) + "_" + triggeringItem.name.split("_").get(1)
postUpdate(itemName, "OFF")
//Presence_Vincent.postUpdate(OFF)
end