GPIO working

This commit is contained in:
Jim Shepich III 2025-07-13 14:18:59 -04:00
commit 36c129b939
7 changed files with 149 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.venv
config.yaml

109
app.py Normal file
View File

@ -0,0 +1,109 @@
import subprocess
from flask import Flask, render_template, request, redirect, url_for, session
from authlib.integrations.flask_client import OAuth
from time import sleep
from dynaconf import Dynaconf
import logging
logger = logging.getLogger(__name__)
config = Dynaconf(settings_files = ['config.yaml'])
class Pinctrl:
def __init__(self):
pass
def _run(self, verb, pin, option):
if config.dry_run is False:
subprocess.run(['pinctrl', verb, str(pin), option])
else:
logger.info(f'Simulating command `pinctrl {verb} {pin} {option}`')
def input(self, pin):
self._run('set', pin, 'ip')
def output(self, pin):
self._run('set', pin, 'op')
def on(self, pin):
self._run('set', pin, 'dh')
def off(self, pin):
self._run('set', pin, 'dl')
pinctrl = Pinctrl()
app = Flask(__name__)
oauth = OAuth(app)
oauth.register(
'jimlab',
**config.oauth.to_dict()
)
# Set up lights.
for led, pin in config.pinout.led.items():
pinctrl.output(pin)
pinctrl.off(pin)
@app.route('/')
def homepage():
user = session.get('user')
return render_template('index.html', user=user)
@app.route('/login')
def login():
redirect_uri = url_for('auth', _external=True)
return oauth.jimlab.authorize_redirect(redirect_uri)
@app.route('/auth')
def auth():
token = oauth.jimlab.authorize_access_token()
session['user'] = token['userinfo']
return redirect('/')
# @app.route('/')
# def index():
# logger.info(oauth.jimlab.get('user'))
# return render_template('index.html')
# @app.route('/checkin', methods=['POST'])
# def check_in():
# if can_check_in():
# pinctrl.on(config.pinout.led[config.led_map.guest])
# print("Visitor checked in")
# else:
# pinctrl.on(config.pinout.led[config.led_map.error])
# print("Exception occurred: Cannot accept visitors currently")
# return redirect(url_for('index'))
# @app.route('/status')
# def get_status_route():
# status = get_status()
# return render_template('status.html', status=status)
# def get_status():
# if is_accepting_visitors():
# return "accepting"
# else:
# return "not accepting"
# def is_accepting_visitors():
# # This would be checked against Authentik server or a configuration file
# # For simplicity, let's assume it's always true in this example
# return True
# def can_check_in():
# # Logic to check if the system can accept a visitor
# return is_accepting_visitors()
if __name__ == '__main__':
try:
app.run(host='0.0.0.0', port=config.server.port, debug=config.server.debug)
finally:
# Turn off lights
for led, pin in config.pinout.led.items():
pinctrl.off(pin)
#with shelve.open('db', 'w', writeback=True) as db

3
requirements.txt Normal file
View File

@ -0,0 +1,3 @@
flask
authlib
dynaconf

10
templates/base.html Normal file
View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body style="text-align: center;">
{% block content %}{% endblock %}
</body>
</html>

10
templates/index.html Normal file
View File

@ -0,0 +1,10 @@
{% extends "base.html" %}
{% set title = "Visitor Check-in System" %}
{% block content %}
<h1>Welcome to Visitor Check-in System</h1>
<p>Visitors are currently {{ status }}</p>
<form action="/checkin" method="post">
<input type="submit" value="Check In Visitor">
</form>
{% endblock %}

11
templates/status.html Normal file
View File

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Status</title>
</head>
<body>
<h1>Current Status: {{ status }}</h1>
<a href="/">Go back to main page</a>
</body>
</html>

4
test.py Normal file
View File

@ -0,0 +1,4 @@
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.HIGH)