diff --git a/kdoorpi/kdoorpi/wiegand.py b/kdoorpi/kdoorpi/wiegand.py index 519299b..c763051 100644 --- a/kdoorpi/kdoorpi/wiegand.py +++ b/kdoorpi/kdoorpi/wiegand.py @@ -27,8 +27,10 @@ class Decoder: else: self.pi = False - self.gpio_0 = 17 #settings.WIEGAND[0] - self.gpio_1 = 18 #settings.WIEGAND[1] + self.gpio_0 = 17 #settings.WIEGAND[0] + self.gpio_1 = 18 #settings.WIEGAND[1] + self.door_pin = 21 # from settings.py + self.button_pin = 13 # from settings.py self.callback = callback @@ -39,12 +41,16 @@ class Decoder: if self.pi: self.pi.set_mode(self.gpio_0, pigpio.INPUT) self.pi.set_mode(self.gpio_1, pigpio.INPUT) + self.pi.set_mode(self.door_pin, pigpio.OUTPUT) + self.pi.set_mode(self.button_pin, pigpio.INPUT) self.pi.set_pull_up_down(self.gpio_0, pigpio.PUD_UP) self.pi.set_pull_up_down(self.gpio_1, pigpio.PUD_UP) + self.pi.set_pull_up_down(self.button_pin, pigpio.PUD_UP) self.cb_0 = self.pi.callback(self.gpio_0, pigpio.FALLING_EDGE, self._cb) self.cb_1 = self.pi.callback(self.gpio_1, pigpio.FALLING_EDGE, self._cb) + self.button_cb_h = self.pi.callback(self.button_pin, pigpio.FALLING_EDGE, self._cb) def cut_empty(self, item): if item[0:8] == "00000000": @@ -125,6 +131,14 @@ class Decoder: except Exception as e: logging.error("Wiegand callback error: " + str(e)) + def button_cb(self, gpio_pin, level, tick): + print("button: gpio_pin:{}, level:{}, tick:{}".format(gpio_pin, level, tick)) + + def open_door(self): + self.pi.write(self.door_pin, 1) + sleep(3) + self.pi.write(self.door_pin, 0) + def cancel(self): """ @@ -133,11 +147,10 @@ class Decoder: self.cb_0.cancel() self.cb_1.cancel() + self.button_cb_h.cancel() self.pi.stop() - - if __name__ == "__main__": from urllib.request import urlopen import json @@ -150,9 +163,11 @@ if __name__ == "__main__": cards[user["card_uid"].strip()] = user def wiegand_callback(bits, value): - print("bits", bits) - print("value", value) - print("user", cards.get(value)) + print("bits", bits, "value", value) + u = cards.get(value) + if u: + print("user", u) + w.open_door() logging.basicConfig(level=logging.DEBUG) @@ -160,6 +175,10 @@ if __name__ == "__main__": w = Decoder(wiegand_callback) from time import sleep while 1: - sleep(1) + try: + sleep(1) + except KeyboardInterrupt as e: + w.cancel() + break diff --git a/kdoorweb/kdoorweb/api.py b/kdoorweb/kdoorweb/api.py new file mode 100644 index 0000000..4a1615c --- /dev/null +++ b/kdoorweb/kdoorweb/api.py @@ -0,0 +1,34 @@ +from bottle import Bottle, request, response + + +api = Bottle() + + +# FIXME: Fix door api auth +def check_api_auth(callback): + def wrapper(*args, **kwargs): + print("check api auth") + if "db" not in kwargs: + request.current_user = None + return callback(*args, **kwargs) + user = None + request.current_user = user + if user: + print(f"logged in as {user['user']}") + print(request.current_user) + return callback(*args, **kwargs) + else: + print("not logged in") + return "Invalid authentication" + return wrapper + +# FIXME: db plugin not available yet +api.install(check_api_auth) + +@api.route("/") +def index(): + return "api v1" + +@api.route("/cards") +def api_list_cards(db): + return {"keycards":[dict(card) for card in db.list_all_keycards()]} diff --git a/kdoorweb/kdoorweb/web.py b/kdoorweb/kdoorweb/web.py index 9e0a6cc..81f6045 100644 --- a/kdoorweb/kdoorweb/web.py +++ b/kdoorweb/kdoorweb/web.py @@ -5,6 +5,7 @@ from bottle import Bottle, view, TEMPLATE_PATH, static_file, \ request, redirect, response, HTTPError from .db import SQLitePlugin +from .api import api application = app = Bottle() @@ -49,9 +50,14 @@ def check_auth(callback): return wrapper -app.install(SQLitePlugin(SQLITE_PATH)) +db_plugin = SQLitePlugin(SQLITE_PATH) + +app.install(db_plugin) app.install(check_auth) +api.install(db_plugin) +app.mount("/api/v1", api) + @app.route('/static/', skip=[check_auth]) def callback(path): @@ -152,9 +158,3 @@ def log(db): @view("doors.html") def doors(db): return {"doors":[]} - - -# FIXME: Add door api auth -@app.route("/api/v1/cards", skip=[check_auth]) -def api_list_cards(db): - return {"keycards":[dict(card) for card in db.list_all_keycards()]}