Litmus Edge 4.4.x - Analytics

Building a pipeline? Read /workflows/build-analytics-pipeline.md first.

Need the catalog of processors with their params and required wire definitions? Read /reference/analytics-processors.md (description and config keys per processor). The reference page is a static snapshot; call Get All (Supported) Processors Metadata on the target device for exact defaults, enums, and UI hints.

THE ONE RULE: an analytics pipeline is always SOURCE -> TRANSFORM(s) -> SINK, wired together. A lone JSONata / Expression / KPI processor does nothing on its own (nothing feeds it, nothing consumes it). Minimum pipeline = 3 processors + 2 wires (the wire feeding a sink/publish is always events).

A processor's role is set by its ConnectDirection field in Get All (Supported) Processors Metadata: - outputOnly = SOURCE (e.g. DataHub Subscribe, Generator, Inject, Database Batch Input) - inputOnly = SINK (e.g. DataHub Publish, Database Output, StdOut, FileWriter) - inputOutput = TRANSFORM (everything else: JSONata, Expression, KPI/OEE, anomaly, windows, ...)

EXCEPTIONS (a node can run without an input wire two ways): (1) Features contains Invoke -> driven on demand via Invoke Processor. Live set: Inject, Database Batch Input, FileReader, Delay/Rate-Limit, AI Responses. (2) a parameter supplies the data directly -> e.g. AI Vision has file_path_for_image ("leave empty to use input message as the image"), so it runs standalone when set or wired when empty. Check both Features and the Parameters labels; do not infer "needs input" from ConnectDirection alone.

Tag data arrives as a flat DeviceHub/DataHub message (fields value, tagName, deviceID, datatype, timestamp, ... no payload wrapper). Full shape: /reference/devicehub-message-format.md. A JSONata schema is object construction over those fields, e.g. {"value": value}.

Two ways to build: (a) step by step -- Create New Processor per node, then Connect Processor Instances with ConnectionType: "values" or "events" (PLURAL; the API rejects the singular "value"/"event"). NOTE Connect's fields are reversed: Inputs = the upstream producer, Outputs = the downstream consumer. (b) one-shot -- author the whole group as a BackupItem JSON and load it with Import Group (additive: creates/replaces the named group, other groups untouched; placement via each Positions[].GroupName). Each wire is mirrored on BOTH sides: producer Outputs += consumer ID AND consumer InputEvents += producer ID (use InputWaits for value-combine inputs); InputsDefinitions {slot: producer} only for named-input nodes like Expression. Full step tables, the import JSON template, and recipes (subscribe+publish-one-key, OEE, anomaly/SPC) are in /workflows/build-analytics-pipeline.md.

Get All Groups

POST {{edgeUrl}}/analytics/v3

Deprecated in LE 4.1.x: GetGroups is marked deprecated in the schema (reason: "Use GetWorkspaces"). Use Workspaces > Get Workspaces instead. The operation still works in 4.1.x but will be removed in a future release.

Get All Groups

Returns every analytics group defined on the device. Groups are logical buckets used to scope processors and permissions; default is always present.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetGroups {
  GetGroups
}

No arguments.

Response

200 OK -- application/json. data.GetGroups is a plain array of strings (the group names).

{
  "data": {
    "GetGroups": [
      "PredictiveMaintenance",
      "OEE - Line 2",
      "default",
      "SPC"
    ]
  }
}

To get the processors inside a group, call Get Processor Instances with input: <groupName>.

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetGroups {
    GetGroups
}

Response

Status: 200 OK

{
    "data": {
        "GetGroups": [
            "PredictiveMaintenance",
            "OEE - Line 2",
            "OEE - Line 4",
            "Preventative Maintenance",
            "default",
            "OEE - Line 1",
            "OEE - Line 3",
            "SPC"
        ]
    }
}

Get Processor Instances

POST {{edgeUrl}}/analytics/v3

Deprecated in LE 4.1.x: GetProcessorInstances is marked deprecated in the schema (reason: "Use GetWorkspaceProcessors"). Use Workspaces > Get Workspace Processors instead. The operation still works in 4.1.x but will be removed in a future release.

Get Processor Instances

Returns every processor instance inside one group, with the full configuration needed to render or edit it.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetProcessorInstances($input: String!) {
  GetProcessorInstances(input: $input) {
    ID
    Name
    Function
    Definitions { Key Value }
    ValueInputs
    EventInputs
    Parameters { Key Value }
    Active
    Outputs
  }
}

Variables

Field Type Required Description
input String! Yes Group name (e.g. default).
{ "input": "{{analytics_group_name}}" }

Response

200 OK -- application/json

Field Type Description
data.GetProcessorInstances [Processor!]! All processors in the requested group.
Processor.ID ID Processor UUID. Used wherever {{analytics_single_processor_id}} appears.
Processor.Name String Display name (often <FunctionName> - [NNNN] for auto-named processors).
Processor.Function String Function key (Generator, Database Output, Moving Average, ...). See Get All (Supported) Processors Metadata for the catalog.
Processor.Definitions [KV!]! Definition entries (function-specific input bindings).
Processor.ValueInputs [ID!]! UUIDs of upstream processors feeding value wires into this one.
Processor.EventInputs [ID!]! UUIDs of upstream processors feeding event wires.
Processor.Parameters [KV!]! Function-specific tunables (e.g. pollingInterval, window).
Processor.Active Boolean true if the processor is currently running.
Processor.Outputs [ID!]! UUIDs of downstream processors this one feeds.

Example response (excerpt)

