Receta: control de acceso por patente para una barrera de estacionamiento
Leé patentes desde una cámara de barrera, contrastalas con una lista blanca y negra, y dispará eventos de patente firmados que abren una barrera o registran un ingreso. Modelos open source, una base por app, sin nube.
Por qué LPR en la barrera
Una barrera de estacionamiento o el portón de una calle privada tiene una sola pregunta: ¿esta patente puede entrar? La Studio App LPR la responde desde una cámara común — detecta la patente, la lee, la contrasta con tus listas, y emite un evento sobre el que tu controlador de barrera o tu backend puede actuar. Corre enteramente sobre modelos open source, guarda un historial por app, y nunca llama a un servicio de patentes en la nube.
La arquitectura en palabras
LPR es una Studio App con un worker Python (fast-alpr: un detector ONNX más OCR, todo con licencia MIT). Muestrea el stream de la app, lee patentes, y en cada lectura aceptada emite plate.detected, más plate.allowed si la patente está en tu lista blanca o plate.denied si está en la negra. Los eventos fluyen por tres vías: los callbacks firmados de la app (webhook y MQTT), opcionalmente una URL de callback directa (para un abridor de barrera), y el feed en vivo del dashboard. Las lecturas se guardan en un lpr.db por app, con una captura JPEG por evento.
1. Instalar y apuntar a la cámara de la barrera
export BASE="https://your-server.example.com/api/v1"
export TOKEN="sk_...."
curl -X POST $BASE/apps/parking/plugins/lpr/install -H "Authorization: Bearer $TOKEN"
curl -X PATCH $BASE/apps/parking/plugins/lpr -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"enabled": true,
"config": {
"room": "gate-cam",
"whitelist": "AB123CD, AA000AA",
"blacklist": "ZZ999ZZ",
"dedupeWindowSec": 10,
"callbackUrl": "https://gate.example.com/open"
}
}'
room es obligatorio. Las listas se separan por coma o salto de línea y se comparan sin distinguir mayúsculas ni separadores.
2. Entender los eventos
En cada lectura el worker emite plate.detected y, si coincide con una lista, plate.allowed o plate.denied (una patente en ambas listas es denegada — la lista negra gana). Cada evento lleva el mismo payload:
{ "plate": "AB123CD", "confidence": 0.94, "ts": 1751000000.1,
"listMatch": "whitelist", "snapshot": "…/lpr/snapshots/1751000000100-AB123CD.jpg" }
Por la vía de callbacks firmados el cuerpo se envuelve como { event, app, room, ts, data } y se firma con X-StreamHub-Signature: sha256=<hmac>. La callbackUrl directa opcional recibe un cuerpo plano y sin firmar — cómodo para un controlador de barrera en tu LAN, pero mantené ese endpoint privado o protegelo con un token compartido.
3. Ajustar precisión y ritmo
Perillas de config (con defaults):
detector—yolo-v9-t-384-license-plate-end2end(balanceado); 256 es el más rápido, 512 el más preciso.ocrModel—cct-xs-v1-global-model(rápido) occt-s-v1-global-model(preciso).confidence—0.5de confianza mínima de OCR.fps—2;dedupeWindowSec—10(la misma patente dentro de la ventana emite una vez; un auto detenido re-emite cada ventana, no por cuadro).snapshots—true;cuda—false.
4. Leer el historial y conectar la barrera
La pestaña del dashboard muestra las lecturas recientes por el canal en vivo autenticado (GET /apps/parking/plugins/lpr/data). Para abrir la barrera, hacé que tu controlador escuche en la callbackUrl directa y actúe ante plate.allowed; registrá todo desde el webhook firmado en tu propio sistema; el apps/parking/lpr/lpr.db por app guarda el historial completo de reads para auditorías.
Qué deberías ver
Un auto se acerca; en uno o dos segundos dispara plate.detected, y una patente en lista blanca produce plate.allowed con una captura. Tu barrera se abre; una patente desconocida simplemente registra un plate.detected con listMatch: null; una patente en lista negra dispara plate.denied.
Resolución de problemas
- Patentes no leídas o mal leídas — mejorá el ángulo y la iluminación de la cámara sobre la patente, subí el detector a 512 y el OCR a
cct-s, o bajáfpssi la patente se ve borrosa a velocidad. - Eventos repetidos para un auto estacionado — es el heartbeat de
dedupeWindowSec; subilo si solo querés un evento por llegada. - La barrera se abre con la patente equivocada — recordá que el callback directo va sin firmar; verificá la patente en tu controlador, o consumí el webhook firmado en su lugar.
- Se llena el disco — ni
lpr.dbni las capturas se podan solas; agregá un cron en una barrera con mucho tránsito.
Cierre
Todo — modelos, historial de patentes, capturas — queda en tu servidor, lo que importa en un predio residencial o corporativo bajo reglas de privacidad. Si querés integración con el hardware de la barrera, portones de múltiples carriles, o un portal de autogestión para residentes, es un armado de consultoría acotado sobre la app LPR open source.