fix(lane-status): TTL 5s -> 30s after measuring the real re-fire pattern

Controlled in/out test on the camera: the `active` re-fire rate is
MOVEMENT-driven, not steady — ~1-3s apart while the car moves, but up to
~15-25s when it sits MOTIONLESS in the zone. A 5s TTL would flicker a
parked car free; the TTL must exceed the still-car gap. The camera has
~no dwell lag (goes silent within ~1s of the car leaving — measured: last
event 16:15:17 vs car-left ~16:15:30), so 30s keeps a motionless car busy
while clearing promptly after departure. This also confirms vision-based
tracking isn't warranted: the camera's leave signal is already tight.

Claude-Session: https://claude.ai/code/session_01Xcm6ikLgGoCxxHrxtjkk5V
This commit is contained in:
2026-06-22 18:16:42 +02:00
parent 89542d4ab6
commit a2bdf99db2
+8 -5
View File
@@ -15,12 +15,15 @@ import { directionOf } from "./device-resolve.js";
/** How long after the last vehicle detection a lane stays "busy" before clearing. /** How long after the last vehicle detection a lane stays "busy" before clearing.
* Must exceed the camera's `active` re-fire interval so a still-present car keeps the * Must exceed the camera's `active` re-fire interval so a still-present car keeps the
* lane busy. Measured on the test unit: while a vehicle is in the zone the camera * lane busy. MEASURED on the test unit (controlled in/out test): the re-fire rate is
* re-fires `active` about every ~1s — so a few seconds of silence reliably means the * MOVEMENT-driven, not a fixed rate — ~1-3s apart while the car moves, but stretching
* car has left. 5s gives fast clearing without flicker. Override with LANE_BUSY_TTL_MS. */ * to ~15-25s when it sits MOTIONLESS in the zone. So the TTL must clear the still-car
* gap (~25s) or a parked car flickers free. The camera has ~no dwell lag (it goes
* silent within a second of the car leaving), so 30s clears promptly after departure
* while keeping a motionless car solidly busy. Override with LANE_BUSY_TTL_MS. */
export function busyTtlMs(): number { export function busyTtlMs(): number {
const raw = Number(process.env.LANE_BUSY_TTL_MS ?? 5_000); const raw = Number(process.env.LANE_BUSY_TTL_MS ?? 30_000);
return Number.isFinite(raw) && raw > 0 ? raw : 5_000; return Number.isFinite(raw) && raw > 0 ? raw : 30_000;
} }
export class LaneStatus { export class LaneStatus {