2026-07-04 01:04:26 +02:00
2026-05-18 21:03:05 +02:00
2026-07-01 17:54:16 +02:00
2026-07-01 17:47:19 +02:00
2026-06-04 15:16:11 +02:00
2026-05-20 20:00:59 +02:00
2026-07-04 01:04:15 +02:00
2026-05-15 22:01:57 +02:00
2026-05-23 20:09:12 +02:00
2026-07-04 01:04:26 +02:00
2026-05-22 08:28:35 +02:00
2026-05-23 20:09:12 +02:00

Gatekeeper - Door access system

Status: WIP - getting there o.o

Start prod server nix run
Start dev server nix run .#dev or nix run .#dev -- {args}
Interactive dev with nix develop, then sync deps with uv sync
Swagger UI @ http://127.0.0.1:8000/api/v1/docs
OpenApi @ http://127.0.0.1:8000/api/v1/openapi.json

Config:

Nixos config for the card reader:

services.pcscd = {
  enable = true;
  plugins = [ pkgs.acsccid ]; #<-- Needed for the ACE1552U
};

This application is configured using env vars. You can use cp .env.example .env and then edit .env to change the keys to something else.

A note on keycard scanners

I have tried two scanners while developing this project, the TWN4 MultiTech 2 from elatec and the ACR1552U from acs.

TWN4

From the factory the TWN4 comes with firmware that emulates a HID and just inputs the serial of any scanned card. To be usable with pcscd it had to be flashed with the TWN4_xPx520_S1SC161_Multi_CCID_1Slot_Standard.bix firmware found in the TWN4DevPack520 which can be downloaded under https://www.elatec-rfid.com/int/elatec-software (They send you a download link via email). This software seems to not work under wine. I had to setup a win10 vm and pass the usb to be able to flash.
Range: In my testing the TWN4 has a range of about 22mm when interfacing with our Mifare DESFire v2 cards. This is not enough for our idea of mounting the scanner on the inside of a glass window.

ACR1552U

The ACR1552U comes preloaded with PC/SC firmware. You need to install the acsccid package with your package-manager of choice (Nixos user see above) for the scanner to work but after that I had no problems with the hardware interfacing.
Range: The range of the ACR1552U was much better at over 60mm (almost 70mm if you take of the face plate)

Issues:

  • documentation missing
  • raspberry pi image not working
  • no door state
  • no door operations
  • hardcoded secret key in auth.py -> centralise env var loading
  • i don't like the error handling in the scanner - doesn't pass errors correctly
  • cors for frontend: https://fastapi.tiangolo.com/tutorial/cors
    • Load cors from env var or something
  • BackgroundScanner shouldn't get a single session for the whole lifecycle
  • input validation maybe
  • too many imports
  • inconsistent logging (request logging?)
  • rate limiting maybe
  • pretty sure the controllers are doing too much stuff
  • hardware call tests or sth
Description
No description provided
Readme 1.3 MiB
Languages
Python 95.2%
Nix 4.8%