#!/usr/bin/env python
#****************************************
#  smsrelay.py  
#  Written by Michael Wright www.y2KLeader.com
#  Startup example:
#  python3 smsrelay.py relay 7 on 1234
#****************************************
import sys
import os
import time
import datetime
import threading
import serial
password="1234"
#----------------------------------------
def open_usb_ports():
#----------------------------------------
   global ser
   global event_port
   errors=""
   try:
        
   ser=serial.Serial('/dev/ttyUSB3',115200,timeout=.5)
   except:
      errors=errors+"/dev/ttyUSB3 not available\n"
   try:
      event_port=serial.Serial('/dev/ttyUSB2',
115200,timeout=.5)
   except:
      errors=errors+"/dev/ttyUSB2 not available\n"
   if(errors!=""):
      print(errors)
      os._exit(0)
#----------------------------------------
def send(command,port,sleeptime):
#----------------------------------------
   command=command+"\r"
   port.write(command.encode())
   time.sleep(sleeptime)  
   data=ser.read(1000)
   data=data.decode("utf-8").strip()
   return data


#----------------------------------------
def reply(message,phone_number):
#----------------------------------------
   send('AT+CMGS="'+phone_number+'"',ser,.1)
   send(message+"\x1a",ser,.1)

#----------------------------------------
def listen():
#----------------------------------------
   #Checks for an unsolicited events every 3 seconds
   threading.Timer(3.0, listen).start()
   eventbuf=event_port.read(1000)
   eventbuffer=eventbuf.decode("utf-8").strip()
   eventbuffer=eventbuffer.replace('OK','')
   if(len(eventbuffer)>0):
      #---check to see if there was an incoming text 
      if (eventbuffer.find("+CMT:") != -1):
         line=eventbuffer.split('\r\n')
         msg=line[1].split(" ") 
         if(len(msg)==0):
            return  # blank message so ignore it
         n=line[0].split(",")
         phone_number=n[0].partition('+CMT: ')[2].replace('"','')
         error=""
         if(len(msg)!=4):
            return
         keyword=msg[0].lower()
         if(keyword!="relay"):
            return
         relaynum=msg[1].lower()
         state=msg[2].lower()
         pw=msg[3].lower()
         if(keyword!="relay"):
            error=error+"1st arg should be relay.\n"
         if(relaynum.isnumeric()!=True):
            error=error+"2nd arg is relay #.\n"
         if(state != "on" and state != "off"):
            error=error+"3rd arg should be on or off\n" 
         if(pw!=password):
            error=error+"bad password\n"
         if(error!=""):
            error=error+"\nExample:\n"
            error=error+"relay 7 on 1234"
            reply(error,phone_number)
            return
         if(state=="off"):
            st="1"
         if(state=="on"):
            st="0"
         os.system("gpio mode "+relaynum+" output")
         os.system("gpio write "+relaynum+" "+st)
         reply("relay "+relaynum+" is now "+state+".",phone_number)
open_usb_ports()
send("ATE0",ser,.1) 
send("AT+CMGF=1",ser,.1)
send('AT+CSCS="GSM"',ser,.1)
send("AT+CNMI=1,2,0,1,0",ser,.1)  
listen()
