A major plus for home automation is the ability to give any device multiple purposes. With a little imagination, a Sonos speaker can become a voice announcer, a lightbulb can become an effective method of simulating occupancy in a home.
Everyone wants to feel their possessions are secure. A standard house alarm is useful- and many are becoming smarter- but there is always the chance that a ringing alarm box is less of a call-to-arms and more of an annoyance to be ignored. With that in mind, I would suggest building your own security system to notify you as soon as something is out of the ordinary.
This security system is created wholly from home automation products and is armed when you select a switch called “Leaving” on Domoticz, waits for 5 minutes to allow you time to come back in if you have forgotten anything (which I always do!), then after a further 5 minutes attempts to detect your phone(s) and if they are in wifi range, disarms the system again.
What you’ll need
- Raspberry Pi running Domoticz
- RFXCOM RFXtrx433
- A number of door sensors, vibration sensors or PIRs (or any combination of these)
- Python running on the Raspberry Pi
- Maybe a network IP camera if you want to capture a photo when the alarm is triggered
How long it will take
Depending on the number of door sensors/PIRs/Cameras that you want to install, it could take anything from 15 minutes to several hours.
Step One – Install your devices
Choose entry points to your home. The obvious one is the front door but also think about other places where someone may try to gain entry.
For doors, place the sensor towards the top of the door. Remember to look at where the battery will need changing from, and ensure this will be easy to access by orienting the battery compartment/drawer towards the ground. If space is limited, remember that there’s nothing to stop you attaching the larger part of the sensor (the transmitter) on the door itself and the smaller part (housing the magnet) on the frame of the door. Use sticky strips first to test, even if you plan to screw the sensor to the door later.
For vibration sensors you can usually affix these directly to the window using suction cups. If the type you have requires a more permanent fixing, try taping the sensor to the window first to ensure you (and other family members) are happy with their placement.
For PIRs, install these unobtrusive but accessible areas. Remember that as these devices are wireless, you can even place them on shelves. You don’t need to put them in corners of rooms like wired sensors. Choose places where it would be impossible not to cross the detector if moving from room to room (hallways are a great position). Remember that if you have pets the sensors should be raised up so that they can only be activated by humans.
Learn and name each sensor into Domoticz. Remember to specify what type of device you are adding (PIR, Door sensor etc).
Step Two – Create a few Dummy switches
Create a dummy switch called “Leaving”. This will be ON when you have left the home and OFF when you return.
Another dummy switch called “Security Alarm” is needed. This is the switch that tells the scripts whether to send you an alert when a sensor is triggered. You don’t want to get alerts when you are at home (as you’re probably the one triggering them!)
Another dummy switch called “Waiting for Phones” needs to be created. This will be ON when the security system is waiting for you to return home.
Then create a switch for each phone you want to automatically disarm the system with. I use two switches (“Chesters Phone” and “Harrys Phone”).
Finally, we need one more dummy switch – “Arm Security”.
Step Three – Write the scripts
A few scripts are needed now. What will happen when you switch on the “Leaving” switch? What about when it is turned off? What happens when a sensor is activated and the “Security Alarm” switch is on?
The first code I write is saved as “device_SECURITY_Leave.lua” and is saved in the domoticz/scripts/lua/ folder
commandArray = {}
if devicechanged['Leaving'] == 'On' then
commandArray['Environment Automation'] = 'Off'
commandArray['Living Room Camera'] = 'On'
commandArray['Security Alarm'] = 'Off'
commandArray['Arm Security'] = 'On'
commandArray['TEMP Set to 15'] = 'On'
end
return commandArray
This script (which I have reduced down as there are tens more switches to change when the flat is left unoccupied) runs once the Leaving switch is turned on.
We need a script to say when the alarm is activated – notice that I don’t switch the “Security Alarm” switch on with the above code. If I did, once the Leaving switch was set, notifications would be sent to my phone as I walk through the flat to leave and open the front door. I want to add a delay to the arming of the system. This script is a timed script so starts with the text”script_time” instead of “script_device” – I’ve called it “script_time_SECURITY_Leaving.lua”
t1 = os.time()
s = otherdevices_lastupdate['Arm Security']
year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)
commandArray = {}
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = (os.difftime (t1, t2))
print ('Leaving difference ' .. difference)
if (difference > 300 and otherdevices['Security Alarm'] == 'Off' and otherdevices['Arm Security'] == 'On') then
commandArray['Security Alarm'] = 'On'
commandArray['Arm Security'] = 'Off'
print ('Security Alarm is now armed.')
commandArray['SendNotification']='Security Armed#Security alarm is now armed.'
end
if (difference > 600 and otherdevices['Waiting for Phone'] == 'Off' and otherdevices['Leaving'] == 'On') then
commandArray['Waiting for Phone'] = 'On'
commandArray['Harry Phone'] = 'Off'
commandArray['Chester Phone'] = 'Off'
print ('Waiting for phones to return.')
end
return commandArray
Again, I’ve removed quite a few of the potential sensors to activate the alarm, but you get the idea. You may notice another switch in there – “SECURITY Living Room”. This switch is linked to a network camera we have in the living room, and thanks to the inbuilt scripting in Domoticz, sends a picture from the camera via email to multiple recipients.

