#!/usr/bin/python2 #David Pleskot, 2016 #watchdog je na GPIO17, pin 11 from __future__ import print_function import smbus import time import os import RPi.GPIO as GPIO from datetime import datetime #skript na komunikaci se zdrojem #nema hlidani delky logfajlu, predpokladam ze se moc rychle plnit nebude #gsm modul se resetuje zapisem 'gsm reset' do souboru zdroj na ramdisku bus=smbus.SMBus(1) filename='/home/pi/ramdisk/zdroj' logfile='/home/pi/zdroj.log' def loguj(co): if not os.path.isfile(logfile): f=open(logfile,'a') f.close() f=open(logfile,'r+') old=f.read() #prectu vsechno f.seek(0) #prejedu na zacatek f.write(co+'\n'+old) f.close() return def cti(): try: data=bus.read_i2c_block_data(0x24,0,3) except IOError: data=(0,0,0) return(data) def pis(stat): try: bus.write_i2c_block_data(0x24,stat,[]) except IOError: print('nelze cist z i2c adresy 0x24, zdroj') return def cti_status(): cti() time.sleep(0.2) dat=cti() return(dat[2]) def mer(): stat=cti_status() if (stat&0xF0)==0xA0: pis(stat|0xA1) time.sleep(0.3) data=cti() if ((data[2]&0xF0)==0xA0) and (data[1]>0) and (data[0]>0): vysledek=data[0]*256+data[1] else: vysledek=0x8000 else: vysledek=0x8000 return(vysledek) GPIO.setwarnings(False) mode=GPIO.getmode() if mode==None: GPIO.setmode(GPIO.BOARD) mode=GPIO.BOARD if mode==GPIO.BOARD: cislo_portu=11 else: cislo_portu=17 GPIO.setup(cislo_portu, GPIO.OUT, initial=GPIO.HIGH) def preklop(): if GPIO.input(cislo_portu)==GPIO.HIGH: GPIO.output(cislo_portu, GPIO.LOW) else: GPIO.output(cislo_portu, GPIO.HIGH) nizke=False nemam=False loguj('%s nahozeno'% str(datetime.now())) pis(0xA4) time.sleep(0.3) data=cti() if data[2]!=0xA4: loguj('%s nepodarilo se nahodit watchdog'% str(datetime.now())) while True: napeti=mer() if napeti>0x3FF: if nemam==False: loguj('%s chyba, nemam data ze zdroje'% str(datetime.now())) nemam=True else: if nemam==True: loguj('%s spojeni obnoveno'% str(datetime.now())) nemam=False if napeti<0x33C: loguj('%s vybity akumulator !'% str(datetime.now())) if (nizke==True): pis(0xA2) time.sleep(0.3) data=cti() if data[2]==0xA2: loguj('%s vypinam se'% str(datetime.now())) os.system("/home/pi/vypnuti.py") else: nizke=True else: nizke=False if os.path.isfile(filename): #prikazy ze systemu f=open(filename,'r') radek=f.readline() f.close() if radek.find('gsm reset')>=0: s=cti_status() if (s&0xF0)==0xA0: pis(s|0xA8) time.sleep(10) pis(s&0xA7) try: os.remove(filename) except: time.sleep(1) os.remove(filename) loguj('%s gsm reset'% str(datetime.now())) preklop() time.sleep(20)