Pérdida de Vídeo Frontal
Desde el colector a la función rules-complete-vehicles llega el evento Video Loss y esta función
se encarga de completar a que vehiculo pertenece este evento seteando la propiedad vehiculo
{
"events": [
{
"alt": 0,
"fecha": "2025-05-05T16:49:36.945Z",
"fechaGPS": "2025-05-05T16:49:39.000Z",
"lat": "-31.417123",
"lng": "-62.081555",
"rumbo": 259,
"tipo": "Video Loss",
"serieDVR": "0071024D02",
"velocidad": 0,
"precisionGPS": 2,
"comando": 1,
"canal": 1,
"alarmaID": 4,
"vehiculo": {
"id": 7363,
"serieDVR": "0071024D02",
"dominioTractor": "AE977HK",
"numeroInterno": "297",
"transportistasId": 1,
"tipodvr": "M1N",
"negocio": 1,
"_deleted": false
},
"choferesId": null,
"eventoId": "6179231372148736",
"vehiculosId": 7363,
"usuariosId": null,
"isHist": false
}
]
rules-complete-viajes
En esta función se completan en el evento las propiedades viaje y viajesId.
En caso de ser un evento historico se busca un viaje en mysql con fecha de carga menor o igual a la fecha
del evento.
Si es un evento en real time se busca el ultimo viaje registrado en redis vinculado a la unidad.
rules-complete-lugares
En esta función se completan estas propiedades:
lugaresytipoLugaresId- Lugares que contengan al punto (lat, lng) dentro de su geometría, filtrando por estado APROBADO (Tiene un maximo de 10 lugares).
maximaynombreCartografia- Velocidad maxima y nombre de la cartografia del negocio que pertenece la unidad.
rules-complete-tipoeventos
En esta función se reemplaza el nombre del evento que viene en el colector por el tipo perdida_video_frontal
{
"canal": "frontal",
"comando": 1,
"delta": 0,
"descripcion": "Cuando se detecte la desconexión de la cámara frontal de CCTV",
"destacado": false,
"id": 150,
"idExterno": "Video Loss",
"intervencion": true,
"nombre": "Pérdida de Vídeo Frontal",
"nombreCorto": "perdida_video_frontal",
"tablet": false,
"tipo": "evento",
"useAsUiFilter": true
}
Aca podemos ver el cambio en el payload:

Para llevar a cabo esta relación se consulta en redis según el tipo de evento Video Loss el
siguiente payload:
[
{
"id": 150,
"nombreCorto": "perdida_video_frontal",
"nombre": "Pérdida de Vídeo Frontal",
"descripcion": "Cuando se detecte la desconexión de la cámara frontal de CCTV",
"tipo": "evento",
"intervencion": true,
"idExterno": "Video Loss",
"destacado": false,
"tablet": false,
"delta": 0,
"comando": 1,
"canal": "frontal",
"useAsUiFilter": true
},
{
"id": 151,
"nombreCorto": "perdida_video_tapa",
"nombre": "Pxc3xa9rdida de Vxc3xaddeo Tapa superior",
"descripcion": "Cuando se detecte la desconexixc3xb3n de la cxc3xa1mara tapa superior de CCTV",
"tipo": "alarma",
"intervencion": true,
"idExterno": "Video Loss",
"destacado": true,
"tablet": false,
"delta": 0,
"comando": 1,
"canal": "tapa_superior",
"useAsUiFilter": true
},
{
"id": 152,
"nombreCorto": "perdida_video_valvula",
"nombre": "Pxc3xa9rdida de Vxc3xaddeo Vxc3xa1lvula",
"descripcion": "Cuando se detecte la desconexixc3xb3n de la cxc3xa1mara vxc3xa1lvula de CCTV",
"tipo": "alarma",
"intervencion": true,
"idExterno": "Video Loss",
"destacado": true,
"tablet": false,
"delta": 0,
"comando": 1,
"canal": "valvula",
"useAsUiFilter": true
},
{
"id": 220,
"nombreCorto": "perdida_video_generica",
"nombre": "Pxc3xa9rdida de Vxc3xaddeo Genxc3xa9rica",
"descripcion": "Cuando se detecte la desconexixc3xb3n de alguna cxc3xa1mara de CCTV",
"tipo": "evento",
"intervencion": true,
"idExterno": "Video Loss",
"destacado": false,
"tablet": false,
"delta": 0,
"comando": 1,
"canal": "generico",
"useAsUiFilter": true
}
]
Como el canal viene en 1, no tengo inicio y fin.
Ahora con el tipo de dvr busco la configuración que esta guardada en redis, en este caso
de ejemplo el dispositivo es de tipo M1N:
[
{ "name": "Frontal", "order": 1, "channel": 1, "ispAnalytics": "" },
{ "name": "Lateral Derecha", "order": 2, "channel": 2 },
{ "name": "Lateral Izquierda", "order": 3, "channel": 3 },
{ "name": "Retroceso", "order": 4, "channel": 4 },
{ "name": "Elevador", "order": 5, "channel": 5 }
]
Como el canal es el 1 obtengo la camara Frontal
{ "name": "Frontal", "order": 1, "channel": 1, "ispAnalytics": "" },
El nombre de la camara matchea con el canal del tipo de evento que esta guardado en redis
por lo tanto la propiedad tipo del evento se completa asi:
{
"id": 150,
"nombreCorto": "perdida_video_frontal",
"nombre": "Pérdida de Vídeo Frontal",
"descripcion": "Cuando se detecte la desconexión de la cámara frontal de CCTV",
"tipo": "evento",
"intervencion": true,
"idExterno": "Video Loss",
"destacado": false,
"tablet": false,
"delta": 0,
"comando": 1,
"canal": "frontal",
"useAsUiFilter": true
}
y el evento completo que se envia a la rules-complete-preevaluation es:
[
{
"alarmaID": 4,
"alt": 0,
"canal": 1,
"choferesId": null,
"comando": 1,
"eventoId": "6179231372148736",
"fecha": "2025-05-05T16:49:36.945Z",
"fechaGPS": "2025-05-05T16:49:39.000Z",
"isHist": false,
"lat": "-31.417123",
"lng": "-62.081555",
"lugares": [],
"maxima": 45,
"nombreCartografia": "CORDOBA-40-M-T1023",
"precisionGPS": 2,
"rumbo": 259,
"serieDVR": "0071024D02",
"tipo": {
"canal": "frontal",
"comando": 1,
"delta": 0,
"descripcion": "Cuando se detecte la desconexión de la cámara frontal de CCTV",
"destacado": false,
"id": 150,
"idExterno": "Video Loss",
"intervencion": true,
"nombre": "Pérdida de Vídeo Frontal",
"nombreCorto": "perdida_video_frontal",
"tablet": false,
"tipo": "evento",
"useAsUiFilter": true
},
"tipoEventosId": 150,
"tipoLugaresId": null,
"usuariosId": null,
"vehiculo": {
"_deleted": false,
"dominioTractor": "AE977HK",
"id": 7363,
"negocio": 1,
"numeroInterno": "297",
"serieDVR": "0071024D02",
"tipodvr": "M1N",
"transportistasId": 1
},
"vehiculosId": 7363,
"velocidad": 0,
"viaje": null,
"viajesId": null
}
]
rules-complete-preevaluation
En esta función se completan las propiedades:
- "ignition": true
- "lastRpt": null
- "lastRud": null
- "lastStart": null
- "mustCreateStop": false
check-related
En esta función lo que se realiza es buscar en redis si el evento tiene un evento relacionado
para poder hacer la acumulación con los demas Video Loss que lleguen con el mismo alarmaID.
Como el comando del incidente es 0, lo toma como evento de inicio y sigue con la ejecución.
En el caso que sea comando 1 hay dos posibles casos:
-
Que el delta de tiempo definido para el evento sea mayor que 0, en ese caso se busca el incidente relacionado en redis y se checkea que el la diferencia de tiempo entre el incidente original y el relacionado sean menores al delta definido para ese evento.
: Tiempo absoluto en segundos según fechaGPS del evento original
: Tiempo absoluto en segundos según fechaFin del evento relacionado
: Delta de tiempo asociado al tipo de evento
En el caso que se cumpla se borra de redis la key del acumulado.
Luego:
- Se aumenta en uno la cantidad de acumulados en el evento relacionado.
- Se calcula duración entre fechaGPS del relacionado y la fecha de fin del evento.
- Se actualiza el comando del relacionado con el del evento original.
-
El otro caso es que el delta sea 0, el tipo de evento sea de acumulación y tenga asociado un alarmaID.
- En este caso se actualiza en redis el relacionado por tipo y alarmaID, no se realiza la validación de tiempo como en el caso anterior.
Luego de este procesamiento el evento se envia con su relacionado en el caso que exista al motor de reglas.
motor-reglas
En la función motor-reglas se completan las siguientes propiedades:
"geometry": {
"type":"Point",
"coordinates":[-62.081555,-31.417123]
},
"fechaActualizacion": "2025-05-05T16:49:39.000Z",
"fechaFin": "2025-05-05T16:49:39.000Z",
"lastShift": null,
Estas propiedades no son relevantes para la generación del evento Perdida de video frontal.
Luego de procesarse en estas funciones se crea un incidente en mysql enviando el evento
a la función rules-create-incident.