#!/usr/bin/python3 #prikazy: #DPC WEB vyfoti fotku webkamnerkou a posle na web, pak prozvoni #DPC EVE vypis eventu # DPC EVE MOT/PIR/VSE x, pricemz x je doba v minutach od now do minulosti #DPC ALA aktivace/deaktivace alarmu (prozvoneni), takhle samo o sobe alarm vypne # DPC ALA MOT/PIR/VSE zapne alarm z pozadovaneho zdroje, posle potvrzujici sms #DPC MOT aktivace/deaktivace programu motion, samo o sobe posle sms se stavem # DPC MOT VYP/ZAP posle vypis ps -e|grep motion, nebo motion vypnut #DPC PIR -"- pro pir #DPC CMD co nasleduje se preda jako prikaz bashi, vrati sms s vysledkem #DPC TLK posle sms s vystupem skriptu tlakteplota.py, pokud je pustenej #co nedekoduje jako prikaz to preposle #David Pleskot, 2016 import gsmmodule as gsm import time import os from datetime import datetime zdrfile='/home/pi/ramdisk/zdroj' logname='/home/pi/gsm.log' limit=1000 #maximalni pocet radku logu max_pocet_sms=20 #max. pocet sms odeslanych v ramci jedne odpovedi cislo='+420123456789' #doplnit svoje cislo def loguj(co): if not os.path.isfile(logname): f=open(logname,'a') f.close() f=open(logname,'r+') old=f.read() #prectu vsechno f.seek(0) #prejedu na zacatek f.write(co+'\n'+old) f.close() return def otestuj(): i=0 while gsm.initgsm()!=0: #kdyz se nepovede zinicializovat, tak nema smysl pokracovat i=i+1 if i>5: #resetuju gsm modul, max. 5x f=open(zdrfile,'w') f.write('gsm reset') f.close() ii=0 while os.path.isfile(zdrfile): ii=ii+1 if ii>40: break time.sleep(1) if i>10: #nenaskocilo, tak shodim skript loguj(str(datetime.now())+' gsm modul se nehlasi, script ukoncen') exit(1) time.sleep(1) def ctiradek(fajl, minut_limit): radek=fajl.readline() try: lindat=datetime.strptime(radek[:19],'%Y-%m-%d %H:%M:%S') except: return('') rozdil=datetime.now()-lindat deltamin=(rozdil.days*24*60)+(rozdil.seconds/60) if deltamin>minut_limit: return('') else: return(radek[5:19]+radek[26:len(radek)-1]) loguj(str(datetime.now())+' script spusten') gsm.inituart() otestuj() gsm.smaz_vsechny_sms() while True: otestuj() if os.path.isfile('/home/pi/ramdisk/alarm'): gsm.vytoc(cislo) try: os.system('rm /home/pi/ramdisk/alarm') except: time.sleep(1) os.system('rm /home/pi/ramdisk/alarm') indexy=gsm.indexy_sms('ALL') if len(indexy)>0: carka=indexy.find(',') if carka>0: index=indexy[:carka] else: index=indexy text=gsm.cteni_sms(index) #print(text) #print(index) #print(indexy) time.sleep(1) #kdyz jsem tam dal ty printy, tak to oprestalo zlobit, takze to chce asi zpozdeni gsm.smaz_sms(index) loguj(str(datetime.now())+' prijata sms: '+text) #****************************** if text.find('DPC WEB')!=-1: #poslani fotky na sweb ok=True try: os.system('fswebcam -d /dev/video1 --skip 4 --rotate 180 /home/pi/ramdisk/d.jpg >/dev/null 2>&1') except: #kamerku nejspis pouziva jinej skript, dam mu 2s a zkusim znova time.sleep(2) ok=False if ok==False: try: os.system('fswebcam -d /dev/video1 --skip 4 --rotate 180 /home/pi/ramdisk/d.jpg >/dev/null 2>&1') except: gsm.posli_sms(cislo, 'problem, kamera /dev/video1 je zrejme nedostupna') loguj(str(datetime.now())+' problem, kamera /dev/video1 je zrejme nedostupna') else: ok=True if ok: pokusu=5 ch=1 while (pokusu>0) and (ch>0): ch=gsm.ftpodesli('/home/pi/ramdisk/d.jpg') pokusu=pokusu-1 if ch>0: gsm.closegprs() os.system('rm /home/pi/ramdisk/d.jpg') if ch==0: gsm.vytoc(cislo) else: loguj(str(datetime.now())+' problem, nepodarilo se uploadnout fotku') #****************************** elif text.find('DPC EVE')!=-1: #vypis eventu zacatek=text.find('DPC EVE') if (len(text)-zacatek)>=13: #napr. DPC EVE MOT 10 evzdr=text[zacatek+8:zacatek+11] #MOT pro motion, PIR pro pir a VSE nebo cokoliv pro oboji minut=text[12:] if not minut.isdigit(): iminut=10 #kdyz to bude neplatny cislo, tak defaultne 10 minut else: iminut=int(minut) zprava=[] if evzdr!='MOT': try: soub=open('/home/pi/pir.log','r') except: print('pir.log neni') else: t=ctiradek(soub,iminut) while len(t)>0: zprava.append('P'+t) t=ctiradek(soub,iminut) soub.close() if evzdr!='PIR': try: soub=open('/home/pi/motion.log','r') except: print('motion.log neni') else: t=ctiradek(soub,iminut) while len(t)>0: zprava.append('M'+t) t=ctiradek(soub,iminut) soub.close() prohazuju=True #zacatek serazeni (probublavani) while prohazuju: prohazuju=False for i in range(len(zprava)-1): d1=datetime.strptime(zprava[i][1:15],'%m-%d %H:%M:%S') d2=datetime.strptime(zprava[i+1][1:15],'%m-%d %H:%M:%S') if d10: m=divmod(delkasms, 160) if m[0]>max_pocet_sms: m[0]=max_pocet_sms m[1]=0 if m[0]>0: for i in range(m[0]): gsm.posli_sms(cislo, strzprava[i*160:(i+1)*160]) if m[1]>0: gsm.posli_sms(cislo, strzprava[m[0]*160:]) else: gsm.posli_sms(cislo, 'zadne udalosti') #****************************** elif text.find('DPC ALA')!=-1: #aktivace/deaktivace alarmu zacatek=text.find('DPC ALA') if (len(text)-zacatek)>=11: #napr. DPC ALA MOT alzdr=text[zacatek+8:zacatek+11] #MOT pro motion, PIR pro pir, VSE nebo cokoliv pro oboji, nic pro vypnuti if alzdr!='MOT': s=open('/home/pi/ramdisk/alarm_pir','w') s.close() if alzdr!='PIR': s=open('/home/pi/ramdisk/alarm_mot','w') s.close() else: if os.path.isfile('/home/pi/ramdisk/alarm_pir'): os.system('rm /home/pi/ramdisk/alarm_pir') if os.path.isfile('/home/pi/ramdisk/alarm_mot'): os.system('rm /home/pi/ramdisk/alarm_mot') zprava='alarm:' if os.path.isfile('/home/pi/ramdisk/alarm_pir'): zprava=zprava+' pir' if os.path.isfile('/home/pi/ramdisk/alarm_mot'): zprava=zprava+' motion' if len(zprava)<=6: zprava=zprava+' vypnuto' gsm.posli_sms(cislo, zprava) #poslu potvrzeni #****************************** elif text.find('DPC MOT')!=-1: #aktivace/deaktivace motion zacatek=text.find('DPC MOT') if (len(text)-zacatek)>=11: #napr. DPC MOT VYP sts=text[zacatek+8:zacatek+11] if sts=='VYP': if os.path.isfile('/home/pi/motion.pid'): f=open('/home/pi/motion.pid','r') os.system('sudo kill '+f.readline()[:-1]) f.close() else: os.system('ps -e|grep motion >/home/pi/ramdisk/mot') f=open('/home/pi/ramdisk/mot','r') if f.read()=='': os.system('motion -c /home/pi/muj_motion.conf >/dev/null 2>&1') f.close() time.sleep(10) #motion potrebuje nejakej cas aby se bezpecne vypnul os.system('ps -e|grep motion >/home/pi/ramdisk/mot') f=open('/home/pi/ramdisk/mot','r') t=f.read() if t=='': t='motion vypnut' f.close() gsm.posli_sms(cislo,t) #****************************** elif text.find('DPC PIR')!=-1: #aktivace/deaktivace pir.py zacatek=text.find('DPC PIR') if (len(text)-zacatek)>=11: #napr. DPC PIR VYP sts=text[zacatek+8:zacatek+11] os.system('pidof -x pir.py >/home/pi/ramdisk/pir') f=open('/home/pi/ramdisk/pir','r') t=f.readline() f.close() if sts=='VYP': os.system('sudo kill -KILL '+t[:-1]) else: if t=='': os.system('/home/pi/pir.py & >/dev/null 2>&1') os.system('ps -e|grep pir.py >/home/pi/ramdisk/pir') f=open('/home/pi/ramdisk/pir','r') t=f.readline() f.close() if t=='': t='pir.py vypnut' gsm.posli_sms(cislo,t) #****************************** elif text.find('DPC CMD')!=-1: #prikaz pro bash zacatek=text.find('DPC CMD') os.system(text[zacatek+8:]+' >/home/pi/ramdisk/cmdvysledek 2>&1') f=open('/home/pi/ramdisk/cmdvysledek') t=f.read() d=len(t)-1 if d>160: d=160 gsm.posli_sms(cislo,t[:d]) #****************************** elif text.find('DPC TLK')!=-1: #tlak a teplota if os.path.isfile('/home/pi/ramdisk/tempres'): f=open('/home/pi/ramdisk/tempres','r') gsm.posli_sms(cislo, f.read().replace('\n',' ')) f.close() #****************************** else: gsm.posli_sms(cislo, text) #preposlu sms #print(text) fi=open(logname,"r") #kdyz je log moc dlouhej radku=sum(1 for line in fi) if radku>limit: fi.seek(0) lines=fi.readlines() fi.close() for i in range(radku-limit): del lines[-1] fi=open(logname,"w") fi.writelines(lines) fi.close()