a0e0fd9118
UHPPOTE controllers self-announce via UDP broadcast, but the frontend had no way to find them — the admin had to type the serial blind. Add a generic discovery capability and surface it in the setup wizard. packages/devices: - DiscoverableDriver capability + DiscoveredDevice type + isDiscoverable() guard on the registry (optional, so any driver can opt in). - uhppote driver implements discover() via uhppoted getDevices (UDP broadcast), mapping each controller's serial/IP/firmware into a DiscoveredDevice; extract shared buildCtx(). apps/server: - GET /api/setup/discover/:driverId (admin-only): runs discover() and health-checks each found device so reachability shows before assigning. - catalog now returns a `discoverable` driver-id list. apps/web: - SetupWizard "Scan for controllers" button for discoverable drivers; lists found devices with health badges; selecting one auto-fills serial + host. api client gains discoverDevices(). wiki: new device-discovery concept; cross-link from registry/setup/uhppote; note the broadcast-permission (EACCES) deployment caveat; index + log. Verified: catalog flags uhppote discoverable; discover runs and fails gracefully without hardware; non-discoverable driver -> 400; missing token -> 401.
1.7 KiB
1.7 KiB
type, tags, sources, updated
| type | tags | sources | updated | |||||
|---|---|---|---|---|---|---|---|---|
| concept |
|
|
2026-06-15 |
First-Run Setup (device selection)
The admin install flow that makes the system device-agnostic in practice: on first run, an admin assigns devices per lane by choosing from the device-registry catalog and entering each device's connection config.
Implementation-derived (from
apps/server+apps/web), not the source doc.
Flow
- Read the catalog —
GET /api/setup/catalogreturns supported drivers per category (no secrets, just schema) plus adiscoverablelist. The webSetupWizardrenders a picker + the driver's config fields, and a Scan button for discoverable drivers (device-discovery). - Assign per lane —
POST /api/setup/assign(admin-only, role-guarded; see local-jwt-auth). The server validates the chosen driver + config against the registry before persisting to thelane_devicestable; unknown drivers / missing required fields are rejected. - Complete —
POST /api/setup/completemarks the single-rowsetup_state.
Config granularity
Organized per lane — each lane gets an access controller, reader(s), and camera(s), each with its own connection settings. Matches the architecture's "mixable per lane" reality (a lane can serve permit holders via wiegand and casual via host-side reads on one relay — see entry-exit-readers).
Security notes
- The assign/state/complete endpoints require the admin role (local-jwt-auth).
- Device credentials are stored in
lane_devices.config— protect at rest (disk-os-hardening); device hosts belong on the isolated VLAN (network-isolation).