{"openapi":"3.1.0","info":{"title":"API Centurión","description":"API para gestionar controladores y proyectos","version":"1.0.0"},"paths":{"/sistema/test":{"get":{"tags":["Sistema"],"summary":"Test","description":"Realiza una prueba de conexión con base de datos y servidor MQTT.","operationId":"test_sistema_test_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"manual","in":"query","required":true,"schema":{"type":"boolean","title":"Manual"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sistema/respaldo":{"post":{"tags":["Sistema"],"summary":"Database Backup ","description":"Ejecuta la tarea de respaldo de base de datos.","operationId":"database_backup__sistema_respaldo_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/sistema/subirOneDrive":{"post":{"tags":["Sistema"],"summary":"Subir Onedrive","description":"Sube a OneDrive cualquier archivo del proyecto indicando su ruta relativa a la raíz (p. ej. 'backend/src/utils/backup/backups/LONDON_20260813.sql'). Solo administradores. La ruta debe quedar dentro del proyecto.","operationId":"subir_onedrive_sistema_subirOneDrive_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/subidaOneDrive"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/sistema/ClientStatus":{"post":{"tags":["Sistema"],"summary":"Client Connection Status","description":"Envia notificación por correo electrónico y por telegram cada vez que se conecta/desconecta un cliente del broker.","operationId":"client_connection_status_sistema_ClientStatus_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/estadoCliente"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sistema/internal-notify":{"post":{"tags":["Sistema"],"summary":"Internal Notify","description":"Correo interno (lo usa el data_recolector). Con cco_admins=true los\nadministradores activos van en copia oculta.","operationId":"internal_notify_sistema_internal_notify_post","parameters":[{"name":"asunto","in":"query","required":true,"schema":{"type":"string","title":"Asunto"}},{"name":"mensaje","in":"query","required":true,"schema":{"type":"string","title":"Mensaje"}},{"name":"cco_admins","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Cco Admins"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sistema/test-whatsapp":{"post":{"tags":["Sistema"],"summary":"Test Whatsapp Alerta Desconexion","operationId":"test_whatsapp_alerta_desconexion_sistema_test_whatsapp_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"to","in":"query","required":true,"schema":{"type":"string","title":"To"}},{"name":"matricula","in":"query","required":false,"schema":{"type":"string","default":"CTRL-001","title":"Matricula"}},{"name":"interseccion","in":"query","required":false,"schema":{"type":"string","default":"Reforma y Juárez","title":"Interseccion"}},{"name":"latitude","in":"query","required":false,"schema":{"type":"number","default":19.4326,"title":"Latitude"}},{"name":"longitude","in":"query","required":false,"schema":{"type":"number","default":-99.1332,"title":"Longitude"}},{"name":"location_name","in":"query","required":false,"schema":{"type":"string","default":"Cruce Reforma","title":"Location Name"}},{"name":"address","in":"query","required":false,"schema":{"type":"string","default":"Av. Reforma 123","title":"Address"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/":{"post":{"tags":["Autenticación"],"summary":"Authentication","description":"Autentica con correo y contraseña y verifica que el usuario esté activo y relacionado con el proyecto. Con origen=true (modo servidor-a-servidor del SIC) omite la contraseña y exige la cabecera X-Centurion-Service-Key. Credenciales inválidas responden 401 con un mensaje genérico.","operationId":"authentication_auth__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/external":{"post":{"tags":["Autenticación"],"summary":"External Authentication","description":"Autentica con correo y contraseña y verifica que el usuario esté activo y relacionado con el proyecto. Con origen=true (modo servidor-a-servidor del SIC) omite la contraseña y exige la cabecera X-Centurion-Service-Key. Credenciales inválidas responden 401 con un mensaje genérico.","operationId":"external_authentication_auth_external_post","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$","description":"Dirección de correo electrónico válida","title":"Email"},"description":"Dirección de correo electrónico válida","example":"usuario@trafficlight.mx"},{"name":"password","in":"query","required":true,"schema":{"type":"string","title":"Password"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/info/monitoreo":{"get":{"tags":["Centurion info"],"summary":"Current State","description":"Revisa el último estado de Centurión específico con respecto a la fecha y hora ingresada.","operationId":"current_state_info_monitoreo_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Z]{2}-[A-Z]{2}-[0-9]{2}-[0-9]{4}$","description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","title":"Matricula"},"description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","example":"TC-CL-24-0023"},{"name":"fecha","in":"query","required":true,"schema":{"type":"string","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$","description":"Fecha en formato YYYY-MM-DD","title":"Fecha"},"description":"Fecha en formato YYYY-MM-DD","example":"2025-09-01"},{"name":"hora","in":"query","required":true,"schema":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$","description":"Hora en formato HH:MM:SS (24 horas)","title":"Hora"},"description":"Hora en formato HH:MM:SS (24 horas)","example":"17:13:13"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/info/listaEstados":{"get":{"tags":["Centurion info"],"summary":"List Of States","description":"Devuelve un JSON con la lista de estados que ha tenido Centurión en la fecha indicada.","operationId":"list_of_states_info_listaEstados_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Z]{2}-[A-Z]{2}-[0-9]{2}-[0-9]{4}$","description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","title":"Matricula"},"description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","example":"TC-CL-24-0023"},{"name":"fecha","in":"query","required":true,"schema":{"type":"string","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$","description":"Fecha en formato YYYY-MM-DD","title":"Fecha"},"description":"Fecha en formato YYYY-MM-DD","example":"2025-09-01"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/info/escenarios":{"get":{"tags":["Centurion info"],"summary":"Scenarios By Project","description":"Devuelve, por matrícula, los escenarios y el tipo de la fase 1 de todos los controladores del proyecto, leídos de la base sin consultar al controlador. Lo usa la vista de coordinación del mapa.","operationId":"scenarios_by_project_info_escenarios_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"proyecto","in":"query","required":true,"schema":{"type":"string","description":"Proyecto válido","title":"Proyecto"},"description":"Proyecto válido","example":"DEMO"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/info/realtime":{"get":{"tags":["Centurion info"],"summary":"Permiso Realtime","operationId":"permiso_realtime_info_realtime_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/info/controladores":{"get":{"tags":["Centurion info"],"summary":"List Of Controllers","description":"Devuelve un JSON con la lista de controladores activos con respecto al proyecto. Cada controlador muestra su nombre auxiliar, ubicación e intersección.","operationId":"list_of_controllers_info_controladores_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"proyecto","in":"query","required":true,"schema":{"type":"string","description":"Proyecto válido","title":"Proyecto"},"description":"Proyecto válido","example":"DEMO"},{"name":"manual","in":"query","required":true,"schema":{"type":"boolean","title":"Manual"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/info/historial":{"get":{"tags":["Centurion info"],"summary":"Programming History","description":"Devuelve un JSON con la lista de programaciones realizadas a un Centurión en específico. Cada item indica el usuario que programó, fecha, hora, origen y nota aurxiliar.","operationId":"programming_history_info_historial_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Z]{2}-[A-Z]{2}-[0-9]{2}-[0-9]{4}$","description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","title":"Matricula"},"description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","example":"TC-CL-24-0023"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/info/progHistorial":{"get":{"tags":["Centurion info"],"summary":"Programming History Id","description":"Devuelve el JSON de programación de un item específico.","operationId":"programming_history_ID_info_progHistorial_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Z]{2}-[A-Z]{2}-[0-9]{2}-[0-9]{4}$","description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","title":"Matricula"},"description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","example":"TC-CL-24-0023"},{"name":"ID","in":"query","required":true,"schema":{"type":"integer","description":"ID de historial entero","title":"Id"},"description":"ID de historial entero","example":"1"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/info/progActual":{"get":{"tags":["Centurion info"],"summary":"Current Programming","description":"Devuelve la última programación de un Centurión en específico.","operationId":"current_programming_info_progActual_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Z]{2}-[A-Z]{2}-[0-9]{2}-[0-9]{4}$","description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","title":"Matricula"},"description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","example":"TC-CL-24-0023"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/info/controlador":{"get":{"tags":["Centurion info"],"summary":"Controller By Name Aux","description":"Resuelve un controlador por su NAME_AUX y devuelve su matrícula y el\nsensor ligado (CONTROLADORES.SENSOR → SENSORES): el puente que el front\nnecesita para pasar de la vista de controladores a los datos de aforo.\n`tipo`: aislado | coordinado (CONTROLADORES.TIPO); lo ve cualquier usuario,\nsolo el administrador lo cambia (PATCH /update/tipo_control/{matricula}).","operationId":"controller_by_name_aux_info_controlador_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"nameAux","in":"query","required":true,"schema":{"type":"string","description":"NAME_AUX del controlador","title":"Nameaux"},"description":"NAME_AUX del controlador"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/info/coordenadas":{"get":{"tags":["Centurion info"],"summary":"Controller Coordinates","description":"Latitud/longitud del controlador, del ÚLTIMO registro de MONITOREO que\ntenga una posición real. Hay muchos registros por controlador — gana el más\nreciente (ID mayor).\n\nPrimero busca la coordenada colocada a mano (MANUAL_COORDINATES = '1'), que\nes la fiable porque alguien la puso sobre el mapa. Si no hay ninguna, cae a\nla última lectura del GPS del equipo: aproximada, pero suficiente para\ncentrar el croquis del aforo, que antes no se podía ni empezar. `origen`\ndice cuál de las dos salió, para que la UI lo advierta.\n\nMismo respaldo que ya hacen /info/controladores y el monitor de\ndesconexiones. En ambos casos se exigen lat/lon distintas de cero: un equipo\nsin fijar el GPS reporta 0,0, que cae en el Golfo de Guinea.","operationId":"controller_coordinates_info_coordenadas_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Z]{2}-[A-Z]{2}-[0-9]{2}-[0-9]{4}$","description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","title":"Matricula"},"description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","example":"TC-CL-24-0023"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/info/proyectos":{"get":{"tags":["Centurion info"],"summary":"List Of Projects","description":"Devuelve los proyectos activos.","operationId":"list_of_projects_info_proyectos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/info/usuarios":{"get":{"tags":["Centurion info"],"summary":"List Of Users","description":"Devuelve la lista de usuarios.","operationId":"list_of_users_info_usuarios_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/info/status_controller":{"get":{"tags":["Centurion info"],"summary":"Status Controler","description":"Envia notificación por correo electrónico y por telegram cada vez que se conecta/desconecta un cliente del broker.","operationId":"status_controler_info_status_controller_get","parameters":[{"name":"matricula","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Z]{2}-[A-Z]{2}-[0-9]{2}-[0-9]{4}$","description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","title":"Matricula"},"description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","example":"TC-CL-24-0023"},{"name":"manual","in":"query","required":true,"schema":{"type":"boolean","title":"Manual"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/info/planos":{"get":{"tags":["Centurion info"],"summary":"Read Plans","operationId":"read_plans_info_planos_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Z]{2}-[A-Z]{2}-[0-9]{2}-[0-9]{4}$","description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","title":"Matricula"},"description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","example":"TC-CL-24-0023"},{"name":"tipo","in":"query","required":true,"schema":{"$ref":"#/components/schemas/TipoConsulta"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/update/add_control":{"post":{"tags":["Actualizar agregar"],"summary":"Add Controller","description":"Este endpoint agrega un nuevo controlador en la base de datos.","operationId":"add_controller_update_add_control_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Control"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/update/delete_control":{"delete":{"tags":["Actualizar agregar"],"summary":"Delete Controller","description":"Elimina un controlador de la base de datos.","operationId":"delete_controller_update_delete_control_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"query","required":true,"schema":{"type":"string","title":"Matricula"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/update/add_user":{"post":{"tags":["Actualizar agregar"],"summary":"Add User ","description":"Agrega un nuevo usuario a base de datos.","operationId":"add_user__update_add_user_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/add_user"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/update/proy_asign":{"post":{"tags":["Actualizar agregar"],"summary":"Assign Project","description":"Asigna proyecto a un usuario específico.","operationId":"assign_project_update_proy_asign_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/assign_user"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/update/user_desactivate":{"patch":{"tags":["Actualizar agregar"],"summary":"Delete User","description":"Asigna proyecto a un usuario específico.","operationId":"delete_user_update_user_desactivate_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_desactivate_email","in":"query","required":true,"schema":{"type":"string","title":"User Desactivate Email"}},{"name":"estado","in":"query","required":true,"schema":{"type":"integer","title":"Estado"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/update/agregar_planos":{"post":{"tags":["Actualizar agregar"],"summary":"Add Plans","operationId":"add_plans_update_agregar_planos_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_add_plans_update_agregar_planos_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/update/borrar_planos":{"delete":{"tags":["Actualizar agregar"],"summary":"Delete Plans","operationId":"delete_plans_update_borrar_planos_delete","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_delete_plans_update_borrar_planos_delete"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/update/add_config_scheme":{"patch":{"tags":["Actualizar agregar"],"summary":"Add Config","operationId":"add_config_update_add_config_scheme_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/config_eschema"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/update/delete_config_scheme/{matricula}":{"delete":{"tags":["Actualizar agregar"],"summary":"Delete Config","operationId":"delete_config_update_delete_config_scheme__matricula__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"path","required":true,"schema":{"type":"string","title":"Matricula"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/update/tipo_control/{matricula}":{"patch":{"tags":["Actualizar agregar"],"summary":"Tipo Control","operationId":"tipo_control_update_tipo_control__matricula__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"path","required":true,"schema":{"type":"string","title":"Matricula"}},{"name":"tipo","in":"query","required":true,"schema":{"type":"string","title":"Tipo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/update/realtime_usuario":{"patch":{"tags":["Actualizar agregar"],"summary":"Realtime Usuario","operationId":"realtime_usuario_update_realtime_usuario_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$","description":"Dirección de correo electrónico válida","title":"Email"},"description":"Dirección de correo electrónico válida","example":"usuario@trafficlight.mx"},{"name":"habilitado","in":"query","required":true,"schema":{"type":"boolean","title":"Habilitado"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/update/notifications_control/{matricula}":{"patch":{"tags":["Actualizar agregar"],"summary":"Delete Config","description":"Notificaciones del control","operationId":"delete_config_update_notifications_control__matricula__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"path","required":true,"schema":{"type":"string","title":"Matricula"}},{"name":"estado","in":"query","required":true,"schema":{"type":"integer","title":"Estado"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/update/user_update":{"patch":{"tags":["Actualizar agregar"],"summary":"User Update","operationId":"user_update_update_user_update_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/update_user"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/operacion/progLocal":{"post":{"tags":["Operación"],"summary":"Send Local Programming","description":"Guarda programación hecha localmente en base de datos.","operationId":"send_local_programming_operacion_progLocal_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Local"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/operacion/prog":{"post":{"tags":["Operación"],"summary":"Send Remote Programming","description":"Guarda programación hecha en página centralizado en base de datos y envía la programación al controlador.","operationId":"send_remote_programming_operacion_prog_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Operacion"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/operacion/modo":{"post":{"tags":["Operación"],"summary":"Send Operation Mode","description":"Cambia el modo de operación de Centurión. Automático (A), manual (M), semi-automático (S) y destello (D).","operationId":"send_operation_mode_operacion_modo_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Modo"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/operacion/local-conf":{"post":{"tags":["Operación"],"summary":"Config Local Mode","description":"Guarda la configuración local de un controlador específico en base de datos.","operationId":"config_local_mode_operacion_local_conf_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"manual","in":"query","required":true,"schema":{"type":"boolean","title":"Manual"}},{"name":"Matricula","in":"query","required":true,"schema":{"type":"string","title":"Matricula"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/operacion/reset-pos":{"post":{"tags":["Operación"],"summary":"Config Local Mode","description":"Envía el comando RESET_POS a un controlador específico a través de MQTT.","operationId":"config_local_mode_operacion_reset_pos_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Matricula","in":"query","required":true,"schema":{"type":"string","title":"Matricula"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/operacion/emergency-mode":{"post":{"tags":["Operación"],"summary":"Config Local Mode","description":"Cambia a todo rojo indefinidamente a una serie de controladores específicos dependiendo de la zona ingresada.","operationId":"config_local_mode_operacion_emergency_mode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Emergencia"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/operacion/emergency-off":{"post":{"tags":["Operación"],"summary":"Disable Emergency Mode","description":"Regresa a modo automático los controladores que estaban en emergencia (NOTIFICATIONS=3) y restablece su NOTIFICATIONS a 1.","operationId":"disable_emergency_mode_operacion_emergency_off_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmergenciaOFF"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/estado/save":{"post":{"tags":["Estado"],"summary":"Save Current Sate","description":"Guarda los cambios de estado que presenta Centurión en el transcurso del día. Estos datos son almacenados en base de datos.","operationId":"save_current_sate_estado_save_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Estado"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/estado/save-manual-location":{"post":{"tags":["Estado"],"summary":"Current Position","description":"Guarda la ubicación manual de un controlador específico en base de datos.","operationId":"current_position_estado_save_manual_location_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstadoPos"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/estado/savEMQX":{"post":{"tags":["Estado"],"summary":"Save Current Sate Emqx","operationId":"save_current_sate_emqx_estado_savEMQX_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstadoEMQX"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/estado/operActual":{"get":{"tags":["Estado"],"summary":"Current Operating Mode","description":"Devuelve el modo de operación en que está trabajando actualmente Centurión.","operationId":"current_operating_mode_estado_operActual_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"controlador","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Z]{2}-[A-Z]{2}-[0-9]{2}-[0-9]{4}$","description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","title":"Controlador"},"description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","example":"TC-CL-24-0023"},{"name":"manual","in":"query","required":true,"schema":{"type":"boolean","title":"Manual"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitoring/relative-individual":{"get":{"tags":["Monitoring"],"summary":"Days","operationId":"days_monitoring_relative_individual_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Z]{2}-[A-Z]{2}-[0-9]{2}-[0-9]{4}$","description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","title":"Matricula"},"description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","example":"TC-CL-24-0023"},{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Dias"}},{"name":"format","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/FormatType"}],"default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitoring/absolute-individual":{"get":{"tags":["Monitoring"],"summary":"Analyze By Date Range","operationId":"analyze_by_date_range_monitoring_absolute_individual_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Z]{2}-[A-Z]{2}-[0-9]{2}-[0-9]{4}$","description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","title":"Matricula"},"description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","example":"TC-CL-24-0023"},{"name":"fecha_inicio","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)Z$","description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","title":"Fecha Inicio"},"description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","example":"2025-09-22T18:42:00Z"},{"name":"fecha_fin","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)Z$","description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","title":"Fecha Fin"},"description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","example":"2025-09-22T18:42:00Z"},{"name":"format","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/FormatType"}],"default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitoring/relative-general":{"get":{"tags":["Monitoring"],"summary":"General Report","operationId":"general_report_monitoring_relative_general_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Dias"}},{"name":"format","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/FormatType"}],"default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitoring/absolute-general":{"get":{"tags":["Monitoring"],"summary":"General Report By Range","operationId":"general_report_by_range_monitoring_absolute_general_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fecha_inicio","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)Z$","description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","title":"Fecha Inicio"},"description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","example":"2025-09-22T18:42:00Z"},{"name":"fecha_fin","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)Z$","description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","title":"Fecha Fin"},"description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","example":"2025-09-22T18:42:00Z"},{"name":"format","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/FormatType"}],"default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitoring/disconnection-analysis-relative":{"get":{"tags":["Monitoring"],"summary":"Disconnection Analysis","operationId":"disconnection_analysis_monitoring_disconnection_analysis_relative_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Dias"}},{"name":"format","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/FormatType"}],"default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitoring/disconnection-analysis-absolute":{"get":{"tags":["Monitoring"],"summary":"Disconnection Analysis By Range","operationId":"disconnection_analysis_by_range_monitoring_disconnection_analysis_absolute_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fecha_inicio","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)Z$","description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","title":"Fecha Inicio"},"description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","example":"2025-09-22T18:42:00Z"},{"name":"fecha_fin","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)Z$","description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","title":"Fecha Fin"},"description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","example":"2025-09-22T18:42:00Z"},{"name":"format","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/FormatType"}],"default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitoring/general-report":{"get":{"tags":["Monitoring"],"summary":"Generate Report","operationId":"generate_report_monitoring_general_report_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Dias"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitoring/pdf-relative-individual":{"get":{"tags":["Monitoring"],"summary":"Pdf Individual Relativo","description":"Genera PDF con análisis individual de una matrícula para los últimos N días","operationId":"pdf_individual_relativo_monitoring_pdf_relative_individual_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Z]{2}-[A-Z]{2}-[0-9]{2}-[0-9]{4}$","description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","title":"Matricula"},"description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","example":"TC-CL-24-0023"},{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Dias"}},{"name":"project_name","in":"query","required":false,"schema":{"type":"string","default":"DEMO","title":"Project Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitoring/pdf-absolute-individual":{"get":{"tags":["Monitoring"],"summary":"Pdf Individual Absoluto","description":"Genera PDF con análisis individual de una matrícula para un rango de fechas específico","operationId":"pdf_individual_absoluto_monitoring_pdf_absolute_individual_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Z]{2}-[A-Z]{2}-[0-9]{2}-[0-9]{4}$","description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","title":"Matricula"},"description":"Matrícula de control a consultar. Formato: TC-CL-24-0001 ","example":"TC-CL-24-0023"},{"name":"fecha_inicio","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)Z$","description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","title":"Fecha Inicio"},"description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","example":"2025-09-22T18:42:00Z"},{"name":"fecha_fin","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)Z$","description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","title":"Fecha Fin"},"description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","example":"2025-09-22T18:42:00Z"},{"name":"project_name","in":"query","required":false,"schema":{"type":"string","default":"DEMO","title":"Project Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitoring/pdf-relative-general":{"get":{"tags":["Monitoring"],"summary":"Pdf General Relativo","description":"Genera PDF con reporte general de todas las matrículas para los últimos N días","operationId":"pdf_general_relativo_monitoring_pdf_relative_general_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Dias"}},{"name":"project_name","in":"query","required":false,"schema":{"type":"string","default":"DEMO","title":"Project Name"}},{"name":"Conclusions","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":1000,"description":"Conclusiones del reporte (máximo 1000 caracteres)","default":"Sin Conclusiones","title":"Conclusions"},"description":"Conclusiones del reporte (máximo 1000 caracteres)","example":"El sistema operó correctamente durante el período analizado."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitoring/pdf-absolute-general":{"get":{"tags":["Monitoring"],"summary":"Pdf General Absoluto","description":"Genera PDF con reporte general de todas las matrículas para un rango de fechas específico","operationId":"pdf_general_absoluto_monitoring_pdf_absolute_general_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fecha_inicio","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)Z$","description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","title":"Fecha Inicio"},"description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","example":"2025-09-22T18:42:00Z"},{"name":"fecha_fin","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)Z$","description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","title":"Fecha Fin"},"description":"Fecha y hora en formato ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)","example":"2025-09-22T18:42:00Z"},{"name":"project_name","in":"query","required":false,"schema":{"type":"string","default":"DEMO","title":"Project Name"}},{"name":"Conclusions","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":1000,"description":"Conclusiones del reporte (máximo 1000 caracteres)","default":"Sin Conclusiones","title":"Conclusions"},"description":"Conclusiones del reporte (máximo 1000 caracteres)","example":"El sistema operó correctamente durante el período analizado."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/whatsapp/webhook":{"get":{"tags":["WhatsApp Webhook"],"summary":"Verificar Webhook","operationId":"verificar_webhook_whatsapp_webhook_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["WhatsApp Webhook"],"summary":"Recibir Webhook","operationId":"recibir_webhook_whatsapp_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/vehicle_detection/sensors":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Sensors","description":"Lista los nombres de los sensores de aforo vehicular que tienen datos.","operationId":"get_sensors_vehicle_detection_sensors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/vehicle_detection/lines":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Lines","description":"Lista las líneas de conteo de un sensor específico.","operationId":"get_lines_vehicle_detection_lines_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor","title":"Name"},"description":"Nombre del sensor"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/range":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Range","description":"Devuelve el rango de datos disponible (primer y último timestamp), global o por sensor.","operationId":"get_range_vehicle_detection_range_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":false,"schema":{"type":"string","description":"Nombre del sensor (opcional; sin él, rango global)","title":"Name"},"description":"Nombre del sensor (opcional; sin él, rango global)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/flows":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Flows","description":"Flujos origen→destino detectados por ID de vehículo (entrada→salida). format=json, analysis (tablero vertical) o slide (tablero 16:9 para presentación); avg=true colapsa el rango a un día promedio.","operationId":"get_flows_vehicle_detection_flows_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor","title":"Name"},"description":"Nombre del sensor"},{"name":"dateStart","in":"query","required":true,"schema":{"type":"string","description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)","title":"Datestart"},"description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"dateEnd","in":"query","required":true,"schema":{"type":"string","description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)","title":"Dateend"},"description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"groupBy","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/GroupBy"}],"description":"Nivel de agregación","default":"10min","title":"Groupby"},"description":"Nivel de agregación"},{"name":"classLevel","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/ClassLevel"}],"description":"coarse (veh/bike/ped) o fine (car/van/truck/...)","default":"coarse","title":"Classlevel"},"description":"coarse (veh/bike/ped) o fine (car/van/truck/...)"},{"name":"format","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/TrafficFormat"}],"description":"json o analysis (gráfica de flujos)","default":"json","title":"Format"},"description":"json o analysis (gráfica de flujos)"},{"name":"avg","in":"query","required":false,"schema":{"type":"boolean","description":"Día promedio: colapsa el rango a un día típico (paneles 1,6,8). Solo con format=analysis","default":false,"title":"Avg"},"description":"Día promedio: colapsa el rango a un día típico (paneles 1,6,8). Solo con format=analysis"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/frame":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Frame","description":"Frame actual del video del sensor (JPEG), vía VPN efímera.\n\nAbre el túnel OpenVPN, pide GET /api/stream/lastFrame al API DeepBlue y lo\ncierra — patrón del data_recolector. Tarda ~8-15 s por el handshake del\ntúnel: es para vistazos ocasionales (configuración/diagnóstico), no para\nvideo continuo. La IP se resuelve por nombre en la tabla SENSORES sin\nfiltrar ACTIVO: poder asomarse a un sensor apagado es justo el caso de uso.","operationId":"get_frame_vehicle_detection_frame_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor (tabla SENSORES)","title":"Name"},"description":"Nombre del sensor (tabla SENSORES)"},{"name":"stream","in":"query","required":false,"schema":{"type":"integer","description":"Índice del stream en el sensor","default":0,"title":"Stream"},"description":"Índice del stream en el sensor"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/sensor-config":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Sensor Config","description":"Configuración persistida del sensor (columna SENSORES.CONFIG).\n\nJSON namespaced por tema; hoy: {\"webster\": {escenarios, carriles_por_acceso,\nmetodo, eventos, ...}}. La guarda el frontend y la lee /get-program.","operationId":"get_sensor_config_vehicle_detection_sensor_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor (tabla SENSORES)","title":"Name"},"description":"Nombre del sensor (tabla SENSORES)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Vehicle Detection Sensor"],"summary":"Put Sensor Config","description":"Guarda la configuración del sensor — MERGE por llave raíz.\n\nEl PUT actualiza las llaves que manda y CONSERVA las demás: guardar el\ncroquis no borra el bloque webster ni al revés. Mandar una llave con null\nla elimina.\n\nSe valida SOLO el bloque \"webster\" que venga en esta petición, y antes de\ntocar nada. Validar el documento ya fusionado acoplaba las dos llaves: un\namarre viejo o incompleto hacía fallar el guardado del croquis, que es\nválido y va aparte. Quien exige el amarre completo es /get-program, que es\ndonde de verdad hace falta.\n\nSolo administrador: es configuración del sensor (croquis, flujos,\nescenarios). Leerla (GET) sigue abierto, porque el tablero la dibuja.","operationId":"put_sensor_config_vehicle_detection_sensor_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor (tabla SENSORES)","title":"Name"},"description":"Nombre del sensor (tabla SENSORES)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Config"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/sensores":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Sensores","description":"Catálogo de sensores (tabla SENSORES) con el controlador enlazado a cada uno.\n\nDistinto de GET /sensors, que lista los nombres con datos en Influx. Incluye\nla IP porque es la pantalla de administración; por eso es solo admin.","operationId":"get_sensores_vehicle_detection_sensores_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Vehicle Detection Sensor"],"summary":"Post Sensor","description":"Alta de un sensor. El recolector lo toma en su siguiente ciclo si ACTIVO=1\n(lee la tabla en cada vuelta: no hay que reiniciar nada).\n\nEl NOMBRE queda fijo para siempre: es el tag con el que se escribe en\nInfluxDB y renombrarlo partiría la serie en dos.","operationId":"post_sensor_vehicle_detection_sensores_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorAlta"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/vehicle_detection/sensores/{sensor_id}":{"put":{"tags":["Vehicle Detection Sensor"],"summary":"Put Sensor","description":"Cambia la IP y/o ACTIVO de un sensor. ACTIVO=0 lo saca del ciclo del\nrecolector sin borrarlo ni perder sus datos. El nombre no se toca.","operationId":"put_sensor_vehicle_detection_sensores__sensor_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sensor_id","in":"path","required":true,"schema":{"type":"integer","title":"Sensor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorCambio"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/controlador/{matricula}/sensor":{"put":{"tags":["Vehicle Detection Sensor"],"summary":"Put Controlador Sensor","description":"Enlaza un sensor al controlador (CONTROLADORES.SENSOR) o lo desenlaza con\nsensor_id null. Con el enlace, el frontend muestra \"Aforo vehicular\" para ese\ncontrolador y /info/planos genera el histograma en vivo desde la digesta.\n\nUn sensor solo puede estar enlazado a UN controlador: si ya lo tiene otro,\nresponde 409 y hay que desenlazarlo primero (evita enlaces fantasma).","operationId":"put_controlador_sensor_vehicle_detection_controlador__matricula__sensor_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"path","required":true,"schema":{"type":"string","title":"Matricula"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ControladorSensor"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/parametros":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Parametros","description":"Límites del ciclo de Webster vigentes (tabla PARAMETROS). `origen` dice,\npor campo, si el valor viene de la base ('bd') o del código ('codigo':\nfila o tabla ausente). `ciclo_equipo_max_s` es el tope del firmware y no\nse edita.","operationId":"get_parametros_vehicle_detection_parametros_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Vehicle Detection Sensor"],"summary":"Put Parametros","description":"Cambia en caliente uno o más límites del ciclo de Webster; el siguiente\nget-program ya los usa, sin redesplegar. Solo administrador. Se validan en\nconjunto: mínimo por escenario ≥ 7 s (firmware), ciclo mínimo ≥ un\nescenario, mínimo ≤ máximo ≤ tope del equipo.","operationId":"put_parametros_vehicle_detection_parametros_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParametrosWebster"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/vehicle_detection/get-program":{"post":{"tags":["Vehicle Detection Sensor"],"summary":"Get Program","description":"Programación ideal a partir de los datos — fase 1: ciclo de F.V. Webster.\n\nEl backend pone la demanda (q y q_ucp por flujo durante la HMD del crucero,\ndesde la digesta); el usuario define los escenarios (qué flujos verdean\njuntos) y los carriles por acceso. Cálculo (Cal y Mayor / Webster):\n\n    q_acceso = Σ q de los flujos del escenario que ENTRAN por esa línea\n               (comparten carriles: grupo de carriles)\n    y_acceso = q_acceso / (carriles × s_default)\n    y_i      = máx y_acceso del escenario   (accesos distintos van en paralelo)\n    Y = Σ y_i      L = Σ l_i,  l_i = arranque + ámbar_i + todo rojo_i − ámbar aprovechado\n    C0 = (1.5·L + 5) / (1 − Y)\n    g_i = (C0 − L) · y_i / Y   (verde efectivo por escenario)\n\nEl amarre (escenarios, carriles, método) SIEMPRE sale de SENSORES.CONFIG\n(lo guarda el front con PUT /sensor-config). El body solo trae los eventos\ndel front (franjas pico/valle): con eventos, un programa POR EVENTO (HMD\ndentro de cada franja); sin body, un solo programa con la HMD del rango.\nRespuesta: el JSON de la tabla de programación propuesta, nada más.","operationId":"get_program_vehicle_detection_get_program_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor","title":"Name"},"description":"Nombre del sensor"},{"name":"dateStart","in":"query","required":true,"schema":{"type":"string","description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)","title":"Datestart"},"description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"dateEnd","in":"query","required":true,"schema":{"type":"string","description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)","title":"Dateend"},"description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"detalle","in":"query","required":false,"schema":{"type":"boolean","description":"true = devuelve el cálculo completo paso a paso (q por flujo, y por acceso, Y, L, C0, g) en vez del resumen","default":false,"title":"Detalle"},"description":"true = devuelve el cálculo completo paso a paso (q por flujo, y por acceso, Y, L, C0, g) en vez del resumen"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/EventosRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/program-review":{"post":{"tags":["Vehicle Detection Sensor"],"summary":"Program Review","description":"Revisión por IA de la programación recomendada.\n\nMismos parámetros que /get-program: recalcula Webster con detalle y un\nagente (backend-ai) lo revisa con los criterios de experiencia de\nbackend-ai/src/conocimiento/criterios-programacion.md. Aislado: mensajes\nde demanda + programación sugerida (programa_ia). Coordinado: solo los\nmensajes de demanda (el ciclo es del corredor). Es un complemento:\n/get-program no depende de él, y si la IA falla se responde 200 con\nestado «no_disponible» para que el front solo oculte la revisión.\nLos errores del propio cálculo (sin amarre, sin digesta) salen igual que\nen /get-program.","operationId":"program_review_vehicle_detection_program_review_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor","title":"Name"},"description":"Nombre del sensor"},{"name":"dateStart","in":"query","required":true,"schema":{"type":"string","description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)","title":"Datestart"},"description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"dateEnd","in":"query","required":true,"schema":{"type":"string","description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)","title":"Dateend"},"description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/EventosRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/anomalias-explicacion":{"post":{"tags":["Vehicle Detection Sensor"],"summary":"Anomalias Explicacion","description":"Explicación por IA de las anomalías del rango (botón del panel\n«anomalias»). La detección es la del panel (sin IA); aquí backend-ai solo\nla explica. Complemento: si la IA falla responde 200 con estado\n«no_disponible» y el panel de anomalías sigue igual.","operationId":"anomalias_explicacion_vehicle_detection_anomalias_explicacion_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor","title":"Name"},"description":"Nombre del sensor"},{"name":"dateStart","in":"query","required":true,"schema":{"type":"string","description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)","title":"Datestart"},"description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"dateEnd","in":"query","required":true,"schema":{"type":"string","description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)","title":"Dateend"},"description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/digest":{"post":{"tags":["Vehicle Detection Sensor"],"summary":"Post Digest","description":"Calcula la digesta de flujos de un día y la guarda en flows_digest.\n\nInterno, sin auth (misma pauta que /sistema/internal-notify): lo invoca el\ndata_recolector al terminar cada día, desde la red de Docker. Idempotente.\n\nEl recolector manda `name`: una digesta por sensor recién recolectado. Sin\n`name` se digieren todos los sensores con crudo ese día; si alguno falla\nlos demás siguen, y la respuesta trae `errores: {sensor: motivo}` con 200.\nSolo responde 500 cuando no se pudo digerir ninguno.","operationId":"post_digest_vehicle_detection_digest_post","parameters":[{"name":"day","in":"query","required":true,"schema":{"type":"string","description":"Día UTC a digerir (YYYY-MM-DD)","title":"Day"},"description":"Día UTC a digerir (YYYY-MM-DD)"},{"name":"name","in":"query","required":false,"schema":{"type":"string","description":"Sensor específico (opcional; sin él, todos)","title":"Name"},"description":"Sensor específico (opcional; sin él, todos)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/salud":{"post":{"tags":["Vehicle Detection Sensor"],"summary":"Post Salud","description":"Reporte diario de los sensores (salud del sensor + anomalías del\ncrucero de un día) y correo a los administradores.\n\nInterno, sin auth (misma pauta que /digest): lo dispara el data_recolector\na las 09:00 con el día anterior. Los lunes (día = domingo) incluye las\ntendencias de esa semana. Se puede volver a correr a mano (después de un\nbackfill, por ejemplo). Sin nada que reportar no se manda correo. El\ncorreo va a MAIL_TO con los administradores activos en copia oculta.","operationId":"post_salud_vehicle_detection_salud_post","parameters":[{"name":"day","in":"query","required":false,"schema":{"type":"string","description":"Día local a revisar (YYYY-MM-DD); sin él, ayer","title":"Day"},"description":"Día local a revisar (YYYY-MM-DD); sin él, ayer"},{"name":"name","in":"query","required":false,"schema":{"type":"string","description":"Sensor específico (opcional; sin él, todos los activos)","title":"Name"},"description":"Sensor específico (opcional; sin él, todos los activos)"},{"name":"enviar","in":"query","required":false,"schema":{"type":"boolean","description":"false = solo calcula, no manda el correo (pruebas)","default":true,"title":"Enviar"},"description":"false = solo calcula, no manda el correo (pruebas)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/tendencias":{"post":{"tags":["Vehicle Detection Sensor"],"summary":"Post Tendencias","description":"Tendencias semanales del aforo (velocidad, horarios y forma del día) y\ncorreo a los administradores.\n\nInterno, sin auth, para correr A MANO: el correo de los lunes ya las\nincluye (/salud con día = domingo). Sin tendencias no se manda correo.","operationId":"post_tendencias_vehicle_detection_tendencias_post","parameters":[{"name":"semana","in":"query","required":false,"schema":{"type":"string","description":"Lunes de la semana a revisar (YYYY-MM-DD); sin él, la semana pasada","title":"Semana"},"description":"Lunes de la semana a revisar (YYYY-MM-DD); sin él, la semana pasada"},{"name":"name","in":"query","required":false,"schema":{"type":"string","description":"Sensor específico (opcional; sin él, todos los activos)","title":"Name"},"description":"Sensor específico (opcional; sin él, todos los activos)"},{"name":"enviar","in":"query","required":false,"schema":{"type":"boolean","description":"false = solo calcula, no manda el correo (pruebas)","default":true,"title":"Enviar"},"description":"false = solo calcula, no manda el correo (pruebas)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/flows-fast":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Flows Fast","description":"Como /flows pero leyendo la digesta diaria (flows_digest): mismo JSON\n{meta, panels} y mismo PNG, sin agrupar vehicle_id — rápido y sin riesgo de\nmemoria en rangos largos. Requiere la digesta de cada día del rango.\n\nEn el PNG, los paneles de cobertura (4 y 9) se ocultan: coverage aún no se\ndigiere (siguiente iteración); fhp/line_volume/classification se consultan\nen vivo, igual que en /flows.","operationId":"get_flows_fast_vehicle_detection_flows_fast_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor","title":"Name"},"description":"Nombre del sensor"},{"name":"dateStart","in":"query","required":true,"schema":{"type":"string","description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)","title":"Datestart"},"description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"dateEnd","in":"query","required":true,"schema":{"type":"string","description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)","title":"Dateend"},"description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"groupBy","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/GroupBy"}],"description":"Nivel de agregación","default":"10min","title":"Groupby"},"description":"Nivel de agregación"},{"name":"classLevel","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/ClassLevel"}],"description":"coarse o fine","default":"coarse","title":"Classlevel"},"description":"coarse o fine"},{"name":"format","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/TrafficFormat"}],"description":"json, analysis (PNG) o slide","default":"json","title":"Format"},"description":"json, analysis (PNG) o slide"},{"name":"avg","in":"query","required":false,"schema":{"type":"boolean","description":"Día promedio","default":false,"title":"Avg"},"description":"Día promedio"},{"name":"extras","in":"query","required":false,"schema":{"type":"boolean","description":"true = incluye velocidad, colas y anomalías (lento); false = solo lo principal, y esos tres se piden aparte en /velocidad, /colas y /anomalias","default":true,"title":"Extras"},"description":"true = incluye velocidad, colas y anomalías (lento); false = solo lo principal, y esos tres se piden aparte en /velocidad, /colas y /anomalias"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/velocidad":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Velocidad","description":"Velocidad de operación (p85 del sensor) del crucero: = panels.velocidad.","operationId":"get_velocidad_vehicle_detection_velocidad_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor","title":"Name"},"description":"Nombre del sensor"},{"name":"dateStart","in":"query","required":true,"schema":{"type":"string","description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)","title":"Datestart"},"description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"dateEnd","in":"query","required":true,"schema":{"type":"string","description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)","title":"Dateend"},"description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/colas":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Colas","description":"Colas y demora por acceso en la HMD: = panels.colas.","operationId":"get_colas_vehicle_detection_colas_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor","title":"Name"},"description":"Nombre del sensor"},{"name":"dateStart","in":"query","required":true,"schema":{"type":"string","description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)","title":"Datestart"},"description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"dateEnd","in":"query","required":true,"schema":{"type":"string","description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)","title":"Dateend"},"description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/anomalias":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Anomalias","description":"Detección de anomalías del crucero (eventos y patrones): = panels.anomalias.","operationId":"get_anomalias_vehicle_detection_anomalias_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor","title":"Name"},"description":"Nombre del sensor"},{"name":"dateStart","in":"query","required":true,"schema":{"type":"string","description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)","title":"Datestart"},"description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"dateEnd","in":"query","required":true,"schema":{"type":"string","description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)","title":"Dateend"},"description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/coverage-all":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Coverage All","description":"Cobertura OD de TODOS los sensores activos en el rango, con clase fija fine: % de IDs que forman flujo válido, y los IDs de una sola línea por línea y clase. Sirve para decidir qué sensor necesita ajustar líneas; ordenados de menor a mayor cobertura. format=json (para graficar en el front), pdf (ranking + una página por sensor) o png (todo en una imagen).","operationId":"get_coverage_all_vehicle_detection_coverage_all_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dateStart","in":"query","required":true,"schema":{"type":"string","description":"Primer día del rango, YYYY-MM-DD (desde sus 0 h)","title":"Datestart"},"description":"Primer día del rango, YYYY-MM-DD (desde sus 0 h)"},{"name":"dateEnd","in":"query","required":true,"schema":{"type":"string","description":"Día en que termina el rango, YYYY-MM-DD (hasta sus 0 h, exclusivo): del 28 al 29 = el 28 completo","title":"Dateend"},"description":"Día en que termina el rango, YYYY-MM-DD (hasta sus 0 h, exclusivo): del 28 al 29 = el 28 completo"},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CoverageFormat"},{"type":"null"}],"description":"json, pdf o png. Sin él, decide la cabecera Accept (application/pdf, image/png); si no, json","title":"Format"},"description":"json, pdf o png. Sin él, decide la cabecera Accept (application/pdf, image/png); si no, json"}],"responses":{"200":{"description":"JSON, PDF o PNG según `format`","content":{"application/json":{"schema":{}},"application/pdf":{},"image/png":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/fhp":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Fhp","description":"Factor de Hora Pico (FHP) del aforo: encuentra la Hora de Máxima Demanda (HMD), su volumen (VMD), el cuarto de hora pico (QMAX) y calcula FHP = VMD / (4·QMAX). Incluye la serie de volumen por 15 min.","operationId":"get_fhp_vehicle_detection_fhp_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor","title":"Name"},"description":"Nombre del sensor"},{"name":"dateStart","in":"query","required":true,"schema":{"type":"string","description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)","title":"Datestart"},"description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"dateEnd","in":"query","required":true,"schema":{"type":"string","description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)","title":"Dateend"},"description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vehicle_detection/flows/volume":{"get":{"tags":["Vehicle Detection Sensor"],"summary":"Get Flows Volume","description":"Gráfica de volumen por intervalo y por flujo (serie temporal). format=json o analysis; avg=true para día promedio.","operationId":"get_flows_volume_vehicle_detection_flows_volume_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Nombre del sensor","title":"Name"},"description":"Nombre del sensor"},{"name":"dateStart","in":"query","required":true,"schema":{"type":"string","description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)","title":"Datestart"},"description":"Inicio del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"dateEnd","in":"query","required":true,"schema":{"type":"string","description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)","title":"Dateend"},"description":"Fin del rango (YYYY-MM-DDTHH:MM:SS)"},{"name":"groupBy","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/GroupBy"}],"description":"Nivel de agregación","default":"10min","title":"Groupby"},"description":"Nivel de agregación"},{"name":"classLevel","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/ClassLevel"}],"description":"coarse (veh/bike/ped) o fine (car/van/truck/...)","default":"coarse","title":"Classlevel"},"description":"coarse (veh/bike/ped) o fine (car/van/truck/...)"},{"name":"format","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/TrafficFormat"}],"description":"json o analysis (solo gráfica de volumen)","default":"json","title":"Format"},"description":"json o analysis (solo gráfica de volumen)"},{"name":"avg","in":"query","required":false,"schema":{"type":"boolean","description":"Día promedio: colapsa el rango a un día típico","default":false,"title":"Avg"},"description":"Día promedio: colapsa el rango a un día típico"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sic/projects":{"get":{"tags":["Proxy SIC"],"summary":"Sic Projects","description":"@brief Lista de proyectos for_centurion (bootstrap del login, sin sesión).","operationId":"sic_projects_sic_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sic/ia-ws-ticket":{"get":{"tags":["Proxy SIC"],"summary":"Sic Ia Ws Ticket","description":"@brief Ticket efímero para registrarse en el WebSocket del backend de IA.\n@details Sustituye a la systemKey del bundle (fase 6): el backend de IA\nverifica la firma con el mismo IA_WS_TICKET_SECRET y toma la identidad del\nclaim email, no del mensaje del cliente.","operationId":"sic_ia_ws_ticket_sic_ia_ws_ticket_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/sic/versions":{"get":{"tags":["Proxy SIC"],"summary":"Sic Versions","description":"@brief Lista de versiones de un tipo de documento (p. ej. MU = Manual de Usuario).","operationId":"sic_versions_sic_versions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"type","in":"query","required":true,"schema":{"type":"string","title":"Type"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","title":"From"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sic/versions/{id_version}/file":{"get":{"tags":["Proxy SIC"],"summary":"Sic Version File","description":"@brief Archivo (base64 dentro del JSON del SIC) de una versión concreta.","operationId":"sic_version_file_sic_versions__id_version__file_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id_version","in":"path","required":true,"schema":{"type":"integer","title":"Id Version"}},{"name":"type","in":"query","required":true,"schema":{"type":"string","title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sic/openai-models":{"get":{"tags":["Proxy SIC"],"summary":"Sic Openai Models","description":"@brief Modelos de IA disponibles para el chat CenturIA.\n@details Desde la fase 8 los atiende el backendai de esta instancia (keys\npropias), no el SIC. Se conserva la ruta /sic/openai-models para no tocar\nel frontend. El backendai exige un ticket firmado con IA_WS_TICKET_SECRET\nporque su puerto es público vía el dominio de IA.","operationId":"sic_openai_models_sic_openai_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/sic/controllers/0/{matricula}":{"patch":{"tags":["Proxy SIC"],"summary":"Sic Update Controller","description":"@brief Actualiza la ubicación de un controlador en el SIC.","operationId":"sic_update_controller_sic_controllers_0__matricula__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"matricula","in":"path","required":true,"schema":{"type":"string","title":"Matricula"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/remoto/{proyecto}/controladores":{"get":{"tags":["Consulta remota"],"summary":"Controladores Remotos","description":"@brief Controladores de otro proyecto (GET /info/controladores allá), para el usuario de la sesión.","operationId":"controladores_remotos_remoto__proyecto__controladores_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"proyecto","in":"path","required":true,"schema":{"type":"string","title":"Proyecto"}},{"name":"manual","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Manual"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/remoto/{proyecto}/monitoring/{reporte}":{"get":{"tags":["Consulta remota"],"summary":"Reporte Pdf Remoto","description":"@brief Reporte PDF de conectividad de otro proyecto; los query params viajan tal cual\n(matricula, dias, fecha_inicio, fecha_fin, project_name...).","operationId":"reporte_pdf_remoto_remoto__proyecto__monitoring__reporte__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"proyecto","in":"path","required":true,"schema":{"type":"string","title":"Proyecto"}},{"name":"reporte","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ReportePDF"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/archivos/centurion/cifrar":{"post":{"tags":["Archivos"],"summary":"Cifrar Centurion","description":"@brief Cifra un contenido para descargarlo como archivo .centurion.","operationId":"cifrar_centurion_archivos_centurion_cifrar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContenidoCenturion"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/archivos/centurion/descifrar":{"post":{"tags":["Archivos"],"summary":"Descifrar Centurion","description":"@brief Descifra un archivo .centurion que el usuario subió.\n@details Un archivo corrupto o de otro origen falla al quitar el padding;\nse responde 422 para que el frontend lo distinga de un fallo del servidor.","operationId":"descifrar_centurion_archivos_centurion_descifrar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArchivoCenturion"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}}},"components":{"schemas":{"ArchivoCenturion":{"properties":{"data_b64":{"type":"string","title":"Data B64"}},"type":"object","required":["data_b64"],"title":"ArchivoCenturion","description":"@class ArchivoCenturion\n@brief Contenido cifrado del archivo, en base64 (el archivo en disco son los\nmismos bytes sin codificar; el base64 solo sirve para viajar en el JSON)."},"AuthRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"proyecto":{"type":"string","title":"Proyecto"},"origen":{"type":"boolean","title":"Origen"}},"type":"object","required":["email","password","proyecto","origen"],"title":"AuthRequest"},"Body_add_plans_update_agregar_planos_post":{"properties":{"matricula":{"type":"string","title":"Matricula"},"histograma":{"type":"string","format":"binary","title":"Histograma"},"esquema":{"type":"string","format":"binary","title":"Esquema"}},"type":"object","required":["matricula"],"title":"Body_add_plans_update_agregar_planos_post"},"Body_delete_plans_update_borrar_planos_delete":{"properties":{"matricula":{"type":"string","title":"Matricula"},"borrar_histograma":{"type":"boolean","title":"Borrar Histograma","default":false},"borrar_esquema":{"type":"boolean","title":"Borrar Esquema","default":false}},"type":"object","required":["matricula"],"title":"Body_delete_plans_update_borrar_planos_delete"},"ClassLevel":{"type":"string","enum":["coarse","fine"],"title":"ClassLevel","description":"Granularidad de clase vehicular para /flows."},"ContenidoCenturion":{"properties":{"contenido":{"type":"string","title":"Contenido"}},"type":"object","required":["contenido"],"title":"ContenidoCenturion","description":"@class ContenidoCenturion\n@brief Texto plano a cifrar (la programación o la configuración de flechas)."},"Control":{"properties":{"matricula":{"type":"string","title":"Matricula"},"nombre_auxiliar":{"type":"string","title":"Nombre Auxiliar"},"programacion":{"type":"string","title":"Programacion"},"nota":{"type":"string","title":"Nota"},"fecha":{"type":"string","format":"date","title":"Fecha"},"hora":{"type":"string","format":"time","title":"Hora"},"proyecto":{"type":"string","title":"Proyecto"},"latitud":{"type":"string","title":"Latitud"},"longitud":{"type":"string","title":"Longitud"},"interseccion":{"type":"string","title":"Interseccion"}},"type":"object","required":["matricula","nombre_auxiliar","programacion","nota","fecha","hora","proyecto","latitud","longitud","interseccion"],"title":"Control"},"ControladorSensor":{"properties":{"sensor_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sensor Id"}},"additionalProperties":false,"type":"object","title":"ControladorSensor","description":"Enlace controlador → sensor. sensor_id null desenlaza."},"CoverageFormat":{"type":"string","enum":["json","pdf","png"],"title":"CoverageFormat","description":"Formato de salida para /coverage-all (cobertura de todos los sensores)."},"Emergencia":{"properties":{"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"},"radius_m":{"type":"integer","title":"Radius M"},"controllers":{"items":{"type":"string"},"type":"array","title":"Controllers"}},"type":"object","required":["latitude","longitude","radius_m","controllers"],"title":"Emergencia"},"EmergenciaOFF":{"properties":{"controllers":{"items":{"type":"string"},"type":"array","title":"Controllers"}},"type":"object","required":["controllers"],"title":"EmergenciaOFF"},"Estado":{"properties":{"matricula":{"type":"string","title":"Matricula"},"estado":{"type":"object","title":"Estado"},"latitud":{"type":"number","title":"Latitud"},"longitud":{"type":"number","title":"Longitud"},"fecha":{"type":"string","format":"date","title":"Fecha"},"hora":{"type":"string","format":"time","title":"Hora"},"descripcion":{"type":"string","title":"Descripcion"}},"type":"object","required":["matricula","estado","latitud","longitud","fecha","hora","descripcion"],"title":"Estado"},"EstadoEMQX":{"properties":{"matricula":{"type":"string","title":"Matricula"},"estado":{"type":"object","title":"Estado"},"latitud":{"type":"number","title":"Latitud"},"longitud":{"type":"number","title":"Longitud"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["matricula","estado","latitud","longitud","timestamp"],"title":"EstadoEMQX"},"EstadoPos":{"properties":{"matricula":{"type":"string","title":"Matricula"},"latitud":{"type":"number","title":"Latitud"},"longitud":{"type":"number","title":"Longitud"},"zona":{"type":"integer","title":"Zona"},"interseccion":{"type":"string","title":"Interseccion"}},"type":"object","required":["matricula","latitud","longitud","zona","interseccion"],"title":"EstadoPos"},"EventoVentana":{"properties":{"nombre":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nombre"},"inicio":{"type":"string","pattern":"^(([01]\\d|2[0-3]):[0-5]\\d|24:00)$","title":"Inicio"},"fin":{"type":"string","pattern":"^(([01]\\d|2[0-3]):[0-5]\\d|24:00)$","title":"Fin"},"nivel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nivel"}},"type":"object","required":["inicio","fin"],"title":"EventoVentana","description":"Franja horaria local de un evento del controlador (valle, normal, pico).\n\ninicio/fin en \"HH:MM\"; se admite fin \"24:00\" y franjas que cruzan\nmedianoche (inicio > fin)."},"EventosRequest":{"properties":{"eventos":{"items":{"$ref":"#/components/schemas/EventoVentana"},"type":"array","title":"Eventos","default":[]}},"type":"object","title":"EventosRequest","description":"Body de /get-program: los eventos que muestra el front (franjas del\nanálisis pico/valle). Vacío u omitido = un solo programa con la HMD del\nrango completo."},"FormatType":{"type":"string","enum":["json","csv"],"title":"FormatType"},"GroupBy":{"type":"string","enum":["10min","15min","hour","day","week","month","total"],"title":"GroupBy","description":"Niveles de agregación para /traffic y /flows.\n\nLas cubetas finas son alias de la cubeta NATIVA de la digesta\n(DIGEST_BIN_MIN): en una instalación de 15 min, pedir \"10min\" devuelve\ncubetas de 15 y meta.group_by lo reporta. Pedir una más fina que la nativa\nno es posible, y 15 no es múltiplo de 10."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Local":{"properties":{"matricula":{"type":"string","title":"Matricula"},"usuario":{"type":"string","title":"Usuario"},"prog":{"type":"object","title":"Prog"},"interseccion":{"type":"string","title":"Interseccion"},"nota":{"type":"string","title":"Nota"},"fecha":{"type":"string","format":"date-time","title":"Fecha"}},"type":"object","required":["matricula","usuario","prog","interseccion","nota","fecha"],"title":"Local"},"Modo":{"properties":{"matricula":{"type":"string","title":"Matricula","example":"TC-CL-24-0023"},"modo":{"type":"string","title":"Modo","example":"A"},"usuario":{"type":"string","title":"Usuario","example":"miovision@miovision"}},"type":"object","required":["matricula","modo","usuario"],"title":"Modo"},"Operacion":{"properties":{"matricula":{"type":"string","title":"Matricula","description":"Matrícula de control","example":"TC-CL-24-0023"},"usuario":{"type":"string","title":"Usuario","description":"Usuario que realiza la solicitud","example":"miovision@miovision.com"},"prog":{"type":"object","title":"Prog","description":"Datos de programación","default":{},"example":{}},"interseccion":{"type":"string","title":"Interseccion","description":"Intersección de referencia","example":"Calle 1 y Av. 2"},"nota":{"type":"string","title":"Nota","description":"Comentarios adicionales","example":"Nota importante"},"fecha":{"type":"string","format":"date-time","title":"Fecha","description":"Fecha y hora de la solicitud","example":"2025-06-02T09:22:28"}},"type":"object","required":["matricula","usuario","interseccion","nota","fecha"],"title":"Operacion"},"ParametrosWebster":{"properties":{"tiempo_escenario_min":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":1.0},{"type":"null"}],"title":"Tiempo Escenario Min"},"ciclo_min_s":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":1.0},{"type":"null"}],"title":"Ciclo Min S"},"ciclo_max_s":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":1.0},{"type":"null"}],"title":"Ciclo Max S"},"reduccion_valle_pct":{"anyOf":[{"type":"integer","maximum":90.0,"minimum":0.0},{"type":"null"}],"title":"Reduccion Valle Pct"}},"additionalProperties":false,"type":"object","title":"ParametrosWebster","description":"Límites del ciclo de Webster editables en caliente (tabla PARAMETROS).\nSe mandan solo los que cambian; la coherencia entre ellos (mínimo ≤ máximo,\ntope del equipo, mínimo del firmware) la valida parametros.validar_webster\nsobre el conjunto resultante."},"ReportePDF":{"type":"string","enum":["pdf-relative-individual","pdf-absolute-individual","pdf-relative-general","pdf-absolute-general"],"title":"ReportePDF","description":"@brief Reportes PDF que se pueden pedir a otro proyecto (lista blanca)."},"SensorAlta":{"properties":{"nombre":{"type":"string","maxLength":255,"minLength":1,"title":"Nombre"},"ip":{"type":"string","title":"Ip"},"activo":{"type":"boolean","title":"Activo","default":true}},"additionalProperties":false,"type":"object","required":["nombre","ip"],"title":"SensorAlta","description":"Alta de un sensor en SENSORES. El NOMBRE es el tag inmutable con el que\nel recolector escribe en InfluxDB: no existe endpoint para renombrarlo."},"SensorCambio":{"properties":{"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip"},"activo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Activo"}},"additionalProperties":false,"type":"object","title":"SensorCambio","description":"Cambios admitidos sobre un sensor: IP y ACTIVO. Sin nombre a propósito\n(extra=forbid lo rechaza con 422): renombrar duplicaría la serie en Influx."},"TipoConsulta":{"type":"string","enum":["Histograma","Esquema"],"title":"TipoConsulta"},"TrafficFormat":{"type":"string","enum":["json","analysis","slide"],"title":"TrafficFormat","description":"Formato de salida para /traffic, /flows y /flows/volume."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"add_user":{"properties":{"nombre":{"type":"string","title":"Nombre"},"ap_pater":{"type":"string","title":"Ap Pater"},"ap_mater":{"type":"string","title":"Ap Mater"},"correo":{"type":"string","title":"Correo"},"rol":{"type":"string","title":"Rol"},"password":{"type":"string","title":"Password"},"proyecto":{"items":{"type":"string"},"type":"array","title":"Proyecto"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"notifications":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Notifications"}},"type":"object","required":["nombre","ap_pater","ap_mater","correo","rol","password","proyecto"],"title":"add_user"},"assign_user":{"properties":{"usuario_reg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Usuario Reg"},"correo":{"type":"string","title":"Correo"},"proyecto":{"type":"string","title":"Proyecto"}},"type":"object","required":["correo","proyecto"],"title":"assign_user"},"config_eschema":{"properties":{"matricula":{"type":"string","title":"Matricula","example":"TC-CL-24-0023"},"config_scheme":{"type":"object","title":"Config Scheme","example":{"arrows":[{"curvature":0,"id":1764714856163,"length":5.2,"phase":2,"rotation":84,"scale":1,"x":248.65042979942695,"y":1.180945577927588},{"curvature":180,"id":1764714856164,"length":7.7,"phase":2,"rotation":60,"scale":1,"x":317.7707736389685,"y":3.0258493682753684},{"curvature":0,"id":1764714883692,"length":4.5,"phase":6,"rotation":263,"scale":1,"x":547.8166189111748,"y":699.9367382472432},{"curvature":0,"id":1764714941100,"length":4.3,"phase":3,"rotation":171,"scale":1,"x":1047.8223495702005,"y":283.59355328362875}],"exportDate":"2025-12-02T22:36:14.149Z","version":"1.0"}}},"type":"object","required":["matricula","config_scheme"],"title":"config_eschema"},"estadoCliente":{"properties":{"estado":{"type":"boolean","title":"Estado"},"matricula":{"type":"string","title":"Matricula"}},"type":"object","required":["estado","matricula"],"title":"estadoCliente"},"subidaOneDrive":{"properties":{"ruta":{"type":"string","title":"Ruta"},"carpeta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Carpeta"},"proyecto":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proyecto"}},"type":"object","required":["ruta"],"title":"subidaOneDrive"},"update_user":{"properties":{"user":{"type":"string","title":"User"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"ap_pater":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ap Pater"},"ap_mater":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ap Mater"},"id_rol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id Rol"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"activo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activo"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"notifications":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Notifications"}},"type":"object","required":["user"],"title":"update_user"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}