Skip to content

ControlID IdFace

Guía completa para instalar, configurar y conectar los dispositivos ControlID IdFace con el sistema de control de acceso de Vitality Gym.

  • 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
┌──────────────────┐ ┌────────────────────┐ ┌──────────────────┐
│ 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 │ └────────────────────┘ └──────────────────┘
└──────────────────┘
DirecciónDescripciónProtocolo
VPS → DispositivosEnrolar usuarios, captura facial, consultar logsHTTP vía Tailscale
Dispositivos → RPI → VPSEventos de acceso en tiempo real (Monitor)HTTP → Traefik → HTTPS

  1. Conectar los dispositivos a la red ethernet de la VLAN del gimnasio (192.168.30.0/24)

  2. 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 responden
    ping 192.168.30.Y # Talanquera
    ping 192.168.30.Z # Premium
  3. Reservar las IPs en el router/DHCP para que no cambien


Cada dispositivo IdFace tiene una interfaz web de administración accesible por su IP.

  1. Abrir en el navegador: http://192.168.30.Y (Talanquera) o http://192.168.30.Z (Premium)
  2. 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:

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)

Configurar la zona horaria correcta:

  • Zona horaria: America/Bogota (UTC-5)
  • NTP: Habilitado, apuntando a pool.ntp.org

Cambiar usuario y contraseña del administrador:

Terminal window
# 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:

  1. Ir a Control de Acceso > Dispositivos
  2. Click en “Configurar” en el dispositivo deseado
  3. 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:

Terminal window
# 1. Iniciar sesión en el dispositivo
SESSION=$(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 monitor
curl -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ón
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"]}'

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.Y
CONTROLID_PREMIUM_IP=192.168.30.Z
# Credenciales de acceso a los dispositivos
CONTROLID_TURNSTILE_LOGIN=admin
CONTROLID_TURNSTILE_PASSWORD=TU_CONTRASEÑA_SEGURA
CONTROLID_PREMIUM_LOGIN=admin
CONTROLID_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 API
CONTROLID_API_CALLBACK_URL=http://192.168.30.X

Una vez configurados los dispositivos, enrolar usuarios desde la interfaz de admin:

  1. 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.

  2. 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.

  3. Verificar: El usuario prueba el acceso con su rostro o PIN en ambos dispositivos.


El dispositivo envía eventos a las siguientes rutas (construidas como hostname:port/path/endpoint):

EndpointURL FinalDescripción
dao/api/v1/access-control/notifications/daoEventos de access_logs, alarm_logs, cards, templates
device_is_alive/api/v1/access-control/notifications/device_is_aliveHeartbeat periódico (cada 30s por defecto)
catra_event/api/v1/access-control/notifications/catra_eventEventos de giro de talanquera (iDBlock)
door/api/v1/access-control/notifications/doorCambios de estado de puerta
secbox/api/v1/access-control/notifications/secboxCambios de estado del relay SecBox
operation_mode/api/v1/access-control/notifications/operation_modeCambios de modo de operación

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ódigoEvento
7Acceso permitido
6Acceso denegado
12Sin identificación (desconocido)

Verificar que el monitor está configurado

Section titled “Verificar que el monitor está configurado”
Terminal window
# Obtener configuración actual del monitor
SESSION=$(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"
}
}
  1. Verificar que el monitor está configurado (ver arriba)
  2. Verificar que la RPI es alcanzable desde el dispositivo:
    Terminal window
    # Desde la RPI, simular un evento
    curl -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}'
  3. Verificar los logs de Traefik:
    Terminal window
    docker logs $(docker ps -q --filter "name=traefik") --tail 50

Verificar que el intervalo de heartbeat está configurado:

Terminal window
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:

Terminal window
# Reset completo (usar con precaución)
curl -X POST "http://192.168.30.Y/reset_configuration.fcgi?session=$SESSION"

Para más información sobre la API de los dispositivos ControlID:

EndpointDescripción
POST /login.fcgiIniciar sesión (obtener token de sesión)
POST /create_objects.fcgi?session=XCrear usuarios, PINs, reglas
POST /load_objects.fcgi?session=XConsultar usuarios, logs
POST /destroy_objects.fcgi?session=XEliminar objetos
POST /set_configuration.fcgi?session=XModificar configuración (monitor, red, etc.)
POST /get_configuration.fcgi?session=XConsultar configuración actual
POST /remote_enroll.fcgi?session=XCaptura facial remota
POST /execute_actions.fcgi?session=XAbrir puerta/talanquera remotamente
POST /system_information.fcgi?session=XInformación del sistema
POST /user_set_image.fcgi?session=X&user_id=YSubir foto facial
POST /user_get_image.fcgi?session=XDescargar foto facial