几个小时后Python脚本部分处于非活动状态 - Raspberry Pi

时间:2017-04-30 09:43:55

标签: python mysql raspberry-pi telegram gpio

我为Raspberry Pi编写了一个Python脚本,以监控4个GPIO输入的变化,将它们写入数据库并通过电报机器人向我的手机发送消息。

一切正常,但几个小时后,脚本的某些进程关闭。该脚本仍在运行(从日志文件开始),但尤其是GPIO事件检测和电报bot API停止工作。这主要发生在一夜之间。

因为它在启动后的前几个小时完全正常,我想它不应该是程序中的错误,但你永远不会知道。

我通过rc.local启动了该脚本,但切换到System.d以便在启动时运行。适用于此。

简而言之:脚本运行良好,但几个小时后脚本中的某些功能变为非活动状态(GPIO事件检测,日志消息,电报API - 有点感觉就像Pi正在睡着)。

#!/usr/bin/env python

#Import libraries
import time
import RPi.GPIO as GPIO
import telepot
import MySQLdb
import os.path
import logging
import datetime

#start logging
logfile = '/home/pi/Betrieb/logs/log_'+datetime.datetime.now().strftime("%Y-%m-%d_%H-%M")
logging.basicConfig(filename=logfile,level=logging.DEBUG,format='%(asctime)s %(message)s')
logging.debug('=========================================================')
logging.debug('Logging started!')

#initialize connection to Telegram bot
bot = telepot.Bot('##########################################')

#Connect to MySQL-database
con = MySQLdb.connect('localhost',"root","###########","################")
c = con.cursor()

###########################################################################################################

class User:

    def __init__(self, id, name, user_id, enable):
        self.id = id
        self.name = name
        self.chat_id = user_id
        self.enable = enable

class Machine:

    def __init__(self, id, number, name, pin, enable):
        self.id = id
        self.number = number
        self.name = name
        self.pin = pin
        self.enable = enable

###########################################################################################################
def my_callback(pin):
    c.execute("SELECT name FROM machines WHERE pin=%s" % pin)
    con.commit()
    data = c.fetchall()
    for set in data:
        machine_name=set[0]
        ### Attention: multiple sets with same ID can exist



    if GPIO.input(pin):
        print "Rising edge detected "+str(pin)

        string = "INSERT INTO malfunction(machine_name,machine_pin,status) VALUES('%s',%s,1)" % (machine_name,pin)
        c.execute(string)
        con.commit()

        for i in range(0,len(user)):        
            if user[i].enable:
                bot.sendMessage(user[i].chat_id,"Stoerung "+ machine_name)
                print "Sent message to", user[i].name               
                logging.debug('Detected malfunction on Pin %s and sent message to %s', str(pin), user[i].name)


    else:  
        print "Falling edge detected on "+str(pin)      

        string = "INSERT INTO malfunction(machine_name,machine_pin,status) VALUES('%s',%s,0)" % (machine_name,pin)
        c.execute(string)
        con.commit()

        for i in range(0,len(user)):
            if user[i].enable:
                bot.sendMessage(user[i].chat_id,"Stoerung behoben "+ machine_name) 
                print "Sent message to", user[i].name   

                logging.debug('Solved malfunction on Pin %s and sent message to %s', str(pin), user[i].name)



def updateData():
    global machine
    global user

    logging.debug('Update data.')

    #Update user data    
    c.execute("SELECT * FROM telegram_users")
    con.commit()
    data = c.fetchall()        

    user = []
    del user[:]

    for set in data:
        newUser = User(set[0],set[1],set[2],set[3])
        user.append(newUser)    


    #Update machine data
    try: 
        machine
    except NameError:
        machine = []
    else:

        for i in range(0,len(machine)):
            if machine[i].enable:
                GPIO.remove_event_detect(machine[i].pin)
        del machine[:]

    c.execute("SELECT * FROM machines")
    con.commit()
    data = c.fetchall()        

    GPIO.setmode(GPIO.BCM)
    for set in data:
        # 0 = id / 1 = number / 2 = name / 3 = pin / 4 = enable #
        newMachine = Machine(set[0],set[1],set[2],set[3],set[4])
        machine.append(newMachine)
        if set[4]:
            GPIO.setup(set[3], GPIO.IN, pull_up_down = GPIO.PUD_DOWN)    
            GPIO.add_event_detect(set[3], GPIO.BOTH, callback=my_callback, bouncetime=300)

            logging.debug('Added Event Detect on Pin %s', set[3])

###########################################################################################################

updateData()

logging.debug('Initial Update finished. Start looping.')

Counter = 0
while True:
    Counter +=1
    if Counter == 600:
        logging.debug('Still running!')
        Counter = 0


    time.sleep(1);
    lockfile = "/home/pi/Betrieb/lockfiles/request_update"
    if os.path.isfile(lockfile):
        os.remove(lockfile)
        updateData()
        print "Data updated."
        logging.debug('Deleted lockfile and updated data.')

0 个答案:

没有答案