{
  "data": {
    "GetProcessorInstances": [
      {
        "ID": "38687BA1-C2F2-450A-8A9C-9BF10617BADB",
        "Name": "DataHub Subscribe  - [5513]",
        "Function": "DataHub Subscribe",
        "Definitions": [],
        "ValueInputs": [],
        "EventInputs": [],
        "Parameters": [
          { "Key": "ignore_failed_data", "Value": "false" },
          { "Key": "ignore_null_value",  "Value": "false" }
        ],
        "Active": true,
        "Outputs": []
      }
    ]
  }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetProcessorInstances($input: String!) {
    GetProcessorInstances(input: $input) {
        ID
        Name
        Function
        Definitions {
            Key
            Value
        }
        ValueInputs
        EventInputs
        Parameters {
            Key
            Value
        }
        Active
        Outputs
    }
}

Variables

{
    "input": "{{analytics_group_name}}"
}

Response

Status: 200 OK

{
    "data": {
        "GetProcessorInstances": [
            {
                "ID": "38687BA1-C2F2-450A-8A9C-9BF10617BADB",
                "Name": "DataHub Subscribe  - [5513]",
                "Function": "DataHub Subscribe",
                "Definitions": [],
                "ValueInputs": [],
                "EventInputs": [],
                "Parameters": [
                    {
                        "Key": "ignore_failed_data",
                        "Value": "false"
                    },
                    {
                        "Key": "ignore_null_value",
                        "Value": "false"
                    },
                    {
                        "Key": "topic",
                        "Value": "scrapHistoryRecord"
                    }
                ],
                "Active": true,
                "Outputs": [
                    "7CCC34AE-6C58-4DB0-9F77-DAFDB793A3B7"
                ]
            },
            {
                "ID": "CA4DA5E7-5DAD-4131-A95D-1152E92197F6",
                "Name": "DataHub Subscribe  - [1311]",
                "Function": "DataHub Subscribe",
                "Definitions": [],
                "ValueInputs": [],
                "EventInputs": [],
                "Parameters": [
                    {
                        "Key": "format",
                        "Value": "json"
                    },
                    {
                        "Key": "topic",
                        "Value": "P2_EnergyMonitoring"
                    }
                ],
                "Active": true,
                "Outputs": [
                    "10A5AFCD-D002-4DD0-A7EE-81DBCE813937"
                ]
            },
            {
                "ID": "10A5AFCD-D002-4DD0-A7EE-81DBCE813937",
                "Name": "Database Output  - [9039]",
                "Function": "Database Output",
                "Definitions": [],
                "ValueInputs": [],
                "EventInputs": [
                    "CA4DA5E7-5DAD-4131-A95D-1152E92197F6"
                ],
                "Parameters": [
                    {
                        "Key": "database",
                        "Value": "tsdata"
                    },
                    {
                        "Key": "measurement",
                        "Value": "EnergyMonitoring"
                    },
                    {
                        "Key": "typed",
                        "Value": "autogen"
                    }
                ],
                "Active": true,
                "Outputs": []
            },
            {
                "ID": "1C589F97-66F4-43A8-BBC3-738C46F11EFD",
                "Name": "Flow  - [9175]",
                "Function": "Database Output",
                "Definitions": [],
                "ValueInputs": [],
                "EventInputs": [
                    "41BE8686-B8C8-485E-9B40-76F471A63D4D"
                ],
                "Parameters": [
                    {
                        "Key": "database",
                        "Value": "tsdata"
                    },
                    {
                        "Key": "measurement",
                        "Value": "EnergyMonitoring"
                    },
                    {
                        "Key": "typed",
                        "Value": "autogen"
                    }
                ],
                "Active": true,
                "Outputs": []
            },
            {
                "ID": "41BE8686-B8C8-485E-9B40-76F471A63D4D",
                "Name": "DataHub Subscribe  - [644]",
                "Function": "DataHub Subscribe",
                "Definitions": [],
                "ValueInputs": [],
                "EventInputs": [],
                "Parameters": [
                    {
                        "Key": "format",
                        "Value": "json"
                    },
                    {
                        "Key": "topic",
                        "Value": "P1_EnergyMonitoring"
                    }
                ],
                "Active": true,
                "Outputs": [
                    "1C589F97-66F4-43A8-BBC3-738C46F11EFD"
                ]
            },
            {
                "ID": "E8ED3C80-690C-4549-A509-BBEFE66F039E",
                "Name": "DataHub Subscribe  - [7390]",
                "Function": "DataHub Subscribe",
                "Definitions": [],
                "ValueInputs": [],
                "EventInputs": [],
                "Parameters": [
                    {
                        "Key": "ignore_failed_data",
                        "Value": "false"
                    },
                    {
                        "Key": "ignore_null_value",
                        "Value": "false"
                    },
                    {
                        "Key": "topic",
                        "Value": "downtimeHistoryRecord"
                    }
                ],
                "Active": true,
                "Outputs": [
                    "5B4DC834-C069-4340-986A-BC45957D5E07"
                ]
            },
            {
                "ID": "5B4DC834-C069-4340-986A-BC45957D5E07",
                "Name": "Database Output  - [5434]",
                "Function": "Database Output",
                "Definitions": [],
                "ValueInputs": [],
                "EventInputs": [
                    "E8ED3C80-690C-4549-A509-BBEFE66F039E"
                ],
                "Parameters": [
                    {
                        "Key": "database",
                        "Value": "tsdata"
                    },
                    {
                        "Key": "measurement",
                        "Value": "DTR"
                    },
                    {
                        "Key": "typed",
                        "Value": "autogen"
                    }
                ],
                "Active": true,
                "Outputs": []
            },
            {
                "ID": "7CCC34AE-6C58-4DB0-9F77-DAFDB793A3B7",
                "Name": "Database Output  - [8347]",
                "Function": "Database Output",
                "Definitions": [],
                "ValueInputs": [],
                "EventInputs": [
                    "38687BA1-C2F2-450A-8A9C-9BF10617BADB"
                ],
                "Parameters": [
                    {
                        "Key": "database",
                        "Value": "tsdata"
                    },
                    {
                        "Key": "measurement",
                        "Value": "SR"
                    },
                    {
                        "Key": "typed",
                        "Value": "autogen"
                    }
                ],
                "Active": true,
                "Outputs": []
            }
        ]
    }
}

Get Group Locking Status

POST {{edgeUrl}}/analytics/v3

Get Group Locking Status

Returns the optimistic-locking state for a group. The LE UI uses this to prevent two operators from concurrently editing the same group's pipeline. A locked group cannot be edited by anyone other than the holder of the lock until the lock expires or is released (Set Group Locking Status with Mode: CHECKIN).

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetGroupLockStatus($input: String!) {
  GetGroupLockStatus(input: $input) {
    GroupName
    LockDeadline
    LockedBy
    LockTime
  }
}

Variables

Field Type Required Description
input String! Yes Group name.
{ "input": "{{analytics_group_name}}" }

Response

200 OK -- application/json

Field Type Description
data.GetGroupLockStatus.GroupName String Group name, echoed.
data.GetGroupLockStatus.LockDeadline Time When the current lock expires. 0001-01-01T00:00:00Z (sentinel) when no lock is held.
data.GetGroupLockStatus.LockedBy String API token / user that holds the lock. Empty when no lock is held.
data.GetGroupLockStatus.LockTime Time When the lock was acquired. Sentinel 0001-01-01T00:00:00Z when no lock is held.
{
  "data": {
    "GetGroupLockStatus": {
      "GroupName": "default",
      "LockDeadline": "0001-01-01T00:00:00Z",
      "LockedBy": "",
      "LockTime": "0001-01-01T00:00:00Z"
    }
  }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetGroupLockStatus($input: String!) {
    GetGroupLockStatus(input: $input) {
        GroupName
        LockDeadline
        LockedBy
        LockTime
    }
}

Variables

{
    "input": "{{analytics_group_name}}"
}

Response

Status: 200 OK

{
    "data": {
        "GetGroupLockStatus": {
            "GroupName": "default",
            "LockDeadline": "0001-01-01T00:00:00Z",
            "LockedBy": "",
            "LockTime": "0001-01-01T00:00:00Z"
        }
    }
}

Set Group Locking Status

POST {{edgeUrl}}/analytics/v3

Set Group Locking Status

Acquires (CHECKIN), releases (CHECKOUT), or steals (Force: true) a group's edit lock. The mode names are the reverse of the usual source-control sense; verified on LE 4.0.x: after CHECKIN, Get Group Locking Status shows the caller in LockedBy with a LockDeadline 30 minutes out, and after CHECKOUT both are cleared. API tokens show up as LockedBy: guest. Pair with Get Group Locking Status for live UI state.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation SetGroupLockStatus($input: SetGroupTopicsRequest!) {
  SetGroupLockStatus(input: $input)
}

Variables (input: SetGroupTopicsRequest!)

Field Type Required Description
GroupName String! Yes Group to lock or unlock.
Mode String! Yes CHECKIN to acquire the lock; CHECKOUT to release it.
Force Boolean No Default false. true to acquire the lock even if another user already holds it (the existing holder is preempted).
{
  "input": {
    "GroupName": "{{analytics_group_name}}",
    "Mode": "CHECKIN",
    "Force": false
  }
}

Response

200 OK -- application/json. No data returned on success.

{ "data": { "SetGroupLockStatus": null } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation SetGroupLockStatus($input: SetGroupTopicsRequest!) {
    SetGroupLockStatus(input: $input)
}

Variables

{
    "input": {    
        "GroupName": "{{analytics_group_name}}",
        "Mode": "CHECKIN",
        "Force": false
  }
}

Response

Status: 200 OK

{
    "data": {
        "SetGroupLockStatus": null
    }
}

Get Processor Positions

POST {{edgeUrl}}/analytics/v3

Deprecated in LE 4.1.x: GetProcessorInstancePositions is marked deprecated in the schema (reason: "Use GetWorkspacePositions"). Use Workspaces > Get Workspace Positions instead. The operation still works in 4.1.x but will be removed in a future release.

Get Processor Positions

Returns the UI canvas coordinates of every processor in a group -- the same {Top, Left} values used by the LE UI to render the pipeline diagram. Useful when building a custom UI on top of Analytics, or for exporting/importing a pipeline layout.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetProcessorInstancePositions($input: String!) {
  GetProcessorInstancePositions(input: $input) {
    Key
    Value {
      Top
      Left
      GroupName
    }
  }
}

Variables

Field Type Required Description
input String! Yes Group name.
{ "input": "{{analytics_group_name}}" }

Response

200 OK -- application/json

Field Type Description
data.GetProcessorInstancePositions [Entry!]! One entry per processor in the group.
data.GetProcessorInstancePositions[].Key ID Processor UUID.
data.GetProcessorInstancePositions[].Value.Top / .Left Int Canvas coordinates in the LE UI's editor.
data.GetProcessorInstancePositions[].Value.GroupName String Group name (echoes the request).
{
  "data": {
    "GetProcessorInstancePositions": [
      {
        "Key": "10A5AFCD-D002-4DD0-A7EE-81DBCE813937",
        "Value": { "Top": 16, "Left": 0, "GroupName": "default" }
      }
    ]
  }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetProcessorInstancePositions($input: String!) {
    GetProcessorInstancePositions(input: $input) {
        Key
        Value {
            Top
            Left
            GroupName
        }
    }
}

Variables

{
    "input": "{{analytics_group_name}}"
}

Response

Status: 200 OK

{
    "data": {
        "GetProcessorInstancePositions": [
            {
                "Key": "10A5AFCD-D002-4DD0-A7EE-81DBCE813937",
                "Value": {
                    "Top": 16,
                    "Left": 0,
                    "GroupName": "default"
                }
            },
            {
                "Key": "E8ED3C80-690C-4549-A509-BBEFE66F039E",
                "Value": {
                    "Top": 357,
                    "Left": 0,
                    "GroupName": "default"
                }
            },
            {
                "Key": "5B4DC834-C069-4340-986A-BC45957D5E07",
                "Value": {
                    "Top": 357,
                    "Left": 0,
                    "GroupName": "default"
                }
            },
            {
                "Key": "38687BA1-C2F2-450A-8A9C-9BF10617BADB",
                "Value": {
                    "Top": 241,
                    "Left": 0,
                    "GroupName": "default"
                }
            },
            {
                "Key": "41BE8686-B8C8-485E-9B40-76F471A63D4D",
                "Value": {
                    "Top": 125,
                    "Left": 0,
                    "GroupName": "default"
                }
            },
            {
                "Key": "CA4DA5E7-5DAD-4131-A95D-1152E92197F6",
                "Value": {
                    "Top": 16,
                    "Left": 0,
                    "GroupName": "default"
                }
            },
            {
                "Key": "1C589F97-66F4-43A8-BBC3-738C46F11EFD",
                "Value": {
                    "Top": 125,
                    "Left": 0,
                    "GroupName": "default"
                }
            },
            {
                "Key": "7CCC34AE-6C58-4DB0-9F77-DAFDB793A3B7",
                "Value": {
                    "Top": 241,
                    "Left": 0,
                    "GroupName": "default"
                }
            }
        ]
    }
}

Get Available DB Measurements

GET {{edgeUrl}}/stats/db

Get Available DB Measurements

Returns the time-series databases and their measurements (tables) available on the device. This is not a /analytics/v3 endpoint -- it borrows from DataHub at /stats/db. It is surfaced under Analytics because it's most commonly used when configuring a Database Output or Database Input processor that needs to pick a target measurement.

This endpoint returns the same payload as DataHub > List DBs -- see that page for the full field reference.

Endpoint

GET {{edgeUrl}}/stats/db

Authentication

HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.

Parameters

None.

Response

200 OK -- application/json. Array of database objects with name, size, and measurements[]. See DataHub > List DBs for the field-by-field reference and example.

Errors

HTTP status When it happens
400 Bad Request Missing or malformed query/body parameter.
401 Unauthorized Missing or invalid credentials.
403 Forbidden Token lacks permission for this operation.
404 Not Found Target entity does not exist.
5xx Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Response

Status: 200 OK

[
    {
        "name": "tsdata",
        "size": 69788326,
        "measurements": [
            "Anomaly",
            "DTR",
            "EnergyMonitoring",
            "OEEData",
            "P1_L1_Machine1_1_OPC.7C24EDB3-D95C-4097-ADFE-EA7228175ACD",
            "P1_L1_Machine2_1_MB.16FC5E6A-345A-4257-A939-9E13F5C416F1",
            "P1_L1_Machine3_1_S7.024F0542-540E-4556-8445-13F5158A9E67",
            "P1_L2_Machine2_1_MB.0A99BA31-89B9-45B3-822B-3A94CDDAB411",
            "P1_L2_Machine3_1_S7.55C2503D-A9A1-4F0E-A538-EA74E98187ED",
            "P2_L1_Machine1_1_OPC.F96584F6-DD85-4B7D-9053-53C68C67D290",
            "P2_L1_Machine2_1_MB.7BF01228-1B5C-4EFE-9E3C-8E01E2F7F2F6",
            "P2_L1_Machine3_1_S7.94D8E47F-9307-47F7-9F8E-B47AE6B90695",
            "P2_L2_Machine1_1_OPC.538054E8-2349-4AD0-8C87-830C9A06B118",
            "P2_L2_Machine2_1_MB.CEEEF257-0DB8-4F0C-9C0F-B17301B7A673",
            "P2_L2_Machine3_1_S7.C27E0DAC-B863-489F-8A19-F526EE6FE2D2",
            "SR",
            "XMR",
            "classification"
        ]
    }
]

Get Topics in Group

POST {{edgeUrl}}/analytics/v3

Get Topics in Group

Searches the topics published by processors inside a single group, filtered by a substring or pattern. Used by the LE UI to populate autocomplete dropdowns when wiring downstream consumers (e.g. an Integration's MQTT bridge) to analytics outputs.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetGroupTopics($input: GetGroupTopicsRequest!) {
  GetGroupTopics(input: $input) {
    TotalItems
    IsLastPage
    Children {
      Name
      ID
    }
  }
}

Variables (input: GetGroupTopicsRequest!)

Field Type Required Description
GroupName String Yes Group to search inside.
TagPattern String Yes Pattern to match on topic name.
TagPatternSearchOption String Yes Search mode: CONTAINS, STARTSWITH, ENDSWITH, EQUALS.
Limit Int Yes Page size.
SkipCount Int Yes Offset to skip (paging).
{
  "input": {
    "GroupName": "{{analytics_group_name}}",
    "Limit": 10,
    "SkipCount": 0,
    "TagPattern": "analytics",
    "TagPatternSearchOption": "CONTAINS"
  }
}

Response

200 OK -- application/json

Field Type Description
data.GetGroupTopics.TotalItems Int Total matching topics across all pages.
data.GetGroupTopics.IsLastPage Boolean true if this is the final page.
data.GetGroupTopics.Children [Topic!]! Matching topics in this page.
data.GetGroupTopics.Children[].Name String Topic name (e.g. analytics.publish.<id>).
data.GetGroupTopics.Children[].ID ID Topic ID.
{
  "data": {
    "GetGroupTopics": {
      "TotalItems": 1,
      "IsLastPage": true,
      "Children": [
        { "Name": "analytics.publish.u6PLGF3J1D-C_PQXmJC9Y", "ID": "373ef09a-c290-413d-969c-9db308142c6a" }
      ]
    }
  }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetGroupTopics($input: GetGroupTopicsRequest!) {
    GetGroupTopics(input: $input) {
        TotalItems
        IsLastPage
        Children {
            Name
            ID
        }
    }
}

Variables

{
    "input": {
        "GroupName": "{{analytics_group_name}}",
        "Limit": 10,
        "SkipCount": 0,
        "TagPattern": "analytics",
        "TagPatternSearchOption": "CONTAINS"
    }
}

Response

Status: 200 OK

{
    "data": {
        "GetGroupTopics": {
            "TotalItems": 1,
            "IsLastPage": true,
            "Children": [
                {
                    "Name": "analytics.publish.u6PLGF3J1D-C_PQXmJC9Y",
                    "ID": "373ef09a-c290-413d-969c-9db308142c6a"
                }
            ]
        }
    }
}

Export Group

POST {{edgeUrl}}/analytics/v3

Deprecated in LE 4.1.x: ExportGroup is marked deprecated in the schema (reason: "Use ExportWorkspace"). Use Workspaces > Export Workspace instead. The operation still works in 4.1.x but will be removed in a future release.

Export Group

Serializes an entire group -- its processors, wire definitions, canvas positions, AI models, variables, and parameters -- as a single GraphQL response payload. The output is the source-of-truth backup of a pipeline and is the input to Import Group.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query ExportGroup($input: String!) {
  ExportGroup(input: $input) {
    Processors {
      ID
      Name
      FunctionName
      IsActive
      Config { settings }
      InputEvents
      InputWaits
      InputsDefinitions
      State
      Outputs
    }
    Positions { ID Top Left GroupName }
    Version
    Git
    AIModels   { UniqueName Provider URL ModelName }
    Variables  { UniqueName DataType DBValue IsReadWrite IsPersistent }
    Parameters { UniqueName DataType DBValue IsReadWrite IsPersistent }
  }
}

Variables

Field Type Required Description
input String! Yes Group name to export.
{ "input": "{{analytics_group_name}}" }

Response

200 OK -- application/json. Carries:

To restore on the same or another device, feed the entire ExportGroup payload back through Import Group as the data argument.

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

Security note

The export omits secrets (API keys for AI models, integration credentials) but does include processor settings which may reference variable names or DB names. Review before sharing externally.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query ExportGroup($input: String!) {
    ExportGroup(input: $input) {
        Processors {
            ID
            Name
            FunctionName
            IsActive
            Config {
                settings
            }
            InputEvents
            InputWaits
            InputsDefinitions
            State
            Outputs
            }
        Positions {
            ID
            Top
            Left
            GroupName
        }
        Version
        Git
        AIModels {
            UniqueName
            Provider
            URL
            ModelName
        }
        Variables {
            UniqueName
            DataType
            DBValue
            IsReadWrite
            IsPersistent
        }
        ComponentVariables {
            UniqueName
            DataType
            DBValue
            IsReadWrite
            IsPersistent
        }
    }
}

Variables

{
    "input": "{{analytics_group_name}}"
}

Response

Status: 200 OK

{
    "data": {
        "ExportGroup": {
            "Processors": [
                {
                    "ID": "10A5AFCD-D002-4DD0-A7EE-81DBCE813937",
                    "Name": "Database Output  - [9039]",
                    "FunctionName": "Database Output",
                    "IsActive": true,
                    "Config": {
                        "settings": {
                            "database": "tsdata",
                            "measurement": "EnergyMonitoring",
                            "typed": "autogen"
                        }
                    },
                    "InputEvents": [
                        "CA4DA5E7-5DAD-4131-A95D-1152E92197F6"
                    ],
                    "InputWaits": [],
                    "InputsDefinitions": {},
                    "State": null,
                    "Outputs": []
                },
                {
                    "ID": "1C589F97-66F4-43A8-BBC3-738C46F11EFD",
                    "Name": "Flow  - [9175]",
                    "FunctionName": "Database Output",
                    "IsActive": true,
                    "Config": {
                        "settings": {
                            "database": "tsdata",
                            "measurement": "EnergyMonitoring",
                            "typed": "autogen"
                        }
                    },
                    "InputEvents": [
                        "41BE8686-B8C8-485E-9B40-76F471A63D4D"
                    ],
                    "InputWaits": [],
                    "InputsDefinitions": {},
                    "State": null,
                    "Outputs": []
                },
                {
                    "ID": "373EF09A-C290-413D-969C-9DB308142C6A",
                    "Name": "Flow  - [5609]",
                    "FunctionName": "DataHub Publish",
                    "IsActive": true,
                    "Config": {
                        "settings": {
                            "dynamic_topic": false,
                            "single_topic": true,
                            "topic": "analytics.publish.u6PLGF3J1D-C_PQXmJC9Y"
                        }
                    },
                    "InputEvents": [
                        "735E383E-EF78-485F-84CB-E02F205BE98B"
                    ],
                    "InputWaits": [],
                    "InputsDefinitions": {},
                    "State": null,
                    "Outputs": []
                },
                {
                    "ID": "38687BA1-C2F2-450A-8A9C-9BF10617BADB",
                    "Name": "DataHub Subscribe  - [5513]",
                    "FunctionName": "DataHub Subscribe",
                    "IsActive": true,
                    "Config": {
                        "settings": {
                            "ignore_failed_data": false,
                            "ignore_null_value": false,
                            "topic": "scrapHistoryRecord"
                        }
                    },
                    "InputEvents": [],
                    "InputWaits": [],
                    "InputsDefinitions": {},
                    "State": null,
                    "Outputs": [
                        "7CCC34AE-6C58-4DB0-9F77-DAFDB793A3B7"
                    ]
                },
                {
                    "ID": "41BE8686-B8C8-485E-9B40-76F471A63D4D",
                    "Name": "DataHub Subscribe  - [644]",
                    "FunctionName": "DataHub Subscribe",
                    "IsActive": true,
                    "Config": {
                        "settings": {
                            "format": "json",
                            "topic": "P1_EnergyMonitoring"
                        }
                    },
                    "InputEvents": [],
                    "InputWaits": [],
                    "InputsDefinitions": {},
                    "State": null,
                    "Outputs": [
                        "1C589F97-66F4-43A8-BBC3-738C46F11EFD"
                    ]
                },
                {
                    "ID": "5B4DC834-C069-4340-986A-BC45957D5E07",
                    "Name": "Database Output  - [5434]",
                    "FunctionName": "Database Output",
                    "IsActive": true,
                    "Config": {
                        "settings": {
                            "database": "tsdata",
                            "measurement": "DTR",
                            "typed": "autogen"
                        }
                    },
                    "InputEvents": [
                        "E8ED3C80-690C-4549-A509-BBEFE66F039E"
                    ],
                    "InputWaits": [],
                    "InputsDefinitions": {},
                    "State": null,
                    "Outputs": []
                },
                {
                    "ID": "735E383E-EF78-485F-84CB-E02F205BE98B",
                    "Name": "Flow  - [5609]",
                    "FunctionName": "Change of Value",
                    "IsActive": true,
                    "Config": {
                        "settings": {
                            "delta_of_tolerance": 0,
                            "map_field_name": "value",
                            "pass_through_value": false,
                            "timerInterval": 0
                        }
                    },
                    "InputEvents": [
                        "97E2788B-CB2E-44CE-8312-41DD1F388286"
                    ],
                    "InputWaits": [],
                    "InputsDefinitions": {},
                    "State": null,
                    "Outputs": [
                        "373EF09A-C290-413D-969C-9DB308142C6A"
                    ]
                },
                {
                    "ID": "7CCC34AE-6C58-4DB0-9F77-DAFDB793A3B7",
                    "Name": "Database Output  - [8347]",
                    "FunctionName": "Database Output",
                    "IsActive": true,
                    "Config": {
                        "settings": {
                            "database": "tsdata",
                            "measurement": "SR",
                            "typed": "autogen"
                        }
                    },
                    "InputEvents": [
                        "38687BA1-C2F2-450A-8A9C-9BF10617BADB"
                    ],
                    "InputWaits": [],
                    "InputsDefinitions": {},
                    "State": null,
                    "Outputs": []
                },
                {
                    "ID": "97E2788B-CB2E-44CE-8312-41DD1F388286",
                    "Name": "Flow  - [5609]",
                    "FunctionName": "DataHub Subscribe",
                    "IsActive": true,
                    "Config": {
                        "settings": {
                            "ignore_failed_data": false,
                            "ignore_null_value": false,
                            "topic": "${hello}"
                        }
                    },
                    "InputEvents": [],
                    "InputWaits": [],
                    "InputsDefinitions": {},
                    "State": null,
                    "Outputs": [
                        "735E383E-EF78-485F-84CB-E02F205BE98B"
                    ]
                },
                {
                    "ID": "A8E5EA5A-7D0F-46A7-848C-D7FF250FB4C2",
                    "Name": "JSONata  - [7992]",
                    "FunctionName": "JSONata",
                    "IsActive": true,
                    "Config": {
                        "settings": {
                            "jsonata_schema": "{\n    \"value\": ${key}\n}"
                        }
                    },
                    "InputEvents": [
                        "B6565676-1A31-488E-8B08-AAB0A2127362"
                    ],
                    "InputWaits": [],
                    "InputsDefinitions": {},
                    "State": {
                        "jsonata_schema": "{\n    \"value\": valye\n}"
                    },
                    "Outputs": []
                },
                {
                    "ID": "B6565676-1A31-488E-8B08-AAB0A2127362",
                    "Name": "Inject  - [7720]",
                    "FunctionName": "Inject",
                    "IsActive": true,
                    "Config": {
                        "settings": {
                            "add_timestamp": true,
                            "inject_field": "${key}",
                            "inject_value": "somethiang",
                            "inject_value_type": "string",
                            "timer_interval_type": "seconds",
                            "timer_interval_value": 0,
                            "timing_mode": "once"
                        }
                    },
                    "InputEvents": [],
                    "InputWaits": [],
                    "InputsDefinitions": {},
                    "State": {
                        "add_timestamp": true,
                        "inject_field": "valye",
                        "inject_value": "somethiang",
                        "inject_value_type": "string",
                        "timer_interval_type": "seconds",
                        "timer_interval_value": 0,
                        "timing_mode": "once"
                    },
                    "Outputs": [
                        "A8E5EA5A-7D0F-46A7-848C-D7FF250FB4C2"
                    ]
                },
                {
                    "ID": "CA4DA5E7-5DAD-4131-A95D-1152E92197F6",
                    "Name": "DataHub Subscribe  - [1311]",
                    "FunctionName": "DataHub Subscribe",
                    "IsActive": true,
                    "Config": {
                        "settings": {
                            "format": "json",
                            "topic": "P2_EnergyMonitoring"
                        }
                    },
                    "InputEvents": [],
                    "InputWaits": [],
                    "InputsDefinitions": {},
                    "State": null,
                    "Outputs": [
                        "10A5AFCD-D002-4DD0-A7EE-81DBCE813937"
                    ]
                },
                {
                    "ID": "E8ED3C80-690C-4549-A509-BBEFE66F039E",
                    "Name": "DataHub Subscribe  - [7390]",
                    "FunctionName": "DataHub Subscribe",
                    "IsActive": true,
                    "Config": {
                        "settings": {
                            "ignore_failed_data": false,
                            "ignore_null_value": false,
                            "topic": "downtimeHistoryRecord"
                        }
                    },
                    "InputEvents": [],
                    "InputWaits": [],
                    "InputsDefinitions": {},
                    "State": null,
                    "Outputs": [
                        "5B4DC834-C069-4340-986A-BC45957D5E07"
                    ]
                }
            ],
            "Positions": [
                {
                    "ID": "10A5AFCD-D002-4DD0-A7EE-81DBCE813937",
                    "Top": 234,
                    "Left": 0,
                    "GroupName": "default"
                },
                {
                    "ID": "1C589F97-66F4-43A8-BBC3-738C46F11EFD",
                    "Top": 343,
                    "Left": 0,
                    "GroupName": "default"
                },
                {
                    "ID": "373EF09A-C290-413D-969C-9DB308142C6A",
                    "Top": 452,
                    "Left": 0,
                    "GroupName": "default"
                },
                {
                    "ID": "38687BA1-C2F2-450A-8A9C-9BF10617BADB",
                    "Top": 125,
                    "Left": 0,
                    "GroupName": "default"
                },
                {
                    "ID": "41BE8686-B8C8-485E-9B40-76F471A63D4D",
                    "Top": 343,
                    "Left": 0,
                    "GroupName": "default"
                },
                {
                    "ID": "5B4DC834-C069-4340-986A-BC45957D5E07",
                    "Top": 16,
                    "Left": 0,
                    "GroupName": "default"
                },
                {
                    "ID": "735E383E-EF78-485F-84CB-E02F205BE98B",
                    "Top": 452,
                    "Left": 0,
                    "GroupName": "default"
                },
                {
                    "ID": "7CCC34AE-6C58-4DB0-9F77-DAFDB793A3B7",
                    "Top": 125,
                    "Left": 0,
                    "GroupName": "default"
                },
                {
                    "ID": "97E2788B-CB2E-44CE-8312-41DD1F388286",
                    "Top": 452,
                    "Left": 0,
                    "GroupName": "default"
                },
                {
                    "ID": "A8E5EA5A-7D0F-46A7-848C-D7FF250FB4C2",
                    "Top": 561,
                    "Left": 0,
                    "GroupName": "default"
                },
                {
                    "ID": "B6565676-1A31-488E-8B08-AAB0A2127362",
                    "Top": 561,
                    "Left": 0,
                    "GroupName": "default"
                },
                {
                    "ID": "CA4DA5E7-5DAD-4131-A95D-1152E92197F6",
                    "Top": 234,
                    "Left": 0,
                    "GroupName": "default"
                },
                {
                    "ID": "E8ED3C80-690C-4549-A509-BBEFE66F039E",
                    "Top": 16,
                    "Left": 0,
                    "GroupName": "default"
                }
            ],
            "Version": "2.0.4",
            "Git": "4360afd7f3",
            "AIModels": null,
            "Variables": null,
            "Parameters": null
        }
    }
}

Get Version

POST {{edgeUrl}}/analytics/v3

Get Version

Returns the deployed version and git revision of the Analytics service. Fast liveness probe and the canonical answer to "what version is in the field" for support tickets.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetVersion {
  GetVersion {
    Git
    Version
  }
}

No arguments.

Response

200 OK -- application/json

Field Type Description
data.GetVersion.Git String Short git commit hash.
data.GetVersion.Version String Semantic version of the Analytics service.
{ "data": { "GetVersion": { "Git": "4360afd7f3", "Version": "2.0.4" } } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetVersion {
    GetVersion {
        Git
        Version
    }
}

Variables

{}

Response

Status: 200 OK

{
    "data": {
        "GetVersion": {
            "Git": "4360afd7f3",
            "Version": "2.0.4"
        }
    }
}

Get All (Supported) Processors Metadata

POST {{edgeUrl}}/analytics/v3

Get All (Supported) Processors Metadata

Returns the complete catalog of processor functions the device supports, with their full input schema. Use this to render a dynamic "Add Processor" form, or to validate a configured processor's parameters before calling Create New Processor / Update Processor.

This is a large response -- each function's metadata includes UI hints, validators, table columns, etc. Cache the result client-side.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetProcessorsMetadata {
  GetProcessorsMetadata {
    Name
    Group
    Description
    ShortDescription
    RequiredDefinitions
    ConnectDirection
    Features
    Properties {
      Key
      Value {
        TabOrder Position LinkedFieldName LinkedValues
        Item {
          Name Label Default Type EnumItems DisplayLabel
          FromNewLine IsValueRequired IsPassword TextType
        }
        Validators { ValidatorType ValidatorValue }
        TableColumns { Name Description DisplayName Default ValueType }
      }
    }
  }
}

No arguments.

Response

200 OK -- application/json

Field Type Description
data.GetProcessorsMetadata [Meta!]! One entry per supported processor function.
Meta.Name String Function key (e.g. Moving Average). Use as Function in Create New Processor.
Meta.Group String Functional grouping (e.g. Statistical, Database, AI). Empty if uncategorized.
Meta.Description String Operator-facing description (markdown). Often multi-paragraph.
Meta.ShortDescription String One-line summary suitable for a tooltip.
Meta.RequiredDefinitions [String!]! Definitions the operator must supply at create time.
Meta.ConnectDirection String input, output, inputOutput. Drives which sides of the node accept wires.
Meta.Features [String!]! Feature flags the function supports (e.g. event, value, wait).
Meta.Properties [KV!]! Full input schema for the function. Each value carries layout, validators, enum items, and table columns.
{
  "data": {
    "GetProcessorsMetadata": [
      {
        "Name": "Moving Average",
        "Group": "",
        "Description": "# Simple Moving Average...",
        "ShortDescription": "",
        "ConnectDirection": "inputOutput",
        "RequiredDefinitions": []
      }
    ]
  }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetProcessorsMetadata {
    GetProcessorsMetadata {
        Name
        Group
        Description
        ShortDescription
        RequiredDefinitions
        ConnectDirection
        Features
        Properties {
            Key
            Value {
                TabOrder
                Position
                LinkedFieldName
                LinkedValues
                Item {
                    Name
                    Label
                    Default
                    Type
                    EnumItems
                    DisplayLabel
                    FromNewLine
                    IsValueRequired
                    IsPassword
                    TextType
                }
                Validators {
                    ValidatorType
                    ValidatorValue
                }
                TableColumns {
                    Name
                    Description
                    DisplayName
                    Default
                    ValueType
                    EnumItems {
                        Name
                        Value
                        Description
                        Type
                    }
                }
                Rules {
                    Name
                    Description
                    DisplayName
                    ValueType
                    EnumItems {
                        Name
                        Label
                        Default
                        Type
                        EnumItems
                        DisplayLabel
                        FromNewLine
                        IsValueRequired
                        IsPassword
                        TextType
                    }
                }
                LinkedFields {
                    FieldName
                    FieldValues
                    Criteria
                    GroupNumber
                }
            }
        }
    }
}

Response

Status: 200 OK

{
    "data": {
        "GetProcessorsMetadata": [
            {
                "Name": "Moving Average",
                "Group": "",
                "Description": "\n# Simple Moving Average \n\n* Simple moving average, also known as Rolling Mean is just an unweighted average of \"n\" values, in the desired window\n\n* The oldest value is then dropped, and a new window with the current value is formed, hence the name \"moving average\"\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "Size of window in which values are observed",
                                "Default": "10",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "processing_type",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "processing_type",
                                "Label": "Data type of the value being processed",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": [
                                    "float",
                                    "signed",
                                    "unsigned"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "field_name",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "field_name",
                                "Label": "Usually left unchanged. Use it if incoming is message type, and/or non-default \"value\" field name",
                                "Default": "value",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Rounding",
                "Group": "Functions",
                "Description": "\n# Rounding\n\n* Enter the number of digits you would like to round to e.g entering 2, will give results like 10.22. 10.44 (but not 10.556)\n\n  * Entering 0 will ignore all floating point values, and just give the integer value\n\n* RoundNearest returns the nearest decimal e.g 10.6 gives 11, 10.1 gives 10\n\n* RoundUp returns the next smallest decimal e.g 10.6 gives 11, 10.1 also gives 11\n\n* RoundDown returns the previous largest decimal e.g 10.6 gives 10, 10.1 also gives 10\n\n* RoundEven returns the nearest integer, rounding ties to even (number of digits entered are irrelevant for this case)\n",
                "ShortDescription": "Ratio of uptime and total time",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "digits",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "digits",
                                "Label": "Round to how many decimals (digits)?",
                                "Default": "2",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "method",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "method",
                                "Label": "Round to nearest, Round up, Round down ?",
                                "Default": "roundUp",
                                "Type": "string",
                                "EnumItems": [
                                    "roundNearest",
                                    "roundUp",
                                    "roundDown",
                                    "roundEven"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Signal Decomposition",
                "Group": "Functions",
                "Description": "\n# Signal Decomposition\n\n* Naive version of signal decomposition\n\n* Additive model: Signal = Trend + Seasonality + Residue\n\n* Multiplicative model: Signal = Trend * Seasonality * Residue\n\n* Trend is calculated by linear regression\n\n* Seasonality is calculated by naive differencing\n",
                "ShortDescription": "\nNaive Decompose\n",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "How many values in the Periodic interval",
                                "Default": "10",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "model_type",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "model_type",
                                "Label": "which type of model",
                                "Default": "additive",
                                "Type": "string",
                                "EnumItems": [
                                    "additive",
                                    "multiplicative"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "periodicity",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "periodicity",
                                "Label": "Periodic interval",
                                "Default": "5",
                                "Type": "int",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Change",
                "Group": "",
                "Description": "\n# Change Processor\n\n* Modifies content of incoming message \n* If ***Change mode*** field is set to **\"set\"**, this processor will assign **Value** to message's **Field**\n\n* If ***Change mode*** field is set to **\"change\"**:\n\t* If **Field** is of type **string** or **JSON** both **Value** and **Replace Value** will be converted to string \nand processor will look for **Value** substrings in **Field** and replace all occurrences of them with **Replace Value** string\n\t* For all other types processor will look for complete match between **Value** and **Field**. If match found **Replace Value** will be set to **Field**\n\n* If ***Change mode*** field is set to **\"delete\"**, this processor will delete **Field** from the payload \n\n* If ***Change mode*** field is set to **\"move\"**, this processor copy contents of '**Field** into **Move to Field** and delete **Field**  \n\n* If **Update timestamp** option is set processor will add current timestamp to a message. It will happen after change-processing \n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "input_value_type",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "input_value_type",
                                "Label": "Type of value1",
                                "Default": "string",
                                "Type": "string",
                                "EnumItems": [
                                    "string",
                                    "uint",
                                    "bool",
                                    "json",
                                    "int",
                                    "float"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "input_value",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "input_value",
                                "Label": "'set' mode: value to set,  'change' mode: value to search ",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "replace_with_value_type",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "replace_with_value_type",
                                "Label": "Type of value2",
                                "Default": "string",
                                "Type": "string",
                                "EnumItems": [
                                    "string",
                                    "uint",
                                    "bool",
                                    "json",
                                    "int",
                                    "float"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "replace_with_value",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "replace_with_value",
                                "Label": "Replace Value for 'change' mode",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "move_to_field",
                        "Value": {
                            "TabOrder": 6,
                            "Position": 6,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "move_to_field",
                                "Label": "Message field to Move data to ",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "update_timestamp",
                        "Value": {
                            "TabOrder": 7,
                            "Position": 7,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "update_timestamp",
                                "Label": "Sets current timestamp to a message",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "mode",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "mode",
                                "Label": "Type of changes",
                                "Default": "set",
                                "Type": "string",
                                "EnumItems": [
                                    "set",
                                    "change",
                                    "delete",
                                    "move"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "input_field",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "input_field",
                                "Label": "Message field to process",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": true,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "TensorFlow processor",
                "Group": "ML",
                "Description": "\n# TensorFlow Processor\n\n* Processor for feeding time-series data to an already created TensorFlow model\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "tags",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "tags",
                                "Label": "Tags for loading model. If multiple tags, use comma separator",
                                "Default": "serve",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "input_operation",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "input_operation",
                                "Label": "Input tensor used while creating the model. Usually the dictionary of values you feed to the model",
                                "Default": "input_tensor",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "output_operation",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "output_operation",
                                "Label": "Output tensor used while creating the model. Usually the output of the model",
                                "Default": "output_tensor",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "Size of values array to process. This is array of values that is modified every new value arrived.",
                                "Default": "60",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "time_shift_ms",
                        "Value": {
                            "TabOrder": 6,
                            "Position": 6,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "time_shift_ms",
                                "Label": "By how many milliseconds to shift the current timestamp",
                                "Default": "0",
                                "Type": "int",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 8,
                            "Position": 8,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "model_path",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "model_path",
                                "Label": "Path to model",
                                "Default": "/var/lib/loopedge-analytics2/models/{MODEL_NAME}",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "number_of_inputs",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "number_of_inputs",
                                "Label": "Number of inputs",
                                "Default": "2",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Production Time/ CTR",
                "Group": "KPI",
                "Description": "\n# Actual Production Time KPI\n\nIf you want to keep track of how much time it takes to complete production, either by:\n\n* counting the time between when you received an order - to when manufacturing is finished, or\n\n* counting the time between the start of manufacturing - to when inspection ends\n\n       e.g Currently it takes 5 minutes to produce that metal plate\n\n\n# Cycle Time Ratio KPI\n\nIf you need to monitor what is the production cycle time compared to an ideal production cycle time\n\n* e.g  current (production) cycle time is 5 times of your ideal cycle time\n  (or) in other words, 'it took you 5 times more time for this production cycle than it actually should/usually does'\n\n* The **timer interval** parameter is useful if the connected input tag is offline, but you still want this KPI to \"look\" for a value every few seconds, defined by the aforementioned timer\n\n  * If you know your tag is going to reliably publish at the expected interval, it is better to disable this timer by entering **0** in the field\n\n### After creating this KPI, you need to add definitions called *manufactureStart* and *manufactureEnd* to the connecting wire, which are event triggers, triggering whenever there is start of manufacturing event and then one more trigger for which represents the end of manufacturing cycle\n",
                "ShortDescription": "Production time and Cycle Time Ratio",
                "RequiredDefinitions": [
                    "manufactureStart",
                    "manufactureEnd"
                ],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "manufacture_end_from",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "manufacture_end_from",
                                "Label": "Manufacture End, when value goes from this number",
                                "Default": "0",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "manufacture_end_to",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "manufacture_end_to",
                                "Label": "Manufacture End, when value goes to this number",
                                "Default": "1",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "ideal_cycle_time",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "ideal_cycle_time",
                                "Label": "Ideal/Standard production cycle time, in seconds",
                                "Default": "100",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds. If no event, use this timer to keep displaying the output continually. Enter zero to disable",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 7,
                            "Position": 7,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "manufacture_start_from",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "manufacture_start_from",
                                "Label": "Manufacture Start, when value goes from this number",
                                "Default": "0",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "manufacture_start_to",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "manufacture_start_to",
                                "Label": "Manufacture Start, when value goes to this number",
                                "Default": "1",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Normalization",
                "Group": "Functions",
                "Description": "\n# Normalization Filter\n\n* Initially, a window of value is observed, and the next value is converted between 0 and 1, based on the method of normalization used\n\n* Afterwards, the values follow moving window algorithm and the next value is again placed between 0 and 1 based on the previous window \n",
                "ShortDescription": "Normalization",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "mode",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "mode",
                                "Label": "Which form of Standardization/Normalization",
                                "Default": "Min-Max",
                                "Type": "string",
                                "EnumItems": [
                                    "Min-Max",
                                    "Average-Standard Deviation"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "How many values to observe",
                                "Default": "10",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Compliance and Loss",
                "Group": "KPI",
                "Description": "\n# Compliance and Production Loss KPI\n\n* **Compliance**\n\n * If you do not need to keep a track of ALL the failures happening in a factory (like a machine failure/defective units/failing regulation, etc), but if there is a topic(event trigger) which updates whenever there is such an event, you can just monitor how many units are compliant (pass quality assurance/non-defective units)\n\n* **Production Loss**\n\n * If you need to know how many of the manufactured units were unsuccessful, and hence realize the loss incurred on the desired period.\n\n\t  e.g  40 out of the 100 were defective\n\t  (or) 40% production is wasted\n\t  (or) 60% of your manufactured products are compliant with your  standards\n\n* The **timer interval** parameter is useful if the connected input tag is offline, but you still want this KPI to \"look\" for a value every few seconds, defined by the aforementioned timer\n\n  * If you know your tag is going to reliably publish at the expected interval, it is better to disable this timer by entering **0** in the field\n\n### After creating this KPI, you need to add definitions called *manufactureEnd* and *defectiveUnit* to the connecting wire, which are event triggers, triggering when it is the end of manufacturing cycle, and one trigger which represents a defective unit was discovered\n",
                "ShortDescription": "Compliance and Production Loss percentage",
                "RequiredDefinitions": [
                    "manufactureEnd",
                    "defectiveUnit"
                ],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "manufacture_to",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "manufacture_to",
                                "Label": "Manufacture End, when value goes to this number",
                                "Default": "1",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "defective_from",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "defective_from",
                                "Label": "Defective Unit, when value goes from this number",
                                "Default": "0",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "defective_to",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "defective_to",
                                "Label": "Defective Unit, when value goes to this number",
                                "Default": "1",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds. If your input is unreliable, use this timer to keep displaying the output continually. Enter zero to disable",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 6,
                            "Position": 6,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "manufacture_from",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "manufacture_from",
                                "Label": "Manufacture End, when value goes from this number",
                                "Default": "0",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Combination Processor",
                "Group": "Functions",
                "Description": "\n# Fields Combination Processor\n\n* This Processor can be used to combine fields from different input processors, into a single JSON string\n\n* A definition is needed to be added on the connecting wire after creating this processor\n\n* The fields to combined, will need to be defined as **wire definition**_**fieldName**\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "combination_type",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "combination_type",
                                "Label": "Combine selected, or combine all fields?",
                                "Default": "combine selected fields",
                                "Type": "string",
                                "EnumItems": [
                                    "combine selected fields",
                                    "combine all fields"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "what_timestamp_to_take?",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "what_timestamp_to_take?",
                                "Label": "Take timestamp from which input processor?",
                                "Default": "fresh timestamp",
                                "Type": "string",
                                "EnumItems": [
                                    "first available",
                                    "last available",
                                    "average of inputs",
                                    "fresh timestamp"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "fields_to_combine",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "fields_to_combine",
                                "Label": "Enter the fields to combine, with comma as the separator",
                                "Default": "inputA_value, inputB_value",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "DataHub Subscribe",
                "Group": "",
                "Description": "\n# DataHub streaming input processor\n\nGenerate events from specified DataHub topic and attach to output\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "outputOnly",
                "Features": [],
                "Properties": [
                    {
                        "Key": "ignore_null_value",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "ignore_null_value",
                                "Label": "Ignores all null value messages (value is null)",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "topic",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "topic",
                                "Label": "Topic name for DataHub subscribe",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "ignore_failed_data",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "ignore_failed_data",
                                "Label": "Ignores all unsuccessful messages (success=false)",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "FileWriter",
                "Group": "",
                "Description": "\n# File Write processor\n\n* Converts input data to specified format, and writes it to a file\n  * This can be done by either adding to the end of the file, or replacing the existing content\n  * Alternatively, it can also delete the file\n\n* If the **\"Generate Filename From Expression\"** option is enabled, the filename will be evaluated as expression.\n  * For example, if you want to get the filename from \"path\" and name\" properties of incoming connection \"AAA\", your expression could be:\n\t**AAA_path + AAA_name + \".txt\"**\n  * Please note that static text in expressions should be put into quotes \n\n* Timer interval in seconds acts as a **\"Re-write file on timer\"** option\n  * This is useful if you want to keep generating new file names after every few intervals\n\n* If ***\"Output File Type\"*** is set to **value only** processor will save incoming data from **\"value\"\"** payload field as is.\n* If ***\"Output File Type\"*** is set to **CSV** following options will affect output: \n  * **CSV Comma** contains CSV-file delimiter (only first character will be used from string entered)\n  * **CSV Header** controls whether column names will be included or not \n  * **CSV Columns From Payload** controls whether column names will be generated from payload\n  * **CSV Custom Columns** contains comma-separated list of columns names (overrides **CSV Columns From Payload**!)\n* If ***\"Output File Type\"*** is set to **Parquet** output file will be rewritten on each incoming payload. \n  * If ** Write file Method ** is set to \"append\" then last **Parquet Buffer Capacity** records will be written to file \n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOnly",
                "Features": [],
                "Properties": [
                    {
                        "Key": "timer_interval_in_seconds",
                        "Value": {
                            "TabOrder": 6,
                            "Position": 6,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timer_interval_in_seconds",
                                "Label": "Period of time in seconds between generation of a new filename.",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "csv_header",
                        "Value": {
                            "TabOrder": 8,
                            "Position": 8,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "csv_header",
                                "Label": "column names output",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "csv_columns_from_payload",
                        "Value": {
                            "TabOrder": 9,
                            "Position": 9,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "csv_columns_from_payload",
                                "Label": "get column names from payload",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "csv_custom_columns",
                        "Value": {
                            "TabOrder": 10,
                            "Position": 10,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "csv_custom_columns",
                                "Label": "output column names",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "parquet_capacity",
                        "Value": {
                            "TabOrder": 11,
                            "Position": 11,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "parquet_capacity",
                                "Label": "Parquet Buffer Capacity",
                                "Default": "100",
                                "Type": "int",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "generate_filename_from_expression",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "generate_filename_from_expression",
                                "Label": "Generates name of a file to write from filename expression.",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "file_write_method",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "file_write_method",
                                "Label": "File write method",
                                "Default": "append",
                                "Type": "string",
                                "EnumItems": [
                                    "append",
                                    "overwrite",
                                    "delete"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "output_file_type",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "output_file_type",
                                "Label": "File type",
                                "Default": "JSON",
                                "Type": "string",
                                "EnumItems": [
                                    "JSON",
                                    "CSV",
                                    "Parquet",
                                    "value only",
                                    "Binary"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "add_new_line",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "add_new_line",
                                "Label": "Adds newline (\\n) to incoming data",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "create_directories",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "create_directories",
                                "Label": "Creates directory in filename if it doesnt' exist",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "csv_comma",
                        "Value": {
                            "TabOrder": 7,
                            "Position": 7,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "csv_comma",
                                "Label": "CSV delimiter (one character)",
                                "Default": ",",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "file_name",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "file_name",
                                "Label": "Name of a file to write. If not absolute it will be relative to working directory of analytics2 process",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": true,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Switch",
                "Group": "",
                "Description": "\n# Switch Processor\n\n* Sends content of incoming message to an output only when rule checks are met\n\n* Available rules to be checked are: \n  * **==** - Equals\n    * For strings, **input value** and **checked value** need to be lexicographically equal\n\n  * **!=** - Not Equals\n    * For strings, **input value** and **checked value** need to be lexicographically different\n\n  * **<** - Less than\n    * For strings, **input value** needs to be lexicographically before **checked value**\n\n  * **<=** - Less than, or equals\n    * For strings, **input value** needs to be lexicographically equal to, or before **checked value**\n\n  * **>** - Greater than\n    * For strings, **input value** needs to be lexicographically after **checked value**\n\n  * **>=** - Greater than, or equals\n    * For strings, **input value** needs to be lexicographically equal to, or after  **checked value**\n\n  * **is true** - Only applicable for field having **Bool** data type\n\n  * **is false** - Only applicable for field having **Bool** data type\n\n  * **is null** - Given field should not be present in the input\n\n  * **is not null** - Given field should be present in the input\n\n  * **is of type** - Compares the datatype of field with given\n\n  * **contains** - Only applicable for field having **String** or **JSON** data type\n\n* For string datatype, the rules for comparison are done via GoLang **strings.compare**\n\n* **Please note that DataHub payload have all numeric values as floats, so this processor will require \"datatype\" field present to perform correct conversions or bool, uint and int data**\n\n* **Field Name**, **Check Value** and **Check Value Type** Represent what field to look for, for the comparison, \nwhat value to check for, and what is the expected type for the mentioned value\n\n* **Output Name** is used to restrict/filter where to publish the output to.\n  * If left empty, output will be published to all connected processors  \n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "rule",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "rule",
                                "Label": "Which rules to check for",
                                "Default": "==",
                                "Type": "string",
                                "EnumItems": [
                                    "==",
                                    "!=",
                                    "<",
                                    "<=",
                                    ">",
                                    ">=",
                                    "is true",
                                    "is false",
                                    "is null",
                                    "is not null",
                                    "is of type",
                                    "contains"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "field_name",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "field_name",
                                "Label": "Field to process",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": true,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "check_value",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "check_value",
                                "Label": "Value to check for",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": true,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "check_value_type",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "check_value_type",
                                "Label": "Data Type of value being checked",
                                "Default": "string",
                                "Type": "string",
                                "EnumItems": [
                                    "string",
                                    "uint",
                                    "bool",
                                    "json",
                                    "int",
                                    "float"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "output",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "output",
                                "Label": "Output name for data. Keeping this empty means filtered data will be sent to all outputs",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "AI Vision",
                "Group": "Functions",
                "Description": "\n# AI Vision Processor\n\n* **File Path** can be provided, or model can expect a base64 image from the input payload\n  * File path will always supersede incoming payload\n  * Model will take file types *jpg*, *png* and *gif*\t\n\n* **AI Model** must be set to define the unique name identifier for the model being used.\n\n* **System Prompt** parameter allows users to provide a predefined instruction that influences the AI’s behavior and response style.\n    * This can be used to enforce a specific tone, persona, or domain expertise in responses.\n\n* **Temperature** parameter (default **1.0**) controls the randomness of responses.\n    * Lower values (e.g., **0.2**) make the AI more focused and deterministic.\n    * Higher values (e.g., **1.8**) increase creativity but may reduce consistency.\n\n* **Max Completion Tokens** parameter limits the maximum number of tokens the AI can generate in a single response.\n    * This ensures output length remains within expected boundaries.\n    * If not set, the model’s default value will be used.\n\n* **HTTP Timeout** parameter sets the maximum time (in seconds) the system will wait for a response from the AI.\n    * If the AI does not respond within this time, the request will timeout and ignored\n    * This prevents excessive delays in cases of high latency.\n",
                "ShortDescription": "AI Vision Processor for multiple type of models",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "ai_model",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "ai_model",
                                "Label": "Unique AI Model Name",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "HTTP_timeout",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "HTTP_timeout",
                                "Label": "HTTP timeout interval in seconds",
                                "Default": "10",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "file_path_for_image",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "file_path_for_image",
                                "Label": "File Path for the Image. Leave empty to use input message as the image",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "system_prompt",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "system_prompt",
                                "Label": "System Prompt used for the AI model",
                                "Default": "System Prompt used in the AI model\n\n Example: You are a JSON analyser. Analyze the input and act as a CNC expert who gives a response based on it",
                                "Type": "script",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "temperature",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "temperature",
                                "Label": "AI model temperature. Float value between 0 and 2",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "max_completion_tokens",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "max_completion_tokens",
                                "Label": "Maximum completion tokens",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 6,
                            "Position": 6,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds in which to push values. Zero disables this timer",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 8,
                            "Position": 8,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Conversion",
                "Group": "Functions",
                "Description": "\n# Unit Conversion\n\n* Ready conversions of commonly used Units\n",
                "ShortDescription": "conversions of units",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "conversion",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "conversion",
                                "Label": "What type of conversion",
                                "Default": "Celsius -> Fahrenheit",
                                "Type": "string",
                                "EnumItems": [
                                    "timestamp to local time",
                                    "timestamp to UTC",
                                    "Celsius -> Fahrenheit",
                                    "Fahrenheit -> Celsius",
                                    "degree -> radian",
                                    "radian -> degree",
                                    "degree -> gon",
                                    "gon -> degree",
                                    "radian -> gon",
                                    "gon -> radian"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Base Conversion",
                "Group": "Functions",
                "Description": "\n# Base Conversion of units\n\n* With this function, you can convert the base from decimal to binary, decimal to HexaDecimal, decimal to OctaDecimal, and the other way round as well \n\n* For conversion of various units to decimal, it is expected that the input is a string\n\n  * Your input needs to have a field named **value** if you are converting from binary/octadecimal/hexadecimal to decimal\n\n* e.g if 12 is the input in decimal place, the output of decimal -> hexadecimal would be \"c\"\n\n* e.g if 12 is the input in decimal place, the output of decimal -> binary would be \"1100\"\n",
                "ShortDescription": "base conversions",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "conversion",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "conversion",
                                "Label": "Which type of conversion?",
                                "Default": "decimal -> binary",
                                "Type": "string",
                                "EnumItems": [
                                    "decimal -> binary",
                                    "decimal -> hexaDecimal",
                                    "decimal -> octaDecimal",
                                    "binary -> decimal",
                                    "octaDecimal -> decimal",
                                    "hexaDecimal -> decimal"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Moving Maximum",
                "Group": "",
                "Description": "\n# Moving Window Maximum\n\n* This KPI shows the maximum value from \"n\" values, in the desired window\n\n* The oldest value is then dropped, and a new window with the current value is formed, hence the name \"moving maximum\"",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "processing_type",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "processing_type",
                                "Label": "Data type of the value being processed",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": [
                                    "float",
                                    "signed",
                                    "unsigned"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "field_name",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "field_name",
                                "Label": "Usually left unchanged. Use it if incoming is message type, and/or non-default \"value\" field name",
                                "Default": "value",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "Size of window in which values are observed",
                                "Default": "10",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Feature Extractor",
                "Group": "Functions",
                "Description": " \n# Feature Extractor\n\nWith this function, once you enter the window of values you prefer, you can then select which functions would you like to see in our output\n\n* Let's say you picked a window of *N* values\n\n* **Minimum** : Gives you minimum of N values\n\n* **Maximum** : Gives you maximum of N values\n\n* **Average** : Gives you the average(mean) of N values\n\n* **Standard Deviation** : \n\n  * standard deviation = squareRoot( (x - average)^2/(N-1) )\n\n* **Variance** : \n\n  * variance = (x - average)^2/(N-1)\n\n* **Median** : \n\n  * median = N/2 for odd number of window elements, {[N-1] + [N]}/2 for even window elements\n\n* **Kurtosis** : \n\n  * kurtosis = [ (N)(N+1) / (N-1)(N-2)(N-3) ] * SIGMA [(x_i - x_avg)/(stdDeviation) ^4]\n\n* **Skewness** :\n\n  * skewness = [ (N) / (N-1)(N-2)] * SIGMA [(x_i - x_avg)/(stdDeviation) ^3]\n\n* **Zero crossing rate**: Gives you how many times the signal has crossed zero i.e positive value to negative, OR negative value to positive\n\n* **Root Mean Square** :\n  \n  * RMS = squareRoot[ SIGMA x^2 / N]\n\n* **Quartiles** : Divides the signal into 4 equal quartiles, based on medians\n\n* **Inter-quartile Range** : Difference between the third quartile and first quartile\n\n* **Mean Absolute Deviation** : \n\n  * mean absolute deviation = abs(x - average)/(N)\n\n* **Average absolute variation** : \n\n  * avg absolute variation = abs(x - average)/(N)\n\n* The **timer interval** parameter is useful if the connected input tag is currently not polling, but you still want this KPI to publish a value every few seconds, defined by the aforementioned timer\n\n  * If you know your input is going to publish at the expected interval, it is better to disable this timer by entering **0** in the field\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "Window in which to calculate. Window represents number of seconds",
                                "Default": "100",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "quartiles",
                        "Value": {
                            "TabOrder": 11,
                            "Position": 11,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "quartiles",
                                "Label": "quartiles",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "mean_absolute_deviation",
                        "Value": {
                            "TabOrder": 13,
                            "Position": 13,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "mean_absolute_deviation",
                                "Label": "MAD",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 17,
                            "Position": 17,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 15,
                            "Position": 15,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds in which to push values. Zero disables this timer",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "minimum",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "minimum",
                                "Label": "Minimum",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "standard_deviation",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "standard_deviation",
                                "Label": "",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "median",
                        "Value": {
                            "TabOrder": 6,
                            "Position": 6,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "median",
                                "Label": "median",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "zero_crossing_rate",
                        "Value": {
                            "TabOrder": 9,
                            "Position": 9,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "zero_crossing_rate",
                                "Label": "zcr",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "maximum",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "maximum",
                                "Label": "Maximum",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "kurtosis",
                        "Value": {
                            "TabOrder": 7,
                            "Position": 7,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "kurtosis",
                                "Label": "kurtosis",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "root_mean_square",
                        "Value": {
                            "TabOrder": 10,
                            "Position": 10,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "root_mean_square",
                                "Label": "rms",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "average_absolute_variation",
                        "Value": {
                            "TabOrder": 14,
                            "Position": 14,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "average_absolute_variation",
                                "Label": "AAV",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "average",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "average",
                                "Label": "Average",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "variance",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "variance",
                                "Label": "",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "skewness",
                        "Value": {
                            "TabOrder": 8,
                            "Position": 8,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "skewness",
                                "Label": "skewness",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "inter_quartile_range",
                        "Value": {
                            "TabOrder": 12,
                            "Position": 12,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "inter_quartile_range",
                                "Label": "iqr",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "XMR Chart",
                "Group": "Functions",
                "Description": "\n# XMR Control Chart\n\n* Once the window is filled with values, a **central line** is calculated which remains constant moving forward\n\n* Other fields that are calculated once window is filled are:\n\n  * **Moving ranges** : Difference of successive values\n\n  * **Average moving range** : Average of the moving ranges\n\n  * **Process Limit Multiplier** is used to calculate the upper and lower process limits\n\n  * **Upper and Lower Natural Process limit** : Calculated by taking the product of process limit multiplier and average moving range, and adding/subtracting it to the central line\n\n* In some cases, the central line is adjusted. Here are the cases:\n\n  * If current value is outside the process limits, multiple times in a row\n\n  * If the multiple values in a row are closer to either limits, than they are to the central line\n\n* The **timer interval** parameter is useful if the connected input tag is currently not polling, but you still want this KPI to publish a value every few seconds, defined by the aforementioned timer\n\n  * If you know your input is going to publish at the expected interval, it is better to disable this timer by entering **0** in the field\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "Window in which to calculate. Window represents number of seconds",
                                "Default": "100",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "process_limit_multiplier",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "process_limit_multiplier",
                                "Label": "Process Limit Multiplier",
                                "Default": "2.66",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds in which to push values. Zero disables this timer",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "StdOut",
                "Group": "",
                "Description": "Just consumer that print to console",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOnly",
                "Features": [],
                "Properties": []
            },
            {
                "Name": "TensorFlow images processor",
                "Group": "ML",
                "Description": "\n# TensorFlow Images Processor\n\n* Processor for feeding images to an already created TensorFlow model\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "model_path",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "model_path",
                                "Label": "Path to model",
                                "Default": "/var/lib/loopedge-analytics2/models/{MODEL_NAME}",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "tags",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "tags",
                                "Label": "Tags for loading model. If multiple tags, use comma separator",
                                "Default": "serve",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "input_operation",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "input_operation",
                                "Label": "Input tensor used while creating the model. Usually the dictionary of values you feed to the model",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "output_operation",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "output_operation",
                                "Label": "Output tensor used while creating the model. Usually the output of the model",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "gray",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "gray",
                                "Label": "Decode image as gray scale, if this checkmark is true",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "image_format",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "image_format",
                                "Label": "",
                                "Default": "png",
                                "Type": "string",
                                "EnumItems": [
                                    "png",
                                    "jpg"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "time_shift_ms",
                        "Value": {
                            "TabOrder": 6,
                            "Position": 6,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "time_shift_ms",
                                "Label": "By how many milliseconds to shift the current timestamp",
                                "Default": "0",
                                "Type": "int",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 8,
                            "Position": 8,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Inputs Sum",
                "Group": "",
                "Description": "\n# Inputs Summation\n\n* This KPI calculates the (cumulative) summation from the given inputs\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "processing_type",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "processing_type",
                                "Label": "Data type of the value being processed",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": [
                                    "float",
                                    "signed",
                                    "unsigned"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "field_name",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "field_name",
                                "Label": "Usually left unchanged. Use it if incoming is message type, and/or non-default \"value\" field name",
                                "Default": "value",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Inputs Maximum",
                "Group": "",
                "Description": "\n# Inputs Maximum\n\n* This KPI calculates the maximum value from the given multiple inputs\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "processing_type",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "processing_type",
                                "Label": "Data type of the value being processed",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": [
                                    "float",
                                    "signed",
                                    "unsigned"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "field_name",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "field_name",
                                "Label": "Usually left unchanged. Use it if incoming is message type, and/or non-default \"value\" field name",
                                "Default": "value",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Inputs Average",
                "Group": "",
                "Description": "\n# Inputs Average\n\n* This KPI calculates the average/mean value from the given multiple inputs\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "processing_type",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "processing_type",
                                "Label": "Data type of the value being processed",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": [
                                    "float",
                                    "signed",
                                    "unsigned"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "field_name",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "field_name",
                                "Label": "Usually left unchanged. Use it if incoming is message type, and/or non-default \"value\" field name",
                                "Default": "value",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Maintenance/Failure",
                "Group": "KPI",
                "Description": "\n# Maintenance and Failure KPIs\n\n*(requirement)* A new topic created such that every time there is a maintenance event or a fault/failure, this topic gets updated\n\n\n1) **Maintenance events per cycle**\n\n * You can see the number of maintenance (planned or unplanned) in a production cycle\n\n       e.g In the production cycle of manufacturing a bottle, on average 3 maintenance events are required\n\n2) **Time since last maintenance**\n\n * If you know that the machine needs to be checked periodically, you can see time elapsed between 'maintenance' events\n\n       e.g It has been 20 days since the last maintenance event happened\n\n3) **Timestamp of last maintenance**\n\n * Keep track of the previous time when maintenance happened\n\n4) **Number of faults/failures detected in a period**\n\n * You can see the number of failures that have happened in a period\n\n       e.g between March 5 and March 16, 12 machine failures happened\n\n5) **Time since last failure**\n\n * If you know that the machine needs to be checked periodically, you can see time elapsed between 'failure' events\n\n       e.g It has been 20 days since the last machine failure\n\n6) **Timestamp of last failure**\n\n * Keep track of the previous time when failure happened\n\n* The **timer interval** parameter is useful if the connected input tag is offline, but you still want this KPI to \"look\" for a value every few seconds, defined by the aforementioned timer\n\n  * If you know your tag is going to reliably publish at the expected interval, it is better to disable this timer by entering **0** in the field\n\n### After creating this KPI, you need to add definitions called *maintenance* and *failure* to the connecting wire, which are event triggers, triggering whenever there is event of maintenance or failure\n",
                "ShortDescription": "Maintenance and Failure related KPIs",
                "RequiredDefinitions": [
                    "maintenance",
                    "failure"
                ],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "unit",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "unit",
                                "Label": "Display time since last Maintenance/Failure in Seconds, Minutes, Hours, Days or Weeks",
                                "Default": "seconds",
                                "Type": "string",
                                "EnumItems": [
                                    "seconds",
                                    "minutes",
                                    "hours",
                                    "days",
                                    "weeks"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds. If no event, use this timer to keep displaying the output continually. Enter zero to disable",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 7,
                            "Position": 7,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "maintenance_from",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "maintenance_from",
                                "Label": "Maintenance, when value goes from this number",
                                "Default": "0",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "maintenance_to",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "maintenance_to",
                                "Label": "Maintenance, when value goes to this number",
                                "Default": "1",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "failure_from",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "failure_from",
                                "Label": "Failure, when value goes from this number",
                                "Default": "0",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "failure_to",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "failure_to",
                                "Label": "Failure, when value goes to this number",
                                "Default": "1",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Change of Value",
                "Group": "KPI",
                "Description": "\n# Change of value KPI\n\n* Show the entire message payload when the current value is different than the previous value\n\n* A simple use-case of this KPI is: you want to see a message ONLY if there is a significant change from the previous value, otherwise if things are normal, no output is expected\n\n* By entering a **delta**, you can ignore some precision error\n\n* If you enter delta as 0.0, even the smallest change will be detected by this KPI, or you can enter a delta of 0.1 (for example) if you want to allow ignore a change of +/- 0.1 from your previous value\n\n\te.g assume that delta is 0.5 and previous value was 100\n\tNow, if the current value is between 99.5 to 100.5, it will be ignored from this KPI, but any other value would trigger this KPI\n\n* **Map Field Name** asks you what is the field you want to observe for COV. This can be \"value\" or \"asset_online\" etc depending entirely on what is the input message you are sending to this KPI\n\n* The **timer interval** parameter is useful if the connected input tag is currently not polling, but you still want this KPI to publish a value every few seconds, defined by the aforementioned timer\n\n  * If you know your input is going to publish at the expected interval, it is better to disable this timer by entering **0** in the field\n\n* **Expected Output:** No output if the current value is the same as the previous value (+ or - *delta*), but outputs the entire input message if there is a change\n",
                "ShortDescription": "Change of Value",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "map_field_name",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "map_field_name",
                                "Label": "What field to observe?",
                                "Default": "value",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "delta_of_tolerance",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "delta_of_tolerance",
                                "Label": "How much delta of values to ignore? (Helps ignore some error of round off)",
                                "Default": "0.0",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds in which to push values. Zero disables this timer",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Statistical Prediction",
                "Group": "Functions",
                "Description": "\n# Statistical Prediction by Fourier extrapolation\n\n* To achieve a prediction of value in the future, Fast fourier transform (FFT) is done on the time series signal\n\n* This FFT is then used to de-trend the data, generate sine-cosine waveform out of the signal, and then the signal is restored to it's best capacity\n\n* The **frequency difference** represents the sampling rate of discretization.\n\n  * For example, if the window has 10 elements, 1 second frequency difference will generate 10 frequency samples (maximum). 2 seconds will generate 5 samples, and so on\n\n  * Usually 1 is good, because it is a time series signal, so you're sampling at every second\n\n* **Harmonics** represent the number of waves to \"add\" to the fundamental wave, to reach the desired signal\n\n  * Some signals have a huge number of harmonics, for example square waves have theoretically infinite harmonics\n\n  * For the number of harmonics, it is better to start with a lower number and play around with it to see what best fits your needs, rather than just entering a high number  \n\n* Due to limitations of working with live data, it is preferable to have a window of data to \"observe\" and then give a \"prediction\" for a future time\n\n* For now, the poling interval of the subscription tag is assumed to be 1 second\n\n* **Expected Output:** Until the window is filled up, no output is expected. Afterwards, the *prediction*, with the timestamp of prediction will be the output\n",
                "ShortDescription": "\nPrediction\n",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "display_prediction_on_current_timestamp",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "display_prediction_on_current_timestamp",
                                "Label": "Check this box if you want to see the answer of the prediction on current timestamp",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "How many values to observe before making each prediction? (assumed with 1 second as poling interval)",
                                "Default": "10",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "number_of_predictions",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "number_of_predictions",
                                "Label": "How many seconds in future to predict? (assumed with 1 second as poling interval)",
                                "Default": "2",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "frequency_difference",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "frequency_difference",
                                "Label": "Frequency sampling distance in seconds",
                                "Default": "1",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "number_of_harmonics",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "number_of_harmonics",
                                "Label": "Number of harmonics",
                                "Default": "4",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 6,
                            "Position": 6,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Database Batch Input",
                "Group": "Connect",
                "Description": "\n# DB polling processor \n\n* Generate events by periodically polling specified DB measurement\n\n* **Filtering:**\n  \n  * You could add filtering for queries\n\n  * List of fields depends on database and measurement, but for device data, standard filters are: datatype, device_id, is_device_status, register_id, success, tag, topic, value\n\n* **Examples:**\n  \n  * Filter by tag: \"tag\" = 'tag1'\n  \n  * Filter by tag and success: \"tag\" = 'tag1' AND \"success\" = 1\n\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "outputOnly",
                "Features": [
                    "Invoke"
                ],
                "Properties": [
                    {
                        "Key": "metric_name",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "metric_name",
                                "Label": "Name of the metric for TimeSeriesDB polling",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "typed",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "typed",
                                "Label": "Data typed policy",
                                "Default": "autogen",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "period_secs",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "period_secs",
                                "Label": "Polling interval in seconds",
                                "Default": "1",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "filter",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "filter",
                                "Label": "SQL filter for the WHERE part of the query",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "ignore_failed_data",
                        "Value": {
                            "TabOrder": 6,
                            "Position": 6,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "ignore_failed_data",
                                "Label": "Ignores all unsuccessful messages (success=false)",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "ignore_null_value",
                        "Value": {
                            "TabOrder": 7,
                            "Position": 7,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "ignore_null_value",
                                "Label": "Ignores all null value messages (value is null)",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "database",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "database",
                                "Label": "Select database name",
                                "Default": "tsdata",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Up/DownTime by Value",
                "Group": "KPI",
                "Description": "\n# UpTime and DownTime by value KPI\n\n* If you would like to compare your current value with a desired value, to count as UpTime or DownTime\n\n* By setting the **condition**, you can define: Downtime if current value is greater(>), less(<), equal(==) or notEqual(!=) than **desired value**\n\n\te.g if current value less than 5 consider it DownTime\n\t(or) if current value not equal to 10.5, consider DownTime\n\t(or) if current value equal 0, consider DownTime, etc\n\n* You can enter a delta too, if you want to forgive some sort of round off error\n\n* The **timer interval** parameter is useful if the connected input tag is offline, but you still want this KPI to \"look\" for a value every few seconds, defined by the aforementioned timer\n\n  * If you know your tag is going to reliably publish at the expected interval, it is better to disable this timer by entering **0** in the field \n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds in which to push values. Zero disables this timer",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 7,
                            "Position": 7,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "device_reset",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "device_reset",
                                "Label": "Reset everything when device changes?",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "unit",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "unit",
                                "Label": "Display UpTime/DownTime in Seconds, Minutes, Hours, Days or Weeks",
                                "Default": "seconds",
                                "Type": "string",
                                "EnumItems": [
                                    "seconds",
                                    "minutes",
                                    "hours",
                                    "days",
                                    "weeks"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "condition",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "condition",
                                "Label": "What sort of comparison to make; Downtime if current value is greater(>), less(<), equal(==) or notEqual(!=) than desired value",
                                "Default": "less",
                                "Type": "string",
                                "EnumItems": [
                                    "less",
                                    "greater",
                                    "equal",
                                    "notEqual"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "desired_value",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "desired_value",
                                "Label": "Desired value to check current values with",
                                "Default": "0",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "delta_of_tolerance",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "delta_of_tolerance",
                                "Label": "Allow freedom of desiredValue + or - this delta",
                                "Default": "0.0",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Simple Window",
                "Group": "",
                "Description": "\n# Simple Moving Window\n\n* Takes input as a single value, outputs a simple moving window following FIFO algorithm\n",
                "ShortDescription": "Simple window with no calculation",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "value_type",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "value_type",
                                "Label": "What is the type of the incoming value?",
                                "Default": "float",
                                "Type": "string",
                                "EnumItems": [
                                    "float",
                                    "int",
                                    "uint"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "order",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "order",
                                "Label": "What is the desired order of output window?",
                                "Default": "Oldest -> Newest",
                                "Type": "string",
                                "EnumItems": [
                                    "Oldest -> Newest",
                                    "Newest -> Oldest"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "Window in which the values will be observed",
                                "Default": "10",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Manufacture Counter",
                "Group": "KPI",
                "Description": "\n# Total Units manufactured KPI\n\n* If you need a simple count of the total number of units manufactured in a period\n\n\te.g  7,000 glasses manufactured between March 23 and March 26\n\t(or) 500 total units produced this week\n\t(or) 20 products manufactured this month\n\n# Capacity Utilization KPI\n\t\t\nYou can monitor how much output is being produced, compared to an ideal scenario. Kind of like CPU usage, Memory usage, etc\n\t\t\n* e.g The specifications of a machine says it produces 100 stickers per hour, but currently it is only producing 80 stickers per hour. Hence you can see that the machine is operating only at 80% of its actual capacity\n\t\t\n* Possibly even more useful, if the machine is more than 100% utilization, it can be inferred that the machine is likely to overheat and cause breakdown/failure\n\n* *Note* : Capacity Utilization will be updated once manufacture event happens\n\n  * Otherwise, it will be updated when the threshold for the hour/day/week is met (decided through the \"unit\" parameter)\n\n* The **timer interval** parameter is useful if the connected input tag is offline, but you still want this KPI to \"look\" for a value every few seconds, defined by the aforementioned timer\n\n  * If you know your tag is going to reliably publish at the expected interval, it is better to disable this timer by entering **0** in the field\n\n### After creating this KPI, you need to add a definition called *manufactureEnd* to the connecting wire, which is an event trigger, triggering whenever there is end of a manufacture cycle\n",
                "ShortDescription": "Total units manufactured and capacity utilization",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "ideal_count",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "ideal_count",
                                "Label": "What is the ideal count of manufacture per hour/day/week?",
                                "Default": "1",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "from_value",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "from_value",
                                "Label": "Manufacture End, when value goes from this number",
                                "Default": "0",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "to_value",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "to_value",
                                "Label": "Manufacture End, when value goes to this number",
                                "Default": "1",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds. If no event, use this timer to keep displaying the output continually. Enter zero to disable",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 7,
                            "Position": 7,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "device_reset",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "device_reset",
                                "Label": "Reset everything when Device changes?",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "unit",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "unit",
                                "Label": "What is the unit in which you are entering the ideal Count in? e.g minute, hour, day, week",
                                "Default": "hour",
                                "Type": "string",
                                "EnumItems": [
                                    "hour",
                                    "day",
                                    "week"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "JavaScript processor",
                "Group": "Functions",
                "Description": "\n# Scripting for data manipulations\n\n* This processor uses JavaScript scripting\n\n* **Simple Use case**: The output you receive from DeviceHub message or from Analytics, might not be helpful, and you want to change the name of a field within that message\n\n  * *e.g* Instead of \"value\" you want your data to show \"furnace pressure\"\n\n  * *e.g* Instead of having all fields of the message, you only want to have \"success\", \"deviceId\" and \"value\" and skip everything else\n\n  * *e.g* You want to add a custom field to the message, based on the \"value\" field, such as: if value = 2, \"error\": \"overheating\"\n\n  * *e.g* You only want to change the timestamp to human readable format instead of Unix timestamp, but keep otherwise keep the message as-it-is\n\n  * In general, if you want to add, remove or modify *ANY* field in the input, this scripting processor is very useful\n\n* **Single Input:** Every message from the input, is stored as an array called \"values\"\n\n  * Using \"for i, message in values{}\" statement, allows to access this input and manipulate it\n\n  * Here \"i\" represents what is the *definition* defined in the connection wire, more useful for multi-inputs, to identify and distinguish between each inputs, so for single input, \"i\" can be replaced with \"_\"\n\n  * \"message\" contains the entire message in the input, and you can perform your manipulations to this \"message\" parameter\n\n  * **Note:** \"i\" and \"message\" can be any custom variable name\n\n* **Multiple Input:** Suppose you have 3 different inputs attached to this scripting processor, with the connecting wires named A, B and C\n\n  * \"for i, message in values{}\" will now have 3 inputs\n\n  * \"i\" represents from which connection wire is the input coming from\n\n  * with if-else statements, every input can be manipulated in isolation, or a common manipulation can be applied to all inputs\n\n  * You can choose to output \"result\" only for one input, or all of the inputs\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "script",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "script",
                                "Label": "Script body",
                                "Default": "/* \n Single input example: inputProcessors() returns list of IDs of incoming data which placed in values object\n incoming values are checked and changed if matches some condition \n also new string field is generated from all incoming parameters\n */\nvar ids = inputProcessors();\n\nfunction allValuesToString(obj) {\n    var res = \"\";\n    for (const key in obj) {\n        if (obj.hasOwnProperty(key)) {\n          res = res + \" \" + key + \" : \" + obj[key] + \"; \";\n        }\n    }\n    return res;\n} \n\nif (ids.length > 0) {\n  if (values && values[ids[0]]) {\n    result.allValues = allValuesToString(values[ids[0]]);\n    if (values[ids[0]].hasOwnProperty('int_param') && (values[ids[0]].int_param == 777)) {\n        result.int_param = 888;\n\t}\n  }\n} \n\n/* \n Multiple input example: inputProcessors() returns list of IDs of incoming data which placed in values object\n incoming values are checked and aggregated \n \n\nfunction allValuesToString(obj) {\n    var res = \"\";\n  \n    for (const key in obj) {\n        if (obj.hasOwnProperty(key)) {\n          res = res + \" \" + key + \" : \" + obj[key] + \"; \";\n        }\n    }\n    return res;\n} \n\nvar ids = inputProcessors();\n\nvar totalSumm = 0;\n\nif (ids.length > 0) {  \n   result[\"ids\"] = ids;\n   for (var i = 0; i < ids.length; i++) {        \n        var obj = values[ids[i]];\n        if (obj && obj.value !== undefined) {\n           totalSumm += obj.value; \n        }\n  }\n   result[\"total_summ\"] = totalSumm;\n} \n\n*/",
                                "Type": "script",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Moving Minimum",
                "Group": "",
                "Description": "\n# Moving Window Minimum\n\n* This KPI shows the minimum value from \"n\" values, in the desired window\n\n* The oldest value is then dropped, and a new window with the current value is formed, hence the name \"moving minimum\"\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "field_name",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "field_name",
                                "Label": "Usually left unchanged. Use it if incoming is message type, and/or non-default \"value\" field name",
                                "Default": "value",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "Size of window in which values are observed",
                                "Default": "10",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "processing_type",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "processing_type",
                                "Label": "Data type of the value being processed",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": [
                                    "float",
                                    "signed",
                                    "unsigned"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Anomaly Detection",
                "Group": "Functions",
                "Description": "\n# Standard Deviation Anomaly Detection (Statistical)\n\n* Anomaly detection by 3-Sigma Rule is a conventional heuristic used for an approximately normalized data-set\n\n* A rolling window of values are \"observed\", and their average and standard deviations are calculated\n\n* You can define the number of standard deviations that would be considered \"normal\", hence everything beyond that would be anomalous data\n\n* In case of an anomaly, the standard deviation window is expanded ever so slightly, so that it can adjust if this anomalous data becomes seasonal\n\n  * This calculation is done because in live data, it is sometimes not preferable for one large anomaly to drastically change the moving average and moving standard deviations \n\n  * With the **control chart mode**, this calculation can be completely bypassed, if all you need to check is whether the value is within upper/lower limit or not\n  \n  * If **control chart mode** is enabled, there will be no modifications done to the moving window before calculation\n\n* Currently if you have very small deviations (close to 0), it is difficult to distinguish between anomalous data, so it would be better to have a larger window size for those kinds of data\n\n* **Expected Output Fields:** timestamp, current value, moving average, moving standard deviation, upper limit, lower limit, total anomalies, and anomaly field replaces current value, if detected \n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "control_chart_mode?",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "control_chart_mode?",
                                "Label": "Ignore all internal calculations, and just display if the value is within upper and lower limit?",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "deviations",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "deviations",
                                "Label": "Number of deviations to keep in range",
                                "Default": "3",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "Window in which to calculate. Window represents number of seconds",
                                "Default": "100",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "topic_reset",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "topic_reset",
                                "Label": "Reset function on topic change?",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "SPC Charts",
                "Group": "Functions",
                "Description": " \n# SPC Charts\n\n* First, the **target_mean** (default 100), **window size** (default 50), and **timer interval** need to be set.\n\t* The **timer interval** parameter ensures that even if the connected input tag is not polling, the SPC chart will still publish data at the specified interval.\n    * If the input is expected to publish at the expected rate, set the timer interval to **0** to disable the timer.\n\n* The **current mean** and **standard deviation (stdDev)** are calculated based on the input data within the defined window.\n\n* **Upper Specification Limit (USL)** and **Lower Specification Limit (LSL)** are computed based on the **current_mean** and standard deviation.\n\n* The **process capability (Cp)** is calculated as the ratio of the difference between USL and LSL over six times the standard deviation (6σ).\n\n* **CPu** (Upper Capability Index) and **CPl** (Lower Capability Index) are calculated to assess how centered the process is within the specification limits.\n  * CPu = (USL - avg) / 3σ, CPl = (avg - LSL) / 3σ\n\n* **Process performance (Cpk)** is calculated by determining the smallest value between CPu and CPl.\n\n* Optionally, if valid data is present, the **Cpm** and **Cpkm** (which use the target mean) will be computed.\n\n* The chart will also output any **Nelson Rule violations** with a **true** flag indicating which rule number has been violated.\n  * The rules are as follows\n  * Rule1: One point is more than 3 standard deviations away from the mean.\n  * Rule2: Nine (or more) points in a row are on the same side of the mean.\n  * Rule3: Six (or more) points in a row are continually increasing or decreasing.\n  * Rule4: Fourteen (or more) points in a row alternate in direction, increasing then decreasing.\n  * Rule5: Two (or three) out of three points in a row are more than 2 standard deviations away from the mean in the same direction.\n  * Rule6: Four (or five) out of five points in a row are more than 1 standard deviation away from the mean in the same direction.\n  * Rule7: Fifteen points in a row are all within 1 standard deviation of the mean on either side of the mean.\n  * Rule8: Eight points in a row exist, but none within 1 standard deviation of the mean, and the points are in both directions from the mean.\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "Window in which to calculate. Window represents number of seconds",
                                "Default": "50",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "target_mean",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "target_mean",
                                "Label": "Target mean",
                                "Default": "100",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 15,
                            "Position": 15,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds in which to push values. Zero disables this timer",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Expression",
                "Group": "Functions",
                "Description": "\n# Expression\n\nThis function is for creating a mathematical-like expression with your desired topic. eg. you can enter a formula to convert temperature from Celsius to Fahrenheit, or a custom formula to perform on furnace pressure, etc \n\n* A definition is needed to be added on the connecting wire after creating this KPI. The expression will need to be defined as **wire definition**_**fieldName** *expression*\n\n* For example, (Celsius_value * 9/5) + 32 will be the expression, and then after creating this expression, you just need to add definition for \"Celsius\" to the connected input\n\n* Other examples of how this processor can be used with modifiers such as: **+** (add), **-** (subtract), **/** (divide),* (multiply), ** (raise-to-power), **%** (modulo division)\n\n* Additionally, comparators such as **<** (less than),  **>>** (greater than), **<=** (less than equals), **>=** (greater than equals), **==** (exactly equals) can also be used to obtain a true or false result\n    * A_value > 10 (implies output will be true if value is greater than 10, otherwise false)\n    \n* Regex comparators **=~** and **!~** are used to compare the left side candidate string to the pattern on the right side\n\n* Logical operators can be added to the expression as well, with **&&** (logical AND), **||** (logical OR)\n\n* Ternary operator **?** and **:** are also available for use. For example:\n  * A_success ? *true* : *false*\n     * In this case, we check if the \"left side\" of the question mark is true or false, if true, output will be true, otherwise false\n  * A_value == 10 ? \"equals10\" : \"notEquals10\"\n      * In this case we are combining expressions and checking if value is equal to 10 and returning output accordingly\n    \n* Finally, there are some useful inbuilt mathematical functions such as:\n  * **sin()**, **cos()**, **exp()** (exponential), **log()** (natural logarithm), **sqrt()** (square root), **abs()** (absolute value)\n  * A simple example on how to use them would be: *sin(A_value)*, or *sqrt(B_value) + abs(C_value)*, etc\n\n* The **timer interval** parameter is useful if the connected input tag is currently not polling, but you still want this KPI to publish a value every few seconds, defined by the aforementioned timer\n\n  * If you know your input is going to publish at the expected interval, it is better to disable this timer by entering **0** in the field\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds in which to push values. Zero disables this timer",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "expression",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "expression",
                                "Label": "Enter a mathematical expression",
                                "Default": "(Celsius_value * 9/5) + 32",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "output_field_name",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "output_field_name",
                                "Label": "Which field name should appear in the output?",
                                "Default": "value",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Inject",
                "Group": "",
                "Description": "\n# Inject Processor\n\n* Generates a new message event based on the provided inputs\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "outputOnly",
                "Features": [
                    "Invoke"
                ],
                "Properties": [
                    {
                        "Key": "timer_interval_type",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timer_interval_type",
                                "Label": "Timer's interval type",
                                "Default": "seconds",
                                "Type": "string",
                                "EnumItems": [
                                    "milliseconds",
                                    "seconds",
                                    "minutes",
                                    "hours",
                                    "days"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timer_interval_value",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timer_interval_value",
                                "Label": "Timer's interval value",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "inject_field",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "inject_field",
                                "Label": "What field to inject into message",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": true,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "inject_value_type",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "inject_value_type",
                                "Label": "Type of injected field's value",
                                "Default": "string",
                                "Type": "string",
                                "EnumItems": [
                                    "string",
                                    "uint",
                                    "bool",
                                    "json",
                                    "int",
                                    "float"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "inject_value",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "inject_value",
                                "Label": "Injected field's value",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": true,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "add_timestamp",
                        "Value": {
                            "TabOrder": 6,
                            "Position": 6,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "add_timestamp",
                                "Label": "Adds a timestamp to message",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timing_mode",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timing_mode",
                                "Label": "Message injection mode",
                                "Default": "once",
                                "Type": "string",
                                "EnumItems": [
                                    "once",
                                    "interval"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Linear Prediction",
                "Group": "Functions",
                "Description": "\n# Linear prediction by ordinary least squares model\n\n* Once window values are full, the mean of values is subtracted from each element and squared (Y_i - Mean_Y)\n\n* Same is done for the time series elements (X_i - Mean_X)\n\n* The sum of squares is sum of (X_i - Mean_X)^2 \n\n* The sum of products is sum of (Y_i - Mean_Y) * (X_i - Mean_X)\n\n* The slope is obtained by the formula m = { Sum of products } / { Sum of Squares } \n\n* The intercept is obtained by the formula b = Mean_Y - m * Mean_X\n\n* Finally, prediction is made by extrapolating the number of predictions in the simple formula y = m*X + b\n\n* Residual Error is obtained by modeling for current value, and subtracting the ACTUAL current value\n\n* The **timer interval** parameter is useful if the connected input tag is currently not polling, but you still want this KPI to publish a value every few seconds, defined by the aforementioned timer\n\n  * If you know your input is going to publish at the expected interval, it is better to disable this timer by entering **0** in the field\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "How many values to observe before making each prediction?",
                                "Default": "60",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "number_of_predictions",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "number_of_predictions",
                                "Label": "How many polling intervals in future to predict?",
                                "Default": "10",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "polling_interval",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "polling_interval",
                                "Label": "What is the polling interval in seconds?",
                                "Default": "1",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds in which to push values. Zero disables this timer",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Database Output",
                "Group": "",
                "Description": "\n# DB publishing processor \n\nPublish all inputs to a specified DB metric\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOnly",
                "Features": [],
                "Properties": [
                    {
                        "Key": "typed",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "typed",
                                "Label": "Publish typed name",
                                "Default": "autogen",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "measurement",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "measurement",
                                "Label": "Name of the measurement to publish",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": true,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "database",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "database",
                                "Label": "If empty - will use default database",
                                "Default": "tsdata",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "JSONata",
                "Group": "",
                "Description": "\n# JSONata Processor\n\n* Uses specified JSONata schema to transform incoming payload\n\n* JSONata is a flexible query and transformation language for JSON data\n\n* When using the JSONata processor it is important to define the correct input wires and JSONata expression to match\n\n* Supports both Event and Value wire types \n\n* Using Event wires as Input:\n\n\t* When using the Event wire type, there is no need to specify the wire name when defining the fields in the JSONata expression\n\t\n\t* Defining multiple inputs into a single JSONata process is possible, however each will be considered its own process flow and will generate a new payload\n\t\n\t* Input payload: \n\t\t**{\n\t\t   \"datatype\":\"float64\",\n\t\t   \"description\":\"\",\n\t\t   \"deviceID\":\"75F601CA-0F7A-4C26-90F0-470E2424BAC1\",\n\t\t   \"deviceName\":\"Gen\",\n\t\t   \"metadata\":{},\n\t\t   \"registerId\":\"D5DCF52F-342B-4211-8F4F-B92E4406BC4C\",\n\t\t   \"success\":true,\n\t\t   \"tagName\":\"tag1\",\n\t\t   \"timestamp\":1739558895577,\n\t\t   \"value\":0.38164469548275337\n\t\t}**\n\n\t* JSONata expression: \n\n\t\t* In this example I simply need to define the field name from the input in the expression:   \n\t\t**{\n\t\t\t\"metric\": $substring(tagName,3),\n\t\t\t\"value\": value,\n\t\t\t\"date\": $fromMillis(timestamp, '[M01]/[D01]/[Y0001] [h#1]:[m01][P]')\n\t\t}**\n\n\t* Output payload: **{\"date\":\"02/14/2025 6:51pm\",\"metric\":\"1\",\"value\":0.38164469548275337}**\n* Using Value wires as Input:\n\n\t* When using the Value wire type, it is important for every input field used there needs to be a prefix wire name\n\n\t* The JSONata processor will not produce a payload until all input payloads  are present. So the payload from input 1 will be stored in memory until input 2 produces a payload\n\n\t* Input payload 1:\t(wirename = Input_1)\n\t\t**{\n\t\t   \"datatype\":\"float64\",\n\t\t   \"description\":\"current metric\",\n\t\t   \"deviceID\":\"75F601CA-0F7A-4C26-90F0-470E2424BAC1\",\n\t\t   \"deviceName\":\"Gen\",\n\t\t   \"metadata\":{},\n\t\t   \"registerId\":\"D5DCF52F-342B-4211-8F4F-B92E4406BC4C\",\n\t\t   \"success\":true,\n\t\t   \"tagName\":\"tag1\",\n\t\t   \"timestamp\":1739558895577,\n\t\t   \"value\":0.38164469548275337\n\t\t}**\n\t* Input payload 2: (wirename = Input_2)\n\t\t**{\n\t\t   \"datatype\":\"float64\",\n\t\t   \"description\":\"temp metric\",\n\t\t   \"deviceID\":\"75F601CA-0F7A-4C26-90F0-470E2424BAC1\",\n\t\t   \"deviceName\":\"Gen\",\n\t\t   \"metadata\":{},\n\t\t   \"registerId\":\"D5DCF52F-342B-4211-8F4F-B92E4406BC4C\",\n\t\t   \"success\":true,\n\t\t   \"tagName\":\"tag2\",\n\t\t   \"timestamp\":1739558895577,\n\t\t   \"value\":-1.8813568907902232\n\t\t}** \n\t* JSONata expression: \n\n\t\t**{\n\t\t\t\"metric_1\": Input_1.tagName\n\t\t\t\"metric_2\": Input_2.tagName\n\t\t\t\"value_1\": Input_1.value,\n\t\t\t\"value_2\": Input_2.value,\n\t\t\t\"date\": $fromMillis(timestamp, '[M01]/[D01]/[Y0001] [h#1]:[m01][P]')\n\t\t}** \n\n\t\t* NOTE: It is required to define fields as **wirename.fieldname**\n\t* Output payload: \n\t\t**{\n\t\t\t\"metric_1\": tag1,\n\t\t\t\"metric_2\": tag2,\n\t\t\t\"value_1\": 0.38164469548275337,\n\t\t\t\"value_2\": -1.8813568907902232,\n\t\t\t\"date\":\"02/14/2025 6:51pm\"\n\t\t}** \n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "jsonata_schema",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "jsonata_schema",
                                "Label": "JSONata schema",
                                "Default": "",
                                "Type": "script",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Asset Online Percentage",
                "Group": "KPI",
                "Description": "\n# Asset Online Percentage KPI\t\n\n* The input tag connected to this KPI will be online for some time, and offline for other\n\n  * This is indicated by the *success* field in the incoming message from the tag\n\n* This KPI is a simple ratio of -> the time the tag has been online vs how long it has been running\n\n* Inference can be something like \n\n* If the machine is ON for 10 hours, how many hours is it successfully online (running)?\n\n\te.g  'Today, your machine is only being online for 80% of the time'\n    (or) 'Last week your machine was online for 60% of the time'\n\n* The **timer interval** parameter is useful if the connected input tag is offline, but you still want this KPI to \"look\" for a value every few seconds, defined by the aforementioned timer\n\n  * If you know your tag is going to reliably publish at the expected interval, it is better to disable this timer by entering **0** in the field\n\n* **Expected Output Fields:** \"asset_online\" in percentage, and the current timestamp\n",
                "ShortDescription": "Ratio of uptime and total time",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "end_hour",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "end_hour",
                                "Label": "End hour when asset online percentage is calculated",
                                "Default": "24",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds in which to push values. Zero disables this timer",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "device_reset",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "device_reset",
                                "Label": "Reset everything when Device changes?",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "start_hour",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "start_hour",
                                "Label": "Start hour when asset online percentage is calculated",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "ARIMA Filter",
                "Group": "Functions",
                "Description": "\n#ARIMA Filter\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "number_of_models",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "number_of_models",
                                "Label": "Take the average prediction from how many models?",
                                "Default": "5",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "Window in which to calculate. Window represents number of seconds",
                                "Default": "100",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "seasonality_size",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "seasonality_size",
                                "Label": "Seasonality size",
                                "Default": "7",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Gaussian Filter",
                "Group": "Functions",
                "Description": " \n#  Simple Gaussian Digital Filter\n\n* First, the mean, standard deviation and variance of a window of values is calculated\n\n* Coefficient is calculated by the formula 1/ {squareRoot(2 * PI) * deviations}\n\n* Exponential Part is calculated by the formula exp{ -(1/2) * (current - mean)^2 / (dev)^2 }\n\n* Multiplying those values gives the Gaussian Function, and then filtered value is obtained\n\n* The **timer interval** parameter is useful if the connected input tag is currently not polling, but you still want this KPI to publish a value every few seconds, defined by the aforementioned timer\n\n  * If you know your input is going to publish at the expected interval, it is better to disable this timer by entering **0** in the field\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "Window in which to calculate. Window represents number of seconds",
                                "Default": "30",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "number_of_deviations",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "number_of_deviations",
                                "Label": "How many deviations to use for the calculation?",
                                "Default": "1",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds in which to push values. Zero disables this timer",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Statistical Functions",
                "Group": "Functions",
                "Description": " \n# Statistical Functions and tests\n\nFew Statistical functions and normality tests for a window of values\n\n* **Jarque-Bera test** : \n\n  * This is simple goodness-of-fit test to check if the sample data has similar skewness and kurtosis to a normal distribution\n  \n  * The further the JB tet value is from zero, the stronger the fact that the data does not belong to the normal distribution\n  \n  * Skewness and kurtosis are calculated from the window of data and then JB value is calculated\n  \n  * JB = (n/6) (skewness^2 + (1/4)(kurtosis-3)^2)\n  \n  * P-value is calculated by subtracting cumulative distribution function at the JB value for the ChiSquared distribution with 1\n\n* **Cramer-Von-Mises test** :\n\n  * This is goodness-of-fit test which uses the summed squared differences between the sample of data, and the expected cumulative distribution function\n\n  * First, a window of data is collected, then mean and standard deviation is calculated\n\n  * Data is then sorted, and Z-scores are calculated by standardizing the data \n  \n  * cramerVonMises = (1/12n) + SIGMA { ((2i-1)/(2n) - phiZ)^2 }\n\n  * P-value is calculated, based on the value of cramerVonMises\n    \n* **Anderson-Darling test** :\n  \n  * This is a statistical test to check whether a given sample of data is from an empirical distribution function or not\n  \n  * In this case, we are using a normal distribution - meaning, we use this test to see how far the data departs from an ideal normal distribution\n  \n  * Compared to other tests, Anderson-Darling test gives more weight to the tails of the distribution\n  \n  * First, a window of data is collected, then mean and standard deviation is calculated\n  \n  * Data is then sorted, and Z-scores are calculated by standardizing the data\n  \n  * A^2 = -n - (1/n)* SIGMA{ (2i-1)ln(phiZ[i]) + (2(n-i)+1)ln(phZ[i]) } formula is applied, where phiZ is the cumulative distribution function for the Z-scores  \n  \n  * P-value is calculated, based on the value of A^2\n\n* **D'Agostino Pearson test** :\n\n  * With a combination of skewness and kurtosis test, D'Agostino Pearson test checks whether the shape of the window of values matches a normal distributions\n\n* **Kolmogorov-Smirnov test** :\n\n  * Lilliefors test is use to check the hypothesis of normality for the Kolmogorov-Smirnov test \n\n  * First, a window of data is collected, then mean and standard deviation is calculated\n\n  * D+ and D- are calculated by taking maximum discrepancy between the empirical distribution function and the cumulative distribution function\n\n  * K statistic is just max(D+,D-)*Sqrt(n)\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "cramer_von_mises",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "cramer_von_mises",
                                "Label": "Cramer-Von-Mises test for normality",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "d_agostino_pearson",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "d_agostino_pearson",
                                "Label": "D'Agostino Pearson test for normality",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "kolmogorov_smirnov",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "kolmogorov_smirnov",
                                "Label": "Kolmogorov-Smirnov test for normality",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 7,
                            "Position": 7,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "window_size",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "window_size",
                                "Label": "Window in which to calculate. Window represents number of seconds",
                                "Default": "100",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "jarque_bera",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "jarque_bera",
                                "Label": "Jarque-Bera test for normality",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "anderson_darling",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "anderson_darling",
                                "Label": "Anderson-Darling test for normality",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "ImagePreview",
                "Group": "",
                "Description": "\n# Image processor\n\n* Shows image preview\n  * **property** specifies name of payload's field which contain image data\n  * **name** specifies label of the image\n  * **width** specifies width of the image, height will be calculated automatically maintaining aspect ratio\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOnly",
                "Features": [],
                "Properties": [
                    {
                        "Key": "image_name",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "image_name",
                                "Label": "Name of an image",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "image_property_name",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "image_property_name",
                                "Label": "Name of the field with image data",
                                "Default": "value",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": true,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "image_width_name",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "image_width_name",
                                "Label": "Width of an image",
                                "Default": "500",
                                "Type": "int",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "AI",
                "Group": "Functions",
                "Description": "\n# AI Processor\n\n* **AI Model** must be set to define the unique name identifier for the model being used.\n\n* **System Prompt** parameter allows users to provide a predefined instruction that influences the AI’s behavior and response style.\n    * This can be used to enforce a specific tone, persona, or domain expertise in responses.\n\n* **Temperature** parameter (default **1.0**) controls the randomness of responses.\n    * Lower values (e.g., **0.2**) make the AI more focused and deterministic.\n    * Higher values (e.g., **1.8**) increase creativity but may reduce consistency.\n\n* **Max Completion Tokens** parameter limits the maximum number of tokens the AI can generate in a single response.\n    * This ensures output length remains within expected boundaries.\n    * If not set, the model’s default value will be used.\n\n* **Force Response Format to JSON?** parameter determines whether the AI should strictly return responses in JSON format.\n    * If **enabled**, all responses will be structured as valid JSON\n    * Important: when using JSON mode, you must also instruct the model to produce JSON yourself via a system or user message\n    * If **disabled**, responses will follow the model's default output style\n\n* **HTTP Timeout** parameter sets the maximum time (in seconds) the system will wait for a response from the AI.\n    * If the AI does not respond within this time, the request will timeout and ignored\n    * This prevents excessive delays in cases of high latency.\n",
                "ShortDescription": "AI Processor for multiple type of models",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "force_response_format_to_JSON?",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "force_response_format_to_JSON?",
                                "Label": "Important: when using JSON mode, you must also instruct the model to produce JSON yourself via a system or user message",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds in which to push values. Zero disables this timer",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 8,
                            "Position": 8,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "ai_model",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "ai_model",
                                "Label": "Unique AI Model Name",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "HTTP_timeout",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "HTTP_timeout",
                                "Label": "HTTP timeout interval in seconds",
                                "Default": "10",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "system_prompt",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "system_prompt",
                                "Label": "System Prompt used for the AI model",
                                "Default": "System Prompt used in the AI model\n\n Example: You are a JSON analyser. Analyze the input and act as a CNC expert who gives a response based on it",
                                "Type": "script",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "temperature",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "temperature",
                                "Label": "AI model temperature. Float value between 0 and 2",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "max_completion_tokens",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "max_completion_tokens",
                                "Label": "Maximum completion tokens",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Inputs Minimum",
                "Group": "",
                "Description": "\n# Inputs Minimum\n\n* This KPI calculates the minimum value from the given inputs\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "processing_type",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "processing_type",
                                "Label": "Data type of the value being processed",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": [
                                    "float",
                                    "signed",
                                    "unsigned"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "field_name",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "field_name",
                                "Label": "Usually left unchanged. Use it if incoming is message type, and/or non-default \"value\" field name",
                                "Default": "value",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Online and Offline",
                "Group": "KPI",
                "Description": "\n# Online and Offline KPI\n\n* If you do not care for how long the sensor has been ON for, but care for how long was it functional, Online/Offline is a raw number to have more detailed knowledge of the time\n\n    e.g this week, the sensor was functional for 150 hours, offline for 18 hours\n    (or) Offline time was 5 minutes out of a total of 60 minutes\n\n* If you enable the \"resetOnStatus\" parameter, this KPI will only show how long the device has been ON, or how long it has been OFF, and will reset every time the status changes from ON or OFF\n\n* The **timer interval** parameter is useful if the connected input tag is offline, but you still want this KPI to \"look\" for a value every few seconds, defined by the aforementioned timer\n\n  * If you know your tag is going to reliably publish at the expected interval, it is better to disable this timer by entering **0** in the field\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds in which to push values. Zero disables this timer",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "device_reset",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "device_reset",
                                "Label": "Reset everything when device changes?",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "reset_on_status_change",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "reset_on_status_change",
                                "Label": "Reset online and offline parameters on change in success? e.g reset online time to 0 when tag offline and vice-versa",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "unit",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "unit",
                                "Label": "Display Online/Offline in Seconds, Minutes, Hours, Days or Weeks",
                                "Default": "seconds",
                                "Type": "string",
                                "EnumItems": [
                                    "seconds",
                                    "minutes",
                                    "hours",
                                    "days",
                                    "weeks"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Rise and Fall",
                "Group": "Functions",
                "Description": "\n# Rise and Fall\n\n* **Rise** : Once you enter a lower threshold and an upper threshold, this function will show you the timestamp at which the current value starts to rise from the lower threshold\n\n* **Fall** : Once you enter a lower threshold and an upper threshold, this function will show you the timestamp at which the current value starts to fall from the upper threshold\n\n* Also provides rise time and fall time in seconds\n",
                "ShortDescription": "Ratio of uptime and total time",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "tolerance",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "tolerance",
                                "Label": "Any changes under this tolerance will be ignored",
                                "Default": "0",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "kpi",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "kpi",
                                "Label": "Rise or Fall, or both?",
                                "Default": "rise",
                                "Type": "string",
                                "EnumItems": [
                                    "rise",
                                    "fall",
                                    "riseAndFall"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "upper",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "upper",
                                "Label": "Upper Threshold",
                                "Default": "80",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "lower",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "lower",
                                "Label": "Lower Threshold",
                                "Default": "30",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "DataHub Publish",
                "Group": "",
                "Description": "\n# DataHub streaming output processor \n\n* Supports Event wire types.\n\n* Single Topic Option:\n\n\t* By default this option is enabled\n\n\t* If disabled, the DataHub Publish processor will publish the data to **Topic defined in processor.ProcessorUUID**\n\n* Static Topic publishing:\n\n\t* Simply define your static topic in the Topic field\n\n\t* All payload that flow into the DataHub Publish processor will be published to the static defined topic\n\n* Dynamic Topic publishing:\n\n\t* Users have the option to define a dynamic topic expression to define the topic the incoming data will be published to.\n\n\t* Dynamic Topic option should be enabled\n\n\t* Dynamic Topic Expression\n\n\t\t* An expression will consist of static strings (wrapped in “”), dynamic fields from input and plus sign  (+)\n\n\t\t\t* Plus sign is used to concatenate the static and dynamic fields together\n\n\t\t* When defining the dynamic part of the expression, defining the wire name is required with an underscore between the wirename and input field name \n\t\t\t\n\t\t\t**wirename_fieldname** i.e:**AA_tagName**\n\n\t* Example:\n\t\t\n\t\t* I have a payload that is being generated in Analytics, where deviceName, tagName, Plant and Area are dynamic fields that change based on logic defined in my Analytics flow \n\t\t\t**{\n\t\t\t   \"datatype\":\"float64\",\n\t\t\t   \"deviceName\":\"Gen\",   // dynamic field\n\t\t\t   \"success\":true,\n\t\t\t   \"tagName\":\"tag2\",     // dynamic field\n\t\t\t   \"timestamp\":1739558895577,   \n\t\t\t   \"value\":-1.8813568907902232,  /dynamic value\n\t\t\t   \"Plant\": \"P1\",  // dynamic field\n\t\t\t   \"Area\": \"A1\"    // dynamic field\n\t\t\t   \"Topic\": \"LE_topic.P1.A1.Gen.tag2\"\n\t\t\t}**\n\t\n\t\t* If I want to publish this dynamic data to the following topic structure: **LE_03.<Plant>.<Area>.<deviceName>.<tagName>**  I simply need to define the following:\n\t\n\t\t\t* Define an Event wire with a name i.e **AA**\n\t\n\t\t\t* In the DataHub Publish Topic field: **“LE_03.” + AA_Plant + “.” + AA_Area + “.” + AA_deviceName + “.” + AA_tagName**\n\t\n\t\t\t\t* **“LE_03”**: static part of my topic structure\n\t\n\t\t\t\t* **AA_Plant, AA_Area, AA_deviceName, AA_tagName**: are all key names present in my input payload\n\t\n\t\t\t\t* **“.”**: is also static and is used to adhere to Litmus Edge dot notation topic structure and allow for wildcarding\n\t\n\t\t\t* Alternatively, a user can also create the entire topic structure for Analytics flow and just pass a single <wirename>_<fieldname> as the Dynamic Topic expression. In this case using Tengo, Javascript or other logic processors in Analytics. I can create my topic and add it as part of my payload\n\t\n\t\t\t\t* Since my input payload has my entire dynamic topic structure, in the DataHub Publish. Simply just define AA_Topic for your dynamic publishing\n\t\t\t\t\n\t\t\t\t**\"Topic\": \"LE_topic.P1.A1.Gen.tag2\"**\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOnly",
                "Features": [],
                "Properties": [
                    {
                        "Key": "topic",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "topic",
                                "Label": "Topic name for DataHub publish",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "single_topic",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "single_topic",
                                "Label": "If true just use output topic. If false add `x.${processorID}` to topic",
                                "Default": "true",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "dynamic_topic",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "dynamic_topic",
                                "Label": "If true treats topic string as an expression and evaluates it before publish",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Generator",
                "Group": "",
                "Description": "Simple generator for testing, use t as the variable",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "outputOnly",
                "Features": [],
                "Properties": [
                    {
                        "Key": "strength",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "strength",
                                "Label": "Strength of simulated wave approximation - max is 10",
                                "Default": "10",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "periodicity",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "periodicity",
                                "Label": "Periodicity of signal in seconds",
                                "Default": "30",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "amplitude_multiplier",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "amplitude_multiplier",
                                "Label": "Amplitude multiplier",
                                "Default": "1",
                                "Type": "float",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "generatorType",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "generatorType",
                                "Label": "User defined signal generation or pre-defined generation",
                                "Default": "User Defined",
                                "Type": "string",
                                "EnumItems": [
                                    "User Defined",
                                    "Triangle Wave",
                                    "Square Wave",
                                    "Semi Circle Wave",
                                    "Sawtooth Wave",
                                    "Reverse Sawtooth Wave",
                                    "Anomalies by dips only",
                                    "Anomalies by spikes only",
                                    "Anomalies by spikes and dips",
                                    "Anomalies with gaps in data",
                                    "Anomalies with non-changing data"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timerInterval",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timerInterval",
                                "Label": "Timer in milliseconds. If no event, use this timer to keep displaying the output continually. Enter zero to disable",
                                "Default": "1000",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "formula",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "formula",
                                "Label": "Supported math functions: sin, cos, tan, power, sqrt, log, exp, abs",
                                "Default": "sin(t)",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Tengo script processor",
                "Group": "Functions",
                "Description": "\n# Scripting for data manipulations\n\n* This processor uses Tengo scripting, with its rules similar to GoLang\n\n* **Simple Use case**: The output you receive from DeviceHub message or from Analytics, might not be helpful, and you want to change the name of a field within that message\n\n  * *e.g* Instead of \"value\" you want your data to show \"furnace pressure\"\n\n  * *e.g* Instead of having all fields of the message, you only want to have \"success\", \"deviceId\" and \"value\" and skip everything else\n\n  * *e.g* You want to add a custom field to the message, based on the \"value\" field, such as: if value = 2, \"error\": \"overheating\"\n\n  * *e.g* You only want to change the timestamp to human readable format instead of Unix timestamp, but keep otherwise keep the message as-it-is\n\n  * In general, if you want to add, remove or modify *ANY* field in the input, this scripting processor is very useful\n\n* **Single Input:** Every message from the input, is stored as an array called \"values\"\n\n  * Using \"for i, message in values{}\" statement, allows to access this input and manipulate it\n\n  * Here \"i\" represents what is the *definition* defined in the connection wire, more useful for multi-inputs, to identify and distinguish between each inputs, so for single input, \"i\" can be replaced with \"_\"\n\n  * \"message\" contains the entire message in the input, and you can perform your manipulations to this \"message\" parameter\n\n  * **Note:** \"i\" and \"message\" can be any custom variable name\n\n* **Multiple Input:** Suppose you have 3 different inputs attached to this scripting processor, with the connecting wires named A, B and C\n\n  * \"for i, message in values{}\" will now have 3 inputs\n\n  * \"i\" represents from which connection wire is the input coming from\n\n  * with if-else statements, every input can be manipulated in isolation, or a common manipulation can be applied to all inputs\n\n  * You can choose to output \"result\" only for one input, or all of the inputs\n\n* **Miscellaneous information:** \n\n  * [Available Standard Library](https://github.com/d5/tengo/blob/master/docs/stdlib.md)\n\n  * [Syntax details Github:](https://github.com/d5/tengo) or [Official site](https://tengolang.com)\n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "timeout",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timeout",
                                "Label": "timeout in ms",
                                "Default": "1000",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "script",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "script",
                                "Label": "Script body",
                                "Default": "// Single input example\n\nresult := 0\n\nfor _, message in values{\n  \n  message[\"customField\"] = float(message[\"value\"]) * 100\n  \n  result = {\n    \"timestamp\": message[\"timestamp\"],\n    \"value100\": message[\"customField\"],\n    \"success\": message[\"success\"]\n  }\n}\n\n/*\n\n// Multiple inputs example\n\nresult:= 0\n\nfor i, message in values{\n  \n  if i == \"A\"{\n    message[\"customField\"] = float(message[\"value\"]) * 10\n  }\n  if i == \"B\"{\n    message[\"customField\"] = float(message[\"value\"]) * 100\n  }\n  if i == \"C\"{\n    message[\"customField\"] = float(message[\"value\"]) * 0.01\n  }\n  \n  result = {\n    \"timestamp\" : values[i][\"timestamp\"],\n    \"value\" : values[i][\"value\"],\n    \"customized_value\": message[\"customField\"], \n    \"input_source: \": i,\n    \"success\": message[\"success\"]\n  }\n}\n*/\n",
                                "Type": "script",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "Join Processor",
                "Group": "",
                "Description": "\n# Join processor by Fields\n\n* Output mode\n  \n  * Two options available here are *map* and *array* form\n\n  * **Map** option is better if standard JSON format is needed (eg. for DataBase output)\n\n  * **Array** option is better if all values are needed in an array format\n\n* Map Field Prefix\n\n  * This field can remain empty, but you can add a prefix if you want, in front of the output fields when they are combined\n\n* Array Sort Order\n\n  * In array mode, you can chose to arrange field values in either Ascending and Descending order\n\n* Input Source\n\n  * What to show as the input source? Device Name, or the connecting wire definition name?\n\n  * If Device Name is chosen, it is *required* to have \"deviceName\" and \"tagName\" field in the input\n",
                "ShortDescription": "Join values in array",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [],
                "Properties": [
                    {
                        "Key": "input_source",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "input_source",
                                "Label": "What to show as the input source?",
                                "Default": "wire connection name",
                                "Type": "string",
                                "EnumItems": [
                                    "device name",
                                    "wire connection name"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "pass_through_value",
                        "Value": {
                            "TabOrder": 9,
                            "Position": 9,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "pass_through_value",
                                "Label": "By enabling this flag input will be joined with output of processor",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": true,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "map_field_prefix",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "map_field_prefix",
                                "Label": "Any prefix for the map field?",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "array_sort_order",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "array_sort_order",
                                "Label": "Sort array in ascending order or descending?",
                                "Default": "asc",
                                "Type": "string",
                                "EnumItems": [
                                    "asc",
                                    "desc"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "output_mode",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "output_mode",
                                "Label": "Output format",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": [
                                    "map",
                                    "array"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "array_sort_by",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "array_sort_by",
                                "Label": "",
                                "Default": "time",
                                "Type": "string",
                                "EnumItems": [
                                    "tag",
                                    "definition",
                                    "id",
                                    "time"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timestampOrder",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timestampOrder",
                                "Label": "Take timestamp in which order?",
                                "Default": "last",
                                "Type": "string",
                                "EnumItems": [
                                    "last",
                                    "first",
                                    "avg"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "field",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "field",
                                "Label": "Which field to join?",
                                "Default": "value",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "attach_devices",
                        "Value": {
                            "TabOrder": null,
                            "Position": null,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "attach_devices",
                                "Label": "Aggregate devices in output?",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            },
            {
                "Name": "FileReader",
                "Group": "",
                "Description": "\n# File Reading Processor\n\n* Reads a file and passes it as a string  in the **\"value\"** field of the output payload\n\n* If the  ***File Name*** field is empty, this processor will attempt to get filename from incoming payload field **\"filename\"**\n  * Otherwise, the filename entered here field will be honored\n\n* If the **\"Generate Filename From Expression\"** option is enabled, the filename will be evaluated as expression.\n  * For example, if you want to get the filename from \"path\" and name\" properties of incoming connection \"AAA\", your expression could be:\n\t**AAA_path + AAA_name + \".txt\"**\n  * Please note that static text in expressions should be put into quotes \n\n* Time interval, in seconds, allows a file to be re-read even if the file is unmodified\n  * Typically, an input message triggers a file read, if the file is unmodified since the last read\n  * The specified time interval resets the “unmodified” status, so that the file can be read at the next input trigger\n  * Any change of the processor’s setting also resets the \"unmodified\" status\n  * Setting **0** means that the “unmodified” status is never reset, and the file is only read if modified\n\n* **\"File Size Limit\"**: If the file/s is bigger than the specified amount of megabytes, reading action on that file/s will be skipped\n  * ***Caution!*** If this limit is set to **0**, files of all sizes will be read, but it can potentially lead to overuse of CPU, memory and storage space\n\n* If ***\"Input File Type\"*** is set to **value only** processor will set incoming data to  **\"value\"\"** payload field.\n* If ***\"Input File Type\"*** is set to **CSV** following options will affect input: \n  * **CSV Comma** contains CSV-file delimiter (only first character will be used from string entered)\n  * **CSV Columns Mode** controls how processor will determine data column names. \n\t* If this option is set to \"indexed\" mode processor will assume CSV file doesnt have header and will generate payload field names as \"FieldXXX\"  \n\t* If this option is set to \"from header\" mode processor will get payload field names from CSV file header\n    * If this option is set to \"custom\" mode processor will get payload field names **CSV Custom Columns** string \n* **\"Data Output Mode\"**: specifies whether data from file would be sent in one message on record-by-record.\n\t* *** Please note: ** **a message per record** data output mode is not supported for binary or JSON files \n",
                "ShortDescription": "",
                "RequiredDefinitions": [],
                "ConnectDirection": "inputOutput",
                "Features": [
                    "Invoke"
                ],
                "Properties": [
                    {
                        "Key": "file_name",
                        "Value": {
                            "TabOrder": 0,
                            "Position": 0,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "file_name",
                                "Label": "Name of a file to read. If not absolute it will be relative to working directory of analytics2 process",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "generate_filename_from_expression",
                        "Value": {
                            "TabOrder": 1,
                            "Position": 1,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "generate_filename_from_expression",
                                "Label": "Generates name of a file to write from filename expression.",
                                "Default": "false",
                                "Type": "bool",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "file_size_limit_in_mb",
                        "Value": {
                            "TabOrder": 3,
                            "Position": 3,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "file_size_limit_in_mb",
                                "Label": "Files which size (in megabytes) is greater than this value will not be read. 0 - no limitations",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "timer_interval_in_seconds",
                        "Value": {
                            "TabOrder": 4,
                            "Position": 4,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "timer_interval_in_seconds",
                                "Label": "Period of time in seconds between generation of a new filename.",
                                "Default": "0",
                                "Type": "uint",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "data_output_mode",
                        "Value": {
                            "TabOrder": 5,
                            "Position": 5,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "data_output_mode",
                                "Label": "Data output mode",
                                "Default": "a single message",
                                "Type": "string",
                                "EnumItems": [
                                    "a single message",
                                    "a message per record"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "csv_columns_mode",
                        "Value": {
                            "TabOrder": 7,
                            "Position": 7,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "csv_columns_mode",
                                "Label": "column names output",
                                "Default": "from header",
                                "Type": "string",
                                "EnumItems": [
                                    "generated as 'columnXX'",
                                    "from header",
                                    "custom (header exist)",
                                    "custom (no header)"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "csv_custom_columns",
                        "Value": {
                            "TabOrder": 8,
                            "Position": 8,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "csv_custom_columns",
                                "Label": "input column names",
                                "Default": "",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "input_file_type",
                        "Value": {
                            "TabOrder": 2,
                            "Position": 2,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "input_file_type",
                                "Label": "File type",
                                "Default": "JSON",
                                "Type": "string",
                                "EnumItems": [
                                    "JSON",
                                    "CSV",
                                    "value only",
                                    "Parquet",
                                    "Binary"
                                ],
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    },
                    {
                        "Key": "csv_comma",
                        "Value": {
                            "TabOrder": 6,
                            "Position": 6,
                            "LinkedFieldName": null,
                            "LinkedValues": null,
                            "Item": {
                                "Name": "csv_comma",
                                "Label": "CSV delimiter (one character)",
                                "Default": ",",
                                "Type": "string",
                                "EnumItems": null,
                                "DisplayLabel": true,
                                "FromNewLine": false,
                                "IsValueRequired": false,
                                "IsPassword": false,
                                "TextType": ""
                            },
                            "Validators": null,
                            "TableColumns": null,
                            "Rules": null,
                            "LinkedFields": null
                        }
                    }
                ]
            }
        ]
    }
}

Get Processor Last Error

POST {{edgeUrl}}/analytics/v3

Get Processor Last Error

Returns the most recent error reported by a specific processor instance. Use this to surface failures inline in a UI (e.g. show a red dot on the node with a tooltip carrying Error).

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetProcessorInstanceLastError($input: String!) {
  GetProcessorInstanceLastError(input: $input) {
    Timestamp
    Error
  }
}

Variables

Field Type Required Description
input String! Yes Processor UUID.
{ "input": "{{analytics_single_processor_id}}" }

Response

200 OK -- application/json

Field Type Description
data.GetProcessorInstanceLastError.Timestamp Time ISO 8601 timestamp of the most recent error (or last status update).
data.GetProcessorInstanceLastError.Error String Error message. Empty string if the processor is healthy.
{
  "data": {
    "GetProcessorInstanceLastError": {
      "Timestamp": "2025-09-11T20:07:37Z",
      "Error": ""
    }
  }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetProcessorInstanceLastError ($input: String!) {
    GetProcessorInstanceLastError(input: $input) {
        Timestamp
        Error
    }
}

Variables

{
    "input": "{{analytics_single_processor_id}}"
}

Response

Status: 200 OK

{
    "data": {
        "GetProcessorInstanceLastError": {
            "Timestamp": "2025-09-11T20:07:37Z",
            "Error": ""
        }
    }
}

Get Processor Last Value

POST {{edgeUrl}}/analytics/v3

Get Processor Last Value

Returns the most recent output value of a processor instance. Useful as a poll-based alternative to Subscribe to Processor Output when you only need a snapshot.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetProcessorInstanceLastValue($input: String!) {
  GetProcessorInstanceLastValue(input: $input) {
    Timestamp
    Value
  }
}

Variables

Field Type Required Description
input String! Yes Processor UUID.
{ "input": "{{analytics_single_processor_id}}" }

Response

200 OK -- application/json

Field Type Description
data.GetProcessorInstanceLastValue.Timestamp Time When the value was emitted.
data.GetProcessorInstanceLastValue.Value JSON The output payload itself. Shape depends on the processor's function.
{
  "data": {
    "GetProcessorInstanceLastValue": {
      "Timestamp": "2025-09-11T20:10:23Z",
      "Value": {
        "success": true,
        "timestamp": 1757621422846,
        "value": 0.8135667470259184
      }
    }
  }
}

A null Value means the processor has not emitted yet since the Analytics service started.

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetProcessorInstanceLastValue($input: String!) {
    GetProcessorInstanceLastValue(input: $input) {
        Timestamp
        Value
    }
}

Variables

{
    "input": "{{analytics_single_processor_id}}"
}

Response

Status: 200 OK

{
    "data": {
        "GetProcessorInstanceLastValue": {
            "Timestamp": "2025-09-11T20:10:23Z",
            "Value": {
                "success": true,
                "timestamp": 1757621422846,
                "value": 0.8135667470259184
            }
        }
    }
}

Delete Processors

POST {{edgeUrl}}/analytics/v3

Delete Processors

Deletes one or more processor instances. The mutation is bulk by design -- pass any number of UUIDs in the array. Processors are removed along with their wires (the wires they were on are simply detached on the surviving sides).

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation DeleteProcessorInstances($input: [String!]) {
  DeleteProcessorInstances(input: $input)
}

Variables

Field Type Required Description
input [String!] Yes UUIDs of processors to delete.
{
  "input": [
    "{{analytics_single_processor_id}}",
    "{{analytics_single_processor_id_another}}"
  ]
}

Response

200 OK -- application/json. No data returned on success.

{ "data": { "DeleteProcessorInstances": null } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation DeleteProcessorInstances($input: [String!]) {
    DeleteProcessorInstances(input: $input)
}

Variables

{
    "input": [
        "{{analytics_single_processor_id}}",
        "{{analytics_single_processor_id_another}}"
    ]
}

Response

Status: 200 OK

{
    "data": {
        "DeleteProcessorInstances": null
    }
}

Delete Processor

POST {{edgeUrl}}/analytics/v3

Delete Processor

Deletes a single processor instance by ID. Use Delete Processors to delete several in one call, and DeleteAllProcessorInstances to clear every processor on the device.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation DeleteProcessorInstance($input: String!) {
  DeleteProcessorInstance(input: $input)
}

Variables

Field Type Required Description
input String! Yes UUID of the processor to delete, as returned by Create New Processor or Get Processor Instances.
{ "input": "{{analytics_single_processor_id}}" }

Response

200 OK -- application/json. No data is returned on success; the processor no longer appears in Get Processor Instances, and Get Processor Instance for its ID reports it as not found.

{ "data": { "DeleteProcessorInstance": null } }

Errors

GraphQL errors come back with 200 OK and an errors array, so check the body, not the status code.

errors[].message When it happens
processor with id [...] not found Unknown ID, or the processor was already deleted. The ID in the message is printed as a byte array, not as a UUID.
uuid: incorrect UUID length 0 in string "" input is not a UUID (here, an empty string).

Deleting is not idempotent: a second call with the same ID returns the not-found error.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation DeleteProcessorInstance($input: String!) {
    DeleteProcessorInstance(input: $input)
}

Variables

{
    "input": "{{analytics_single_processor_id}}"
}

Response

Status: 200 OK

{
    "data": {
        "DeleteProcessorInstance": null
    }
}

Get All Topics

POST {{edgeUrl}}/analytics/v3

Get All Topics

Returns every topic the device knows about: device tag aliases, analytics outputs, integration bridges, etc. Use this for cross-group topic discovery (e.g. selecting an upstream DeviceHub topic to subscribe a processor to).

For the group-scoped, paginated, pattern-filtered variant, see Get Topics in Group.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetTopics {
  GetTopics {
    Topic
    Format
    Direction
  }
}

No arguments.

Response

200 OK -- application/json

Field Type Description
data.GetTopics [Topic!]! All topics on the device.
data.GetTopics[].Topic String Topic name (e.g. devicehub.alias.P1_L1_Machine3_1_S7.CycleTime_Base).
data.GetTopics[].Format String Payload format (json, binary, ...).
data.GetTopics[].Direction String input (the device subscribes), output (the device publishes), or both.
{
  "data": {
    "GetTopics": [
      {
        "Topic": "devicehub.alias.P1_L1_Machine3_1_S7.CycleTime_Base",
        "Format": "json",
        "Direction": "output"
      }
    ]
  }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetTopics {
    GetTopics {
        Topic
        Format
        Direction
    }
}

Response

Status: 200 OK

{
    "data": {
        "GetTopics": [
            {
                "Topic": "devicehub.alias.P1_L1_Machine3_1_S7.CycleTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine3_1_S7.BadPart",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine2_1_MB.TaktTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L1_Machine2_1_MB.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine1_1_OPC.BadPart",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "analytics.publish.u6PLGF3J1D-C_PQXmJC9Y",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L1_Machine1_1_OPC.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine2_1_MB.PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine1_1_OPC.CycleTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "${hello}",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L1_Machine2_1_MB.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine1_1_OPC.TaktTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine3_1_S7.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine1_1_OPC.BadPart",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine3_1_S7.BadPart",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine1_1_OPC.PartMade",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine3_1_S7.CycleTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L3_Machine2_1_MB.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine1_1_OPC.PartMade",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine3_1_S7.PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine3_1_S7.PartMade",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine3_1_S7.TaktTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine2_1_MB.PartMade",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine2_1_MB.PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L2_Machine2_1_MB.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine3_1_S7.PartMade",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine2_1_MB.CycleTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine3_1_S7.FaultCode_Min_Value",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine2_1_MB.BadPart",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L3_Machine1_1_OPC.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine1_1_OPC.BadPart",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine2_1_MB.PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L2_Machine3_1_S7.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine2_1_MB.CycleTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L2_Machine1_1_OPC.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine1_1_OPC.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine1_1_OPC.PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine1_1_OPC.PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine1_1_OPC.CycleTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L4_Machine3_1_S7.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "P1_EnergyMonitoring",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine2_1_MB.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine1_1_OPC.Speed",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine2_1_MB.CycleTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine3_1_S7.PartMade",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine1_1_OPC.PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine3_1_S7.PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L3_Machine1_1_OPC.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine2_1_MB.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine1_1_OPC.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "downtimeHistoryRecord",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L3_Machine3_1_S7.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine3_1_S7.CycleTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine2_1_MB.BadPart",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine1_1_OPC.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine3_1_S7.TaktTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L1_Machine1_1_OPC.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine1_1_OPC.TaktTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine3_1_S7.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine1_1_OPC.PartMade",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine3_1_S7.PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine2_1_MB.TaktTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine3_1_S7.CycleTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L2_Machine1_1_OPC.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine3_1_S7.PartMade",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine3_1_S7.TaktTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L4_Machine2_1_MB.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine1_1_OPC.CycleTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine3_1_S7.BadPart",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine2_1_MB.CycleTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L4_Machine3_1_S7.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine1_1_OPC.CycleTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine3_1_S7.TaktTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L1_Machine3_1_S7.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L1_Machine3_1_S7.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine3_1_S7.Speed",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine2_1_MB.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine1_1_OPC.BadPart",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L4_Machine1_1_OPC.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine2_1_MB.BadPart",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine2_1_MB.TaktTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L4_Machine2_1_MB.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L2_Machine2_1_MB.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine1_1_OPC.PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L3_Machine3_1_S7.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine2_1_MB.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine3_1_S7.PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine2_1_MB.PartMade",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "scrapHistoryRecord",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L3_Machine2_1_MB.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine3_1_S7.BadPart",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine1_1_OPC.TaktTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine2_1_MB.PartMade",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine1_1_OPC.PartMade",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine3_1_S7.PartMade",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine2_1_MB.PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L4_Machine1_1_OPC.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine3_1_S7.Objects_Tags_PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "P2_EnergyMonitoring",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine3_1_S7.PartSize_TestResult",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine2_1_MB.PartMade",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine1_1_OPC.TaktTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L2_Machine3_1_S7.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L1_Machine3_1_S7.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine2_1_MB.BadPart",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P2_L2_Machine3_1_S7.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine1_1_OPC.isRunning",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L2_Machine2_1_MB.TaktTime_Base",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.P1_L1_Machine1_1_OPC.isRunning1",
                "Format": "json",
                "Direction": "output"
            },
            {
                "Topic": "devicehub.alias.L4_Machine3_1_S7.isRunning",
                "Format": "json",
                "Direction": "output"
            }
        ]
    }
}

Subscribe to Processor Output

POST {{edgeUrl}}/analytics/v3

Subscribe to Processor Output (subscription)

Streams the live output of a single processor as it emits. This is a GraphQL subscription -- a plain POST returns at most one event. For continuous streaming, use a WebSocket transport (graphql-ws / subscriptions-transport-ws) or Server-Sent Events.

Transport

WebSocket: wss://{{edgeHost}}/analytics/v3.

The Postman item is shown as POST for documentation purposes; switch to a Postman WebSocket request when streaming.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Subscription body

subscription SubscribeToProcessorInstanceOutput($input: String!) {
  SubscribeToProcessorInstanceOutput(input: $input)
}

Variables

Field Type Required Description
input String! Yes Processor UUID to subscribe to.
{ "input": "{{analytics_single_processor_id}}" }

Event shape

Each event is a JSON document (the processor's emitted payload) wrapped in the standard GraphQL data envelope. The payload may be a serialized string (as in the example) or an object, depending on the processor's output format.

{
  "data": {
    "SubscribeToProcessorInstanceOutput": "{\"success\":true,\"timestamp\":1757621792847,\"value\":-0.7678533456077484}"
  }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

Subscription notes

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

subscription SubscribeToProcessorInstanceOutput($input: String!) {
    SubscribeToProcessorInstanceOutput(input: $input)
}

Variables

{
    "input": "{{analytics_single_processor_id}}"
}

Response

Status: 200 OK

{
    "data": {
        "SubscribeToProcessorInstanceOutput": "{\"success\":true,\"timestamp\":1757621792847,\"value\":-0.7678533456077484}"
    }
}

Create New Processor

POST {{edgeUrl}}/analytics/v3

Updated in 4.1.x. GroupName is now optional; use WorkspaceID.

Request Body

GraphQL Query

mutation CreateProcessorInstance($input: CreateProcessorInstanceRequest!) {
    CreateProcessorInstance(input: $input) {
        ID Name Function Active Outputs ValueInputs EventInputs Parameters { Key Value } Definitions { Key Value }
    }
}

Variables

{
  "input": {
    "WorkspaceID": "{{analytics_workspace_id}}",
    "Name": "API - created Processor",
    "Function": "Generator",
    "Active": true,
    "Outputs": [],
    "ValueInputs": [],
    "EventInputs": [],
    "Parameters": [],
    "Definitions": []
  }
}

Response

Status: 200 OK

{
    "data": {
        "CreateProcessorInstance": {
            "ID": "DA2A2F9D-EE20-415D-AF7F-C30E6FDE0F83",
            "Name": "API - created Processor",
            "Function": "Generator",
            "Definitions": [],
            "ValueInputs": [],
            "EventInputs": [],
            "Parameters": [
                {
                    "Key": "amplitude_multiplier",
                    "Value": "1"
                },
                {
                    "Key": "generatorType",
                    "Value": "User Defined"
                },
                {
                    "Key": "timerInterval",
                    "Value": "1000"
                },
                {
                    "Key": "formula",
                    "Value": "sin(t)"
                },
                {
                    "Key": "strength",
                    "Value": "10"
                },
                {
                    "Key": "periodicity",
                    "Value": "30"
                }
            ],
            "Active": true,
            "Outputs": []
        }
    }
}

Validate Processor Script

POST {{edgeUrl}}/analytics/v3

Validate Processor Script

Changed in 4.1.x. The pre-release TestProcessorScript mutation shipped as the ValidateProcessorScript query. It dry-runs a processor script (e.g. JSONata) without creating or modifying any processor instance. The 4.0.x-era Parameters input was removed; scripts now reference Component Variables instead.

Request body (GraphQL)

query ValidateProcessorScript($input: ValidateProcessorScriptRequest!) {
    ValidateProcessorScript(input: $input) {
        IsValid
        Error
    }
}

Arguments

Argument GraphQL type Required Description
input.ProcessorType ProcessorType! (enum) Yes One of jsonata, javascript, tengo.
input.Script String! Yes The script body to validate.

Request Body

GraphQL Query

query ValidateProcessorScript($input: ValidateProcessorScriptRequest!) {
    ValidateProcessorScript(input: $input) {
        IsValid
        Error
    }
}

Variables

{
    "input": {
        "ProcessorType": "jsonata",
        "Script": "$.value * 2"
    }
}

Import Group

POST {{edgeUrl}}/analytics/v3

Deprecated in LE 4.1.x: ImportGroup is marked deprecated in the schema (reason: "Use ImportWorkspace"). Use Workspaces > Import Workspace instead. The operation still works in 4.1.x but will be removed in a future release.

Import Group

Restores a group from an Export Group payload. The mutation accepts the target groupName (new or existing) and the serialized payload as a JSON string in data.

Importing into an existing group replaces its contents -- snapshot first via Export Group if you may want to roll back.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation ImportGroup($groupName: String!, $data: String!) {
  ImportGroup(groupName: $groupName, data: $data)
}

Variables

Field Type Required Description
groupName String! Yes Target group. Created if it does not exist; replaced if it does.
data String! Yes The ExportGroup payload, JSON-encoded as a string (escaped quotes).
{
  "groupName": "{{analytics_group_name}}",
  "data": "{\"__typename\":\"BackupItem\",\"Processors\":[ ... ]}"
}

The data string must be the full BackupItem envelope as returned by ExportGroup. Build it programmatically by stringifying the export response before sending.

Response

200 OK -- application/json. No data returned on success.

{ "data": { "ImportGroup": null } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation ImportGroup($groupName: String!, $data: String!) {
  ImportGroup(groupName: $groupName, data: $data)
}

Variables

{
  "groupName": "{{analytics_group_name}}",
  "data": "{\"__typename\":\"BackupItem\",\"Processors\":[{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"10A5AFCD-D002-4DD0-A7EE-81DBCE813937\",\"Name\":\"Database Output  - [9039]\",\"FunctionName\":\"Database Output\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"database\":\"tsdata\",\"measurement\":\"EnergyMonitoring\",\"typed\":\"autogen\"}},\"InputEvents\":[\"CA4DA5E7-5DAD-4131-A95D-1152E92197F6\"],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"13295498-20FE-465D-9E12-1491E53FB23F\",\"Name\":\"Flow  - [5701]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"1494F758-8CB6-460D-BC0F-ABFB8C6B9ACD\",\"Name\":\"Flow  - [9566]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"175D1678-DDC4-4141-890A-2AEAC9C3530A\",\"Name\":\"Flow  - [2917]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"1C589F97-66F4-43A8-BBC3-738C46F11EFD\",\"Name\":\"Flow  - [9175]\",\"FunctionName\":\"Database Output\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"database\":\"tsdata\",\"measurement\":\"EnergyMonitoring\",\"typed\":\"autogen\"}},\"InputEvents\":[\"41BE8686-B8C8-485E-9B40-76F471A63D4D\"],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"1CF6F23B-1539-49E5-9987-1B9282FC7440\",\"Name\":\"Generator  - [1096]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"1F971773-3A9F-492B-BEC9-B6BDB18CE187\",\"Name\":\"Flow  - [8290]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"30EED68F-B353-473A-9859-223BA214D4E7\",\"Name\":\"Flow  - [361]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"373EF09A-C290-413D-969C-9DB308142C6A\",\"Name\":\"Flow  - [5609]\",\"FunctionName\":\"DataHub Publish\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"dynamic_topic\":false,\"single_topic\":true,\"topic\":\"analytics.publish.u6PLGF3J1D-C_PQXmJC9Y\"}},\"InputEvents\":[\"735E383E-EF78-485F-84CB-E02F205BE98B\"],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"38687BA1-C2F2-450A-8A9C-9BF10617BADB\",\"Name\":\"DataHub Subscribe  - [5513]\",\"FunctionName\":\"DataHub Subscribe\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"ignore_failed_data\":false,\"ignore_null_value\":false,\"topic\":\"scrapHistoryRecord\"}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"7CCC34AE-6C58-4DB0-9F77-DAFDB793A3B7\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"38DD824D-5270-49E1-A45D-45C2EDF14D1D\",\"Name\":\"Flow  - [8159]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"41BE8686-B8C8-485E-9B40-76F471A63D4D\",\"Name\":\"DataHub Subscribe  - [644]\",\"FunctionName\":\"DataHub Subscribe\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"format\":\"json\",\"topic\":\"P1_EnergyMonitoring\"}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"1C589F97-66F4-43A8-BBC3-738C46F11EFD\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"421CB60D-91BA-4EB7-BD66-AA92AF498602\",\"Name\":\"Flow  - [5225]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"4507AA2F-B3A2-40CE-B2F3-8540476C60A6\",\"Name\":\"Flow  - [6256]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"4B120A78-C3D5-4FBC-B6CC-FD1FAC05F0A7\",\"Name\":\"Flow  - [9777]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"5B4DC834-C069-4340-986A-BC45957D5E07\",\"Name\":\"Database Output  - [5434]\",\"FunctionName\":\"Database Output\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"database\":\"tsdata\",\"measurement\":\"DTR\",\"typed\":\"autogen\"}},\"InputEvents\":[\"E8ED3C80-690C-4549-A509-BBEFE66F039E\"],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"658E3F0A-6762-4DC2-8820-4CAA2C4C853B\",\"Name\":\"Flow  - [9603]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"66D7C5E1-0DBB-4F15-9DB0-7ED63E4960EE\",\"Name\":\"Flow  - [8629]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"735E383E-EF78-485F-84CB-E02F205BE98B\",\"Name\":\"Flow  - [5609]\",\"FunctionName\":\"Change of Value\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"delta_of_tolerance\":0,\"map_field_name\":\"value\",\"pass_through_value\":false,\"timerInterval\":0}},\"InputEvents\":[\"97E2788B-CB2E-44CE-8312-41DD1F388286\"],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"373EF09A-C290-413D-969C-9DB308142C6A\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"7CCC34AE-6C58-4DB0-9F77-DAFDB793A3B7\",\"Name\":\"Database Output  - [8347]\",\"FunctionName\":\"Database Output\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"database\":\"tsdata\",\"measurement\":\"SR\",\"typed\":\"autogen\"}},\"InputEvents\":[\"38687BA1-C2F2-450A-8A9C-9BF10617BADB\"],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"97E2788B-CB2E-44CE-8312-41DD1F388286\",\"Name\":\"Flow  - [5609]\",\"FunctionName\":\"DataHub Subscribe\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"ignore_failed_data\":false,\"ignore_null_value\":false,\"topic\":\"${hello}\"}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"735E383E-EF78-485F-84CB-E02F205BE98B\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"B5902202-288B-46A8-A678-680CB38AECAD\",\"Name\":\"Flow  - [4167]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\",\"Name\":\"Flow  - [2801]\",\"FunctionName\":\"TensorFlow processor\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"input_operation\":\"serve_keras_tensor\",\"model_path\":\"/var/lib/loopedge-analytics2/models/shortSavedModel\",\"number_of_inputs\":19,\"output_operation\":\"StatefulPartitionedCall\",\"pass_through_value\":false,\"tags\":\"serve\",\"time_shift_ms\":0,\"window_size\":10}},\"InputEvents\":[],\"InputWaits\":[\"1CF6F23B-1539-49E5-9987-1B9282FC7440\",\"175D1678-DDC4-4141-890A-2AEAC9C3530A\",\"CB227823-3D17-47A7-A3FE-F7D885509BF7\",\"658E3F0A-6762-4DC2-8820-4CAA2C4C853B\",\"1F971773-3A9F-492B-BEC9-B6BDB18CE187\",\"30EED68F-B353-473A-9859-223BA214D4E7\",\"66D7C5E1-0DBB-4F15-9DB0-7ED63E4960EE\",\"BE9F4653-FC54-4568-AED3-4FFD26D7340E\",\"13295498-20FE-465D-9E12-1491E53FB23F\",\"4B120A78-C3D5-4FBC-B6CC-FD1FAC05F0A7\",\"4507AA2F-B3A2-40CE-B2F3-8540476C60A6\",\"BE958B8C-21FC-4317-8B79-22038AB09BB1\",\"B5902202-288B-46A8-A678-680CB38AECAD\",\"F0099E0C-8A33-4FBA-BA19-A6B328161E47\",\"38DD824D-5270-49E1-A45D-45C2EDF14D1D\",\"1494F758-8CB6-460D-BC0F-ABFB8C6B9ACD\",\"421CB60D-91BA-4EB7-BD66-AA92AF498602\",\"E39F4B2F-7395-46A0-B61A-5919F2DB3A1B\",\"E8FD1472-697F-4BDB-AC7C-D73DC5EF49BE\"],\"InputsDefinitions\":{\"0\":\"1CF6F23B-1539-49E5-9987-1B9282FC7440\",\"1\":\"175D1678-DDC4-4141-890A-2AEAC9C3530A\",\"2\":\"CB227823-3D17-47A7-A3FE-F7D885509BF7\",\"3\":\"658E3F0A-6762-4DC2-8820-4CAA2C4C853B\",\"4\":\"1F971773-3A9F-492B-BEC9-B6BDB18CE187\",\"5\":\"30EED68F-B353-473A-9859-223BA214D4E7\",\"6\":\"66D7C5E1-0DBB-4F15-9DB0-7ED63E4960EE\",\"7\":\"13295498-20FE-465D-9E12-1491E53FB23F\",\"8\":\"BE9F4653-FC54-4568-AED3-4FFD26D7340E\",\"9\":\"4B120A78-C3D5-4FBC-B6CC-FD1FAC05F0A7\",\"10\":\"4507AA2F-B3A2-40CE-B2F3-8540476C60A6\",\"11\":\"BE958B8C-21FC-4317-8B79-22038AB09BB1\",\"12\":\"B5902202-288B-46A8-A678-680CB38AECAD\",\"13\":\"F0099E0C-8A33-4FBA-BA19-A6B328161E47\",\"14\":\"38DD824D-5270-49E1-A45D-45C2EDF14D1D\",\"15\":\"1494F758-8CB6-460D-BC0F-ABFB8C6B9ACD\",\"16\":\"421CB60D-91BA-4EB7-BD66-AA92AF498602\",\"17\":\"E39F4B2F-7395-46A0-B61A-5919F2DB3A1B\",\"18\":\"E8FD1472-697F-4BDB-AC7C-D73DC5EF49BE\"},\"State\":null,\"Outputs\":[]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"BE958B8C-21FC-4317-8B79-22038AB09BB1\",\"Name\":\"Flow  - [2309]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"BE9F4653-FC54-4568-AED3-4FFD26D7340E\",\"Name\":\"Flow  - [1445]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"CA4DA5E7-5DAD-4131-A95D-1152E92197F6\",\"Name\":\"DataHub Subscribe  - [1311]\",\"FunctionName\":\"DataHub Subscribe\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"format\":\"json\",\"topic\":\"P2_EnergyMonitoring\"}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"10A5AFCD-D002-4DD0-A7EE-81DBCE813937\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"CB227823-3D17-47A7-A3FE-F7D885509BF7\",\"Name\":\"Flow  - [9035]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"DA2A2F9D-EE20-415D-AF7F-C30E6FDE0F83\",\"Name\":\"API - created Processor\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"E39F4B2F-7395-46A0-B61A-5919F2DB3A1B\",\"Name\":\"Flow  - [6474]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"E8ED3C80-690C-4549-A509-BBEFE66F039E\",\"Name\":\"DataHub Subscribe  - [7390]\",\"FunctionName\":\"DataHub Subscribe\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"ignore_failed_data\":false,\"ignore_null_value\":false,\"topic\":\"downtimeHistoryRecord\"}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"5B4DC834-C069-4340-986A-BC45957D5E07\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"E8FD1472-697F-4BDB-AC7C-D73DC5EF49BE\",\"Name\":\"Flow  - [3557]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]},{\"__typename\":\"BackupProcessorDBRecord\",\"ID\":\"F0099E0C-8A33-4FBA-BA19-A6B328161E47\",\"Name\":\"Flow  - [9312]\",\"FunctionName\":\"Generator\",\"IsActive\":true,\"Config\":{\"__typename\":\"BackupProcessorConfig\",\"settings\":{\"amplitude_multiplier\":1,\"formula\":\"sin(t)\",\"generatorType\":\"User Defined\",\"periodicity\":30,\"strength\":10,\"timerInterval\":1000}},\"InputEvents\":[],\"InputWaits\":[],\"InputsDefinitions\":{},\"State\":null,\"Outputs\":[\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\"]}],\"Positions\":[{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"10A5AFCD-D002-4DD0-A7EE-81DBCE813937\",\"Top\":16,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"13295498-20FE-465D-9E12-1491E53FB23F\",\"Top\":1489,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"1494F758-8CB6-460D-BC0F-ABFB8C6B9ACD\",\"Top\":2417,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"175D1678-DDC4-4141-890A-2AEAC9C3530A\",\"Top\":793,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"1C589F97-66F4-43A8-BBC3-738C46F11EFD\",\"Top\":125,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"1CF6F23B-1539-49E5-9987-1B9282FC7440\",\"Top\":677,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"1F971773-3A9F-492B-BEC9-B6BDB18CE187\",\"Top\":1141,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"30EED68F-B353-473A-9859-223BA214D4E7\",\"Top\":1257,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"373EF09A-C290-413D-969C-9DB308142C6A\",\"Top\":452,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"38687BA1-C2F2-450A-8A9C-9BF10617BADB\",\"Top\":241,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"38DD824D-5270-49E1-A45D-45C2EDF14D1D\",\"Top\":2301,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"41BE8686-B8C8-485E-9B40-76F471A63D4D\",\"Top\":125,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"421CB60D-91BA-4EB7-BD66-AA92AF498602\",\"Top\":2533,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"4507AA2F-B3A2-40CE-B2F3-8540476C60A6\",\"Top\":1837,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"4B120A78-C3D5-4FBC-B6CC-FD1FAC05F0A7\",\"Top\":1721,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"5B4DC834-C069-4340-986A-BC45957D5E07\",\"Top\":357,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"658E3F0A-6762-4DC2-8820-4CAA2C4C853B\",\"Top\":1025,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"66D7C5E1-0DBB-4F15-9DB0-7ED63E4960EE\",\"Top\":1373,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"735E383E-EF78-485F-84CB-E02F205BE98B\",\"Top\":452,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"7CCC34AE-6C58-4DB0-9F77-DAFDB793A3B7\",\"Top\":241,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"97E2788B-CB2E-44CE-8312-41DD1F388286\",\"Top\":452,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"B5902202-288B-46A8-A678-680CB38AECAD\",\"Top\":2069,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"BDA9466A-6A0B-4646-B9E4-63FA4C5CEB2C\",\"Top\":2177,\"Left\":697,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"BE958B8C-21FC-4317-8B79-22038AB09BB1\",\"Top\":1953,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"BE9F4653-FC54-4568-AED3-4FFD26D7340E\",\"Top\":1605,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"CA4DA5E7-5DAD-4131-A95D-1152E92197F6\",\"Top\":16,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"CB227823-3D17-47A7-A3FE-F7D885509BF7\",\"Top\":909,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"DA2A2F9D-EE20-415D-AF7F-C30E6FDE0F83\",\"Top\":0,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"E39F4B2F-7395-46A0-B61A-5919F2DB3A1B\",\"Top\":2649,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"E8ED3C80-690C-4549-A509-BBEFE66F039E\",\"Top\":357,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"E8FD1472-697F-4BDB-AC7C-D73DC5EF49BE\",\"Top\":2765,\"Left\":0,\"GroupName\":\"default\"},{\"__typename\":\"BackupProcessorPosition\",\"ID\":\"F0099E0C-8A33-4FBA-BA19-A6B328161E47\",\"Top\":2185,\"Left\":0,\"GroupName\":\"default\"}],\"Version\":\"2.0.4\",\"Git\":\"4360afd7f3\",\"AIModels\":null,\"Variables\":null,\"Parameters\":null}"
}

Response

Status: 200 OK

{
    "data": {
        "ImportGroup": null
    }
}

Invoke Processor

POST {{edgeUrl}}/analytics/v3

Invoke Processor

Manually triggers a processor's user-action handler with a payload. Useful for processors that expose a "call me" action (e.g. an AI prompt processor, a manual override gate). Most processors are reactive and don't need this.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation InvokeProcessorInstance($input: UserActionPayloadInput!) {
  InvokeProcessorInstance(input: $input)
}

Variables (input: UserActionPayloadInput!)

Field Type Required Description
Id ID! Yes UUID of the processor.
Data JSON Yes Payload to pass to the user-action handler. Shape is function-specific.
{
  "input": {
    "Id": "{{analytics_single_processor_id}}",
    "Data": {}
  }
}

Response

200 OK -- application/json. No data returned on success (the processor's response is published to its output topic; subscribe via Subscribe to Processor Output to observe).

{ "data": { "InvokeProcessorInstance": null } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation InvokeProcessorInstance($input: UserActionPayloadInput!) {
    InvokeProcessorInstance(input: $input)
}

Variables

{
  "input": {
    "Id": "{{analytics_single_processor_id}}",
    "Data": {}
  }
}

Response

Status: 200 OK

{
    "data": {
        "InvokeProcessorInstance": null
    }
}

Update Processor

POST {{edgeUrl}}/analytics/v3

Update Processor

Updates a processor's parameters. Pass the full new Parameters array; omitted keys are reset to function defaults. To change wiring, use Connect Processor Instances / Disconnect Processors. To change the processor's Function, delete and recreate it.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation UpdateProcessorInstance($input: UpdateProcessorInstanceRequest!) {
  UpdateProcessorInstance(input: $input)
}

Variables (input: UpdateProcessorInstanceRequest!)

Field Type Required Description
Id ID! Yes UUID of the processor to update.
Parameters [KeyValueInput!]! Yes Full new parameter set.
{
  "input": {
    "Id": "{{analytics_single_processor_id}}",
    "Parameters": [
      { "Key": "inject_field",       "Value": "value" },
      { "Key": "inject_value_type",  "Value": "string" },
      { "Key": "inject_value",       "Value": "hello" }
    ]
  }
}

Response

200 OK -- application/json. No data returned on success.

{ "data": { "UpdateProcessorInstance": null } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation UpdateProcessorInstance($input: UpdateProcessorInstanceRequest!) {
    UpdateProcessorInstance(input: $input)
}

Variables

{
  "input": {
    "Id": "{{analytics_single_processor_id}}",
    "Parameters": [
      {
        "Key": "inject_field",
        "Value": "value"
      },
      {
        "Key": "inject_value_type",
        "Value": "string"
      },
      {
        "Key": "inject_value",
        "Value": "hello"
      },
      {
        "Key": "add_timestamp",
        "Value": "true"
      },
      {
        "Key": "timing_mode",
        "Value": "once"
      },
      {
        "Key": "timer_interval_type",
        "Value": "seconds"
      },
      {
        "Key": "timer_interval_value",
        "Value": "0"
      }
    ]
  }
}

Response

Status: 200 OK

{
    "data": {
        "UpdateProcessorInstance": null
    }
}

Reset Processor

POST {{edgeUrl}}/analytics/v3

Reset Processor

Resets a processor instance to its initial state. Internal buffers, windows, accumulators, and any function-specific transient state are discarded. Use to clear a Moving Average's window, drop a Generator's phase, restart an Aggregator's counter, etc.

The processor remains active -- it resumes emitting on the next input.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation ResetProcessorInstance($input: String!) {
  ResetProcessorInstance(input: $input)
}

Variables

Field Type Required Description
input String! Yes Processor UUID to reset.
{ "input": "{{analytics_single_processor_id}}" }

Response

200 OK -- application/json. No data returned on success.

{ "data": { "ResetProcessorInstance": null } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation ResetProcessorInstance($input: String!) {
    ResetProcessorInstance(input: $input)
}

Variables

{
    "input": "{{analytics_single_processor_id}}"
}

Response

Status: 200 OK

{
    "data": {
        "ResetProcessorInstance": null
    }
}

Set Processor Wire Definition

POST {{edgeUrl}}/analytics/v3

Set Processor Wire Definition

Sets the definition payload for a wire between two processors. A wire definition is a function-specific JSON blob attached to an input to describe how the upstream output should be consumed (e.g. which field to extract, which alias to apply).

Use this after Connect Processor Instances to refine the wire's behavior, or when re-binding an existing wire to a different definition.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation DefineProcessorInstanceInput($input: DefineInputRequest!) {
  DefineProcessorInstanceInput(input: $input)
}

Variables (input: DefineInputRequest!)

Field Type Required Description
Id ID! Yes Downstream processor UUID (the one receiving the wire).
InputId ID! Yes Upstream processor UUID (the one producing the value).
Definition String! Yes Function-specific wire definition payload. Format depends on the downstream processor's function.
{
  "input": {
    "Id": "{{analytics_single_processor_id}}",
    "InputId": "{{analytics_single_processor_id_another}}",
    "Definition": "{{analytics_wire_definition}}"
  }
}

Response

200 OK -- application/json. No data returned on success.

{ "data": { "DefineProcessorInstanceInput": null } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation DefineProcessorInstanceInput($input: DefineInputRequest!) {
    DefineProcessorInstanceInput(input: $input)
}

Variables

{
    "input": {
        "Id": "{{analytics_single_processor_id}}",
        "InputId": "{{analytics_single_processor_id_another}}",
        "Definition": "{{analytics_wire_definition}}"
  }
}

Response

Status: 200 OK

{
    "data": {
        "DefineProcessorInstanceInput": null
    }
}

Connect Processor Instances

POST {{edgeUrl}}/analytics/v3

Connect Processor Instances

Creates wires between processors. Same input shape as Disconnect Processors. The mutation creates the cartesian-product set of wires from Inputs (producers) to Outputs (consumers) of the specified ConnectionType.

After connecting, you can attach a definition payload to the wire via Set Processor Wire Definition.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation ConnectionRequest($input: ConnectionRequest!) {
  ConnectProcessorInstances(input: $input)
}

The GraphQL operation name (ConnectionRequest) and the field name (ConnectProcessorInstances) differ -- the operation name is local to the query document; the field name is what the server resolves.

Variables (input: ConnectionRequest!)

Field Type Required Description
Inputs [ID!]! Yes UUIDs of the UPSTREAM producers (where data comes FROM). Reversed from the field name.
Outputs [ID!]! Yes UUIDs of the DOWNSTREAM consumers (where data goes TO). Reversed from the field name.
ConnectionType String! Yes values or events (plural). A wire feeding a sink/publish must be events.
{
  "input": {
    "Inputs":  ["{{analytics_single_processor_id}}"],
    "Outputs": ["{{analytics_single_processor_id_another}}"],
    "ConnectionType": "{{analytics_connection_type}}"
  }
}

Response

200 OK -- application/json. No data returned on success.

{ "data": { "ConnectProcessorInstances": null } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation ConnectionRequest($input: ConnectionRequest!) {
    ConnectProcessorInstances(input: $input)
}

Variables

{
    "input": {
        "Inputs": ["{{analytics_single_processor_id}}"],
        "Outputs": ["{{analytics_single_processor_id_another}}"],
        "ConnectionType": "{{analytics_connection_type}}"
    }
}

Response

Status: 200 OK

{
    "data": {
        "ConnectProcessorInstances": null
    }
}

Disconnect Processors

POST {{edgeUrl}}/analytics/v3

Disconnect Processors

Removes one or more wires between processors. Specify the wire endpoints and ConnectionType. NOTE the fields are reversed: Inputs = upstream producer(s), Outputs = downstream consumer(s). ConnectionType is plural -- values or events (singular rejected).

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation DisconnectProcessorInstances($input: ConnectionRequest!) {
  DisconnectProcessorInstances(input: $input)
}

Variables (input: ConnectionRequest!)

Field Type Required Description
Inputs [ID!]! Yes UUIDs of the UPSTREAM producers (where data comes FROM). Reversed from the field name.
Outputs [ID!]! Yes UUIDs of the DOWNSTREAM consumers (where data goes TO). Reversed from the field name.
ConnectionType String! Yes values or events (plural) -- the kind of wire to remove.

The mutation removes the cartesian-product set of wires (Outputs x Inputs of type ConnectionType).

{
  "input": {
    "Inputs":  ["{{analytics_single_processor_id}}"],
    "Outputs": ["{{analytics_single_processor_id_another}}"],
    "ConnectionType": "{{analytics_connection_type}}"
  }
}

Response

200 OK -- application/json. No data returned on success.

{ "data": { "DisconnectProcessorInstances": null } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation DisconnectProcessorInstances($input: ConnectionRequest!) {
    DisconnectProcessorInstances(input: $input)
}

Variables

{
    "input": {
        "Inputs": ["{{analytics_single_processor_id}}"],
        "Outputs": ["{{analytics_single_processor_id_another}}"],
        "ConnectionType": "{{analytics_connection_type}}"
    }
}

Response

Status: 200 OK

{
    "data": {
        "DisconnectProcessorInstances": null
    }
}

Get Processor Instance

POST {{edgeUrl}}/analytics/v3

Get Processor Instance

Returns one processor instance by ID: its function, configuration, wiring and canvas position. Get Processor Instances returns every processor in a group; use this call when you already hold an ID (from Create New Processor, Get Processor Instances or a SubscribeToEvents status event).

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetProcessorInstance($input: String!) {
  GetProcessorInstance(input: $input) {
    ID
    Name
    Function
    Active
    Outputs
    ValueInputs
    EventInputs
    Parameters { Key Value }
    Definitions { Key Value }
    Position { Left Top WorkspaceID GroupID }
  }
}

Variables

Field Type Required Description
input String! Yes Processor UUID.
{ "input": "{{analytics_single_processor_id}}" }

Response

200 OK -- application/json. data.GetProcessorInstance is a ProcessorInstance:

Field Type Description
ID String! Processor UUID.
Name String! Display name.
Function String! Processor type, one of the Name values from Get All (Supported) Processors Metadata.
Active Boolean! Whether the processor is running. Change it with Set Processor Enabled.
Outputs [String!]! IDs of the processors this one feeds.
ValueInputs [String!]! IDs of processors wired into its value inputs.
EventInputs [String!]! IDs of processors wired into its event inputs.
Parameters [KeyValue!]! Function configuration, as set by Create New Processor / Update Processor.
Definitions [KeyValue!]! Input definitions set by Set Processor Wire Definition.
Position ProcessorInstancePosition Canvas position (Left, Top, WorkspaceID, GroupID), or null. A processor created in a workspace without a group has GroupID: null.
{
  "data": {
    "GetProcessorInstance": {
      "ID": "72CB1E96-54C9-4BCD-9B64-FEC108A079FB",
      "Name": "apidocs-backfill-an-proc2",
      "Function": "Generator",
      "Active": true,
      "Outputs": [],
      "ValueInputs": [],
      "EventInputs": [],
      "Parameters": [
        { "Key": "formula", "Value": "sin(t)" },
        { "Key": "timerInterval", "Value": "1000" }
      ],
      "Definitions": [],
      "Position": {
        "Left": 0,
        "Top": 0,
        "WorkspaceID": "24A5BDCC-5AF9-46B3-A0DB-7FF4A953B20B",
        "GroupID": null
      }
    }
  }
}

An unknown ID is an error, with the ID printed as a byte array:

{
  "errors": [
    {
      "message": "get processor by ID error: processor with id [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 171] not found",
      "path": ["GetProcessorInstance"]
    }
  ],
  "data": null
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetProcessorInstance($input: String!) {
  GetProcessorInstance(input: $input) {
    ID
    Name
    Function
    Active
    Outputs
    ValueInputs
    EventInputs
    Parameters {
      Key
      Value
    }
    Definitions {
      Key
      Value
    }
    Position {
      Left
      Top
      WorkspaceID
      GroupID
    }
  }
}

Variables

{
    "input": "{{analytics_single_processor_id}}"
}

Response

Status: 200 OK

{
    "data": {
        "GetProcessorInstance": {
            "ID": "72CB1E96-54C9-4BCD-9B64-FEC108A079FB",
            "Name": "apidocs-backfill-an-proc2",
            "Function": "Generator",
            "Active": true,
            "Outputs": [],
            "ValueInputs": [],
            "EventInputs": [],
            "Parameters": [
                {
                    "Key": "generatorType",
                    "Value": "User Defined"
                },
                {
                    "Key": "amplitude_multiplier",
                    "Value": "1"
                },
                {
                    "Key": "periodicity",
                    "Value": "30"
                },
                {
                    "Key": "strength",
                    "Value": "10"
                },
                {
                    "Key": "timerInterval",
                    "Value": "1000"
                },
                {
                    "Key": "formula",
                    "Value": "sin(t)"
                }
            ],
            "Definitions": [],
            "Position": {
                "Left": 0,
                "Top": 0,
                "WorkspaceID": "24A5BDCC-5AF9-46B3-A0DB-7FF4A953B20B",
                "GroupID": null
            }
        }
    }
}

Set Processor Enabled

POST {{edgeUrl}}/analytics/v3

Set Processor Enabled

Starts or stops a single processor without deleting it, the same as the enable toggle on a processor in the LE UI. A stopped processor keeps its configuration and wiring and stops consuming and emitting messages; Active on the processor reflects the new state.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation SetProcessorInstanceEnabled($input: SetProcessorInstanceEnabledRequest!) {
  SetProcessorInstanceEnabled(input: $input)
}

Variables (input: SetProcessorInstanceEnabledRequest!)

Field Type Required Description
Id String! Yes Processor UUID. Note the casing: Id, not ID.
Value Boolean! Yes true to start the processor, false to stop it.
{
  "input": {
    "Id": "{{analytics_single_processor_id}}",
    "Value": false
  }
}

Response

200 OK -- application/json. The return type is the Empty scalar, so success is null with no errors array. The change is immediate: Get Processor Instance returns the new Active value at once, and Subscribe to Analytics Events emits a processor_statuses event for the processor.

{ "data": { "SetProcessorInstanceEnabled": null } }

An unknown ID returns an errors entry. data.SetProcessorInstanceEnabled is null either way, so check errors, not the value:

{
  "errors": [
    {
      "message": "processor with id [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 171] not found",
      "path": ["SetProcessorInstanceEnabled"]
    }
  ],
  "data": { "SetProcessorInstanceEnabled": null }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation SetProcessorInstanceEnabled($input: SetProcessorInstanceEnabledRequest!) {
  SetProcessorInstanceEnabled(input: $input)
}

Variables

{
    "input": {
        "Id": "{{analytics_single_processor_id}}",
        "Value": false
    }
}

Response

Status: 200 OK

{
    "data": {
        "SetProcessorInstanceEnabled": null
    }
}

Subscribe to Analytics Events

POST {{edgeUrl}}/analytics/v3

Subscribe to Analytics Events (subscription)

Streams Analytics service events: processor status changes, group lock and unlock, and notices that new data is available for processors shown in the UI. The LE UI uses it to keep the Analytics canvas live. This is a GraphQL subscription; a plain POST does not stream.

Transport

WebSocket: wss://{{edgeHost}}/analytics/v3, subprotocol graphql-transport-ws. Send the API token as HTTP Basic Auth on the upgrade request, then connection_init, then a subscribe message with the body below. The Postman item is shown as POST for documentation purposes; switch to a Postman WebSocket request when streaming.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Subscription body

subscription SubscribeToEvents {
  SubscribeToEvents {
    eventType
    event {
      __typename
      ... on ProcessorStatusesEvent { statuses { id status active lastError } }
      ... on GroupLockEvent { groupName lockedBy lockTime lockDeadline }
      ... on GroupUnlockEvent { groupName }
      ... on NewDataForUIEvent { ids }
      ... on WorkspaceCreatedEvent { workspace { ID Name Description } }
      ... on WorkspaceDeletedEvent { workspaceID }
    }
  }
}

No arguments. Every subscriber receives every event. Right after connection_ack the server sends one processor_statuses event listing every processor on the device, then only changes.

Events

Each message carries an Analytics2Event: eventType (enum) and event, a union whose member matches the type.

eventType event type Fields
processor_statuses ProcessorStatusesEvent statuses[]: id, status, active, lastError per processor.
group_lock GroupLockEvent groupName, lockedBy, lockTime, lockDeadline. See Set Group Locking Status.
group_unlock GroupUnlockEvent groupName.
new_data_for_ui NewDataForUIEvent ids: processors with new output. Fetch it with Get Processor Last Value.
workspace_created WorkspaceCreatedEvent workspace: the new Workspace.
workspace_deleted WorkspaceDeletedEvent workspaceID.

The enum also lists workspace_updated, group_created, group_updated, group_deleted and group_members_changed. Select __typename to recognise them; add inline fragments for their fields as needed.

When observed on a 4.0.x device, creating a processor emitted group_lock for its group (the caller takes the group lock for 30 minutes) followed by processor_statuses; Set Processor Enabled emitted processor_statuses with the new active value; deleting a processor emitted group_lock for its group. Release a lock left this way with Set Group Locking Status. On that device Mode: CHECKOUT released the lock and CHECKIN took it, the reverse of what the mode names suggest; check Get Group Locking Status after the call.

Example next messages, captured in that order:

{"id": "1", "type": "next", "payload": {"data": {"SubscribeToEvents": {"eventType": "workspace_created", "event": {"__typename": "WorkspaceCreatedEvent", "workspace": {"ID": "F392FB64-D697-4548-B23E-6843C2C013E1", "Name": "apidocs-backfill-an-ws4", "Description": "apidocs test"}}}}}}
{"id": "1", "type": "next", "payload": {"data": {"SubscribeToEvents": {"eventType": "group_lock", "event": {"__typename": "GroupLockEvent", "groupName": "apidocs-backfill-an-ws3", "lockedBy": "guest", "lockTime": "2026-10-13T10:58:30.778290049-07:00", "lockDeadline": "2026-10-13T11:28:30.778290049-07:00"}}}}}
{"id": "1", "type": "next", "payload": {"data": {"SubscribeToEvents": {"eventType": "processor_statuses", "event": {"__typename": "ProcessorStatusesEvent", "statuses": [{"id": "72CB1E96-54C9-4BCD-9B64-FEC108A079FB", "status": "OK", "active": false, "lastError": null}]}}}}}
{"id": "1", "type": "next", "payload": {"data": {"SubscribeToEvents": {"eventType": "workspace_deleted", "event": {"__typename": "WorkspaceDeletedEvent", "workspaceID": "F392FB64-D697-4548-B23E-6843C2C013E1"}}}}}

lockedBy is the caller's user name; an API token shows as guest.

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

subscription SubscribeToEvents {
  SubscribeToEvents {
    eventType
    event {
      __typename
      ... on ProcessorStatusesEvent {
        statuses {
          id
          status
          active
          lastError
        }
      }
      ... on GroupLockEvent {
        groupName
        lockedBy
        lockTime
        lockDeadline
      }
      ... on GroupUnlockEvent {
        groupName
      }
      ... on NewDataForUIEvent {
        ids
      }
      ... on WorkspaceCreatedEvent {
        workspace {
          ID
          Name
          Description
        }
      }
      ... on WorkspaceDeletedEvent {
        workspaceID
      }
    }
  }
}

Response

Status: 200 OK

{
    "data": {
        "SubscribeToEvents": {
            "eventType": "processor_statuses",
            "event": {
                "__typename": "ProcessorStatusesEvent",
                "statuses": [
                    {
                        "id": "72CB1E96-54C9-4BCD-9B64-FEC108A079FB",
                        "status": "OK",
                        "active": false,
                        "lastError": null
                    }
                ]
            }
        }
    }
}

Create Workspace

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Create a Workspace.

Request Body

GraphQL Query

mutation CreateWorkspace($input: CreateWorkspaceInput!) {
    CreateWorkspace(input: $input) {
        ID Name Description CreatedDate ModifiedDate
    }
}

Variables

{
  "input": {
    "Name": "my-workspace",
    "Description": "Created via API"
  }
}

Update Workspace

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Rename or update a workspace's description.

Request Body

GraphQL Query

mutation UpdateWorkspace($input: UpdateWorkspaceInput!) {
    UpdateWorkspace(input: $input) {
        ID Name Description CreatedDate ModifiedDate
    }
}

Variables

{
  "input": {
    "ID": "{{analytics_workspace_id}}",
    "Name": "renamed",
    "Description": "Updated"
  }
}

Delete Workspace

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Fails if the workspace still has processors or groups; use DeleteWorkspaceGroupsAndProcessorInstances first.

Request Body

GraphQL Query

mutation DeleteWorkspace($input: String!) {
    DeleteWorkspace(input: $input)
}

Variables

{
  "input": "{{analytics_workspace_id}}"
}

Delete Workspace Groups and Processor Instances

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Clear all groups and processor instances inside a workspace.

Request Body

GraphQL Query

mutation DeleteWorkspaceGroupsAndProcessorInstances($input: String!) {
    DeleteWorkspaceGroupsAndProcessorInstances(input: $input)
}

Variables

{
  "input": "{{analytics_workspace_id}}"
}

Export Workspace

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Replaces deprecated ExportGroup.

Request Body

GraphQL Query

mutation ExportWorkspace($input: String!) {
    ExportWorkspace(input: $input) {
        Processors { ID Name FunctionName IsActive Outputs }
        Positions { ID Left Top WorkspaceID GroupID }
        Workspaces { ID Name Description }
        Groups { ID WorkspaceID Name Description BackgroundColor }
        ComponentVariables { UniqueName DataType DBValue IsReadWrite IsPersistent }
        Variables { UniqueName DataType DBValue IsReadWrite IsPersistent }
        AIModels { UniqueName Provider URL ModelName }
        Version
        Git
        FormatVersion
    }
}

Variables

{
  "input": "{{analytics_workspace_id}}"
}

Import Workspace

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Replaces deprecated ImportGroup. Omit workspaceID to import as a new workspace.

Request Body

GraphQL Query

mutation ImportWorkspace($workspaceID: String, $data: String!) {
    ImportWorkspace(workspaceID: $workspaceID, data: $data)
}

Variables

{
  "workspaceID": "{{analytics_workspace_id}}",
  "data": "{\"Workspaces\":[],\"Groups\":[],\"Processors\":[],\"Positions\":[],\"ComponentVariables\":[],\"Variables\":[],\"Version\":\"4.1.x\",\"FormatVersion\":1}"
}

Get Workspaces

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Replaces deprecated GetGroups.

Request Body

GraphQL Query

query GetWorkspaces {
    GetWorkspaces {
        ID Name Description CreatedDate ModifiedDate
    }
}

Get Workspace

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Fetch a single workspace by ID.

Request Body

GraphQL Query

query GetWorkspace($input: String!) {
    GetWorkspace(input: $input) {
        ID Name Description CreatedDate ModifiedDate
    }
}

Variables

{
  "input": "{{analytics_workspace_id}}"
}

Get Workspace Processors

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Replaces deprecated GetProcessorInstances.

Request Body

GraphQL Query

query GetWorkspaceProcessors($workspaceID: String!) {
    GetWorkspaceProcessors(workspaceID: $workspaceID) {
        ID Name Function Active Outputs ValueInputs EventInputs
        Position { Left Top WorkspaceID GroupID }
    }
}

Variables

{
  "workspaceID": "{{analytics_workspace_id}}"
}

Get Workspace Positions

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Replaces deprecated GetProcessorInstancePositions.

Request Body

GraphQL Query

query GetWorkspacePositions($workspaceID: String!) {
    GetWorkspacePositions(workspaceID: $workspaceID) {
        Key
        Value { Left Top WorkspaceID GroupID }
    }
}

Variables

{
  "workspaceID": "{{analytics_workspace_id}}"
}

Get Workspace Groups

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. List all groups inside a workspace.

Request Body

GraphQL Query

query GetWorkspaceGroups($workspaceID: String!) {
    GetWorkspaceGroups(workspaceID: $workspaceID) {
        ID WorkspaceID Name Description BackgroundColor LabelColor LabelLocation MemberIDs
        Bounds { X Y Width Height }
    }
}

Variables

{
  "workspaceID": "{{analytics_workspace_id}}"
}

Create Group

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Create a Group inside a Workspace.

Request Body

GraphQL Query

mutation CreateGroup($input: CreateGroupInput!) {
    CreateGroup(input: $input) {
        ID WorkspaceID Name Description BackgroundColor LabelColor LabelLocation MemberIDs
        Bounds { X Y Width Height }
    }
}

Variables

{
  "input": {
    "WorkspaceID": "{{analytics_workspace_id}}",
    "Name": "my-group",
    "Description": "Created via API",
    "BackgroundColor": "#3b82f6",
    "LabelColor": "#ffffff",
    "LabelLocation": "top"
  }
}

Update Group

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Update group metadata.

Request Body

GraphQL Query

mutation UpdateGroup($input: UpdateGroupInput!) {
    UpdateGroup(input: $input) {
        ID Name Description BackgroundColor LabelColor LabelLocation
    }
}

Variables

{
  "input": {
    "ID": "{{analytics_group_id}}",
    "Name": "renamed-group",
    "Description": "Updated",
    "BackgroundColor": "#10b981"
  }
}

Delete Group

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Processor instances inside the group are NOT deleted, they become un-grouped.

Request Body

GraphQL Query

mutation DeleteGroup($input: String!) {
    DeleteGroup(input: $input)
}

Variables

{
  "input": "{{analytics_group_id}}"
}

Get Group

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Fetch a single group by ID.

Request Body

GraphQL Query

query GetGroup($input: String!) {
    GetGroup(input: $input) {
        ID WorkspaceID Name Description BackgroundColor LabelColor LabelLocation MemberIDs
        Bounds { X Y Width Height }
    }
}

Variables

{
  "input": "{{analytics_group_id}}"
}

Add Processors to Group

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Add existing processor instances to a group.

Request Body

GraphQL Query

mutation AddProcessorsToGroup($groupID: String!, $processorIDs: [String!]!) {
    AddProcessorsToGroup(groupID: $groupID, processorIDs: $processorIDs)
}

Variables

{
  "groupID": "{{analytics_group_id}}",
  "processorIDs": [
    "{{analytics_processor_id}}"
  ]
}

Remove Processors from Group

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Remove processors from a group without deleting them.

Request Body

GraphQL Query

mutation RemoveProcessorsFromGroup($groupID: String!, $processorIDs: [String!]!) {
    RemoveProcessorsFromGroup(groupID: $groupID, processorIDs: $processorIDs)
}

Variables

{
  "groupID": "{{analytics_group_id}}",
  "processorIDs": [
    "{{analytics_processor_id}}"
  ]
}

Delete All Groups and Processor Instances

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Destructive system-wide reset.

Request Body

GraphQL Query

mutation DeleteAllGroupsAndProcessorInstances {
    DeleteAllGroupsAndProcessorInstances
}

Get All AI Providers

POST {{edgeUrl}}/analytics/v3

Get All AI Providers

Lists the AI providers Analytics is built to integrate with. Use this to render a provider picker; the name field is the value to pass to Add AI Model / Update AI Model / Verify AI Model API Key as provider.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetAIProviders {
  GetAIProviders {
    name
  }
}

No arguments.

Response

200 OK -- application/json. Array of provider objects.

Field Type Description
data.GetAIProviders[].name String Provider key (e.g. OpenAI API, Anthropic API, Ollama API).
{
  "data": {
    "GetAIProviders": [
      { "name": "Grok API" },
      { "name": "Google Gemini API" },
      { "name": "Nvidia API" },
      { "name": "OpenAI API" },
      { "name": "Cloudflare AI Gateway" },
      { "name": "Anthropic API" },
      { "name": "Ollama API" }
    ]
  }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetAIProviders {
    GetAIProviders {
        name
    }
}

Response

Status: 200 OK

{
    "data": {
        "GetAIProviders": [
            {
                "name": "Grok API"
            },
            {
                "name": "Google Gemini API"
            },
            {
                "name": "Nvidia API"
            },
            {
                "name": "OpenAI API"
            },
            {
                "name": "Cloudflare AI Gateway"
            },
            {
                "name": "Anthropic API"
            },
            {
                "name": "Ollama API"
            }
        ]
    }
}

List AI Models

POST {{edgeUrl}}/analytics/v3

List AI Models

Lists every configured AI model on the device. An AI model is a {provider, modelName, URL, uniqueName} tuple plus a stored API key (not returned here for security).

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query ListAIModels {
  ListAIModels {
    modelName
    provider
    uniqueName
    url
  }
}

No arguments.

Response

200 OK -- application/json

Field Type Description
data.ListAIModels [Model!]! All configured AI models.
data.ListAIModels[].modelName String Provider-specific model identifier (e.g. claude-3-7-sonnet-20250219, gpt-4o).
data.ListAIModels[].provider String Provider name from Get All AI Providers.
data.ListAIModels[].uniqueName String Operator-chosen alias used as the key in Update AI Model / Delete AI Model.
data.ListAIModels[].url String Provider API base URL (e.g. https://api.anthropic.com/v1).
{
  "data": {
    "ListAIModels": [
      {
        "modelName": "claude-3-7-sonnet-20250219",
        "provider": "Anthropic API",
        "uniqueName": "Claude Anthropic",
        "url": "https://api.anthropic.com/v1"
      }
    ]
  }
}

API keys are never returned by this endpoint. To rotate a key, call Update AI Model with the new key.

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query ListAIModels {
    ListAIModels {
        modelName
        provider
        uniqueName
        url
    }
}

Variables

{}

Response

Status: 200 OK

{
    "data": {
        "ListAIModels": [
            {
                "modelName": "claude-3-7-sonnet-20250219",
                "provider": "Anthropic API",
                "uniqueName": "Claude Anthropic",
                "url": "https://api.anthropic.com/v1"
            }
        ]
    }
}

Verify AI Model API Key

POST {{edgeUrl}}/analytics/v3

Verify AI Model API Key

Validates an API key + provider/URL combination without persisting it. Use this before Add AI Model to fail fast on bad credentials, or to test a new key before rotating.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation verifyAIModel($input: AIModelVerifyRequest!) {
  verifyAIModel(input: $input)
}

Variables (input: AIModelVerifyRequest!)

Field Type Required Description
provider String! Yes Provider name from Get All AI Providers.
url String! Yes Provider API base URL.
key String! Yes API key / token to verify.
cfApiKey String No Extra Cloudflare API key for Cloudflare AI Gateway. Empty string for other providers.
{
  "input": {
    "provider": "{{AI_Model_Provider_Name}}",
    "url": "{{AI_Model_URL}}",
    "key": "{{AI_Model_API_Key}}",
    "cfApiKey": ""
  }
}

Response

200 OK -- application/json

Field Type Description
data.verifyAIModel String "Verification successful" on success; an error string otherwise.
{ "data": { "verifyAIModel": "Verification successful" } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation verifyAIModel($input: AIModelVerifyRequest!) {
    verifyAIModel(input: $input)
}

Variables

{
    "input": {
        "provider": "{{AI_Model_Provider_Name}}",
        "url": "{{AI_Model_URL}}",
        "key": "{{AI_Model_API_Key}}",
        "cfApiKey": ""
    }
}

Response

Status: 200 OK

{
    "data": {
        "verifyAIModel": "Verification successful"
    }
}

Add AI Model

POST {{edgeUrl}}/analytics/v3

Add AI Model

Registers an AI model on the device. After this call, processors that support AI inference can reference the model by its uniqueName.

Run Verify AI Model API Key first to validate the credentials -- the add mutation itself does not re-verify.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation addAIModel($input: AIModelRequest!) {
  addAIModel(input: $input)
}

Variables (input: AIModelRequest!)

Field Type Required Description
provider String! Yes Provider name from Get All AI Providers.
uniqueName String! Yes Operator-chosen alias. Must be unique on this device.
url String! Yes Provider API base URL.
apiKey String! Yes API key / token. Stored encrypted on the device.
modelName String! Yes Provider-specific model identifier.
cfApiKey String No Extra Cloudflare API key for Cloudflare AI Gateway. Empty for other providers.
{
  "input": {
    "provider": "{{AI_Model_Provider_Name}}",
    "uniqueName": "{{AI_Model_Unique_Name}}",
    "url": "{{AI_Model_URL}}",
    "apiKey": "{{AI_Model_API_Key}}",
    "modelName": "{{AI_Provider_Model_Name}}",
    "cfApiKey": ""
  }
}

Response

200 OK -- application/json. No data returned on success.

{ "data": { "addAIModel": null } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation addAIModel($input: AIModelRequest!) {
    addAIModel(input: $input)
}

Variables

{
    "input": {
        "provider": "{{AI_Model_Provider_Name}}",
        "uniqueName": "{{AI_Model_Unique_Name}}",
        "url": "{{AI_Model_URL}}",
        "apiKey": "{{AI_Model_API_Key}}",
        "modelName": "{{AI_Provider_Model_Name}}",
        "cfApiKey": ""
    }
}

Response

Status: 200 OK

{
    "data": {
        "addAIModel": null
    }
}

Update AI Model

POST {{edgeUrl}}/analytics/v3

Update AI Model

Updates an existing AI model. The uniqueName outside input selects which model to update; the values inside input are the new fields. You can rotate the key, switch model, or move to a different provider -- all in one call.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation UpdateAIModel($input: AIModelRequest!, $uniqueName: String!) {
  UpdateAIModel(input: $input, uniqueName: $uniqueName)
}

Variables

Field Type Required Description
uniqueName String! Yes The model's current unique name (selects which model to update).
input AIModelRequest! Yes New field values. Same shape as Add AI Model > input. Pass all fields, not just the changed ones.
{
  "input": {
    "provider": "{{AI_Model_Provider_Name}}",
    "uniqueName": "{{AI_Model_Unique_Name}}",
    "url": "{{AI_Model_URL}}",
    "apiKey": "{{AI_Model_API_Key}}",
    "modelName": "{{AI_Provider_Model_Name}}",
    "cfApiKey": ""
  },
  "uniqueName": "{{AI_Model_Unique_Name}}"
}

Response

200 OK -- application/json. No data returned on success.

{ "data": { "UpdateAIModel": null } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation UpdateAIModel($input: AIModelRequest!, $uniqueName: String!) {
    UpdateAIModel(input: $input, uniqueName: $uniqueName)
}

Variables

{
    "input": {
        "provider": "{{AI_Model_Provider_Name}}",
        "uniqueName": "{{AI_Model_Unique_Name}}",
        "url": "{{AI_Model_URL}}",
        "apiKey": "{{AI_Model_API_Key}}",
        "modelName": "{{AI_Provider_Model_Name}}",
        "cfApiKey": ""
    },
    "uniqueName":"{{AI_Model_Unique_Name}}"
}

Response

Status: 200 OK

{
    "data": {
        "UpdateAIModel": null
    }
}

Delete AI Model

POST {{edgeUrl}}/analytics/v3

Delete AI Model

Removes a configured AI model. Processors that reference the deleted model's uniqueName will start failing on their next invocation -- either reassign them to a different model first, or be prepared for them to error.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation DeleteAIModel($input: String!) {
  DeleteAIModel(name: $input)
}

The variable is named input but the GraphQL argument is name -- substitute the unique name as the value.

Variables

Field Type Required Description
input String! Yes uniqueName of the model to delete.
{ "input": "{{AI_Model_Unique_Name}}" }

Response

200 OK -- application/json

Field Type Description
data.DeleteAIModel Boolean true on success.
{ "data": { "DeleteAIModel": true } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation DeleteAIModel($input: String!) {
    DeleteAIModel(name: $input)
}

Variables

{
    "input": "{{AI_Model_Unique_Name}}"
}

Response

Status: 200 OK

{
    "data": {
        "DeleteAIModel": true
    }
}

Get TensorFlow Models

POST {{edgeUrl}}/analytics/v3

Get TensorFlow Models

Lists every TensorFlow SavedModel uploaded to the device. Includes the on-disk path and the size in bytes -- useful for capacity planning.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetModels {
  GetModels {
    AbsolutePath
    Name
    Size
  }
}

No arguments.

Response

200 OK -- application/json

Field Type Description
data.GetModels [Model!]! All TensorFlow models on the device.
data.GetModels[].AbsolutePath String On-disk path (e.g. /var/lib/loopedge-analytics2/models/motionModel).
data.GetModels[].Name String Model name. Used as the key for Delete TensorFlow Model.
data.GetModels[].Size Int On-disk size in bytes.
{
  "data": {
    "GetModels": [
      { "AbsolutePath": "/var/lib/loopedge-analytics2/models/motionModel", "Name": "motionModel", "Size": 5094648 },
      { "AbsolutePath": "/var/lib/loopedge-analytics2/models/savedmodel4", "Name": "savedmodel4", "Size": 511197 }
    ]
  }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetModels {
    GetModels {    
        AbsolutePath
        Name
        Size
    }
}

Variables

{}

Response

Status: 200 OK

{
    "data": {
        "GetModels": [
            {
                "AbsolutePath": "/var/lib/loopedge-analytics2/models/motionModel",
                "Name": "motionModel",
                "Size": 5094648
            },
            {
                "AbsolutePath": "/var/lib/loopedge-analytics2/models/savedmodel4",
                "Name": "savedmodel4",
                "Size": 511197
            }
        ]
    }
}

Delete TensorFlow Model

POST {{edgeUrl}}/analytics/v3

Delete TensorFlow Model

Removes a TensorFlow model from the device. Free disk space is reclaimed. Processors that reference the deleted model start failing on their next inference -- reassign or delete them first.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation DeleteModel($input: String!) {
  DeleteModel(input: $input)
}

Variables

Field Type Required Description
input String! Yes Model name from Get TensorFlow Models.
{ "input": "{{TensorFlow_model_name}}" }

Response

200 OK -- application/json. No data returned on success.

{ "data": { "DeleteModel": null } }

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation DeleteModel($input: String!) {
    DeleteModel(input: $input)
}

Variables

{
    "input": "{{TensorFlow_model_name}}"
}

Response

Status: 200 OK

{
    "data": {
        "DeleteModel": null
    }
}

Step 1: Upload TensorFlow Model

DELETE {{edgeUrl}}/analytics/v2/upload_model/v2

Step 1: Upload TensorFlow Model (purge in-progress)

Step 1 of 3 in the resumable TensorFlow model upload flow. This call deletes any in-progress upload state held by the server, so that step 2 starts cleanly. Always call this before starting a fresh upload to recover from interrupted previous attempts.

Endpoint

DELETE {{edgeUrl}}/analytics/v2/upload_model/v2

Authentication

HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.

Parameters

None.

Response

200 OK on success. The next step is Step 2: Upload TensorFlow Model.

Errors

HTTP status When it happens
400 Bad Request Missing or malformed query/body parameter.
401 Unauthorized Missing or invalid credentials.
403 Forbidden Token lacks permission for this operation.
404 Not Found Target entity does not exist.
5xx Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Response

Status: 204 No Content


Step 2: Upload TensorFlow Model

POST {{edgeUrl}}/analytics/v2/upload_model/v2

Step 2: Upload TensorFlow Model (initiate)

Step 2 of 3. Announces an upload by declaring the target model name and size. The server returns an id that step 3 uses as the upload session handle.

Endpoint

POST {{edgeUrl}}/analytics/v2/upload_model/v2
Content-Type: application/json

Authentication

HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.

Request body

{
  "size": {{TensorFlow_model_size}},
  "name": "{{TensorFlow_model_name}}.zip"
}
Field Type Required Description
size integer Yes Total size of the ZIP archive in bytes.
name string Yes File name. Must end in .zip. The model's directory name is taken from the part before .zip.

Response

200 OK -- application/json

Field Type Description
id string Upload session UUID. Use as {{TensorFlow_model_upload_id}} in step 3.
{ "id": "94076e1c-9a59-46bb-8cc2-540da6505069" }

Errors

HTTP status When it happens
400 Bad Request Missing or malformed query/body parameter.
401 Unauthorized Missing or invalid credentials.
403 Forbidden Token lacks permission for this operation.
404 Not Found Target entity does not exist.
5xx Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

{
    "size": {{TensorFlow_model_size}},
    "name": "{{TensorFlow_model_name}}.zip"
}

Response

Status: 200 OK

{
    "id": "94076e1c-9a59-46bb-8cc2-540da6505069"
}

Step 3: Upload TensorFlow Model

PUT {{edgeUrl}}/analytics/v2/upload_model/v2/resume/{{TensorFlow_model_upload_id}}

Step 3: Upload TensorFlow Model (resume / stream chunks)

Step 3 of 3. Streams (or resumes streaming) the ZIP archive bytes for the upload session created in step 2. The endpoint accepts a chunked multipart upload and reports back the offset consumed so far -- if the connection drops, you can resume by streaming starting from that offset.

The Postman item posts the entire file in one PUT for simplicity. For robust transfer of large models, chunk client-side and re-issue this PUT with progressively larger offsets.

Endpoint

PUT {{edgeUrl}}/analytics/v2/upload_model/v2/resume/{{TensorFlow_model_upload_id}}
Content-Type: multipart/form-data

Authentication

HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.

Path parameters

Location Name Required Description
Path {{TensorFlow_model_upload_id}} Yes Upload session ID returned by step 2.

Request body (form-data)

Form key Type Description
(empty) file The ZIP archive (or next chunk thereof).

Response

200 OK -- application/json

Field Type Description
id string Echo of the upload session ID.
offset integer Bytes consumed so far. If less than the total size from step 2, resume from this offset.
done boolean true when the upload is fully consumed and the model is installed.
{
  "id": "f7ed9907-8f1c-4cf4-9e2c-fd558e0653d5",
  "offset": 1024199,
  "done": false
}

Once done: true, the model is unpacked and available via Get TensorFlow Models.

Errors

HTTP status When it happens
400 Bad Request Missing or malformed query/body parameter.
401 Unauthorized Missing or invalid credentials.
403 Forbidden Token lacks permission for this operation.
404 Not Found Target entity does not exist.
5xx Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Headers

Key Value
Upload-Length 1024199
Upload-Offset 0

Request Body

Response

Status: 200 OK

{
    "id": "f7ed9907-8f1c-4cf4-9e2c-fd558e0653d5",
    "offset": 1024199,
    "done": false
}

List Provider Models

POST {{edgeUrl}}/analytics/v3

New in 4.3.x. Ask an AI provider which models it exposes for a given set of credentials, without first creating a model entry on the device.

Request field Meaning
provider Provider identifier
url Provider API base URL
key API key to authenticate with
cfApiKey Cloudflare API key, for providers reached through a Cloudflare AI Gateway. Optional
Response field Meaning
Id Model identifier to use when configuring a model
Name Display name, may be null
Description Provider-supplied description, may be null
ContextLength Context window in tokens, may be null
OwnedBy Owning organisation, may be null
Created Provider-supplied creation timestamp, may be null

Only Id is non-null, so drive configuration from Id and treat every other field as best-effort metadata that varies by provider.

The call reaches out to the provider from the device, so it doubles as a credential and reachability check: a valid key behind a blocked egress path fails here too. Note the credentials are sent in the request body, so send it over the TLS endpoint only and avoid logging the variables.

Request Body

GraphQL Query

query ListProviderModels($input: AIModelVerifyRequest!) {
    ListProviderModels(input: $input) {
        Id
        Name
        Description
        ContextLength
        OwnedBy
        Created
    }
}

Variables

{
  "input": {
    "provider": "openai",
    "url": "https://api.openai.com/v1",
    "key": "{{ai_provider_api_key}}",
    "cfApiKey": ""
  }
}

Set Variables

POST {{edgeUrl}}/analytics/v3

Set Variables

Creates or updates a global variable that processors can read and write at runtime. Variables differ from parameters:

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation SetVariable($input: InputVariable!) {
  SetVariable(input: $input)
}

Variables (input: InputVariable!)

Field Type Required Description
Name String! Yes Variable name. Unique across all variables. Creating a name that already exists updates it.
Value String! Yes Variable value (always a string at the wire level, regardless of DataType).
DataType String! Yes One of STRING, INT, FLOAT, BOOL, JSON.
{
  "input": {
    "Name": "{{analytics_parameter_key}}",
    "Value": "{{analytics_parameter_value}}",
    "DataType": "STRING"
  }
}

Response

200 OK -- application/json

Field Type Description
data.SetVariable.UniqueName String Variable name, echoed.
data.SetVariable.DataType String Type, echoed.
data.SetVariable.DBValue String Stored value (DB-encoded).
data.SetVariable.IsReadWrite Boolean true for variables (always); false for parameters.
data.SetVariable.IsPersistent Boolean true -- variables persist across Analytics service restarts.
{
  "data": {
    "SetVariable": {
      "UniqueName": "api_set_key",
      "DataType": "STRING",
      "DBValue": "api_set_value",
      "IsReadWrite": true,
      "IsPersistent": true
    }
  }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation SetVariable($input: InputVariable!) {
    SetVariable(input: $input)
}

Variables

{
    "input": {
        "Name": "{{analytics_parameter_key}}",
        "Value": "{{analytics_parameter_value}}",
        "DataType": "STRING"
    }
}

Response

Status: 200 OK

{
    "data": {
        "SetVariable": {
            "UniqueName": "api_set_key",
            "DataType": "STRING",
            "DBValue": "api_set_value",
            "IsReadWrite": true,
            "IsPersistent": true
        }
    }
}

Get Variables

POST {{edgeUrl}}/analytics/v3

Get Variables

Returns every global variable known to Analytics. Same shape as Instances > Get Parameters, but for variables (read/write at runtime).

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetVariables {
  GetVariables {
    DataType
    Name
    Value
  }
}

No arguments.

Response

200 OK -- application/json

Field Type Description
data.GetVariables[].DataType String Type: STRING, INT, FLOAT, BOOL, JSON.
data.GetVariables[].Name String Variable name.
data.GetVariables[].Value String Variable value (serialized as string).
{
  "data": {
    "GetVariables": [
      { "DataType": "STRING", "Name": "parameterKey",  "Value": "parameterValue" },
      { "DataType": "STRING", "Name": "api_set_key",   "Value": "api_set_value" }
    ]
  }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetVariables {
    GetVariables {
        DataType
        Name
        Value
    }
}

Variables

{}

Response

Status: 200 OK

{
    "data": {
        "GetVariables": [
            {
                "DataType": "STRING",
                "Name": "parameterKey",
                "Value": "parameterValue"
            },
            {
                "DataType": "STRING",
                "Name": "api_set_key",
                "Value": "api_set_value"
            }
        ]
    }
}

Delete Variable

POST {{edgeUrl}}/analytics/v3

Delete Variable

Deletes a global variable created with Set Variables. Processors that read the variable see it as missing from then on.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

mutation DeleteVariable($name: String!) {
  DeleteVariable(name: $name)
}

Variables

Field Type Required Description
name String! Yes Variable name, as returned in Get Variables (Name). Case sensitive.
{ "name": "{{analytics_parameter_key}}" }

Response

200 OK -- application/json. data.DeleteVariable is true when the variable was deleted.

{ "data": { "DeleteVariable": true } }

A name that does not exist is an error, not false:

{
  "errors": [
    { "message": "variable 'api_set_key' not found", "path": ["DeleteVariable"] }
  ],
  "data": null
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

mutation DeleteVariable($name: String!) {
  DeleteVariable(name: $name)
}

Variables

{
    "name": "{{analytics_parameter_key}}"
}

Response

Status: 200 OK

{
    "data": {
        "DeleteVariable": true
    }
}

Set Component Variable

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Replaces SetParameter.

Request Body

GraphQL Query

mutation SetComponentVariable($input: InputComponentVariable!) {
    SetComponentVariable(input: $input)
}

Variables

{
  "input": {
    "Name": "myVariable",
    "DataType": "STRING",
    "Value": "hello"
  }
}

Delete Component Variable

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Replaces DeleteParameter.

Request Body

GraphQL Query

mutation DeleteComponentVariable($name: String!) {
    DeleteComponentVariable(name: $name)
}

Variables

{
  "name": "myVariable"
}

Get Component Variables

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Replaces GetParameters.

Request Body

GraphQL Query

query GetComponentVariables {
    GetComponentVariables { Name DataType Value }
}

Get Component Variable

POST {{edgeUrl}}/analytics/v3

New in 4.1.x. Replaces GetParameter.

Request Body

GraphQL Query

query GetComponentVariable($input: String!) {
    GetComponentVariable(input: $input) { Name DataType Value }
}

Variables

{
  "input": "myVariable"
}

Retrieve Prometheus Metrics

GET {{edgeUrl}}/analytics/v2/metrics

Retrieve Prometheus Metrics

Returns the Analytics service's runtime metrics in the Prometheus exposition format. This is a plain REST endpoint on /analytics/v2, not part of the GraphQL surface at /analytics/v3 -- it is directly scrapable, with the same semantics as the DeviceHub, Integration, and Marketplace Prometheus endpoints.

Endpoint

GET {{edgeUrl}}/analytics/v2/metrics

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Parameters

None.

Response

200 OK -- text/plain. The body is the Prometheus text exposition payload; there is no JSON envelope.

Metric reference

Metric Type Description
num_of_message_in gauge Total messages consumed by Analytics since service start.
num_of_message_out gauge Total messages produced by Analytics since service start.
processing_time_in_nano_sec gauge Average per-message processing time in nanoseconds, last sample.

Other per-function or per-processor metrics may also be emitted depending on the build -- treat the metric list as open-ended.

Example response

# HELP num_of_message_in
# TYPE num_of_message_in gauge
num_of_message_in 2.937457e+06

# HELP num_of_message_out
# TYPE num_of_message_out gauge
num_of_message_out 3.1471953e+07

# HELP processing_time_in_nano_sec
# TYPE processing_time_in_nano_sec gauge
processing_time_in_nano_sec 0.0679513251743302

Scrape configuration

- job_name: 'litmusedge-analytics'
  scheme: https
  tls_config:
    insecure_skip_verify: true
  metrics_path: /analytics/v2/metrics
  basic_auth:
    username: '<api-token>'
    password: ''
  static_configs:
    - targets: ['<edge-host>:443']

Useful PromQL recipes

# Messages-per-second over 5m
rate(num_of_message_in[5m])

# Output amplification (out/in ratio)
num_of_message_out / num_of_message_in

Errors

HTTP status When it happens
401 Unauthorized Missing or invalid credentials.
403 Forbidden Token lacks permission for this operation.
405 Method Not Allowed The path only accepts GET.
5xx Analytics is unreachable, restarting, or internally errored. Inspect device logs under System > Support.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Response

Status: 200 OK

# HELP num_of_message_in 
# TYPE num_of_message_in gauge
num_of_message_in 2.937457e+06
# HELP num_of_message_out 
# TYPE num_of_message_out gauge
num_of_message_out 3.1471953e+07
# HELP processing_time_in_nano_sec 
# TYPE processing_time_in_nano_sec gauge
processing_time_in_nano_sec 0.0679513251743302


Retrieve Prometheus Metrics (GraphQL)

POST {{edgeUrl}}/analytics/v3

Retrieve Prometheus Metrics (GraphQL)

Returns the same Analytics metrics as Retrieve Prometheus Metrics (GET {{edgeUrl}}/analytics/v2/metrics), in the Prometheus exposition format, but wrapped in a GraphQL response: data.GetMetrics carries the exposition text as a string. For Prometheus scraping, use the REST endpoint; use this one when your client already talks GraphQL to /analytics/v3.

Endpoint

POST {{edgeUrl}}/analytics/v3
Content-Type: application/json

The operation is chosen by the GraphQL query body, not the URL path.

Authentication

HTTP Basic Auth. Username is your API token, password is empty. The same token is valid across /devicehub/v2, /analytics/v2, /cc, /opcua, and the other LE services.

Request body

query GetMetrics {
  GetMetrics
}

No arguments.

Response

200 OK -- application/json. data.GetMetrics is a string in Prometheus text exposition format.

Metric Type Description
num_of_message_in gauge Total messages consumed by Analytics since service start.
num_of_message_out gauge Total messages produced by Analytics since service start.
processing_time_in_nano_sec gauge Average per-message processing time in nanoseconds, last sample.

Other metrics may appear depending on the build; treat the list as open-ended.

{
  "data": {
    "GetMetrics": "# HELP num_of_message_in \n# TYPE num_of_message_in gauge\nnum_of_message_in 9.3019998e+07\n# HELP num_of_message_out \n# TYPE num_of_message_out gauge\nnum_of_message_out 7.2468305e+07\n# HELP processing_time_in_nano_sec \n# TYPE processing_time_in_nano_sec gauge\nprocessing_time_in_nano_sec 0.8867536333826946\n"
  }
}

Errors

GraphQL endpoints return 200 OK even on logical errors. Inspect the errors array in the response body:

{ "errors": [ { "message": "...", "path": ["..."], "extensions": { "code": "..." } } ] }
extensions.code Meaning
UNAUTHENTICATED Missing or invalid API token.
FORBIDDEN Token lacks permission for this operation.
BAD_USER_INPUT Invalid argument (wrong type, missing required field, malformed UUID, unknown ID, etc.).
NOT_FOUND The targeted entity does not exist.
INTERNAL_SERVER_ERROR DeviceHub fault. Retry, then escalate via System > Support.

A non-200 HTTP response means DeviceHub itself is unreachable. See Dashboard > DeviceHub Status.

TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.

Request Body

GraphQL Query

query GetMetrics {
  GetMetrics
}

Response

Status: 200 OK

{
    "data": {
        "GetMetrics": "# HELP num_of_message_in \n# TYPE num_of_message_in gauge\nnum_of_message_in 219785\n# HELP num_of_message_out \n# TYPE num_of_message_out gauge\nnum_of_message_out 175934\n# HELP processing_time_in_nano_sec \n# TYPE processing_time_in_nano_sec gauge\nprocessing_time_in_nano_sec 575.8980018785757\n"
    }
}

Get Analytics Logs

POST {{edgeUrl}}/analytics/v3

DEPRECATED in 4.4.x. Local logs are superseded by central logging. Still works, scheduled for removal after 2027-09-01. Read logs from System > Logs (GET /logs/query) instead.

New in 4.2.x. Pull the Analytics service log over the API, rather than reading it off the device.

LogTimeRange: FIVE_MINUTES | TEN_MINUTES | FIFTEEN_MINUTES | THIRTY_MINUTES | FORTY_FIVE_MINUTES | ONE_HOUR | ALL. Omitting timeRange applies the server default.

Response field Meaning
success Whether the log could be read at all
entries The log lines, each with timestamp, level, message, source
totalLines Number of lines matched before any cap was applied
truncated true when the response was cut short
error Populated when success is false

Check truncated before drawing conclusions from a quiet log: a true here with ALL selected means you are seeing a window, not the whole history. Narrow the timeRange rather than assuming the entries are complete.

level is DEBUG | INFO | WARN | ERROR | DPANIC | PANIC | FATAL.

Request Body

GraphQL Query

query GetAnalyticsLogs($timeRange: LogTimeRange) {
    GetAnalyticsLogs(timeRange: $timeRange) {
        success
        totalLines
        truncated
        error
        entries {
            timestamp
            level
            message
            source
        }
    }
}

Variables

{
  "timeRange": "FIVE_MINUTES"
}

Subscribe to Analytics Logs

POST {{edgeUrl}}/analytics/v3

DEPRECATED in 4.4.x. Local logs are superseded by central logging. Still works, scheduled for removal after 2027-09-01. Poll System > Logs (GET /logs/query) with the returned cursor instead.

New in 4.2.x. Streaming form of GetAnalyticsLogs. Each event carries a batch of entries in the same shape.

LogTimeRange: FIVE_MINUTES | TEN_MINUTES | FIFTEEN_MINUTES | THIRTY_MINUTES | FORTY_FIVE_MINUTES | ONE_HOUR | ALL. The range seeds the backlog delivered on connect; live lines follow as they are written.

Unlike the query, an event has no truncated or totalLines field, so use GetAnalyticsLogs when you need to know whether history was capped.

WebSocket subscription. Convert to a Postman WebSocket request after import (URL: wss://.../analytics/v3).

Request Body

GraphQL Query

subscription SubscribeToAnalyticsLogs($timeRange: LogTimeRange) {
    SubscribeToAnalyticsLogs(timeRange: $timeRange) {
        entries {
            timestamp
            level
            message
            source
        }
    }
}

Variables

{
  "timeRange": "FIVE_MINUTES"
}

Get AI Suite Files

POST {{edgeUrl}}/analytics/v3

New in 4.3.x. List everything stored under one AI Suite resource type.

AISuiteResourceType is INSTRUCTIONS | SKILLS | CONTEXT | TOOLS | MCP | AGENTS | MEMORY. Each value is a separate namespace: a name is only unique within one resource type, so the same name may exist under several of them without clashing.

Response field Meaning
Name Entry name relative to the resource type. This is the value every other AI Suite operation expects
Path Location within the AI Suite store, including the resource-type directory. Informational
Size Size in bytes
Modified Last-modified timestamp

The listing is recursive, so a resource type holding a directory of related files returns one row per file with a Name that includes the intermediate directories. An empty resource type returns an empty list rather than an error, so use the list length to tell 'nothing uploaded yet' apart from a failure.

Note the response carries no content. Fetch that per entry with Get AI Suite File Content.

Request Body

GraphQL Query

query GetAISuiteFiles($resourceType: AISuiteResourceType!) {
    GetAISuiteFiles(resourceType: $resourceType) {
        Name
        Path
        Size
        Modified
    }
}

Variables

{
  "resourceType": "SKILLS"
}

Response

Status: 200 OK

[
    {
        "Name": "anomaly-triage/SKILL.md",
        "Path": "skills/anomaly-triage/SKILL.md",
        "Size": 2418,
        "Modified": "2026-09-11T10:22:04Z"
    },
    {
        "Name": "anomaly-triage/reference.md",
        "Path": "skills/anomaly-triage/reference.md",
        "Size": 7734,
        "Modified": "2026-09-11T10:22:04Z"
    }
]

Get AI Suite File Content

POST {{edgeUrl}}/analytics/v3

New in 4.3.x. Return the contents of one AI Suite entry as a string.

AISuiteResourceType is INSTRUCTIONS | SKILLS | CONTEXT | TOOLS | MCP | AGENTS | MEMORY. Each value is a separate namespace: a name is only unique within one resource type, so the same name may exist under several of them without clashing.

name is the entry's path relative to its resource type, not an absolute path and not the Path value returned by Get AI Suite Files. Pass the Name field from that query back verbatim.

The return type is a plain String!, so the payload arrives as text with no metadata wrapper. Binary entries are not meaningfully representable this way; treat this query as the text-file accessor it is and use Export AI Suite when you need the store as bytes.

A name that does not exist under the given resource type is an error, not an empty string.

Request Body

GraphQL Query

query GetAISuiteFileContent($resourceType: AISuiteResourceType!, $name: String!) {
    GetAISuiteFileContent(resourceType: $resourceType, name: $name)
}

Variables

{
  "resourceType": "SKILLS",
  "name": "anomaly-triage/SKILL.md"
}

Delete AI Suite File

POST {{edgeUrl}}/analytics/v3

New in 4.3.x. Permanently remove one entry from the AI Suite store. Returns Boolean!.

AISuiteResourceType is INSTRUCTIONS | SKILLS | CONTEXT | TOOLS | MCP | AGENTS | MEMORY. Each value is a separate namespace: a name is only unique within one resource type, so the same name may exist under several of them without clashing.

name is the entry's path relative to its resource type, not an absolute path and not the Path value returned by Get AI Suite Files. Pass the Name field from that query back verbatim.

There is no soft delete and no undo. Anything referencing the deleted entry, such as a processor whose AISuiteResource names it, keeps the now-dangling reference; re-point or re-upload before deleting if the resource is in use.

Take an Export AI Suite snapshot first if you may need to roll back.

Request Body

GraphQL Query

mutation DeleteAISuiteFile($resourceType: AISuiteResourceType!, $name: String!) {
    DeleteAISuiteFile(resourceType: $resourceType, name: $name)
}

Variables

{
  "resourceType": "SKILLS",
  "name": "anomaly-triage/SKILL.md"
}

Create AI Suite Upload Session

POST {{edgeUrl}}/analytics/v3

New in 4.3.x. Open a resumable upload session for a new AI Suite entry. This is the first of three calls: create the session, push the bytes with Resume AI Suite Upload Session, then Close AI Suite Upload Session.

Request field Meaning
Size Total size of the file in bytes, declared up front
ResourceType Which AI Suite namespace the file lands in
FileName Name relative to the resource type. May include directories

AISuiteResourceType is INSTRUCTIONS | SKILLS | CONTEXT | TOOLS | MCP | AGENTS | MEMORY. Each value is a separate namespace: a name is only unique within one resource type, so the same name may exist under several of them without clashing.

Response field Meaning
Id Session identifier. Pass as SessionID on every resume call
Offset Bytes the server has so far. 0 on a fresh session
Done Whether the declared Size has been received in full

Offset is a String!, not an integer, while UploadOffset on the resume call is an Int!. Convert when you feed one into the other.

Declare Size accurately. It is what the server uses to decide when the upload is complete, so a wrong value either truncates the entry or leaves the session open.

Request Body

GraphQL Query

mutation CreateAISuiteUploadSession($input: CreateAISuiteUploadSessionRequest!) {
    CreateAISuiteUploadSession(input: $input) {
        Id
        Offset
        Done
    }
}

Variables

{
  "input": {
    "Size": 2418,
    "ResourceType": "SKILLS",
    "FileName": "anomaly-triage/SKILL.md"
  }
}

Resume AI Suite Upload Session

POST {{edgeUrl}}/analytics/v3

New in 4.3.x. Push one chunk into an open AI Suite upload session. Call repeatedly until the response reports Done: true.

Request field Meaning
SessionID The Id returned by Create AI Suite Upload Session
UploadOffset Byte offset this chunk starts at. Must equal the Offset the server last reported
UploadLength Total length of the whole upload
ContentLength Length of this chunk
ContentType MIME type of the entry being uploaded
Data The chunk payload

The input type is ResumeModelUploadSessionRequest, shared with the AI model upload flow rather than specific to the AI Suite. That is why its field names say 'Model'.

Drive the loop from the server's Offset rather than from a counter you keep locally. After any failed or uncertain chunk, re-read Offset from the last good response and resume there; that is what makes the session resumable.

A small file can be sent as a single chunk with UploadOffset: 0 and ContentLength equal to UploadLength.

Request Body

GraphQL Query

mutation ResumeAISuiteUploadSession($input: ResumeModelUploadSessionRequest!) {
    ResumeAISuiteUploadSession(input: $input) {
        Id
        Offset
        Done
    }
}

Variables

{
  "input": {
    "SessionID": "{{ai_upload_session_id}}",
    "UploadOffset": 0,
    "UploadLength": 2418,
    "ContentLength": 2418,
    "ContentType": "text/markdown",
    "Data": "<base64-encoded chunk>"
  }
}

Close AI Suite Upload Session

POST {{edgeUrl}}/analytics/v3

New in 4.3.x. Finalise the AI Suite upload session and commit the uploaded entry into the store. Returns Empty.

The mutation takes no arguments: the device tracks a single active AI Suite upload session, so there is no session ID to pass and no way to close one session while another stays open. Upload entries one at a time rather than interleaving.

Call this only once the resume loop reports Done: true. Closing early leaves a partial entry. After it returns, the new file shows up in Get AI Suite Files for its resource type.

Request Body

GraphQL Query

mutation CloseAISuiteUploadSession {
    CloseAISuiteUploadSession
}

Variables

{}

Export AI Suite

POST {{edgeUrl}}/analytics/v3

New in 4.3.x. Export the entire AI Suite store as a single string. Returns String!.

The value is a base64-encoded ZIP archive covering every resource type at once; there is no per-resource-type export. Decode the string, then unzip. The example response above is the real value returned by a device with an empty AI Suite: the decoded bytes begin PK\x05\x06, an empty ZIP central directory, which is the quickest way to confirm you are handling the payload correctly.

Because the export is one opaque string in a GraphQL response, a large AI Suite produces a correspondingly large response body. Expect it to grow with the store and size client-side buffers accordingly.

Pair with Import AI Suite to move a configured suite between devices, and use it as the backup step before any Delete AI Suite File.

Request Body

GraphQL Query

query ExportAISuite {
    ExportAISuite
}

Variables

{}

Response

Status: 200 OK

{
    "data": {
        "ExportAISuite": "UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA=="
    }
}

Import AI Suite

POST {{edgeUrl}}/analytics/v3

New in 4.3.x. Import an AI Suite archive produced by Export AI Suite. data is the same base64-encoded ZIP that export returns.

Response field Meaning
Written Names of the entries that were imported
Skipped Entries that were not imported, each with the Entry name and a Reason

The import is partial by design: a rejected entry does not fail the whole call. The mutation can return successfully with an empty Written list and everything in Skipped, so treat a 200 response as 'the archive was processed', not 'the archive was applied', and always inspect Skipped before considering a migration complete.

Entries land in the resource type recorded in the archive, so an export taken from one device restores into the matching namespaces on another.

Request Body

GraphQL Query

mutation ImportAISuite($data: String!) {
    ImportAISuite(data: $data) {
        Written
        Skipped {
            Entry
            Reason
        }
    }
}

Variables

{
  "data": "<base64-encoded ZIP, as returned by ExportAISuite>"
}

Test AI Suite MCP Server

POST {{edgeUrl}}/analytics/v3

New in 4.3.x. Connect to the MCP servers defined by one entry in the MCP resource type and report what each one exposes. Use it to confirm an MCP definition works before pointing an agent at it.

name is an entry under the MCP resource type specifically, as returned by Get AI Suite Files with resourceType: MCP. A single definition may declare several servers, which is why the query returns a list.

Response field Meaning
Name The server name from the definition
ServerUrl The URL that was contacted
Error Populated when that server could not be reached or refused the probe
Tools The tools the server advertises, each with Name and Description

Error is per server, so a healthy entry in the list sits alongside a failing one. Check Error on every element rather than assuming a successful response means every server is reachable; Tools is null for a server that failed.

A name that does not exist under MCP fails the whole query with extension code AISUITE_MCP_TEST_FAILED rather than returning an empty list.

Request Body

GraphQL Query

query TestAISuiteMCPServer($name: String!) {
    TestAISuiteMCPServer(name: $name) {
        Name
        ServerUrl
        Error
        Tools {
            Name
            Description
        }
    }
}

Variables

{
  "name": "maintenance-tools"
}

View this page as Markdown