Montana Mendy Montana Mendy - 12 days ago 11
Python Question

Python (Arduino motion sensor, with SMS notification)

I'm doing a small project I found on GitHub, I have an Arduino Mega 2560, and I'm trying to get an SMS when it detects motion, but I keep getting an error in Python, when I try running the server.

Here's the code:

#!/usr/bin/env python

import serial
import requests
from datetime import datetime, timedelta

# Set the serial port to the same serial port you uploaded the arduino sketch to
# In the Arduino IDE, click "Tools > Serial Port"
# SERIAL_PORT = "/dev/tty.usbserial-A70064Mh"
SERIAL_PORT = "/dev/cu.usbmodem1421"
SERIAL_BAUD = 115200

# Don"t send more than one message every 30 minutes
SENSOR_INTERVAL = timedelta(minutes=30)

SMS_FROM = "" # Make sure this is a number on telapi.com or you'll get charged extra for spoofing
SMS_TO = ""
SMS_BODY = "ALERT! Your Arduino just detected motion!"
TELAPI_ACCOUNT_SID = ""
TELAPI_TOKEN = ""

# Try to import TELAPI_ACCOUNT_SID and such from settings_local.py, if it exists
try:
from settings_local import *
except ImportError:
pass

TELAPI_SMS_URL = "https://api.zang.io/v2/Accounts/{AccountSid}/SMS/Messages" % TELAPI_ACCOUNT_SID

# Start the server
if __name__ == "__main__":
print "Starting SMS motion detector server at", datetime.now()
last_sent_time = None

# Open a serial connection to the Arduino
with serial.Serial(SERIAL_PORT, SERIAL_BAUD) as arduino:
while True:
print "Polling Arduino..."

# Listen for the Arduino to send a byte
byte_received = arduino.read()

print "Received byte:", byte_received

# Motion was detected
if byte_received == "1":
print "Motion detected at", datetime.now()

# If we haven"t sent an SMS in the last 30 minutes, send one now
if not last_sent_time or (datetime.now() - last_sent_time) > SENSOR_INTERVAL:
last_sent_time = datetime.now()
print "Sending SMS..."

# Send request to TelAPI to send SMS
try:
data = {
"From": SMS_FROM,
"To": SMS_TO,
"Body": SMS_BODY,
}
requests.post(TELAPI_SMS_URL, data=data, auth=(TELAPI_ACCOUNT_SID, TELAPI_TOKEN))

print "** SMS Sent! **"

except Exception as e:
print "Some error occurred while sending SMS:", e


So when I run "python server.py" it gives me this error

Traceback (most recent call last):
File "server.py", line 28, in <module>
TELAPI_SMS_URL = "https://api.zang.io/v2/Accounts/{AccountSid}/SMS/Messages" % TELAPI_ACCOUNT_SID
TypeError: not all arguments converted during string formatting


Now it looks like TELAPI is no more, but Zang has taken it's place, any help would be appreciated, thank you so much!

Answer

I fixed this by replacing the Zang API, with the following

TELAPI_SMS_URL = "https://api.telapi.com/2011-07-01/Accounts/%s/SMS/Messages" % TELAPI_ACCOUNT_SID

Then of course running server.py, Arduino was able to detect motion and send SMS.

Comments