ControlID IdFace
Guía completa para instalar, configurar y conectar los dispositivos ControlID IdFace con el sistema de control de acceso de Vitality Gym.
Requisitos Previos
Section titled “Requisitos Previos”- Dispositivos ControlID IdFace conectados a la VLAN del gimnasio (
192.168.30.0/24) - Raspberry Pi configurada con Tailscale y Traefik (ver Raspberry Pi)
- API de Vitality Gym desplegada y accesible
- Acceso de administrador a la interfaz web de los dispositivos
Arquitectura del Sistema
Section titled “Arquitectura del Sistema”┌──────────────────┐ ┌────────────────────┐ ┌──────────────────┐│ IdFace │ │ Raspberry Pi │ │ VPS ││ (Talanquera) │──────►│ Traefik proxy │──────►│ API Hono ││ 192.168.30.Y │ │ 192.168.30.X │ │ api.vitality- ││ │◄──────│ │ │ gym.com ││ IdFace │ │ (Tailscale Subnet │ │ ││ (Zona Premium) │──────►│ Routing) │ │ ││ 192.168.30.Z │ └────────────────────┘ └──────────────────┘└──────────────────┘Flujos de comunicación
Section titled “Flujos de comunicación”| Dirección | Descripción | Protocolo |
|---|---|---|
| VPS → Dispositivos | Enrolar usuarios, captura facial, consultar logs | HTTP vía Tailscale |
| Dispositivos → RPI → VPS | Eventos de acceso en tiempo real (Monitor) | HTTP → Traefik → HTTPS |
Paso 1: Conexión Física y Red
Section titled “Paso 1: Conexión Física y Red”-
Conectar los dispositivos a la red ethernet de la VLAN del gimnasio (
192.168.30.0/24) -
Verificar conectividad — Los dispositivos deben obtener IP automáticamente por DHCP o configurar IP estática:
Terminal window # Desde la Raspberry Pi, verificar que los dispositivos respondenping 192.168.30.Y # Talanqueraping 192.168.30.Z # Premium -
Reservar las IPs en el router/DHCP para que no cambien
Paso 2: Acceso a la Interfaz Web
Section titled “Paso 2: Acceso a la Interfaz Web”Cada dispositivo IdFace tiene una interfaz web de administración accesible por su IP.
- Abrir en el navegador:
http://192.168.30.Y(Talanquera) ohttp://192.168.30.Z(Premium) - Credenciales por defecto:
admin/admin
Paso 3: Configuración Manual del Dispositivo
Section titled “Paso 3: Configuración Manual del Dispositivo”Estos pasos se realizan desde la interfaz web del dispositivo:
3.1 Configuración de Red
Section titled “3.1 Configuración de Red”Verificar que la configuración de red sea correcta:
- IP: Estática o reservada en DHCP
- Máscara:
255.255.255.0 - Gateway: Gateway de la VLAN
- DNS: DNS del router o público (8.8.8.8)
3.2 Fecha y Hora
Section titled “3.2 Fecha y Hora”Configurar la zona horaria correcta:
- Zona horaria:
America/Bogota(UTC-5) - NTP: Habilitado, apuntando a
pool.ntp.org
3.3 Credenciales de Administrador
Section titled “3.3 Credenciales de Administrador”Cambiar usuario y contraseña del administrador:
# También se puede hacer vía API:curl -X POST http://192.168.30.Y/change_password.fcgi?session=SESSION \ -H "Content-Type: application/json" \ -d '{"password": "NUEVA_CONTRASEÑA_SEGURA"}'Paso 4: Configuración del Monitor (vía API)
Section titled “Paso 4: Configuración del Monitor (vía API)”El paso más importante: configurar el Monitor para que el dispositivo envíe eventos de acceso a la API de Vitality Gym.
4.1 Opción A: Desde la Interfaz de Admin (Recomendado)
Section titled “4.1 Opción A: Desde la Interfaz de Admin (Recomendado)”Desde el panel de administración de Vitality Gym:
- Ir a Control de Acceso > Dispositivos
- Click en “Configurar” en el dispositivo deseado
- Esto ejecuta internamente
POST /api/v1/access-control/devices/:deviceType/configure
El sistema automáticamente envía la siguiente configuración al dispositivo:
{ "monitor": { "hostname": "192.168.30.X", "port": "80", "path": "api/v1/access-control/notifications", "request_timeout": "5000" }, "online_client": { "enabled": true }}4.2 Opción B: Configuración Manual vía API del Dispositivo
Section titled “4.2 Opción B: Configuración Manual vía API del Dispositivo”Si prefieres configurar directamente el dispositivo:
# 1. Iniciar sesión en el dispositivoSESSION=$(curl -s -X POST http://192.168.30.Y/login.fcgi \ -H "Content-Type: application/json" \ -d '{"login":"admin","password":"admin"}' | jq -r '.session')
echo "Sesión: $SESSION"
# 2. Configurar el monitorcurl -X POST "http://192.168.30.Y/set_configuration.fcgi?session=$SESSION" \ -H "Content-Type: application/json" \ -d '{ "monitor": { "hostname": "192.168.30.X", "port": "80", "path": "api/v1/access-control/notifications", "request_timeout": "5000" } }'
# 3. Verificar la configuracióncurl -X POST "http://192.168.30.Y/get_configuration.fcgi?session=$SESSION" \ -H "Content-Type: application/json" \ -d '{"monitor": ["hostname", "port", "path", "request_timeout"]}'Paso 5: Variables de Entorno en la API
Section titled “Paso 5: Variables de Entorno en la API”Agregar las siguientes variables al .env de la API:
# ============ CONTROLID ACCESS CONTROL ============
# IP de los dispositivos IdFace (accesibles vía Tailscale Subnet Routing)CONTROLID_TURNSTILE_IP=192.168.30.YCONTROLID_PREMIUM_IP=192.168.30.Z
# Credenciales de acceso a los dispositivosCONTROLID_TURNSTILE_LOGIN=adminCONTROLID_TURNSTILE_PASSWORD=TU_CONTRASEÑA_SEGURACONTROLID_PREMIUM_LOGIN=adminCONTROLID_PREMIUM_PASSWORD=TU_CONTRASEÑA_SEGURA
# URL del callback — IP de la Raspberry Pi en la VLAN# Los dispositivos hacen POST HTTP aquí, Traefik reenvía a la APICONTROLID_API_CALLBACK_URL=http://192.168.30.XPaso 6: Enrolamiento de Usuarios
Section titled “Paso 6: Enrolamiento de Usuarios”Una vez configurados los dispositivos, enrolar usuarios desde la interfaz de admin:
-
Enrolar usuario (PIN + datos): El admin selecciona un usuario y ejecuta el enrolamiento. Esto crea el usuario en ambos dispositivos con su cédula como PIN.
-
Captura facial: El usuario se para frente al dispositivo Talanquera. El admin inicia la captura remota. La imagen se sincroniza automáticamente al dispositivo Premium.
-
Verificar: El usuario prueba el acceso con su rostro o PIN en ambos dispositivos.
Endpoints del Monitor ControlID
Section titled “Endpoints del Monitor ControlID”El dispositivo envía eventos a las siguientes rutas (construidas como hostname:port/path/endpoint):
| Endpoint | URL Final | Descripción |
|---|---|---|
dao | /api/v1/access-control/notifications/dao | Eventos de access_logs, alarm_logs, cards, templates |
device_is_alive | /api/v1/access-control/notifications/device_is_alive | Heartbeat periódico (cada 30s por defecto) |
catra_event | /api/v1/access-control/notifications/catra_event | Eventos de giro de talanquera (iDBlock) |
door | /api/v1/access-control/notifications/door | Cambios de estado de puerta |
secbox | /api/v1/access-control/notifications/secbox | Cambios de estado del relay SecBox |
operation_mode | /api/v1/access-control/notifications/operation_mode | Cambios de modo de operación |
Formato del Evento DAO
Section titled “Formato del Evento DAO”El evento más importante es el dao, que se envía cuando cambian las tablas de acceso:
{ "object_changes": [ { "object": "access_logs", "type": "inserted", "values": { "id": "519", "time": "1532977090", "event": "7", "device_id": "478435", "identifier_id": "0", "user_id": "1234567890", "portal_id": "1", "identification_rule_id": "0", "card_value": "0", "log_type_id": "-1" } } ], "device_id": 478435}Códigos de Evento
Section titled “Códigos de Evento”| Código | Evento |
|---|---|
7 | Acceso permitido |
6 | Acceso denegado |
12 | Sin identificación (desconocido) |
Verificación y Troubleshooting
Section titled “Verificación y Troubleshooting”Verificar que el monitor está configurado
Section titled “Verificar que el monitor está configurado”# Obtener configuración actual del monitorSESSION=$(curl -s -X POST http://192.168.30.Y/login.fcgi \ -H "Content-Type: application/json" \ -d '{"login":"admin","password":"admin"}' | jq -r '.session')
curl -X POST "http://192.168.30.Y/get_configuration.fcgi?session=$SESSION" \ -H "Content-Type: application/json" \ -d '{"monitor": ["hostname", "port", "path", "request_timeout", "alive_interval"]}'Respuesta esperada:
{ "monitor": { "hostname": "192.168.30.X", "port": "80", "path": "api/v1/access-control/notifications", "request_timeout": "5000", "alive_interval": "30000" }}El dispositivo no envía eventos
Section titled “El dispositivo no envía eventos”- Verificar que el monitor está configurado (ver arriba)
- Verificar que la RPI es alcanzable desde el dispositivo:
Terminal window # Desde la RPI, simular un eventocurl -X POST http://localhost/api/v1/access-control/notifications/dao \-H "Content-Type: application/json" \-d '{"object_changes": [{"object": "access_logs", "type": "inserted", "values": {"user_id": "0"}}], "device_id": 123}' - Verificar los logs de Traefik:
Terminal window docker logs $(docker ps -q --filter "name=traefik") --tail 50
El heartbeat no llega
Section titled “El heartbeat no llega”Verificar que el intervalo de heartbeat está configurado:
curl -X POST "http://192.168.30.Y/set_configuration.fcgi?session=$SESSION" \ -H "Content-Type: application/json" \ -d '{"monitor": {"alive_interval": "30000"}}'Restablecer configuración del dispositivo
Section titled “Restablecer configuración del dispositivo”Si necesitas volver a la configuración de fábrica:
# Reset completo (usar con precaución)curl -X POST "http://192.168.30.Y/reset_configuration.fcgi?session=$SESSION"Referencia de la API ControlID
Section titled “Referencia de la API ControlID”Para más información sobre la API de los dispositivos ControlID:
Endpoints del dispositivo más usados
Section titled “Endpoints del dispositivo más usados”| Endpoint | Descripción |
|---|---|
POST /login.fcgi | Iniciar sesión (obtener token de sesión) |
POST /create_objects.fcgi?session=X | Crear usuarios, PINs, reglas |
POST /load_objects.fcgi?session=X | Consultar usuarios, logs |
POST /destroy_objects.fcgi?session=X | Eliminar objetos |
POST /set_configuration.fcgi?session=X | Modificar configuración (monitor, red, etc.) |
POST /get_configuration.fcgi?session=X | Consultar configuración actual |
POST /remote_enroll.fcgi?session=X | Captura facial remota |
POST /execute_actions.fcgi?session=X | Abrir puerta/talanquera remotamente |
POST /system_information.fcgi?session=X | Información del sistema |
POST /user_set_image.fcgi?session=X&user_id=Y | Subir foto facial |
POST /user_get_image.fcgi?session=X | Descargar foto facial |