Anfängerfrage
Verfasst: Samstag 12. Oktober 2019, 17:07
Hallo zusammen,
ich habe bisher nicht in Python programmiert dafür jede Mende in Visual Basic.
War natürlich damals alles unter Windows.
Ich habe nun ein wohl ziemlich dummes Problem:
ich habe aus einem Buch ein RFID-Türschloss-Projekt nachgebaut. Im Code (konnte ich runterladen) sollten keine Fehler sein aber dennoch habe ich en interessante Phänomen:
Starte ich das Python Script über mu, so funktioniert alles bestens. Sobald ich es in einem Shell-Fenster über das Kommando
python main.py starte, kommen nur Fehlermeldungen und das Script bricht ab.
Muss ich für den Start des Scripts direlt aus einer Shell heraus andere Bibliotheken includen als für mu notwendig? Ich war der Annahne dass die Bibliothek sys eigentlich ausreichen müsste, um die Print-Befehle etc. richtig auszugeben.
Ich steige da nicht ganz durch.
Mier mal die Listings (main.py und funkctions.py), vielleicht hat jemand einen Tipp:
#!/usr/bin/python3
# Datei main.py
import RPi.GPIO as GPIO # Laden der GPIO-Funktionen
from functions import * # import aller Funktionen
import time.sys # Laden der Zeitstempel-Funktionen
GPIO.setmode(GPIO.BOARD) # GPIO Parameter setzen
GPIO.setup(13,GPIO.OUT) # GPIO-Pin13 als Ausgang
db = DB() # die DB mit den RFIDs
time_open = 10 # Dauer der Tueroeffnung, hier 10 Sekunden
try:
while True:
print ("Warte auf Transponder...\n") # Aufforderung, einen RFID-Tag anzumelden
id = read_rfid() # Lesen was der RFID-Reader bekommen hat
check = db.mysql_read(id) # Test, ob die eingelesene ID in der RFID-Datenbank drin ist
if check[1] != 0: # Falls ID gefunden wurde, wird ein Array mit allen Daten der ID kommen
print ("Hallo", check[1],"\n") # Begruessung des gefundenen Users
print ("Tuer ist ",time_open," Sekunden offen") # Meldung, dass die Tuer 10 Sekunden geoeffnet wird
db.update_timestamp(id) # Zeitstempel neu holen
GPIO.output(13, True) # GPIO-Pin13 bekommt ein true (Relais zieht an)
time.sleep(time_open) # 10 Sekunden warten
GPIO.output(13, False) # GPIO-Pin13 bekommt ein False (Relais faellt ab)
else: # unbekannten RFID-Tag erkannt
print ("Transpondernummer ", id, " unbekannt!")
print ("Kein Zutritt zum Vereinsheim!")
continue # weiter machen
except KeyboardInterrupt: # z.B. CTRL-C
db.close_db() # Datenbank schliessen
GPIO.cleanup() # GPIO deaktivieren
sys.exit() # beenden
#!/usr/bin/python3
# coding=utf8
# Datei functions.python3
import serial
import pymysql
import sys
# Auslesen der RFID-Transponder
def read_rfid():
ser = serial.Serial("/dev/serial0")
ser.baudrate = 9600
daten = ser.read(14)
ser.close()
daten = daten.replace(b'\x02', b'')
daten = daten.replace(b'\x03', b'')
return daten
class DB():
def __init__(self):
db = pymysql.connect(host="localhost", user="pi",
passwd="Klabautermann", db="rfid")
db.autocommit(True)
self.cur = db.cursor()
def close_db( self ):
self.cur.close()
def add_user(self,rfid_id, name):
add=self.cur.execute("INSERT INTO user (rfid, name) " +
"VALUES (%s,%s)", (rfid_id, name))
def mysql_read(self, rfid_id):
a=self.cur.execute("SELECT id, name, timestamp, rfid " +
"FROM user WHERE rfid = %s" ,rfid_id)
id = 0
name = 0
timestamp = 0
rfid = 0
for row in self.cur.fetchall():
id = int(row[0])
name = str(row[1])
timestamp = str(row[2])
rfid = str(row[3])
return id, name, timestamp, rfid
def update_timestamp(self, rfid_id):
a = self.cur.execute("UPDATE user SET timestamp = NOW() " +
"WHERE rfid = %s" ,rfid_id)
ich habe bisher nicht in Python programmiert dafür jede Mende in Visual Basic.
War natürlich damals alles unter Windows.
Ich habe nun ein wohl ziemlich dummes Problem:
ich habe aus einem Buch ein RFID-Türschloss-Projekt nachgebaut. Im Code (konnte ich runterladen) sollten keine Fehler sein aber dennoch habe ich en interessante Phänomen:
Starte ich das Python Script über mu, so funktioniert alles bestens. Sobald ich es in einem Shell-Fenster über das Kommando
python main.py starte, kommen nur Fehlermeldungen und das Script bricht ab.
Muss ich für den Start des Scripts direlt aus einer Shell heraus andere Bibliotheken includen als für mu notwendig? Ich war der Annahne dass die Bibliothek sys eigentlich ausreichen müsste, um die Print-Befehle etc. richtig auszugeben.
Ich steige da nicht ganz durch.
Mier mal die Listings (main.py und funkctions.py), vielleicht hat jemand einen Tipp:
#!/usr/bin/python3
# Datei main.py
import RPi.GPIO as GPIO # Laden der GPIO-Funktionen
from functions import * # import aller Funktionen
import time.sys # Laden der Zeitstempel-Funktionen
GPIO.setmode(GPIO.BOARD) # GPIO Parameter setzen
GPIO.setup(13,GPIO.OUT) # GPIO-Pin13 als Ausgang
db = DB() # die DB mit den RFIDs
time_open = 10 # Dauer der Tueroeffnung, hier 10 Sekunden
try:
while True:
print ("Warte auf Transponder...\n") # Aufforderung, einen RFID-Tag anzumelden
id = read_rfid() # Lesen was der RFID-Reader bekommen hat
check = db.mysql_read(id) # Test, ob die eingelesene ID in der RFID-Datenbank drin ist
if check[1] != 0: # Falls ID gefunden wurde, wird ein Array mit allen Daten der ID kommen
print ("Hallo", check[1],"\n") # Begruessung des gefundenen Users
print ("Tuer ist ",time_open," Sekunden offen") # Meldung, dass die Tuer 10 Sekunden geoeffnet wird
db.update_timestamp(id) # Zeitstempel neu holen
GPIO.output(13, True) # GPIO-Pin13 bekommt ein true (Relais zieht an)
time.sleep(time_open) # 10 Sekunden warten
GPIO.output(13, False) # GPIO-Pin13 bekommt ein False (Relais faellt ab)
else: # unbekannten RFID-Tag erkannt
print ("Transpondernummer ", id, " unbekannt!")
print ("Kein Zutritt zum Vereinsheim!")
continue # weiter machen
except KeyboardInterrupt: # z.B. CTRL-C
db.close_db() # Datenbank schliessen
GPIO.cleanup() # GPIO deaktivieren
sys.exit() # beenden
#!/usr/bin/python3
# coding=utf8
# Datei functions.python3
import serial
import pymysql
import sys
# Auslesen der RFID-Transponder
def read_rfid():
ser = serial.Serial("/dev/serial0")
ser.baudrate = 9600
daten = ser.read(14)
ser.close()
daten = daten.replace(b'\x02', b'')
daten = daten.replace(b'\x03', b'')
return daten
class DB():
def __init__(self):
db = pymysql.connect(host="localhost", user="pi",
passwd="Klabautermann", db="rfid")
db.autocommit(True)
self.cur = db.cursor()
def close_db( self ):
self.cur.close()
def add_user(self,rfid_id, name):
add=self.cur.execute("INSERT INTO user (rfid, name) " +
"VALUES (%s,%s)", (rfid_id, name))
def mysql_read(self, rfid_id):
a=self.cur.execute("SELECT id, name, timestamp, rfid " +
"FROM user WHERE rfid = %s" ,rfid_id)
id = 0
name = 0
timestamp = 0
rfid = 0
for row in self.cur.fetchall():
id = int(row[0])
name = str(row[1])
timestamp = str(row[2])
rfid = str(row[3])
return id, name, timestamp, rfid
def update_timestamp(self, rfid_id):
a = self.cur.execute("UPDATE user SET timestamp = NOW() " +
"WHERE rfid = %s" ,rfid_id)