Schrankensteuerung V1.2

Ich habe nun schon ein paar weitere Schrankensteuerungen in Betrieb genommen. Diese funktionieren sehr gut. Bei einem Kunden kam dann sogar eine spezielle Version zum Einsatz. Dort wird ist eine Säule betrieben. Da es kurz vor der Ausfahrt eine Einmündung gibt und die LKW von dort nicht an die Normale Säule kommen. Auf dem Pi dort läuft eine leicht modifiziert Version der Software. Diese ruft eine CGI Seite auf dem 'Master Pi' auf und öffnet damit dann die Schranke.

Hier erst einmal die Bilder vom Aufbau

Relaismodule Relaismodule

Hier der Python Code dazu:

#!/usr/bin/python
# Hier die Libs einbinden
import MySQLdb
import urllib
import time
import datetime
import RPi.GPIO as GPIO

"""
    ************************************************************************************
    ** Hier die Datenbank verbindung eintragen
    ************************************************************************************
"""

MYSQL_Host = "SQL Datenbank Server"
MYSQL_User = "UserName"
MYSQL_Passwd = "Passwort"
MYSQL_DB = "Datenbank Name"

# Ansteuern eines Externen Pi fuer die Schranke     1 - Aktiv
GET_URL = 0
# Adresse der Externen Pi                  Nur falls Aktiv
CGI_URL = "123.123.123.123/cgi-bin/read.py"
# Sperren des Barcodes nach dem Scannen            1 - Sperren nach dem Scannen
SET_SPERRE = 0
# Standort Parkplatz                    1 - Sonderfall Parkplatz
SET_PARKPLATZ = 0

#Name des Gast Pi
MYNAME="Name der Pi fuer das Logging"

"""
    ************************************************************************************
    ** Ab Hier nichts mehr aendern
    ************************************************************************************
"""

GPIO.setmode(GPIO.BCM)
# set up the GPIO channels - one input and one output
# OK Meldung
GPIO.setup(24, GPIO.OUT)    
# Fehler Meldung
GPIO.setup(23, GPIO.OUT)
# IOS auf Low setzen
GPIO.output(23, GPIO.LOW)
GPIO.output(24, GPIO.LOW)

#0.5 Sek warten
time.sleep(0.5)

"""
    ************************************************************************************
    ** Funktionsdeklarationen
    ************************************************************************************
"""

"""
    Hier die Datenbank verbindung erstelle. Fehlertolerant
"""
def ConnectMYSQL(MyHost,MyUser,MyPass,MyDB):
    lok = 0

    print "Connection DB"

    while lok == 0 :
        try:    
            conn = MySQLdb.connect(host=MyHost,user=MyUser, passwd=MyPass,db=MyDB)
            lok = 1
        except:
            lok = 0
    return conn

"""
    Logging Informationen ausgeben Parameter : logtext (zu loggender Text),key (0-Systemfehler,1-StatusInfo), connection (DB Connection)
"""
def Logging(logtext,key,connection):

...


"""
    Barcode inaktiv Schalten : code (Barcode) , connection (Datenbank Connection)
"""    
def DisableBarcode(code,connection):

...


"""
    Laufzeit des Barcodes Pruefen : bar (Barcode), connection (Datenbank verbindung) -> Rueckgabewert 0 - Fehler / nicht ok  1 - Alles Ok
"""
def PruefeBarcodeLaufzeit(bar,connection):

...

return nret

"""
    Hier eine URL aufrufen und einen Parameter uebergeben : URL ist die audzurufende URL , param ist der zu uebergebende Parameter
"""
def GetUrl(URL,param):
    try:
        params = urllib.urlencode({'param': param})
        f = urllib.urlopen(URL, params)
    except:
        print "Fehler beim Aufrufen der URL"

"""
    ************************************************************************************
    ** Hauptprogramm startet hier
    ************************************************************************************
"""

# Datenbank oeffnen
#conn = MySQLdb.connect(host=MYSQL_Host,user=MYSQL_User, passwd=MYSQL_Passwd,db=MYSQL_DB)
conn = ConnectMYSQL(MYSQL_Host,MYSQL_User,MYSQL_Passwd,MYSQL_DB)

