Raspberry Pi RFID Triggered Email
by TonyCanning in Circuits > Raspberry Pi
3034 Views, 14 Favorites, 0 Comments
Raspberry Pi RFID Triggered Email
I've never worked with an RFID reader before so had no idea how this was going to go. As usual though, someone else had done it and so the individual elements were easy enough - getting it all to work together was a bit of a struggle but it's been a great learning experience for me!
This project is can become a part of someone else's work. What I've done is gotten an RFID reader to scan an RFID card, then trigger the Pi camera to take an image and finally email that image.
It could form part of a wider access set up to open a lock or something. I haven't gone that far as I've no real need to - I just wanted to figure out how to do something with the few bits I had on hand at the time!
Here's the Bits You'll Need for the Project....
Parallax RFID reader - I'm sure there is code out there for others. Or indeed the code below might work for a different one. I can't tell you that as this is the first time I've tried anything with them! I understand these are available with and without an FTDI chip. This one has it's own on board and from working with other things that require an FTDI cable, it's always seemed simpler to me to buy the components that have the FTDI chip on board.
RFID card - which comes with the reader.
Raspberry Pi - I have no doubt that this will work with pretty much any RPi - mine is an RPi 2 model B.
SD Card with Raspbian installed.
Raspberry Pi camera module.
Usb mini cable - for the RFID reader.
Preparation...
If you've used the RPi camera module before you've most likely enabled it. If not, Open a terminal and type:
sudo raspi-config
and move down to "Enable Camera". When prompted, select "YES" to enable the camera module. This will take you back to the raspi-config menu at which you can use the TAB key to go to "FINISH".
The RPi will ask if you want to reboot now - select NO. This is because we need to connect everything up now before restarting and so we need to shut down instead. To shutdown type the following into the terminal:
sudo shutdown -h now
Once shutdown you can connect the RFID scanner by USB to the Raspberry Pi. Also connect the RPi camera module. Now you can boot the Pi up again.
For the RPi to communicate with the RFID reader you'll need to install a few bits.
Open up the terminal on your RPi & at the $ prompt:
sudo pip install pyserial
Then "Enter" - if you get asked to confirm, just select "Y".
You'll also need to install this:
sudo apt-get install sqlite3
Once both of these are installed you're ready to create your python files to handle the jobs.
The Code for Sending Email With Attachment...
I like to create a specific folder to separate projects. To create a folder type into the terminal:
mkdir yourfoldername
Then to move to that folder and create your python files:
cd yourfoldername
Note: You'll be creating 2 different python files. They kind of depend on each other to some extent so there's not much point in running one untill they are both created. Let's first create the 2 files and then go over what they're doing.
You're in the folder you created you can create the files:
sudo nano rf-img-mail.py
Now copy and paste the following code into terminal (I've highlighted bits you need to or can change):
#!/usr/bin/env python
import smtplib from email.MIMEMultipart
import MIMEMultipart from email.MIMEBase
import MIMEBase from email.MIMEText
import MIMEText from email.Utils
import COMMASPACE, formatdate from email
import Encoders
import os
USERNAME = "YOURUSERNAME" # you'll need your own gmail username in here
PASSWORD = "YOURPASSWORD" #you'll need your gmail password here
def sendMail(to, subject, text, files=[]):
assert type(to)==list
assert type(files)==list
msg = MIMEMultipart()
msg['From'] = USERNAME
msg['To'] = COMMASPACE.join(to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach( MIMEText(text) )
for file in files:
part = MIMEBase('application', "octet-stream")
part.set_payload( open(file,"rb").read() )
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"'
% os.path.basename(file))
msg.attach(part)
server = smtplib.SMTP('smtp.gmail.com:587') #this is for communicating through gmail. I've no idea about other mail handlers!
server.ehlo_or_helo_if_needed()
server.starttls()
server.ehlo_or_helo_if_needed()
server.login(USERNAME,PASSWORD)
server.sendmail(USERNAME, to, msg.as_string())
server.quit()
sendMail( ["YOUR.EMAIL@gmail.com"], #change to match the receiver's email address
"RFID Access Notification", #Your subject line which can suit your project
"Someome has accessed your RFID lock, picture attached", #The body text of the email
["/home/pi/rf-parallax/rfid.jpg"] ) #the location of the image that will be taken - you'll need to change this to suit the directory name you've created.
Once you've copied and edited the necessary bits above, press CTRL + X and answer Y then ENTER a couple of times to save the file.
CREDIT where it's due: This is code from https://harizanov.com/2013/07/raspberry-pi-emalsms-doorbell-notifier-picture-of-the-person-ringing-it/ where it's triggered instead by a doorbell.
Creating the RFID Reading Trigger File...
This file will be the one we actually run. It will listen for a card to be presented to the RFID reader then trigger the camera. Once the image is taken it will then call the previous python file to send the image as an attachment to your email.
In terminal:
sudo nano rf-read.py
And copy in the following contents:
#! /usr/bin/python
import serial
import time
import sqlite3
import os
# open sqlite database file db = sqlite3.connect('tagreads.db') cursor = db.cursor()
# check that the correct tables exists in database; create them if they do not
tables = cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND (name='tagreads');").fetchall()
if len(tables) == 0 :
cursor.execute("CREATE table tagreads (timestamp, tagid)")
# connect to serial port on which the RFID reader is attached
port = serial.Serial('/dev/ttyUSB0', 2400, timeout=1)
lastid = ""
print("Present RFID tag")
try:
while True:
# attempt to read in a tag
tagid = port.read(12)
# if tag read success full, save it to database and wait half a second;
# else try again
if(len(tagid) != 0) and (len(lastid) == 0):
# close and open the port to blink the light and give visual feedback
port.close()
# take an image on presentation of rfid tag
print("Taking RFID image - remain still while camera led is on")
os.system("raspistill -w 640 -h 480 -o rfid.jpg") #this is a REALLY handy feature in Python. No matter what you want to run you can place commands between the quotes in the same way you can run things from the command line. So for taking a picture like here, you can add in all the options available to raspistill.
tagid = tagid.strip()
timestamp = time.time()
cursor.execute("INSERT INTO tagreads VALUES (?,?);", (timestamp, tagid))
db.commit()
print("Time:%s, Tag:%s" % (timestamp,tagid))
# The actual mail send is completed in a seperate python script located within the same folder
os.system("python rf-img-mail.py") #Again, using that
time.sleep(.5)
port.open()
print("Present RFID tag")
lastid = tagid
except KeyboardInterrupt:
port.close()
db.commit()
db.close()
print ("Program interrupted")
Again once you've copied and edited the necessary bits above, press CTRL + X
and answer Y then ENTER a couple of times to save the file.
CREDIT where's its due: I got the vast majority of this code from here - http://theatticlight.net/posts/Using-a-Parallax-RFID-reader-on-the-Raspberry-PI/
Running It All Together....
Here's your moment of truth - and if you've gotten your email details correct then I'd expect this should work for you straight away.
Any time you want to run this, just open a terminal and navigate to the location of the 2 python files.
cd thatdirectoryyoucreatedatthestart
python rf-read.py
One image is an example of how it should all react on starting and when presenting the RFID card. It won't look the same as yours as I'm using my Ubuntu laptop to ssh to the RPi. I've also got a different filename - which is pretty much irrelevant!
The other image is the email that the recipient will get.
Enjoy!