import logging logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO) import os import json import sys import RPi.GPIO as GPIO import serial import time RELAY_PIN = 17 RFID_EN_PIN = 27 CARDS_FILE = 'cardexport.json' OPEN_DURATION = 5 ser = None recent = {} cards = {} def init(): global ser, cards GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(RELAY_PIN, GPIO.OUT) GPIO.output(RELAY_PIN, GPIO.LOW) GPIO.setup(RFID_EN_PIN, GPIO.OUT) GPIO.output(RFID_EN_PIN, GPIO.LOW) logging.info('GPIO initialized.') ser = serial.Serial(port='/dev/ttyAMA0', baudrate=2400, timeout=0.1) logging.info('Serial initialized.') with open(CARDS_FILE, 'r') as f: cards = json.load(f) logging.info('Read in {} card numbers.'.format(str(len(cards)))) def unlock_door(): GPIO.output(RELAY_PIN, GPIO.HIGH) GPIO.output(RFID_EN_PIN, GPIO.HIGH) time.sleep(OPEN_DURATION) GPIO.output(RELAY_PIN, GPIO.LOW) GPIO.output(RFID_EN_PIN, GPIO.LOW) def handle_card_read(card): if card in cards: logging.info('Card recognized.') member = cards[card] else: logging.info('Card not recognized. Denying access.') return if member['enabled']: logging.info('Member active.') else: logging.info('Member not active. Denying access.') return logging.info('DOOR ACCESS - Card: {} | Name: {} | id: {}'.format( card, member['name'], member['id'])) unlock_door() def loop(): card = ser.readline() if not card: return card = card.decode().strip() if len(card) != 10: return now = time.time() if card in recent: if now - recent[card] < 5.0: recent[card] = now return recent[card] = now logging.info('\nRead card #' + card) handle_card_read(card) if __name__ == '__main__': logging.info('Initializing...') init() logging.info('Running main loop...') try: while True: loop() except KeyboardInterrupt: logging.info('Exiting...')