Raspberry PI GPIO + Datenbank

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Becklin
User
Beiträge: 4
Registriert: Freitag 22. Mai 2015, 17:14

Schönen guten Tag,

ich habe nicht sehr viel Ahnung von Python, habe mir aber ein Script aus dem Netz gesucht
und mit anderen Komponenten zusammengefügt.

Mein Script überprüft ob ein Eingangssignal von einem GPIO Pin ankommt oder nicht.
Dies wird ausgelöst in dem ein Magnetkontakt geöffnet oder geschlossen wird.

Wenn der Magnetkontakt sich öffnet, schreibt das Script einmal in eine Textdatei und zum anderen in eine Datenbank.
Das Problem ist, das es zuerst funktioniert, aber irgendwann ist das Script einfach ohne Grund beendet.
Das Script wird über init.d gestartet.


Code: Alles auswählen

#!/usr/bin/python
from time import *
import os, sys
import time
import RPi.GPIO as GPIO

import MySQLdb 
def main():


    GPIO.setmode(GPIO.BCM)


    GPIO.setup(23,GPIO.IN)


    note_open_door =0
   
    
    mysql = MySQLdb.connect(host="",user="",passwd="",db="tuer") 
	


    while True:
        if GPIO.input(23):

            lt = localtime()
            zeit= strftime("%d.%m.%Y", lt) +" "+ strftime("%H:%M:%S"+"\n", lt)
            datei = open("/var/www/zeit.txt", "a")
            datei.write(zeit)
                 
            datei.close()  
            cursor = mysql.cursor()
            cursor.execute("INSERT INTO tuer.dooropen (id, time) VALUES (NULL, '"+ zeit +"');")
            datei_onoff = open("/var/statuspin32.txt", "w")
            datei_onoff.write("auf")
            datei_onoff.close() 
                
            print ("Tuer auf!")
                 

        else:
            datei_onoff = open("/var/statuspin32.txt", "w")
            datei_onoff.write("zu")
            datei_onoff.close() 
            

        time.sleep(0.1)

    

    GPIO.cleanup()



if __name__=="__main__":
    main()



Mit freundlichem Gruß

Becklin
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das kann ja viele Ursachen haben!

Wenn Du das Script in einer Shell startest, solltest Du die Fehlermeldung sehen und hier posten können. Aktuell können wir nur spekulieren.

Die Endlosschleife kann *niemals* ohne das Auftreten einer Exception verlasen werden - daher ist der Aufruf ``GPIO.cleanup()`` in Zeile 53 recht sinnfrei.

Ich tippe mal darauf, dass die Datenbank die Verbindung nicht endlos lange offen hält und es dann zu einer Ausnahme in Zeile 33 kommt. Es kann natürlich auch an einem Problem beim Dateihandling liegen, denn auch das ist alles andere als sauber.

Generell sieht der Code echt unaufgeräumt aus... Haufen von sinnlosen Leerzeilen usw. (Und dann zwischen Zeile 7 und 8 fehlt dann ausgerechnet eine :mrgreen: )

Ok, Du kannst kein Python, aber so ein wenig den Styleguide blättern könntest Du ja schon; insbesondere, wenn Du Code hier postest ;-)

Also ganz wichtig: Programm in einer Shell starten und uns dann die Meldung *vollständig* hier rein posten!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Becklin
User
Beiträge: 4
Registriert: Freitag 22. Mai 2015, 17:14

Also ich leite via autostart alle Inhalte die das Script ausgegeben hat in eine Text Datei.
Außer die Inhalte die via print ausgegeben werden, ist leider nichts vorhanden.
BlackJack

@Becklin: Leitest Du auch die Fehlerausgabe in die Datei um?
Becklin
User
Beiträge: 4
Registriert: Freitag 22. Mai 2015, 17:14

So ein Fehler ausgegeben:

Code: Alles auswählen

'Unbekannter Fehler: ', <class '_mysql_exceptions.OperationalError'>)
Aber was ist das Problem?
BlackJack

@Becklin: Wie kommt denn diese Ausgabe zustande? Ein normaler Traceback sollte mehr Informationen enthalten als das anscheinend selbst gebastelte dort. Zum Beispiel *wo* die Ausnahme auftritt und mindestens die Fehlerbeschreibung die von der Datenbank kommt.
Becklin
User
Beiträge: 4
Registriert: Freitag 22. Mai 2015, 17:14

Und wie?
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Becklin: wenn Du das oben gepostete Programm ausführst, kann die gezeigte Fehlermeldung nicht die komplette Meldung sein.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Starte das Programm doch einfach mal *direkt* in einer Shell und lass es laufen, bis der Fehler auftritt. Dann hast Du den kompletten Traceback!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Ergänzend zu Sirius3: Das kann nicht einmal die inkomplette Meldung sein bei dem gezeigten Quelltext. :-)
Antworten