Timer events
With the addition of timer events to the execution context, a wide variety of custom behaviours is now possible. The added functionality of course comes with some new considerations about how to write your scripts.
- Execution contexts are not re-used, so any variables or assignments not made to the asset object will be lost between events.
 - If a device event is supposed to cancel a timer, but the device has not reported in, the timer may fire while the device is outside of cellular coverage, or before it can send in the event.
 - Timer events only fire after all other events have been processed. That means if there is a backlog of events to process for an asset, the timer will not necessarily fire at the moment requested.
 
How to control and handle a timer
There are two new gloabl methods embedded in the execution context; setTimer and clearTimer. The setTimer function takes two arguments, the timer ID, and a valid Date object as the desried date/time to invoke the TimerEvent. The clearTimer takes only one argument; the timer ID. A timer ID is a number with a value between 128 and 255. Values of 127 and lower are reserved for system use.
When a timer event is fired, it fires only two events in this order:
- timer TimerEvent
The event fired by a invoking setTimer. - finalize FinalizeEvent
After all events have been fired, this one happens last so developers can perform any last checks or clean-ups. 
Here's a simple example for setting and handling a timer event:
var timerId = 128,
     threshold = 60 * 60 * 1000;   // 1 hour
asset.on("position", function(event) {
     clearTimer(timerId); // clear timer with each new position
     var callAt = threshold + event.position.dts.valueOf();
     if (callAt > new Date()) setTimer(timerId, callAt); // only set the timer if it's in the future
});
asset.on("timer", function(event) {
     if (event.number == timerId) {
         // do something
     }
}); 
Here's an example from a script that sets the out-of-date tag on an asset:
var timerId = 209,
     threshold = 5 * 60 * 1000, // 5 minutes
     tagName = "out-of-date";
asset.on("finalize", function(event) {
     clearTimer(timerId);
     var indexOod = this.tags.indexOf(tagName);
     if (!this.position || (new Date() - this.position.dts) >= threshold) {
         if (indexOod < 0) this.tags.push(tagName);
     } else {
         if (threshold > 0) {
             var callAt = threshold + this.position.dts.valueOf();
             if (callAt > new Date()) setTimer(timerId, callAt); // only set the timer if it's in the future
         }
         if (indexOod > -1) this.tags.splice(indexOod, 1);
     }
});