Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. Convert UDTs which converts UDT members to normal tags when enabled
  2. Optimize UDTs which optimizes UDT Payloads sizes in NDATA and DDATA payloads when enabled
  3. Publish UDT Definitions which publishes the UDT definition in the NBIRTH payload when enabled
    Image Added
Note
If you have selected Convert UDTs to be true, then the Optimize UDTs and Publish UDT Definitions parameters will not be used


Tip
UDTs instances must be created at the Edge Node level or lower. Review Cloud Injector Tag Agents and Tag Trees to understand how the Sparkplug Identifiers are determined.

This document will show the effect on the message payload that these parameters have using the UDT example below:

...

In this scenario, the UDT tags are converted to normal tags in the DBIRTH, NBIRTH, DDATA or NDATA messages with the name comprising the UDT instance and the UDT tag, for example name: "Test_UDT/Int001", and associated dataType

...


{"topic":{"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","type":"NDEATH"},"payload":{"timestamp":1652121534156,"metrics":[{"name":"bdSeq","timestamp":1652121534156,"dataType":"Int64","value":0}],"seq":-1}}

...



{"topic":{"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","type":"NBIRTH"},"payload":{"timestamp":1652121535168,"metrics":[{"name":"bdSeq","timestamp":1652121535167,"dataType":"Int64","value":0}],"seq":0}}

...


{"topic":{"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","deviceId":"Tutorial_Device","type":"DBIRTH"},"payload":{"timestamp":1652121535168,"metrics":[{"name":"Test_UDT/Int001","timestamp":1652121535168,"dataType":"Int32","metaData":{},"properties":{"Quality":{"type":"Int32","value":192}},"value":10},{"name":"Test_UDT/Int003","timestamp":1652121535168,"dataType":"Int32","metaData":{},"properties":{"Quality":{"type":"Int32","value":192}},"value":30},{"name":"Test_UDT/Int002","timestamp":1652121535168,"dataType":"Int32","metaData":{},"properties":{"Quality":{"type":"Int32","value":192}},"value":20}],"seq":1}}

...


{"topic":"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","deviceId":"Tutorial_Device","type":"DDATA"},"payload":{"timestamp":1652121670904,"metrics":[{"name":"Test_UDT/Int001","timestamp":1652121669893,"dataType":"Int32","value":100}],"seq":2}}

...


{"topic":"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","deviceId":"Tutorial_Device","type":"DDATA"},"payload":{"timestamp":1652121707709,"metrics":[{"name":"Test_UDT/Int002","timestamp":1652121706702,"dataType":"Int32","value":200}],"seq":3}}


Example 2

Convert UDTs: False

...

In this scenario, the UDT tags are included in the DDATA or NDATA payloads with a dataType of Template and the tag name contained in the metaData

...


{"topic":{"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","type":"NDEATH"},"payload":{"timestamp":1652122108771,"metrics":[{"name":"bdSeq","timestamp":1652122108771,"dataType":"Int64","value":0}],"seq":-1}}

...


{"topic":{"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","type":"NBIRTH"},"payload":{"timestamp":1652122109797,"metrics":[{"name":"UDT001","timestamp":1652122109790,"dataType":"Template","value":{"isDefinition":true,"metrics":[{"name":"Int001","timestamp":1652121236868,"dataType":"Int32","metaData":{},"value":10},{"name":"Int002","timestamp":1652121244677,"dataType":"Int32","metaData":{},"value":20},{"name":"Int003","timestamp":1652121249789,"dataType":"Int32","metaData":{},"value":30}]}},{"name":"bdSeq","timestamp":1652122109795,"dataType":"Int64","value":0}],"seq":0}}

...


{"topic":"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","deviceId":"Tutorial_Device","type":"DBIRTH"},"payload":{"timestamp":1652122109797,"metrics":[{"name":"Test_UDT","timestamp":1652122109809,"dataType":"Template","metaData":{},"value":{"reference":"UDT001","isDefinition":false,"metrics":[{"name":"Int001","timestamp":1652122109797,"dataType":"Int32","metaData":{},"value":100},{"name":"Int002","timestamp":1652122109797,"dataType":"Int32","metaData":{},"value":400200},{"name":"Int003","timestamp":1652122109797,"dataType":"Int32","metaData":{},"value":300}]}}],"seq":1}}

...


{"topic":{"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","deviceId":"Tutorial_Device","type":"DDATA"},"payload":{"timestamp":1652122230548,"metrics":[{"name":"Test_UDT","timestamp":1652122229536,"dataType":"Template","metaData":{},"value":{"reference":"UDT001","isDefinition":false,"metrics":[{"name":"Int001","timestamp":1652122229536,"dataType":"Int32","metaData":{},"value":1000}]}}],"seq":2}}

