Expresiones de Script

Las expresiones de script te permiten escribir tus propios scripts personalizados. Pueden usarse en escenarios de evaluación mucho más complejos en comparación con las reglas de eventos regulares. Se debe usar JavaScript como lenguaje de scripting.

Características

Algunos de los problemas que puedes resolver con expresiones de script: 

  • Combinar evaluaciones complejas de AND/OR, ya que es posible usar múltiples variables en una sola expresión.
  • Preservar datos entre evaluaciones y basar el resultado de la evaluación actual en una combinación de datos actuales e históricos.

Configuración

Para usar expresiones de script, sigue estos pasos:

1. Ve a Gestión de Aplicaciones y habilita _EditScriptExpression.

mceclip0.png

2. Guarda las propiedades de la aplicación.

Configurando tu Expresión de Script

1. Inicia sesión en tu aplicación.

2. Ve a Menú Principal >Admin > Reglas de Eventos.

3. Selecciona + Regla de Evento para crear una nueva regla de evento.

4. Cuando llegues a 4. Expresiones, selecciona Expresión de Script.

Screenshot 2024-08-14 at 13.29.03.png

5. Haz clic en Editar para abrir el editor de scripts.

Screenshot 2024-08-14 at 13.29.43.png

6. Para desarrollar tus scripts, recomendamos seguir estas pautas.

Screenshot 2024-08-14 at 13.54.37.png

7. Cuando termines con tu script, haz clic en Probar Script.

8. Guarda tu script.

9. Guarda tu Regla de Evento.

Importante

  • Solo es posible agregar una expresión de script por regla de evento
  • Las expresiones de script no están disponibles en las expresiones finales. Un solo script te permite controlar las condiciones para activar y finalizar el evento con gran detalle, por lo que esto no crea una limitación.
  • Las expresiones de script deben devolver el resultado convertible al tipo booleano (verdadero o falso), indicando si se cumple esta condición para activar el evento. Nota: devolver valores 0, cadena vacía, nulo o indefinido, o que el script arroje un error es equivalente a devolver falso, mientras que devolver valores distintos de cero u objetos definidos es equivalente a verdadero.
  • Puedes usar la función fields.get(...) para obtener valores de variables mapeadas en el paso “3. Mapeo” del Mapeador de Dispositivos. El primer parámetro es el nombre de la variable, el segundo parámetro es un valor predeterminado que se puede usar si la variable no existe (por ejemplo, si el rastreador nunca la ha enviado). Siempre debes manejar este caso de “variable faltante” para evitar errores de evaluación. Ten en cuenta que las variables utilizadas deben estar mapeadas para los rastreadores a los que se aplicará la Regla de Evento. Las variables de script mapeadas en el paso “4. Scripts” del Mapeador de Dispositivos son accesibles desde los scripts de Expresión de Script.
  • Puedes usar context.setState(...) para establecer el objeto context.state accesible desde el script, que se conserva entre evaluaciones separadas. El parámetro de setState puede ser cualquier valor u objeto definido en el script. El estado se guardará en formato JSON. Nota: JSON solo distingue entre los tipos Número, Cadena, Booleano, Arreglo, Objeto o nulo; para tipos como Fecha, la información del tipo se perderá, mientras que las funciones no se pueden guardar en el estado.
  • Puedes acceder a los datos del punto de rastreo a través del objeto trackPoint, por ejemplo.
    var foo = trackPoint.position.longitude;
  • Intenta escribir código eficiente y evita instrucciones innecesarias en los scripts.
  • Hay un límite de pasos de ejecución para cada script para evitar que scripts defectuosos bloqueen el servidor.

Ejemplos

Ejemplo 1: Crear una notificación cuando la velocidad de un activo cambia

Puedes usar esto para saber cuándo el activo deja de estar inactivo.

var velocity = trackPoint.velocity.groundSpeed;
var oldvelocity = context.state;
log('velocity: '+velocity);
log('oldvelocity: '+oldvelocity);

if (velocity !== oldvelocity)
{
context.setState(velocity);
return true;
} else return false;

Screenshot 2024-08-14 at 13.55.16.png

Ejemplo 2: Saber cuándo un activo está excediendo la velocidad solo

-pero solo cuando el exceso de velocidad ocurre de manera continua, en varios mensajes recibidos

Usaremos el objeto trackPoint para acceder a los datos de velocidad (trackPoint.velocity.groundSpeed) y el objeto context.state para preservar la información entre evaluaciones. Estableceremos un umbral de tres mensajes recibidos.

Para verificar la velocidad, y si cruza el umbral por primera vez, guardamos la información de que ocurrió una vez, pero no activamos el evento. Si ocurre nuevamente, tenemos la información de que ya ocurrió una vez en el objeto de estado, y actualizamos el estado para denotar el nivel crítico, pero aún no activamos el evento. Si ocurre por tercera vez, veremos que el estado está en crítico, y ahora activaremos el evento.