while 1:
    try:
        bar = raw_input("")
        print bar    
        Logging("Barcode gelesen : " + bar,1,conn)

        dt = datetime.date.today()
        dday = dt.day
        dmonth = dt.month
        dyear = dt.year
        d = datetime.date(dyear,dmonth, dday-1)
        t2 = d.strftime("%Y-%m-%d")    
        t = time.strftime("%Y-%m-%d")    
        #print t
        #print t2
        Logging("Datum Heute   : " + t ,1,conn)
        Logging("Datum Gestern : " + t2,1,conn)
        conn = ConnectMYSQL(MYSQL_Host,MYSQL_User,MYSQL_Passwd,MYSQL_DB)
        sql = "select aktiv from barcode where barcode=%s and (datum=%s or datum=%s)"
        #print sql
        cursor = conn.cursor()
        cursor.execute(sql,(bar,t,t2))
        row = cursor.fetchone()
        #print row
    except:
        Logging("Fehler beim Lesen des Barcodes",0,conn)
        print "Fehler beim Lesen des Barcodes"

    try:
        if row:
            if row[0] == 1:
                print "Barcode Aktiv"
                if PruefeBarcodeLaufzeit(bar,conn):
                    Logging("Schranke oeffnen " + bar,1,conn)
                    print "aktiv"
                    # Schranke oeffnen            

                    if SET_SPERRE == 1 :
                        Logging("Disable Barcode " + bar,1,conn)
                        print "Disable Barcode"
                        DisableBarcode(bar,conn)                            
                        print "Disable Barcode OK"

                    # Schranke ansteuern
                    GPIO.output(24, GPIO.HIGH)

                    if GET_URL == 1 :
                        # 5 Sekunden warten tut das Script
                        GetUrl(CGI_URL,1)
                    else :
                        # 5 Sekunden warten tut das Script                    
                        time.sleep(5)                    

                    GPIO.output(24, GPIO.LOW)                

                else:
                    Logging("Barcode abgelaufen : " + bar,1,conn)
                    print "Barcode abgelaufen : " + bar

                    if SET_SPERRE == 1 :
                        Logging("Disable Barcode " + bar,1,conn)                    
                        print "Disable Barcode"
                        DisableBarcode(bar,conn)                            
                        print "Disable Barcode OK"

                    # Fehler ansteuern
                    GPIO.output(23, GPIO.HIGH)

                    if GET_URL == 1 :
                        # 10 Sekunden warten tut das Script
                        GetUrl(CGI_URL,0)
                    else :
                        # 10 Sekunden warten tut das Script                    
                        time.sleep(10)                                    

                    GPIO.output(23, GPIO.LOW)

            else:
                Logging("Schranke nicht oeffnen da Barcode schon deaktiviert: " + bar,1,conn)
                print "Schranke nicht oeffnen da Barcode schon deaktiviert: " + bar
                # Fehler ansteuern
                GPIO.output(23, GPIO.HIGH)

                if GET_URL == 1 :
                    # 10 Sekunden warten tut das Script
                    GetUrl(CGI_URL,0)
                else :
                    # 10 Sekunden warten tut das Script                    
                    time.sleep(10)                    

                GPIO.output(23, GPIO.LOW)

        else:
            Logging("Barcode nicht bekannt : " + bar,1,conn)
            print "Barcode nicht bekannt : " + bar
            # Fehler ansteuern
            GPIO.output(23, GPIO.HIGH)

            if GET_URL == 1 :
            # 10 Sekunden warten tut das Script
                GetUrl(CGI_URL,0)
            else :
                # 10 Sekunden warten tut das Script                    
                time.sleep(10)                    

            GPIO.output(23, GPIO.LOW)

        cursor.close()
    except:
        Logging("Fehler beim verarbeiten",0,conn)
        print "Fehler beim verarbeiten"  

Im Kopf lässt sich dann folgendes Einstellen:

