This post may contain affiliate links. Please see the disclaimer for more information.
Home security is one of the more interesting and useful applications of home automation technologies. Of-course it’s a whole field and industry in itself with all manner of products and services available. Of course the first part of any security system should be good physical security (good doors, windows and locks). Once you get past this it seems like you can go two ways: prevention or detection.
Most traditional systems are in the detection camp. They aim to detect an intruder and alert someone, either via the traditional loud noise or other means. The presence of an alarm box or sign my provide a minimal amount of prevention capability, but not much. Camera systems on the other hand provide both pretty robust prevention as well as (increasingly) advanced detection capabilities.
The third option is to ramp up the prevention angle by making it look like someone is home. It’s this that I’m going to tackle here, with an occupancy simulation application for Home Assistant called Occusim.
Note: I’m not a home security specialist and you should definitely consult a professional. This post is provided for informational purposes and should not be relied upon to provide a full security system. The author excepts no responsibility for any consequence of you relying on this information and/or not consulting someone who actually does this stuff for a living. YOU HAVE BEEN WARNED!
What is Occupancy Simulation?
Basically it’s pretending you are home, by switching on and off things as you would when you’re there. The reasoning behind it is that potential intruders are less likely to invade a house with people inside. I’m sure there are parts of the world where that doesn’t hold. However, I’d guess it applies in enough places to be useful.
Methods of occupancy simulation range from the very low tech “light on a timer” to the high tech approach we’re going to take here, using Home Assistant. The key is to make the sequence as close to the normal usage pattern as possible. So that anyone potentially watching your house can’t tell the difference.
OccuSim is a tool for defining complex occupancy simulation rules, for use with Home Assistant. These rules are defined as sequences which proceed from beginning to end (with potentially some randomness applied). In this way you can program in a full day’s operation. There is also a fully random mode, which works better for non-scheduled events. Both modes can be combined to give a good representation of your normal home operation.
OccuSim is actually an AppDaemon app, so you will need AppDaemon installed as a dependency. I’m not going to cover that now. You can either see the link above or read my previous post on the subject.
Once you have a functional AppDaemon install you can install OccuSim by cloning the repository into the
apps subdirectory of you AppDaemon configuration. Rather than just a pure clone, I prefer to add it as a submodule in my AppDaemon configuration repository. This makes it easy to reinstall if you move your configuration around:
cd apps git submodule add https://github.com/acockburn/occusim.git occusim git commit -m "Add OccuSim"
With this setup, updating OccuSim is a little more involved. This is because you also need to commit the submodule change:
cd apps/occusim git pull origin cd ../.. git add apps/occusim git commit -m "Update OccuSim"
OccuSim is configured as an app in your
apps.yaml file. There is some initial config before you get down to creating your simulation sequences:
occupancy_simulator: class: OccuSim module: occusim log: '1' notify: '1' enable: input_boolean.vacation_mode,on test: '0' dump_times: '1' reset_time: '02:00:00'
Here I add a new app to my setup, called
occupancy_simulator. We set the Python class to load as
OccuSim from the module
occusim, since we installed it in it’s own subdirectory. I set OccuSim to log it’s activity and to notify when a sequence step is activated. This will use the default
notify.notify service in HASS, so you better have that set up to go to the right place. I haven’t found a way to change the notifier that it uses.
enable setting takes an
input_boolean entity and a state in which OccuSim should be active. Here I use my vacation mode toggle. I actuate mine manually, but it’s perfectly possible to set this from a HASS automation if you so desire.
The last few settings are some basic housekeeping. Test mode is disabled to ensure that OccuSim does it’s thing (though this can be useful when debugging your sequences). I also set the
dump_times option to true so that I can see the times of the steps in the logs. I then set the time when I want to re-calculate the steps for the upcoming day. In my case this is set to 2am.
Setting up Sequences
A simple sequence might be the following:
step_evening_name: Evening step_evening_start: 'sunset' step_evening_on_1: scene.main_lights
This sequence simply turns on my main lights scene at sunset. The configuration variables take the form
<id> is a custom identifier that needs to be common across all variables for the step. Multiple entities can be turned on or off by appending numbers to the variables in question, e.g.
You can add an offset to the times for sunset or sunrise, such as
sunset - 00:20:00 to trigger 20 minutes before sunset. You can of course also specify an absolute time in the form
More Advanced Sequences
So far that’s great, but we could have just turned on a light at sunset with a basic HASS automation rule. The real power of
OccuSim comes in randomising the sequence times (within bounds) and creating multi-step sequences.
Expanding on our previous example:
step_evening_name: Evening step_evening_start: 'sunset - 00:40:00' step_evening_end: 'sunset - 00:10:00' step_evening_on_1: scene.main_lights
This will turn on the lights at a random time between 40 minutes before sunset and ten minutes before sunset.
Let’s now create a multi-step sequence:
step_movie1_name: Movie Scene step_movie1_start: '20:00:00' step_movie1_end: '20:30:00' step_movie1_on_1: scene.movie step_movie2_name: Movie Scene Pause step_movie2_relative: Movie Scene step_movie2_start_offset: '00:35:00' step_movie2_end_offset: '00:45:00' step_movie2_on_1: script.downlights_bright step_movie3_name: Movie Scene Play step_movie3_relative: Movie Scene Pause step_movie3_start_offset: '00:03:00' step_movie3_end_offset: '00:06:00' step_movie3_on_1: scene.movie
Here I start a sequence that will execute my movie scene sometime between 8pm and 8.30pm. I then specify a second step which will emulate us pausing the movie and putting the kitchen lights on. This happens sometime between 35 and 45 minutes later and is relative to the previous step. This means that whatever time the previous step is executed the second step will always come 35-45 minutes after that. The third step in the sequence is another relative one. This will execute 3-6 minutes after the previous one and emulates us starting up the movie again.
As mentioned earlier, you can also create totally random events. For example you might use the following to simulate overnight bathroom trips:
random_bathroom_name: Overnight Bathroom random_bathroom_start: Bedtime random_bathroom_end: Morning random_bathroom_minduration: 00:02:00 random_bathroom_maxduration: 00:05:00 random_bathroom_number: 2 random_bathroom_on_1: light.bathroom random_bathroom_off_1: light.bathroom step_bedtime_name: Bedtime step_bedtime_start: '21:30:00' step_bedtime_end: '22:30:00' step_morning_name: Morning step_morning_start: 'sunrise + 00:20:00'
This configuration creates a 2 randomised events lasting 2-5 minutes, which turn on and off the bathroom light. These are defined as starting and ending relative to other steps in the sequence. I’ve defined the
Morning steps in my example to illustrate this. These steps can of course contain actions of their own just like the steps above. The full configuration basically says “sometime starting between 9.30pm and 10.30pm and lasting until 20 minutes after sunrise there will be two instances of the bathroom light coming on for 2-5 minutes”. Pretty cool!
OccuSim is a pretty powerful tool, which allows you to create complex occupancy simulation rules with Home Assistant. I’ve only really just begun to map out my own simulations. You can find these on GitLab. Some of the examples here are based upon my rules, but the real times have been changed. I’m going to continue expanding upon this in the coming weeks. Hopefully I’ll end up with a pretty accurate simulation.
I’m also exploring further home security options and will hopefully be expanding my existing ZoneMinder setup this year. Stay tuned to the blog for more info when that happens.
If you liked this post and want to see more, please consider subscribing to the mailing list (below) or the RSS feed. You can also follow me on Twitter. If you want to show your appreciation, feel free to buy me a coffee.
One thought on “Keeping Baddies Away with Occupancy Simulation and Home Assistant”
Thanks for the article. I’m starting thinking about an occupancy simulation. My Idea is to simply log several days and playback one picked up randomnly. What do you think about that ?