The above script checks how long it has been since the “Arm Security” switch has been activated. If 5 minutes, then the “Security Alarm” switch is turned on. If 10 minutes, then the system starts searching for phones. Living in a block of flats it is hard to judge the best interval for this. On more than one occasions Chester and I have left the flat for the day, only to bump into a neighbour on the stairwell and have a gossip with them. This has turned into more than a 10 minute delay, and as we’re still in range of our WiFi, this in turn switches off the “Security Alarm” switch.
Now we need the script to watch out for our phones to automatically disarm the system. This is in three parts. One part controls the timing (i.e. run a script every minute if waiting for phones to return) while the other two try to find our phones using a quick Python script. The first goes in the domoticz/scripts/lua folder and I have called it script_time_SECURITY_Phones.lua:
commandArray = {}
if otherdevices['Waiting for Phone'] == 'On' then
os.execute('python3 ./Security-Detection-Harry.py &')
os.execute('python3 ./Security-Detection-Chester.py &')
end
return commandArray
As you can guess, we now need some Python programs. They are both the same (except each phone has its own static IP address and its own switch in Domoticz). These are stored in the domoticz folder itself (not in any subfolder):
This one is called Security-Detection-Harry.py
import urllib
import requests
from random import randint
import base64,requests,json,time,datetime
import os
"""
Detects Harry's phone and switches Domoticz if found.
"""
hostname = "192.168.1.1"
response = os.system("ping -c 1 " + hostname)
#and then check the response...
if response == 0:
print (hostname, 'is up!')
req = requests.get('http://192.168.1.94:8080/json.htm?type=command¶m=switchlight&idx=176&switchcmd=On')
else:
print (hostname, 'is down!')
req = requests.get('http://192.168.1.94:8080/json.htm?type=command¶m=switchlight&idx=176&switchcmd=Off')
So the above script searches for my phone (the IP address of my phone is fixed to 192.168.1.1) and switches a switch in Domoticz if my phone is detected or not. In the above example Domoticz has given my “Harrys Phone” switch the number 17, so that’s the one I want to alter depending on whether the phone is present or not.
The next script deactivates the security alarm if the phones are detected. Saved in domoticz/scripts/lua it is called script_device_SECURITY_Phones.lua:
commandArray = {}
if devicechanged['Waiting for Phone'] == 'On' then
commandArray['Harry Phone'] = 'Off'
commandArray['Chester Phone'] = 'Off'
end
if (devicechanged['Chester Phone'] == 'On' and otherdevices['Waiting for Phone'] == 'On' and otherdevices['Leaving'] == 'On') then
commandArray['Leaving'] = 'Off'
print("Chester's phone detected.")
commandArray['SendNotification'] = 'Security Message#Chesters phone detected. Disarming system and switching on devices.'
end
if (devicechanged['Harry Phone'] == 'On' and otherdevices['Waiting for Phone'] == 'On' and otherdevices['Leaving'] == 'On') then
commandArray['Leaving'] = 'Off'
print("Harry's phone detected.")
commandArray['SendNotification'] = 'Security Message#Harrys phone detected. Disarming system and switching on devices.'
end
if (devicechanged['Chester Phone'] == 'On' and otherdevices['Waiting for Phone'] == 'On' and otherdevices['Leaving'] == 'Off') then
commandArray['Waiting for Phone'] = 'Off'
print("Chester's phone detected. No action taken.")
end
if (devicechanged['Harry Phone'] == 'On' and otherdevices['Waiting for Phone'] == 'On' and otherdevices['Leaving'] == 'Off') then
commandArray['Waiting for Phone'] = 'Off'
print("Harry's phone detected. No action taken.")
end
return commandArray
Very nearly there! This script is saved in domoticz/scripts/lua and is called script_device_SECURITY_Return.lua and tells Domoticz what to switch back on when one of us arrives home.
commandArray = {}
if devicechanged['Leaving'] == 'Off' then
commandArray['Power Up'] = 'On'
commandArray['Living Room Camera'] = 'Off'
commandArray['Arm Security'] = 'Off'
commandArray['Waiting for Phone'] = 'Off'
commandArray['Security Alarm'] = 'Off'
commandArray['Environment Automation'] = 'On'
if otherdevices['VAR Dusk'] == 'On' then
commandArray['DIMMER TV Lamps'] = 'Set level 100'
os.execute('./Hue-LR-Darkday.py')
commandArray['Front Balcony Lights'] = 'On'
end
commandArray['Air Purifier'] = 'On'
commandArray['Living Room TV'] = 'On'
commandArray['Washing Machine'] = 'On'
commandArray['Cat Sitter'] = 'Off'
end
return commandArray
Now there’s only one thing left to do: decide what happens when the alarm is activated. You could turn on lights, make sound come out of a network speaker, switch on the TV, contact you using the Domoticz alerts function… the list is endless. Here’s some of my code, again stored in domoticz/scripts/lua and this is called script_device_SECURITY_Sensors.lua
commandArray = {}
if (devicechanged['DOOR Entrance'] == 'Open' and otherdevices['Security Alarm'] == 'On') then
commandArray['SendNotification'] = 'Security Message#Front door opened.'
commandArray['VAR Entrance'] = 'On'
commandArray['SECURITY Entrance'] = 'On'
print('ALARM ACTIVATED - FRONT DOOR SENSOR')
elseif (devicechanged['DOOR Hallway'] == 'Open' and otherdevices['Security Alarm'] == 'On') then
commandArray['SendNotification'] = 'Security Message#Hallway door opened.'
commandArray['SECURITY Living Room'] = 'On'
print('ALARM ACTIVATED - HALLWAY SENSOR')
elseif (devicechanged['DOOR Hallway'] == 'Closed' and otherdevices['Security Alarm'] == 'On') then
commandArray['SendNotification'] = 'Important Security Message#Hallway door closed!'
commandArray['SECURITY Living Room'] = 'On'
commandArray['VAR Entrance'] = 'On'
print('ALARM ACTIVATED - HALLWAY SENSOR')end
return commandArray
This is a small (but functioning) fragment of all the sensors that will trigger a security alert in the flat if we are away and something unexpected happens.
Summary
I have probably made this system more difficult than it needs to be over time, but this security system does work flawlessly and does provide peace of mind when we’re away. If you have some home automation sensors doing one type of job, why not get them involved in creating a bespoke security system… and make them earn their keep around your home. Your family will thank you for it – as long as the process of arming and disarming the system is as user friendly as possible.