In this guide we will show you how to control the GPIO pins of a Raspberry pi by send a SMS to the Raspberry Pi from a mobile phone.
For this guide, the GSM modem we are using to receive the SMS is the BerryGPS-GSM.
On the software side, we will be using Gammu, which is specifically designed to control phones and GSM modules. It also has a daemon which will monitor the GSM modem for incoming SMSs.
We will configure Gammu to trigger a python script when a new SMS is received. We will use the contents of the SMS to control what happens in Python
LEDs are used here as an example, but you can do anything you like Eg. Open a garage door, turn on some lights, etc..
Wiring
We will be using the three bottom right GPIO pins on the Raspberry Pi header. These are GPIO 16, 20 and 21.
Each is connected to a different color LED as shown above. The
The resistors used are 330 Ohm and the GND pin (shorter pin) of the LEDs is connected to the GND power rail.
Setup
Install Gammu and python bindings;
pi@raspberrypi ~ $ sudo apt-get install gammu-smsd python-gammu
Edit the config file;
Find the below lines and add port and speed.
For the BerryGPS-GSM, use /dev/ttyACM1 for port and at115200 for speed
port = /dev/ttyACM1 connection = at115200
At the bottom of the file, add the line below. This is the python script which will run when a new SMS is received.
RunOnReceive = sudo python /home/pi/smsReceived.py
We will do a quick test. Restart the gammu service so the new config takes effect;
Send a test SMS to a mobile number. The mobile number below is an example, you will need to update this;
Python Script
This python script will run every time a new SMS is received.
Copy in the below code
import RPi.GPIO as GPIO import time import sys import re RED_LED = 21 GREEN_LED = 20 BLUE_LED = 16 GPIO.setmode(GPIO.BCM) filename=str(sys.argv[1]) #Gammu will pass the filename of the new SMS as an argument complete_filename="/var/spool/gammu/inbox/"+filename #we create the full path to the file here GPIO.setup(RED_LED , GPIO.OUT) GPIO.setup(GREEN_LED , GPIO.OUT) GPIO.setup(BLUE_LED , GPIO.OUT) sms_file=open(complete_filename,"r") #read the contents of the SMS file message=sms_file.read(160) #note that a not-parted SMS can be maximum 160 characters #search the contents and perform an action. Rather than use 'find', # we will use regular expression (re) so we can ignore case. #Most smartphones will have the first letter capitalised if re.search('red', message, re.IGNORECASE): GPIO.output(RED_LED , GPIO.HIGH) time.sleep(2) GPIO.output(RED_LED , GPIO.LOW) elif re.search('green', message, re.IGNORECASE): GPIO.output(GREEN_LED , GPIO.HIGH) time.sleep(2) GPIO.output(GREEN_LED , GPIO.LOW) elif re.search('blue', message, re.IGNORECASE): GPIO.output(BLUE_LED , GPIO.HIGH) time.sleep(2) GPIO.output(BLUE_LED , GPIO.LOW) GPIO.cleanup()
To troubleshoot you can view the syslog
Take some of the learnings above but implement them with something much more solid like this SMS command line interface for Raspi. Its also got TOTP auth, whitelisting of phone numbers and commands and is documented…
https://github.com/itiligent/SMS-to-Shell