Verbindungsdaten  zur Datenbank
Ort des CGI Scriptes
Soll ein Externer Pi angesteuert werden
Sperren des Barcodes nach dem Lesen
Sonderfall Parkplatz
Name des Pi's zum unterscheiden im Log

Die Ansteuerung der Hardware sieht immer noch aus wie bei der ersten Schrankensteuerung

Hier kommen noch die CGI Scripte für den Master Pi:

Zu erst das CGI Script:

#!/usr/bin/python
# Hier die Libs einbinden
import cgi
import cgitb; cgitb.enable()  # for troubleshooting
import os;

"""
    ************************************************************************************
    ** Ab Hier nichts mehr aendern
    ************************************************************************************
"""

form= cgi.FieldStorage()
message= form.getvalue("param", "0")

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Schrankensteuerung</title>"
print "</head>"
print "<body> "
print "<H1>Nicht im Webbrowser aufrufen !!!!!</H1><br>"
print "<H1>Kann Personen verletzen oder Objekte besch&auml;digen !!!!!</H1><br>"

print "Message"
print message
print "<br>"

if message == "0" :
    # Fehler ansteuern    
    print "RED<br>"
    os.system("sudo /usr/lib/cgi-bin/_red.py");
    print "RED<br>"

else :
    print "ELSE<br>"
    if message == "1" :
        # Schranke ansteuern
        print "GREEN<br>"
        os.system("sudo /usr/lib/cgi-bin/_green.py");
        print "GREEN<br>"
    else :
        # Fehler ansteuern
        print "RED<br>"
        os.system("sudo /usr/lib/cgi-bin/_red.py");
        print "RED<br>"


print "</body>"
print "</html>"

Dann das Script zum Schranke öffnen (_green.py):

#!/usr/bin/python
# Hier die Libs einbinden
import syslog
import time
import RPi.GPIO as GPIO

"""
    ************************************************************************************
    ** Ab Hier nichts mehr aendern
    ************************************************************************************
"""

GPIO.setmode(GPIO.BCM)
# set up the GPIO channels - one input and one output
# OK Meldung
GPIO.setup(24, GPIO.OUT)    
# Fehler Meldung
GPIO.setup(23, GPIO.OUT)
# IOS auf Low setzen
GPIO.output(23, GPIO.LOW)
GPIO.output(24, GPIO.LOW)

#0.5 Sek warten
time.sleep(0.5)

# Schranke ansteuern
GPIO.output(24, GPIO.HIGH)
# 5 Sek warten
time.sleep(5)
GPIO.output(24, GPIO.LOW)                
syslog.syslog('Schranke oeffnen!')

Zu letzt das Script zum Anzeigen das der Barcode nicht gültig ist (_red.py):

#!/usr/bin/python
# Hier die Libs einbinden
import syslog
import time
import RPi.GPIO as GPIO

"""
    ************************************************************************************
    ** Ab Hier nichts mehr aendern
    ************************************************************************************
"""

GPIO.setmode(GPIO.BCM)
# set up the GPIO channels - one input and one output
# OK Meldung
GPIO.setup(24, GPIO.OUT)    
# Fehler Meldung
GPIO.setup(23, GPIO.OUT)
# IOS auf Low setzen
GPIO.output(23, GPIO.LOW)
GPIO.output(24, GPIO.LOW)

#0.5 Sek warten
time.sleep(0.5)

# Fehler ansteuern
GPIO.output(23, GPIO.HIGH)
# 10 Sek warten
time.sleep(10)
GPIO.output(23, GPIO.LOW)
syslog.syslog('Schranke nicht oeffnen!')

Hier noch ein paar Bilder von der Entstehung der Relaisplatinen.

Relaismodule Relaismodul von unten

Hier eine Platine von oben. Es wird nur 24V Steuerspannung geschaltet und nicht 230V.

Relaismodul 1 von oben

Hier ist sehr gut zu sehen wie ich die Verdrahtung mit den Versionen ein wenig verbessert habe.

Relaismodul 1 von unten Relaismodul 2 von unten Relaismodul 3 von unten