Skip to content

Readers, tags and cameras

Readers that type like a keyboard need no setup beyond plugging them in: set Controller:Hardware:ConsoleLaneId to the lane they serve, and each line typed is checked as a code or QR at that lane.

Most access-control card readers and keypads speak Wiegand. Wire each reader’s DATA0 and DATA1 to two GPIO pins through a 5 V to 3.3 V level shifter — the Pi’s pins are not 5 V tolerant — and list it:

"Readers": [{ "LaneId": "…", "Direction": "In", "D0Pin": 5, "D1Pin": 6, "CardFormat": "Number" }]
  • 26- and 34-bit cards are read (with parity checked) and acted on at once.
  • On a Wiegand keypad, digits are collected until #; * clears.
  • CardFormat is Number (the card’s whole number) or FacilityCard (the facility code, then a five-digit card number, as many stickers print it).

Residents register their cars in the app; the estate office approves each one and types the tag number printed on the sticker or card. An approved tag read at a lane lets the car in or out as its owner — offline too — for as long as the owner lives in the estate. Tag numbers and plates are compared by letters and digits only, so T-0042 and T0042 are the same.

Point each camera’s HTTP push at the controller on the estate’s network:

http://<controller>:<LanPort>/camera/<Token>/plates

with a long random Token per camera, listed in the controller’s settings:

"Cameras": [{ "Name": "Main in", "Token": "…", "LaneId": "…", "Direction": "In", "MinConfidence": 0.8 }]

The camera sends {"plate": "LSR 123 AB", "confidence": 0.94} (or the same as ?plate=…&confidence=… in the URL).

  • An approved resident car opens for its owner, coming or going.
  • A visitor pass booked with that plate is checked like its code: dates, hours, entries, watchlist, emergencies.
  • Reads below the camera’s MinConfidence are ignored, and the same plate at the same camera within 30 seconds is acted on once.
  • A plate that matches nothing does nothing and is not recorded: the visitor uses their code, or a guard decides.

With more than one controller, give them all the same Controller:LanPort and list the others in each one’s Controller:Peers:Addresses, for example ["http://10.0.0.12:5091"]. Messages between them are signed with a key every controller already has; there is nothing else to configure.