avatar  

Log out

Recently viewed tickets

DCM config file - Aggregation examples

Purpose of this article is to show a few aggregation examples to enabled the user to do simple pre-calculations and manipulation of the data with DCM.

The aggregation in DCM is using Reverse Polish Notation ( RPN )

Aggreation

The Aggregation object contains the following fields:

  • Function (string-enum, mandatory ). This is the aggregation function to be performed. The currently possible values are: "max", "min", "avg", "mavg", "derived", "compute" and "eventcompute".
  • Values (array is strings, maybe-optional). This is a list of sampleref references, whose values will be arguments to the aggregation function. Mandatory for all values of Function except "compute".
  • TriggerSample : (string, mandatory ). This is a sampleref to the sample that will trigger the evaluation of the aggregation function. Only when the sample is updated (either by sampling from a device or from another aggregation), will this aggregation function evaluate and create a new sample value itself.
  • Expression (string, maybe-optional). This is an arithmetic expression using Reverse Polish Notation (RPN) with sampleref , numeric constants and operators separated by commas. See the section on RPN expressions. This field is mandatory if Function is "compute" or "eventcompute".
  • TriggerNewInterval (integer > 0, optional). This is a new sample interval (in secs) for the TriggerSample that should be in effect when the event is triggered. When the event is not triggered, the TriggerSample s normal interval is used. Only used when the Function is "eventcompute". If more than one "eventcompute" event forces a new sample interval for the same sample, the lowest new interval is used.


In the following examples calculations will be done on 4 sample-points

Triangle, Sine, OnOff & Counter



In this example the goal is to have an average of each sample of the sample-points Counter & Triangle.
It is achieved by adding the two values and divide the result by 2.
The Function is normal calculation so the function type is compute.
The Expression "Counter, Triangle,+,2,/" gives the calculation:
(Counter+Triangle)/2
Counter, Triangle , + is equal to (Counter+Triangle)
Then 2,/ is equal to (Counter + Triangle)/2

(
"SampleName": "PressureNozzle",
"SampleDescription": "Pressure/Nozzleflow avg ",
"SamplesSaved": 1000,
"SampleDataType": "int32",
"SampleUnit": "hPA/s",
"Aggregation": {
"Function": "compute",
"Expression": "Counter, Triangle,+,2,/",
"TriggerSample": "Triangle"
}
}



This example is an example of event based logging where data is logged when a certain condition is true.
The Function used is eventcompute.
The Expression "OnOff,35,>" defines the condition, Values are the sample-points that is sampled when condition is true.
The condition is checked every time the TriggerSample is sampled.
When the condition is true a new sample interval is set with TriggerNewInterval .
Here the Sample points Counter, Sine & Triangle are sampled (Sample interval changed from 0(never) to 1(every second)) when the Sample point OnOff is above 35.

{
"SampleName" : "EventValue",
"SampleDescription" : "When OnOff > 35, sample Counter,Sine and Triangle every second",
"SamplesSaved" : 0,
"SampleDataType" : "double",
"Aggregation" : {
"Function" : "eventcompute",
"Expression" : "OnOff,35,>",
"Values" : [ "Counter","Sine","Triangle" ],
"TriggerSample" : "OnOff",
"TriggerNewInterval" : 1
}
}




{
"SampleName": "AveragePressureNozzle",
"SampleDescription": "Pressure/Nozzleflow avg ",
"SamplesSaved": 1000,
"SampleDataType": "int32",
"SampleUnit": "hPA/s",
"Aggregation": {
"Function": "avg",
"Values": ["PressureNozzle"],
"TriggerSample": "OnOff"
}
},



Here is a very special example. 

This is an entire collector example where we have 3 samplepoints and 1 agrregation. 

It monitors the input 1 (I/O port 1, the green connector at bottom of the Sitemanager)


The samplepoints CPULoad and Systemtemperature are configured with "SampleInterval": 0  which means they are not sampled by default. 

The samplepoint IO_1 is sampling every second, but the "SamplesSaved": 0 means that the values are not sent to the cloud, but can be used for aggregation.


The important in this example is the Aggregation samplepoint. It monitors the IO_1 samplepoint and when the Input 1 is "1" or "High" it changes the SampleInterval of CPULoad and SystemTemperature samplepoints. 

So they are only sampled when input 1 is "High"


Summary: This example will only collect and deliver data to the cloud when I/O port 1 is held high.


{

"CollectorDescription": "Internal SM collector",

"CollectorName": "InternalCollector",

"ConnectRetryMax": 60,

"ConnectRetryMin": 5,

"Protocol": "Internal",

"SamplePoints": [

{

"InternalData": {

"InternalFunction": "SystemTemperature",

"InternalSampleInterval": 0

},

"SampleDataType": "float",

"SampleDescription": "System Temperature",

"SampleName": "SystemTemperature",

"SampleUnit": "C",

"SampleDBPriority": 100

},

{

"InternalData": {

"InternalFunction": "CPULoad",

"InternalSampleInterval": 0

},

"SampleDataType": "double",

"SampleDescription": "CPU Load",

"SampleName": "CPULoad",

"SampleUnit": "%",

"SampleDBPriority": 100

},

{

"InternalData": {

"InternalFunction": "DigitalInput",

"InternalSampleInterval": 1,

                                                "InternalIndex":0

},

"SampleDataType": "bool",

"SampleDescription": "I/O port 1 state",

"SampleName": "IO_1",

"SampleUnit": "On/Off",

                                        "SamplesSaved":1,

"SampleDBPriority": 100

},

                                {

                                        "Aggregation": {

                                            "Expression":"IO_1,0,>",

                                            "Function": "eventcompute",

                                            "Values": ["CPULoad","SystemTemperature"],

                                            "TriggerNewInterval": 1,

                                            "TriggerSample": "IO_1"

                                            },

                                  "SampleDataType": "double",

                                  "SampleDescription": "Trigger on IO_1",

                                  "SampleName": "Test1_REG108_trigger",

                                  "SamplesSaved": 100

                                 }

]

}

   

Creation date: 11/12/2019 14:16 (skr@secomea.com)      Updated: 24/01/2020 15:00 (tvo@secomea.com)