Automatic Light Shut-Off Rules

Hi all,

Have had my openHAB setup running pretty well so far with basic app control and the like, and am trying to make my system more smart. Starting with a rule to automatically shut off all my lights when neither me or my girlfriend are in the apartment. The way I’d like it to work would be something like this:

If the front door is opened, then closed (When I leave the apartment). Then openHAB would wait 5 minutes, (in case I’m just going to check the mail and/or also to give me time to be out of wifi range) then check to see if either me or my girlfriend is home (Via Network binding to see if our phones are connected to WiFi), then if neither of us are at home, then send a command to shut off all the lights.

Sounded simple but I haven’t found any examples of this that made sense to me…

Apologies as I am still getting my head around rules and the like!

Jack

Well, you have to define items for your phones and the door:

Group:Switch:OR(ON,OFF) gMyLights     //all lights go to this group
Group:Switch:OR(ON,OFF) gMyPhones     //all phones go to this group
Switch Phone1online (gMyPhones) {...} //binding depends on your hardware
Switch Phone2online (gMyPhones) {...} //binding depends on your hardware
Contact Door {...}                    //binding depends on your hardware

and the rule:

var Timer tDoor = null

rule "auto lights off"
when
    Item Door changed from OPEN to CLOSED                      //door was open and is closed now
then
    if(tDoor!=null)                                            //timer running? then stop it...
        tDoor.cancel
    tDoor = createTimer(now.plusMinutes(5),[                   //start timer
        if(gMyPhones.members.filter(p|p.state==ON).size == 0)  //no phone online

            gMyLights.members.filter(l|l.state!=OFF).forEach(l|l.sendCommand(OFF))
    ])
end

If using dimmers, you will have to use an additional group, because the state will be 0 but not OFF for this sort of items.

I recommend separating this into two separate parts: presence and sensing.

For the presence detection part see Generic Presence Detection which shows a way to aggregate more than one presence detection sensor into one sate, with a five-minute timer to avoid flapping. I suggest this as I suspect you will care about presence elsewhere in your rules and most people find that just using Network is not sufficient for presence detection given how phones go into a deep sleep these days.

After that the rule is pretty much like Udo wrote. I’ll present an alternative implementation using Expire Binding instead of Timers.

Switch DoorTimer { expire="5m,command=OFF" }
rule "Door closed"
when
    Item Door changes from OPEN to CLOSED
then
    DoorTimer.sendCommand(ON)
end

rule "Door timer went off"
when
    Item DoorTimer received command OFF
then
    if(gPresence.state != ON) gMyLights.members.filter[l|l.state != OFF].forEach[l|l.sendCommand(OFF)]
end
2 Likes