Finalmente, si en algún momento la velocidad baja del límite, necesitamos restablecer el estado. Podemos usar un script que se vea así:

---

var speedLimit = 23; // velocidad en metros/segundo

if(trackPoint.velocity.groundSpeed > speedLimit){
// la velocidad está por encima del límite

if(context.state == 'once') {
context.setState('critical');
return false;
}
else if (context.state == 'critical') {
return true;
}
else {
context.setState('once');
return false;
}
}
else {
// la velocidad no está por encima del límite
context.setState('');
return false;
}

Screenshot 2024-08-14 at 13.57.51.png

Ejemplo 3: Calcular la diferencia de tiempo entre mensajes

El siguiente script se activará cuando se supere la diferencia de tiempo entre dos reportes de posición de rastreador diferentes.

---

var d = new Date(trackPoint.utcTimestamp);
var newTime = d.getTime();
var oldTime = context.state;
var limit = 5000; //tiempo en milisegundos

log('newTime: ' + newTime);
log('oldTime: ' + oldTime);

if (!context.state)
{
context.setState (newTime);
log('check1');
}

if ((newTime - oldTime) > limit) // si es más que el límite, entonces esta expresión debería ser verdadera
{
return true;
log('check2');
} else {
context.setState (newTime);
log('check3');
return false;
}

Screenshot 2024-08-14 at 13.58.37.png

Nota: La Regla de Evento no se puede guardar si el script contiene errores.

Ejemplo 4: Consultar el tipo de carretera (expresiones de exceso de velocidad), y si el límite de velocidad de esa carretera excede el valor de velocidad establecido, activar una alerta:

---

var road_type = road.getRoad().type;
var speed = fields.get("Speed",0);
log(road_type);
if(road_type=='motorway' && speed>22,22) // 80kmh a m/s
{
  return true;

return false;

Ejemplo 5: indicar la distancia recorrida entre diferentes categorías de PDI visitadas

Visita este artículo para ver esta solución.

Ejemplo 6: Calcular la distancia diaria y la Velocidad Máxima del día:

(lee sobre esta solución en el Personalizar el panel de estado del activo con estadísticas diarias clave)

---

var local_time=new Date(trackPoint.utcTimestamp.getTime()-new Date().getTimezoneOffset()*60000);
log(local_time);
//Si no hay estado o es un nuevo día
if(!state || state == '' || (new Date(state.date) < local_time)){
var tonightMidnight = local_time;
tonightMidnight.setUTCHours(0,0,0,0);
tonightMidnight.setUTCDate( tonightMidnight.getUTCDate()+1);
var myObject = {
'date': tonightMidnight, //restablecer medianoche mañana
'odometer': odometer, //Valor del odómetro
'speed': speed //Velocidad
}
context.setState(myObject);
}
else
{
if(speed >= state.speed || state.speed =='')
{
state.speed=speed;
context.setState(state);
}
max_speed=state.speed * 3.6;
context.setVariable('Max_Speed', max_speed.toFixed(1));
context.setVariable('Daily_Distance', (odometer - state.odometer)/1000);
return true;
}
return false;

Ejemplo 7: detectar robo de combustible

El siguiente script guarda 8 medidas consecutivas del nivel de combustible y calcula la media de los primeros 4 valores y también la media de los últimos 4 valores.
Si la diferencia es mayor que el umbral especificado, indicaría un consumo anormal de combustible.
Por defecto, el script tiene un umbral de 3 (la diferencia entre ambas medias en litros). Este valor se puede modificar de acuerdo con las entradas de señal de nivel de combustible que reciba de su rastreador (litros/galones). 

var threshold = 3; //la diferencia entre ambas medias en litros
var fuel = fields.get("Fuel level",0);
if(!context.state || context.state == ''){ //primera vez
var fuelarray = [fuel]; //agregar valores de combustible
context.setState(fuelarray);
}
else{ //no es la primera vez
var updatedArray = context.state;
if (context.state.length > 7){//calcular media
var mean1 = 0, mean2 = 0;
for (var i = 0; i < 4; i++){
mean1 += context.state[i];
}
mean1 = mean1 / 4;
for (var i = 4; i < 8; i++){
mean2 += context.state[i];
}
mean2 = mean2 / 4;
if(mean1 - mean2 > threshold){
if(fuel != 0){
updatedArray.shift();
updatedArray.push(fuel);
}
context.setState(updatedArray);
return true;
}
if(fuel != 0){
updatedArray.shift();
updatedArray.push(fuel);
}
}
else{//agregar valores
if(fuel != 0){
updatedArray[context.state.length] = fuel;
}
}
context.setState(updatedArray);
}

Más sobre Pruebas

  • Utilice la función log() para producir información de depuración en la salida del editor de scripts en modo de prueba.
  • Utilice el simulador de activos para generar datos para sus pruebas. Puede leer más sobre esta herramienta aquí.
  • Puede usar la terminal para ver cómo se intercambian los datos entre el servidor y el rastreador. Puede leer más sobre el uso de la terminal aquí.