Difference between revisions of "Computed measurement"
Line 76: | Line 76: | ||
const inputMeasurement = data[i]; | const inputMeasurement = data[i]; | ||
const temperatureF = inputMeasurement.temperatureF; | const temperatureF = inputMeasurement.temperatureF; | ||
− | + | ||
// Calculate the temperature in C | // Calculate the temperature in C | ||
const temperatureC = (temperatureF − 32) * 5/9; | const temperatureC = (temperatureF − 32) * 5/9; | ||
− | + | ||
const outputMeasurement = { | const outputMeasurement = { | ||
site_id: inputMeasurement.site_id, | site_id: inputMeasurement.site_id, |
Revision as of 10:37, 16 September 2019
This page describes computed measurement in detail.
Contents
Overview
As described here, computed measurement is a type of data that is generated from other data sources.
... describe in detailed ... ... include a diagram to describe the parts that the developer needs to know ... ... describe the lifecycle of those parts ...
Design
The first thing to do when designing a computed measurement is to decide what are the inputs and what to output. A computed measurement can specify multiple measurements as input. Metrics and tags in those measurement will then be available to the function that is responsible for generating the output.
... what are valid inputs ... ... what is a valid output ...
Implementation
... describe what functions the developer must override, and what is the expected behaviour of those functions ... ... Junhao feedback that it is unclear that you must output a valid measurement. he thought he has to always output something, like NULL during initial invocation ...
Testing
... how to test ... ... limitations of the test environment ...
Execution
... describe when the compute function will be run. ... ... describe caveats when using multiple measurements - eg. measurement 1 and measurement 2 can come in at different times, and compute will be called twice ...
Examples
Example 1: Temperature Scale Conversion
This example shows a simple usage of computed measurement.
Imagine you have a temperature sensor that sends raw temperature values in degrees Farenheit (℉) and you want to show the temperature in degrees Celsius (°C) instead. This is the temperature measurement from the temperature sensor that you have as input:
{ "tm_source": xxxxxxxxxx, "site_id" xxxxxxxx, "tag1": "xxxxxxxx", "tag2": "xxxxxxxx", "temperatureF": xxxxxxxxx }
And this is the computed measurement that you want to output:
{ "tm_source": xxxxxxxxxx, "site_id" xxxxxxxx, "tag1": "xxxxxxxx", "tag2": "xxxxxxxx", "temperatureC": xxxxxxxxx }
You can use the following script to perform the temperature metric conversion:
The completed script:
/** * @name: init * @description: Perform one-time initialization of your script * param {string} **/ async function init() { // Note: No initialization tasks requires } /** * @name: compute * @description: Perform computation on watching measurements. This function is called when new measurements arrive * @param {string} measurement - The source measurement name * @param {string} stringifiedData - The measurement data **/ function compute(measurement, data) { // Convert 'temperatureF' to 'temperatureC' for (let i = 0; i < data.length; i++) { const inputMeasurement = data[i]; const temperatureF = inputMeasurement.temperatureF; // Calculate the temperature in C const temperatureC = (temperatureF − 32) * 5/9; const outputMeasurement = { site_id: inputMeasurement.site_id, tag1: inputMeasurement.tag1, tag2: inputMeasurement.tag2, temperatureC: temperatureC }; // Output computed measurement output(outputMeasurement); } } /** * @function output * @description: User-invoked function to output a computed measurement * @param {String} outputMeasurment - Output measurement name * @param {Object} outputData - Object containing output metrics (required tags, optional tags, measurement metrics) * @param {string} outputData.lsid - [Example] lsid tag (for lifts) * @param {string} outputData.country - [Example] country tag * @param {number} outputData.metric1 - [Example] metric1 * @param {boolean} outputData.metric2 - [Example] metric2 * @param {integer} outputData.metric3 - [Example] metric3 **/
Example 2
... give a more complex example ...