Introduction: Raspberry Pi - SMS Garage Door Butler
Most Raspberry Pi garage door remotes had open ports, or other features I wasn't too fond of. So I created my own that contains much more security, logging of who opens the garage, video capture, garage status and more.
Features:
- 100% secure garage door operation, with access control lists. Only authorized family members can open.
- Ability to monitor or control garage anywhere in the world from a controlled website, with no open router ports
- Full video capture of who's coming into the garage, uploaded securely to your website for later perusal
- Ability to remotely stop or kill the process in case of malfunction or abuse
- Email notifications when a family member arrives or leaves the house
- Cheap SMS solution (3/4 a cent per text), with no GSM card purchases or any cell contracts
- Standard Linux code, easily setup on a new Pi, and quickly portable to other platforms like BeagleBone or whatever future Linux technology arrives. Basically, I wanted the ability to restore this system on a fresh device within 30 minutes or less
Step 1: Requirements
You will need:
- A Raspberry Pi or BeagleBone Black setup with base configuration. I use Raspbian Wheezy
- Wireless connectivity via a wireless dongle (or just plug in a network cable)
- A camera (compatible webcam or PiCam)
- A relay board. I use "SainSmart 5V 2-Channel Solid State Relay Board", because it defaults to LOW instead of HIGH
- Enough wire to access your garage door opener, or just break apart a spare remote
- A website with hosting. You can get a small amount of space on DropBox or Google Drive and use that, or you can create a random website from a cheap hosting service like 1and1.com, which will provide 100gb of space for only $11 PER YEAR. You won't need to keep these files anyhow, since they're just logs.
- If using the PiCam, a little poster putty
Step 2: Install Required Libraries on Your Raspberry Pi
You first need a Twilio account (free, go to Twilio.com), a Twilio phone number ($1 per month) and some money in your account.
Once setup, install necessary libraries into your Raspberry Pi:
sudo apt-get install -y python-pip mysql-server python-dev libmysqlclient-dev
sudo pip install MySQL-python twilio
And create two directories:
/home/pi/movies
/home/pi/pictures
Step 3: Create SQL Databases, Users, Permissions
Next, login to your new MySQL localhost server, and then add a user + set privs + create the database and tables needed:
mysql -pYourSQLPassword -u root -h localhost
create database GarageDoor;
use GarageDoor;
create table Door(sSid CHAR(40));
create table Authorized(sPhone CHAR(20));
create table Log(sPhone CHAR(20), sAction CHAR(10), dDate datetime);
-- put your phone number, with a +1 before it if you're inside the USA
insert into Authorized (sPhone) values ('+12145551212');
CREATE USER 'garage'@'localhost' IDENTIFIED BY 'garagepassword';
GRANT ALL PRIVILEGES ON * . * TO 'garage'@'localhost';
FLUSH PRIVILEGES;
exit;
Step 4: Hookup a Relay and Garage Door Opener
For this step, we'll be hooking up your Raspberry Pi's GPIO pin 23 (physical pin 16) to a relay. I like the SainSmart 4-Channel Relay Module off Amazon for about $9. Now either break apart a spare garage door remote, or just wire the relay directly to your garage door. Consult your garage manual how to do this.
You can see my spare garage remote has an obvious button that I soldered two wires to, and jammed into my relay.
Next, connect all the proper wires from your Raspberry Pi to the relay. Pin 2 = 5v. Pin 6 = Ground, and Pin 16 controls the relay. Now ensure your relay is ACTIVE LOW, which means sending a HIGH signal opens the garage. This relay off Amazon was the proper fit for me: SainSmart 5V 2-Channel Solid State Relay Board
Step 5: Add a Camera
In this example, I used the Raspberry Pi camera. You can use a webcam if you're on BeagleBone Black or some other Linux computer. Click here for a list of Raspberry Pi compatible webcams
Mount the camera using some stiff wire + poster putty. You can mount on either your Raspberry Pi case, or the shelf your device is sitting on. You alternatively CAN make a fancy 3D printed larger case to house all of this inside, but I'm cheap.
Step 6: Grab the SMS Butler Code, and Install
Grab my code from here:
https://github.com/AkiraFist/GarageSMSButler
and copy it to your Raspberry Pi, any directory is fine. Change the variables up top to your own Twilio account's phone number, and your personal cell number. Plus the Twilio authentication codes you can obtain from your account's main screen on https://www.twilio.com
And run:
sudo chmod 755 garage_sms_butler.py
python garage_sms_butler.py
Then text your Twilio phone number the word "status" (without quotation marks), and you should receive a status message back, with the last person who opened your garage door.
Step 7: Open Garage, and See the Results on Your Website
Command reference for the SMS Garage Butler:
OPEN - sends a HIGH signal to the relay for 0.5 seconds, thus activating the spare remote (or the door operner, if you chose direct connection) and opening the garage door. This will also upload a movie of who opened the door, to your website.
STATUS - see who last opened the garage door, and if the service is ENABLED or DISABLED. This will also upload a picture of your garage door status (YourWebSite.com/uploads/garagepic.jpg)
DISABLE - stops listening for garage opening commands
ENABLE - re-enables the service, if disabled
KILL - completely exits the application. No further commands will be processed
Now go and add your own commands!
Step 8: Questions and Answers
Why not use Motion for video capture?
Motion captures MOTION, which means it'll grab movies of me cleaning my garage, or changing the oil in my lawn mower. I only want to know who's entering my garage when it opens, not have a video blog of my garage activities. Plus this limits the video to only 60 seconds, which is enough time to see who's coming in, and who they are with.
In addition, I don't want to setup that huge file and configure all sorts of little options, including a live stream. Does anybody really want to stare at a live stream of their garage? No.
Why use a website for video uploads?
Most website providers offer a $11 per year plan for the first year of a new site. AND they'll give you about 100gb of free space. So I just created a site called blahblahblah15.com or whatever, and upload my videos there. Now I can view them online from anywhere.
If you're married to DropBox, Google drive, or Amazon hosting then replace my code with the freely available Python sources for using those services.
Why not use WebGPIO, host a Pi website and all that?
I dislike open ports to my home network. Sorry, it's a security issue. I've seen people do it (plus have a live stream to their garage - really? You want to stare into your garage all day?), but not for me.
Can't you just use Adafruit's FONA or some other SMS device?
Sure, if you want. Scanning Twilio for new texts for 3/4 a cent per text is much cheaper than doing FONA, and enrolling yourself in a cell contract.
Step 9: Credits
THANK YOU ADAFRUIT for selling me all these goodies. I haunt that store for new products daily.
This guy's garage idea got me started:
http://www.raspberrypi.org/forums/viewtopic.php?f=...
However I disliked his open port for doing the WebGPIO, and a live webcam of my boring garage seemed useless. I also didn't use a ULN2003APG chip, since I'm only connected to a CR2032 battery with the relay.
Greg's magic tricks alerted me to Twilio, and all the possibilities there:

Participated in the
Tech Contest

Participated in the
Microcontroller Contest
1 Person Made This Project!
- dbagioni made it!
45 Comments
Question 3 years ago
i dont see the coding in which you can close the door as well ? can you point this out for me.
6 years ago
Has anybody tried this with 2 separate garage doors?
Reply 6 years ago
Yes I did and have it working complete with position sensors.
6 years ago
Can anybody comment if the GMail emailing part still works? I am trying to get the software to run, but it appears to crash while sending an email. I am using 2 factor authentacation however I created a special password for this already.
Reply 6 years ago
As of June 2016. Google has phased out SSL V3 encryption. Good look finding another email client that supports SSL V3
6 years ago
Congrats for this instructables !!
Can I avoid the use of the raspberry and only use an arduino with gsm kit ? What is the interest of using raspberry here ? (except for the camera module)
7 years ago on Introduction
Can someone please explain how to add phone numnber to the authorized list?
Reply 6 years ago
Replace the phone number on the below line between the **** I think I copied and pasted it verbatim the first time. I went back and logged in, use GarageDoor, insert into Authorized (sPhone) values ('+MY CELL NUMBER'); Hope it helps!
mysql -pYourSQLPassword -u root -h localhost
create database GarageDoor;
use GarageDoor;
create table Door(sSid CHAR(40));
create table Authorized(sPhone CHAR(20));
create table Log(sPhone CHAR(20), sAction CHAR(10), dDate datetime);
-- put your phone number, with a +1 before it if you're inside the USA
****
insert into Authorized (sPhone) values ('+12145551212');
****
CREATE USER 'garage'@'localhost' IDENTIFIED BY 'garagepassword';
GRANT ALL PRIVILEGES ON * . * TO 'garage'@'localhost';
FLUSH PRIVILEGES;
exit;
7 years ago
Hey does this have capability for "automatic garage door close after x minutes" feature?
I'm looking to buy that as seperate piece but looks like this would be straightforward to instead write in code.....
Thanks!
7 years ago
This is such a slick operation, thanks for posting. I’m wondering if anyone has made this with the latest Raspberry Pi 2? Before I start working on this, I’d like to see if there have been any issues with the latest RP? Thanks in advance!
7 years ago
Fella, this is going on my list of junk to accomplish before Spring!
7 years ago on Introduction
Is there a log file so I can tell where my errors are coming from? The py runs for about 30 seconds and aborts saying an error.
8 years ago on Introduction
Great project - built it your way and everything worked great! I didn't want to continue with the email and video parts so have commented those functions out.
Instead, I added a magnetic switch on the garage door and used GPIO IN (BCM: Pin 18) to monitor switch state. Added a function in garage_sms_butler.py to get status of door (Open, Closed). Called this function with "Status" SMS. Also added 30 second sleep timer after OPEN or CLOSE to send a second SMS showing door's status.
Reply 8 years ago on Introduction
I've been working on the same status idea as well. However, I can't get the function to work properly as the script continues to print my own error message - here's what I have. I'm calling the function down in the status section. Any thoughts?
# Get the status of the garage door (open or closed)
def GetDoorStatus():
try:
if GPIO.input(18):
state = 'open'
else:
state = 'closed'
return state
except:
print "Error inside function GetDoorStatus"
pass
Reply 8 years ago on Introduction
Hello,
I do not have an answer for you. But I have a similar setup.I used a second program I found.
http://www.richlynch.com/code/pi_garage_alert
This way I knew if the garage is open by the wall mount or butler.
Scott-w
8 years ago on Introduction
Hi! How do I add my authorized phone number in "garage_sms_butler.py" file.
8 years ago on Introduction
Hey so everything is up and running pretty well, minus the shut-downs and I don't really know how to write the code to remove mysql list.. But my main question is, is there any way to hook this into the garage directly without compromising the existing door opener buttons that are also hardwired to the system? If my relay is hooked up to the opener directly, it kills the physical buttons. I tried installing in line further away from the unit as well, and it compromises all three buttons as well. Is there any way to fix this? Would a relay work without a data source telling it to activate? I have a second relay and could use a 5v power source from somewhere else to hook other three buttons to a relay if that would do anything?
Reply 8 years ago on Introduction
Jumrm
Sounds like you want a setup like I have. Hardwired to the wall mounted switch.
I needed to change the pin setup to board.
Here is what I have
GPIO_PIN = 18
GPIO.setmode(GPIO.BOARD)
GPIO.setup(GPIO_PIN, GPIO.OUT)
GPIO.output(GPIO_PIN,True)
Need to make sure you change the GPIO_PIN to match what you are using.
Once I changed to board All worked correctly
Scott-w
8 years ago on Introduction
JulianM1,
I am having the same issues. I believe something needs to setup on Twilio website, just not sure what. I also have see that butler is eating up to process time. I found that when the process time gets over 50 mins Butler does not work well.
I have created tow simple scripts that run from cron to help this out. I do want to fix correctly. Just learning python now.
process_check.sh
#!/bin/bash
# 11/20/2014
# Check if mod_garage_sms_butler.py is running, if not start it
ps -ef |grep butler |grep -v grep |grep -v vi >/dev/null
if [ "$?" -ne "0" ] ;
then
python -t /usr/local/etc/mod_garage_sms_butler.py &
else
echo " " >/dev/null
fi
run_away-process.sh
#!/bin/bash
# SMS Butler Seems to be a runway procces/leak Nov.28.2014
F1=`ps -ef |grep mod |grep -v grep |awk '{print $7}' | cut -d : -f 1`
F2=`ps -ef |grep mod |grep -v grep |awk '{print $7}' | cut -d : -f 2`
if [ "$F1$F2" -ge "0050" ];
then
PS=`ps -ef |grep mod |grep -v grep |awk '{print $2}'`
kill $PS
sleep 2
sh /usr/local/etc/process_check.sh
else
echo " " > /dev/null
fi
CRON JOBS
*/5 8-23 * * * sh /usr/local/etc/process_check.sh
29,59 8-23 * * * sh /usr/local/etc/run_away-process.sh
Scott-w
Reply 8 years ago on Introduction
Scott: Try removing the database entirely, and just use the array for tracking
previous messages. Add a few lines to fill the array at startup with
all existing Twilio messages.