Moin,
ich bin neu hier im Forum und sage an alle erstmal ein herzliches Hallo.
Ich bin neuling was den Pi und vorallem Python angeht, aus diesem Grund brauche ich unbedingt eure Hilfe.
Ich habe mir ein Pythonscript erstellt (die Grundlage habe ich mir von hier: ElektronX geholt.
Das Script habe ich nun an meine Bedürfnisse angepasst, ich weiß es ist noch lange nicht perfekt! :s
Nun aber zu meinem Problem: Das Script habe ich in den Autostart (/etc/rc.local) des Pi gepackt und es läuft auch sehr gut. Wenn ich den Pi die Nacht über laufen lasse bricht er mein Script einfach ab, und ich weiß nicht wann und vorallem nicht wieso.
Meine Vermutung war: Die Datenbank wirft standartmäßig nach 1440Sek. ein Timeout, aus diesem Grund habe ich diese Zeilen hinzugefügt (ohne Erfolg) =(
# Wenn Datenbankzugriff durch timeout beendet wurde, stell neue Verbindung her.
if db == 0:
print "Verbindung fehlgeschlagen: Verbindung wird neu aufgabeut!"
db = MySQLdb.connect(host="localhost", user="root", passwd="*********", db="rfid")
#!/usr/bin/python
from sys import exit
import RPi.GPIO as GPIO
from time import *
from funktionen import *
import MySQLdb
import datetime
opentime = 10 # Zeit in der die Tuer geoeffnet bleibt
while True:
# Verbindung zur DB herstellen.
db = MySQLdb.connect(host="localhost", user="root", passwd="*********", db="rfid").
# Cursorfunktion in Variable schreiben....
cur = db.cursor()
# Zeige Bitte Karte einscannen
print ("Bitte Karte einscannen")
..
# Lese Karte aus
for i in range(1):
card = rfid()
#SQL Abfrage. Hier werden die Werte aus "name, count" fuer den Datensatz mit der eingescannten Kartennnummer (cid) ausgelesen
a= cur.execute("SELECT name,lastacc,prio,cid FROM user WHERE cid = %s" ,card )
# Wenn Datenbankzugriff durch timeout beendet wurde, stell neue Verbindung her.
if db == 0:
print "Verbindung fehlgeschlagen: Verbindung wird neu aufgabeut!"
db = MySQLdb.connect(host="localhost", user="root", passwd="*********", db="rfid")
cur = db.cursor()
#Falls Karte nicht in DB eingetragen, wird der Zutritt verweigert und die Schleife staret neu
if a == 0:
prio = 3
print ("Karte nicht erlaubt!")
i = datetime.datetime.now()
date = ("%s-%s-%s-%s-%s-%s" % (i.year, i.month, i.day, i.hour, i.minute, i.second))
print "Es ist der %02i.%02i.%04i %02i:%02i:%02i" % (i.day,i.month,i.year,i.hour,i.minute,i.second)
cursor = db.cursor()
cursor.execute("INSERT INTO user (datum,cid, prio) VALUES (%s ,%s, %s)",(date,card,prio,))
cursor.close()
db.commit()
db.close()
continue
# Wenn Kartennnummer in DB gefunden wurde, werden die 3 Werte zur weiteren Verarbeitung in Variablen geschrieben....
else:
for row in cur.fetchall():
prio = int(row[2])
name = str(row[0])
# Funktion um die aktuelle Zeit und Datum in Variablen zu schreiben......
u = datetime.datetime.now()
date2 = ("%s-%s-%s-%s-%s-%s" % (u.year, u.month, u.day, u.hour, u.minute, u.second))
# Wenn prio = 3 update der Karten ID.
if prio == 3:
print ("Karte nicht erlaubt!")
k = datetime.datetime.now()
date3 = ("%s-%s-%s-%s-%s-%s" % (k.year, k.month, k.day, k.hour, k.minute, k.second))
print "Es ist der %02i.%02i.%04i %02i:%02i:%02i" % (k.day,k.month,k.year,k.hour,k.minute,k.second)
cu = db.cursor()
cu.execute("UPDATE user SET datum='%s' WHERE cid='%s' " % (date3, card))
cu.close()
db.commit()
db.close()
date3 = ()
continue
else:
print "Es ist der %02i.%02i.%04i %02i:%02i:%02i" % (u.day,u.month,u.year,u.hour,u.minute,u.second)
.
# Wenn Prio = 1 oeffne Tuer 1 & 2 und schliesse diese nach x Sekunden
if prio == 1:
lastacc = int(row[1])
lastacc1 = lastacc + 1
t = datetime.datetime.now()
date4 = ("%s-%s-%s-%s-%s-%s" % (t.year, t.month, t.day, t.hour, t.minute, t.second))
print ("Guten Tag",name)
sleep(1)
print ("Tuer 1 & 2 offen", "fuer "+str(opentime)+" Sek")
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(9,GPIO.OUT)
GPIO.setup(10,GPIO.OUT)
GPIO.output(9, False)
GPIO.output(10, False)
sleep (opentime)
GPIO.output(9, True)
GPIO.output(10, True)
print ("Tuer 1 & 2 wieder", "verriegelt")
sleep(1)
curs = db.cursor()
curs.execute("UPDATE user SET datum='%s', lastacc = %s, prio = %s WHERE cid='%s' " % (date2, lastacc1, prio, card))
curs.close()
db.commit()
db.close()
date2 = ()
continue
else:
# Wenn prio = 2 oeffne Tuer 1 und schliesse diese nach x Sekunden
if prio == 2:
lastacc = int(row[1])
lastacc2 = lastacc + 1
print ("Guten Tag",name)
sleep(1)
print ("Tuer 1 offen", "fuer "+str(opentime)+" Sek")
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(10,GPIO.OUT)
GPIO.output(10, False)
sleep (opentime)
GPIO.output(10, True)
print ("Tuer 1 wieder", "verriegelt")
sleep(1)
curse = db.cursor()
curse.execute("UPDATE user SET datum='%s', lastacc = %s, prio = %s WHERE cid='%s' " % (date2, lastacc2, prio, card))
curse.close()
db.commit()
db.close()
date2 = ()
continue
# While Schleife beginnt von vorn und wartet auf einscannen einer Karte
GPIO.cleanup()
Alles anzeigen
Bin für jede Hilfe dankbar!!!
Und bitte fragt mich nicht warum ich das Datum ständig neu auslese, ich habe alles versucht und nur das hat so funktioniert wie ich es wollte.
Aber für Verbesserungsvorschläge bin ich natürlich offen