4.1 KiB
4.1 KiB
UniFi Access Badge-In Dashboard
A small Flask + SQLite web app that receives UniFi Access access.door.unlock webhooks and shows a dark, gold-accented dashboard of daily first badge-in times.
Features
- Receives UniFi Access webhooks for
access.door.unlockevents and stores them in SQLite. - Modern dark UI with black background, gold accents, and on-time (green) vs late (red) status.
- Date picker and configurable "badged in by" cutoff time.
- Dockerised for easy deployment on Unraid.
Repository layout
app.py– Flask application and API endpoints.requirements.txt– Python dependencies.Dockerfile– Container image definition.docker-compose.yml– Example compose file (works on Unraid).static/index.html– Single‑page dashboard UI.
UniFi Access configuration
- Ensure you have UniFi Access running (UA Ultra / UA Hub Door Mini / G3 Intercom etc.).
- In the UniFi Access web UI, open the API / developer section and create a Webhook:[web:24][web:25]
- Method:
POST. - URL:
http://<UNRAID-IP>:8000/unifi-access-webhook(or behind HTTPS via reverse proxy). - Events: at least
access.door.unlock.
- Method:
- Save and trigger a test door unlock. You should see webhook hits in the container logs and rows in
events.db.
Building and running on Unraid
1. Create a public GitHub repository
- On your workstation, create a new folder and put all files from this project in it.
- Initialize a Git repo, commit, and push to GitHub (public or private with a token):
git init
git add .
git commit -m "Initial UniFi Access dashboard"
git branch -M main
git remote add origin https://github.com/<your-user>/<your-repo>.git
git push -u origin main
2. Add a new Docker template on Unraid
You can either use the Docker tab (Add Container) or deploy via the Unraid terminal.
Option A – Using Unraid GUI
- Go to Docker → Add Container.
- Set Name to
unifi-access-dashboard. - For Repository, point to your GitHub repo using the GitHub URL with the
Dockerfileas build context if you build externally, or build the image locally first (Option B). Unraid’s GUI typically expects an image name on Docker Hub; easiest approach is:- Build and push your image from a machine with Docker:
docker build -t <your-user>/unifi-access-dashboard:latest .
docker push <your-user>/unifi-access-dashboard:latest
- Then in Unraid, set Repository to
<your-user>/unifi-access-dashboard:latest.
- Add a Port mapping: host
8000→ container8000. - Add a Path mapping for persistent DB:
- Host path:
/mnt/user/appdata/unifi-access-dashboard/ - Container path:
/data
- Host path:
- Add environment variable
TZto match your timezone (e.g.,America/Chicago). - Apply to start the container.
Option B – Using docker-compose on Unraid
If you prefer to build directly on the Unraid box and pull source from GitHub:
- SSH into Unraid.
- Clone your GitHub repo:
cd /mnt/user/appdata
git clone https://github.com/<your-user>/<your-repo>.git unifi-access-dashboard
cd unifi-access-dashboard
- (Optional) Adjust
docker-compose.ymlports or paths. - Build and start:
docker compose up -d --build
- The app will listen on port
8000by default.
3. Verify the app
- In a browser, open
http://<UNRAID-IP>:8000/. - You should see the dark dashboard with date and cutoff selectors.
- After some badge-in activity, click Refresh and verify that users show as ON TIME (green) or LATE (red) depending on the cutoff.
Environment and volumes
DB_PATH(optional) – path to the SQLite file inside the container (defaults to/data/events.dbvia Dockerfile).- Mount
/datato persistent storage on Unraid so badge history survives container restarts.
Time zones and "on time" logic
- Webhook timestamps are stored in UTC with a
Zsuffix. - The "badged in by" cutoff is interpreted in 24‑hour
HH:MMformat and compared against the stored time string for that day. - If you need strict local‑time handling, you can extend
app.pyto convert UTC to your timezone before comparison.