...


{"topic":"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","deviceId":"Tutorial_Device","type":"DDATA"},"payload":{"timestamp":1652122234323,"metrics":[{"name":"Test_UDT","timestamp":1652122233319,"dataType":"Template","metaData":{},"value":{"reference":"UDT001","isDefinition":false,"metrics":[{"name":"Int002","timestamp":1652122233319,"dataType":"Int32","metaData":{},"value":2000}]}}],"seq":3}}


Example 3 

Convert UDTs: False

...

code
Note
It will be the responsibility of the client subscribing to this data to reconstruct as UDTs if required


{"topic":{"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","type":"NDEATH"},"payload":{"timestamp":1652122380765,"metrics":[{"name":"bdSeq","timestamp":1652122380765,"dataType":"Int64","value":0}],"seq":-1}}

...


{"topic":{"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","type":"NBIRTH"},"payload":{"timestamp":1652122381786,"metrics":[{"name":"UDT001","timestamp":1652122381778,"dataType":"Template","value":{"isDefinition":true,"metrics":[{"name":"Int001","timestamp":1652121236868,"dataType":"Int32","metaData":{},"value":10},{"name":"Int002","timestamp":1652121244677,"dataType":"Int32","metaData":{},"value":20},{"name":"Int003","timestamp":1652121249789,"dataType":"Int32","metaData":{},"value":30}]}},{"name":"bdSeq","timestamp":1652122381785,"dataType":"Int64","value":0}],"seq":0}}

...


{"topic":"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","deviceId":"Tutorial_Device","type":"DBIRTH"},"payload":{"timestamp":1652122381786,"metrics":[{"name":"Test_UDT","timestamp":1652122381790,"dataType":"Template","metaData":{},"value":{"reference":"UDT001","isDefinition":false,"metrics":[{"name":"Int001","timestamp":1652122381786,"dataType":"Int32","metaData":{},"value":1000},{"name":"Int002","timestamp":1652122381786,"dataType":"Int32","metaData":{},"value":2000},{"name":"Int003","timestamp":1652122381786,"dataType":"Int32","metaData":{},"value":300}]}}],"seq":1}}

...


{"topic":{"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","deviceId":"Tutorial_Device","type":"DDATA"},"payload":{"timestamp":1652122454226,"metrics":[{"name":"Test_UDT/Int003","timestamp":1652122453164,"dataType":"Int32","value":3000}],"seq":2}}

...


{"topic":{"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","deviceId":"Tutorial_Device","type":"DDATA"},"payload":{"timestamp":1652122457602,"metrics":[{"name":"Test_UDT/Int001","timestamp":1652122456594,"dataType":"Int32","value":100}],"seq":3}}

...


{"topic":{"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","deviceId":"Tutorial_Device","type":"DDATA"},"payload":{"timestamp":1652122558395,"metrics":[{"name":"Test_UDT/Int001","timestamp":1652122557388,"dataType":"Int32","value":1000}],"seq":4}}


Example 4 - NBIRTH message

Publish UDT Definition: False

...

True

{"topic":{"namespace":"spBv1.0","edgeNodeDescriptor":"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","type":"NBIRTH"},"payload":{"timestamp":

...

1652122381786,"metrics":[{"name":"

...

UDT001","timestamp":

...

1652122381778,"dataType":"

...

Template","value":{"isDefinition":

...

true,"

...

metrics":

...

[{"name":"Int001","

...

timestamp":

...

1652121236868,"

...

dataType":"

...

Int32","

...

metaData":

...

{},"

...

value":

...

10},{"name":"

...

Int002","timestamp":

...

1652121244677,"dataType":"

...

Int32","

...

metaData":{

...

},"

...

value":

...

20},{"name":"

...

Int003","timestamp":

...

1652121249789,"dataType":"Int32","metaData":{},"value":

...

30}]}},{"name":"

...

bdSeq","timestamp":

...

1652122381785,"dataType":"Int64","value":0}],"seq":0}}


Publish UDT Definition: False

{"topic":

...

{"namespace":"spBv1.0","

...

edgeNodeDescriptor":

...

"Tutorial_Group/Tutorial_Edge_Node","groupId":"Tutorial_Group","edgeNodeId":"Tutorial_Edge_Node","type":"NBIRTH"},"payload":{"timestamp":1652123286421,"metrics":[{"name":"bdSeq","timestamp":

...

1652123286417,"dataType":"Int64","value":0}],"seq":0}}

Tip
This functionality is useful if your UDT definitions do not frequently change and you can avoid the data overhead of including the UDT definition in the NBIRTH payload 

...