Using both the WeMo Motion rules and IFTTT allows you to do certain things with this motion detector. However, to expand our possibilities it would help if we could store our motion data and make it accessible to the programs that we write.
To store our motion data in a database we need a bit of a convoluted process. It goes something like this:
First we set up an IFTTT recipe to send an email to a Gmail account when motion is detected.
Having done this you will get a series of emails:
I recommend setting up a separate Gmail account for automation to avoid spamming yourself with IFTTT emails. It would also make things more secure for the next steps. To make things easier when using multiple IFTTT recipe emails, I set up a filtering rule in Gmail to automatically label all emails like this as “Motion”.
The next step is to write some Python code to access our emails, process messages and store data in an SQLite database.
- The email processing makes use of the imaplib and HeaderParser libraries; and
- The database processing makes use of the sqlite3 libraries.
A first function accesses all unread emails with a particular label and returns an array of the subject lines of those emails.
def read_subjects(label): obj = imaplib.IMAP4_SSL('imap.gmail.com', '993') obj.login('username@gmail.com', 'password') obj.select(label) # <--- it will select inbox typ ,data = obj.search(None,'UnSeen') subjects =[] for num in data[0].split(): data = obj.fetch(num, '(BODY[HEADER])') header_data = data[1][0][1] parser = HeaderParser() msg = parser.parsestr(header_data) #print msg['Subject'] subjects.append(msg['Subject']) return subjects
A second set of functions then processes each subject line to extract a ‘datetime’ that the motion occurred and a motion sensor name.
def store_motion(subjects): #Initilise temporary array for data rows = [] unread_count = len(subjects)-1 #Process and store unread mail items for j in range(0,unread_count): #print subjects[j] #Extract date/time of last motion extracted_date = extract_date(subjects[j]) #Extract motion time motion_time = datetime.datetime.strptime(extracted_date, "%B %d, %Y at %I:%M%p") #Extract sensor name s_name = extract_sensor(subjects[j]) #Add (motion time, sensor name) tuple to rows rows.append((motion_time, s_name)) #print rows storemotioninsql(rows) def extract_date(word): date_index_start = word.find("ion: ")+5 date_index_end = word.find(" at")+11 date_out = word[date_index_start:date_index_end] return date_out def extract_sensor(word): name_end = word.find("' ") word_out = word[1:name_end] return word_out
A third function stores the prepared ‘datetime’ and motion sensor name in an SQLite database.
def storemotioninsql(rows): #Save in database con = lite.connect('motion.db') with con: cur = con.cursor() #Create a READINGS table if it doesn't already exist cur.execute('CREATE TABLE IF NOT EXISTS motion (r_datetime TIMESTAMP, r_s_name TEXT)') for row_values in rows: #print row_values cur.execute('INSERT INTO motion VALUES(?,?)', (row_values[0], row_values[1]))
All that remains is to set these functions up in a python script and then use cron to schedule it to run every 15 minutes (crontab -e etc…).