Reference: Advanced Techniques and Applications for building Unified Namespaces

What Does This Article Cover?

This article will provide a sample Intelligence Hub project file for viewers to import, demonstrating key functionality when building Unified Namespaces using the Intelligence Hub.

  • Preparation
  • Use Case: Replicating OPC UA Namespaces
  • Use Case: Templating Asset Data to a Transform Pipeline
  • Use Case: Templating Asset Data to a Buffer Pipeline
  • Use Case: Templating and Event Based Flows
  • Use Case: Connecting and Conditioning ERP Data
  • Summary

Preparation

  • It is recommended to install the Intelligence Hub as close to the data source(s) as possible, this will ensure reliable access to the source data and enable the usage of Store and Forward. If the factory network has communication issues to the output target, Intelligence Hub will buffer the data locally to a SQLite database and forward the data when the output target is healthy again. This is a key benefit to deploying Intelligence Hub at the edge.

  • Enable Intelligence Hub MQTT broker

    • In the left-hand navigation panel, navigate to Manage, and click Settings
    • Under the MQTT Broker section enable the broker, if ports 1885 and 1886 are in use on the server hosting your Intelligence Hub, update to ports of your choosing, otherwise accept the defaults and click save
  • Import the required Project

    • In the left-hand navigation panel, navigate to Manage, and click Project

    • Within the Import screen, ensure Full Project is off (otherwise your existing project will be overwritten)

    • Change the Import Type to JSON and paste the following code block into the Project box and click the import button

      {
      	"productInfo": {
      		"company": "Highbyte",
      		"product": "IntelligenceHub",
      		"version": "3.4.0",
      		"build": "2024.2.16.51",
      		"stage": "Beta"
      	},
      	"project": {
      		"version": 7,
      		"connections": [
      			{
      				"name": "MQTT",
      				"uri": "mqtt://0.0.0.0:3198",
      				"tags": [
      					"Adv_UNS"
      				],
      				"writes": {
      					"flattenModeledValues": false
      				},
      				"storeForward": {
      					"enabled": false,
      					"maxEntries": 100,
      					"waitOnFailureInterval": {
      						"duration": 1,
      						"units": "Seconds"
      					}
      				},
      				"settings": {
      					"connectionTimeoutSeconds": 10,
      					"keepAliveSeconds": 60,
      					"requestTimeoutMS": 5000,
      					"cleanSession": true,
      					"ssl": false,
      					"redundantBrokers": [],
      					"inputDiscovery": ""
      				}
      			},
      			{
      				"name": "OPC_UA",
      				"uri": "opc.tcp://52.10.6.4:49320",
      				"tags": [
      					"Adv_UNS"
      				],
      				"writes": {
      					"flattenModeledValues": false
      				},
      				"subscriptions": {
      					"subscriptionRate": {
      						"duration": 1,
      						"units": "Seconds"
      					}
      				},
      				"storeForward": {
      					"enabled": false,
      					"maxEntries": 100,
      					"waitOnFailureInterval": {
      						"duration": 1,
      						"units": "Seconds"
      					}
      				},
      				"settings": {
      					"security": "None",
      					"authentication": {
      						"type": "Anonymous"
      					},
      					"connectTimeoutSeconds": 5,
      					"requestTimeoutMS": 5000,
      					"maxItemsPerRead": 512,
      					"maxItemsPerWrite": 256,
      					"sessionName": ""
      				}
      			},
      			{
      				"name": "SAP_Hana_REST",
      				"uri": "rest.client://Connection_SAP_HANA_REST_Client_Connection_Demo",
      				"tags": [
      					"Adv_UNS"
      				],
      				"writes": {
      					"flattenModeledValues": false
      				},
      				"storeForward": {
      					"enabled": true,
      					"maxEntries": 100,
      					"waitOnFailureInterval": {
      						"duration": 1,
      						"units": "Seconds"
      					}
      				},
      				"settings": {
      					"authentication": {
      						"type": "None"
      					},
      					"baseURL": "https://sandbox.api.sap.com:443"
      				}
      			},
      			{
      				"name": "SQL_CMMS",
      				"uri": "jdbc.sqlserver://52.10.6.4:1433",
      				"tags": [
      					"Adv_UNS"
      				],
      				"writes": {
      					"flattenModeledValues": false
      				},
      				"storeForward": {
      					"enabled": false,
      					"maxEntries": 100,
      					"waitOnFailureInterval": {
      						"duration": 1,
      						"units": "Seconds"
      					}
      				},
      				"settings": {
      					"database": "serviceinfo",
      					"username": "highbyte"
      				}
      			}
      		],
      		"inputs": [
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_All_Assets_Collection_Templated",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"type": "Collection",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					},
      					"ignoreBadQuality": false,
      					"collection": [
      						{
      							"identifierType": "String",
      							"name": "CNC_{{this.AssetID}}_AssetID",
      							"namespaceIndex": "2",
      							"identifier": "Tutorial.CNC_{{this.AssetID}}.AssetID"
      						},
      						{
      							"identifierType": "String",
      							"name": "CNC_{{this.AssetID}}_CuttingSpeed",
      							"namespaceIndex": "2",
      							"identifier": "Tutorial.CNC_{{this.AssetID}}.CuttingSpeed"
      						},
      						{
      							"identifierType": "String",
      							"name": "CNC_{{this.AssetID}}_MachineTemperature",
      							"namespaceIndex": "2",
      							"identifier": "Tutorial.CNC_{{this.AssetID}}.MachineTemperature"
      						},
      						{
      							"identifierType": "String",
      							"name": "CNC_{{this.AssetID}}_PowerCurrent",
      							"namespaceIndex": "2",
      							"identifier": "Tutorial.CNC_{{this.AssetID}}.PowerCurrent"
      						},
      						{
      							"identifierType": "String",
      							"identifier": "Tutorial.CNC_{{this.AssetID}}.FeedRate",
      							"name": "CNC_{{this.AssetID}}_FeedRate",
      							"namespaceIndex": "2"
      						}
      					]
      				},
      				"cacheLifetime": {
      					"enabled": false
      				},
      				"template": {
      					"name": "{{this.AssetID}}",
      					"type": "Static",
      					"params": {
      						"AssetID": "Fanuc_1001"
      					}
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_AirPressure",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.AirPressure",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_AssetID",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.AssetID",
      					"type": "Tag",
      					"dataType": "String",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					},
      					"isComplex": false
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_AxisPositionX",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.AxisPositionX",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_AxisPositionY",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.AxisPositionY",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_AxisPositionZ",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.AxisPositionZ",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_CoolantpH",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.CoolantpH",
      					"type": "Tag",
      					"dataType": "Int16",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_CuttingSpeed",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.CuttingSpeed",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_FaultCode",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.FaultCode",
      					"type": "Tag",
      					"dataType": "Int16",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_FeedRate",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.FeedRate",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_MachineState",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.MachineState",
      					"type": "Tag",
      					"dataType": "Int16",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_MachineTemperature",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.MachineTemperature",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_PartProgramID",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.PartProgramID",
      					"type": "Tag",
      					"dataType": "String",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_PowerCurrent",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.PowerCurrent",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_PowerCurrentXAxis",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.PowerCurrentXAxis",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_PowerCurrentYAxis",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.PowerCurrentYAxis",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_PowerCurrentZAxis",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.PowerCurrentZAxis",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_ProductionCount",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.ProductionCount",
      					"type": "Tag",
      					"dataType": "Int16",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_RejectCount",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.RejectCount",
      					"type": "Tag",
      					"dataType": "Int16",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_SpindleLoad",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.SpindleLoad",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_SpindleSpeed",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.SpindleSpeed",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_SpindleTemperature",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.SpindleTemperature",
      					"type": "Tag",
      					"dataType": "Real32",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_StateDescription",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.StateDescription",
      					"type": "Tag",
      					"dataType": "String",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_ToolID",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_Fanuc_1001.ToolID",
      					"type": "Tag",
      					"dataType": "String",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_CNC_MachineState_Templated",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_{{this.AssetID}}.MachineState",
      					"type": "Tag",
      					"dataType": "Int16",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				},
      				"template": {
      					"name": "{{this.AssetID}}",
      					"type": "Dynamic",
      					"reference": "{{Connection.SQL_CMMS.Connection_SQL_Server_Input_CNC_Solution_All_CNC_Machines_AssetIDs}}"
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_CNC_PartProgramID_Templated",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_{{this.AssetID}}.PartProgramID",
      					"type": "Tag",
      					"dataType": "Int16",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				},
      				"template": {
      					"name": "{{this.AssetID}}",
      					"type": "Static",
      					"params": {
      						"AssetID": "Fanuc_1001"
      					}
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_CNC_ProductionCount_Templated",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_{{this.AssetID}}.ProductionCount",
      					"type": "Tag",
      					"dataType": "Int16",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				},
      				"template": {
      					"name": "{{this.AssetID}}",
      					"type": "Static",
      					"params": {
      						"AssetID": "Fanuc_1001"
      					}
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_CNC_RejectCount_Templated",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_{{this.AssetID}}.RejectCount",
      					"type": "Tag",
      					"dataType": "Int16",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				},
      				"template": {
      					"name": "{{this.AssetID}}",
      					"type": "Static",
      					"params": {
      						"AssetID": "Fanuc_1001"
      					}
      				}
      			},
      			{
      				"name": "Connection_OPC_UA_Input_CNC_Solution_Fanuc_CNC_ToolID_Templated",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Tutorial.CNC_{{this.AssetID}}.ToolID",
      					"type": "Tag",
      					"dataType": "Int16",
      					"samplingInterval": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"cacheLifetime": {
      					"enabled": false
      				},
      				"template": {
      					"name": "{{this.AssetID}}",
      					"type": "Static",
      					"params": {
      						"AssetID": "Fanuc_1001"
      					}
      				}
      			},
      			{
      				"name": "Fanuc",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Fanuc",
      					"dataType": "Auto",
      					"type": "Branch"
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "INJECT1",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "INJECT1",
      					"dataType": "Auto",
      					"type": "Branch"
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Packaging",
      				"connection": "OPC_UA",
      				"type": "opc.tcp",
      				"qualifier": {
      					"namespaceIndex": 2,
      					"identifierType": "String",
      					"identifier": "Packaging",
      					"dataType": "Auto",
      					"type": "Branch"
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Maintenance_Orders",
      				"connection": "SAP_Hana_REST",
      				"type": "rest.client",
      				"qualifier": {
      					"acceptType": "application/json",
      					"method": "GET",
      					"includeMetadata": false,
      					"endpointURL": "/s4hanacloud/sap/opu/odata/sap/API_MAINTENANCEORDER/MaintenanceOrder?$top=10&$inlinecount=allpages",
      					"header": [
      						{
      							"name": "APIKey",
      							"value": "6P70W19kuYACqpo4USPAqYpaSGwR0t8y"
      						}
      					],
      					"isFile": false
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "All_CNC_Machines_AssetIDs",
      				"connection": "SQL_CMMS",
      				"type": "jdbc.sqlserver",
      				"qualifier": {
      					"query": "SELECT [dbo].[cmms_servicelogs].[asset_id] AS 'AssetID' FROM [dbo].[cmms_servicelogs] WHERE [dbo].[cmms_servicelogs].[asset_type] = 'CNC'"
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_SQL_Server_Input_CNC_Solution_All_Service_Records",
      				"connection": "SQL_CMMS",
      				"type": "jdbc.sqlserver",
      				"qualifier": {
      					"query": "SELECT * FROM [dbo].[cmms_servicelogs]"
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			},
      			{
      				"name": "Connection_SQL_Server_Input_CNC_Solution_All_Service_Records_All_CNCs_Templated",
      				"connection": "SQL_CMMS",
      				"type": "jdbc.sqlserver",
      				"qualifier": {
      					"query": "SELECT * FROM [dbo].[cmms_servicelogs] WHERE [dbo].[cmms_servicelogs].[asset_id] = '{{this.AssetID}}'"
      				},
      				"cacheLifetime": {
      					"enabled": false
      				},
      				"template": {
      					"name": "{{this.AssetID}}",
      					"type": "Static",
      					"params": {
      						"AssetID": "Fanuc_1001"
      					}
      				}
      			},
      			{
      				"name": "Dynamic_Input_CNC",
      				"connection": "SQL_CMMS",
      				"type": "jdbc.sqlserver",
      				"qualifier": {
      					"query": "SELECT * FROM [dbo].[cmms_servicelogs] where [dbo].[cmms_servicelogs].[asset_id] = '{{Connection.OPC_UA.Connection_OPC_UA_Input_CNC_Solution_Fanuc_1001_AssetID}}'"
      				},
      				"cacheLifetime": {
      					"enabled": false
      				}
      			}
      		],
      		"outputs": [
      			{
      				"name": "MQTT_CNC_Original",
      				"connection": "MQTT",
      				"type": "mqtt",
      				"qualifier": {
      					"qos": 0,
      					"namedRoot": false,
      					"breakupArrays": true,
      					"topic": "Enterprise/Site-1/Area-1/Line-1/Assets/{{this.ProcessData.AssetType}}/{{this.ProcessData.AssetID}}/Original_Payload",
      					"retained": false
      				}
      			},
      			{
      				"name": "On_State_Change_Program",
      				"connection": "MQTT",
      				"type": "mqtt",
      				"qualifier": {
      					"qos": 0,
      					"namedRoot": false,
      					"breakupArrays": true,
      					"topic": "Enterprise/Site-1/Area-1/Line-1/On_State_Change/{{this.AssetID}}",
      					"retained": false,
      					"filterList": []
      				}
      			},
      			{
      				"name": "SAP_Output",
      				"connection": "MQTT",
      				"type": "mqtt",
      				"qualifier": {
      					"qos": 0,
      					"namedRoot": false,
      					"breakupArrays": true,
      					"topic": "Enterprise/Site-1/Area-1/Line-1/Maintenance/{{this.Work_Center}}/{{this.Maintenance_Order}}",
      					"retained": false
      				}
      			}
      		],
      		"modeling": {
      			"models": [
      				{
      					"name": "CNC_Machine_Process_Data_Model",
      					"tags": [
      						"Adv_UNS"
      					],
      					"attributes": [
      						{
      							"name": "AssetID",
      							"type": "String",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "AssetType",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "Temperature",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "Temperature_UOM",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "CuttingSpeed",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "PowerCurrent",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "FeedRate",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "LastServiceDate",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "LastServiceNotes",
      							"type": "Any",
      							"array": false,
      							"required": false
      						}
      					]
      				},
      				{
      					"name": "CNC_Machine_Production_Data_Model",
      					"tags": [
      						"Adv_UNS"
      					],
      					"attributes": [
      						{
      							"name": "AssetID",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "ProgramID",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "ToolID",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "MachineState",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "ProductionCount",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "RejectCount",
      							"type": "Any",
      							"array": false,
      							"required": false
      						}
      					]
      				},
      				{
      					"name": "CNC_Machine_Simple_Model",
      					"tags": [
      						"Adv_UNS"
      					],
      					"attributes": [
      						{
      							"name": "Enterprise",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "Site",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "Area",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "Line",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "ProcessData",
      							"type": "Any",
      							"array": false,
      							"required": false
      						}
      					]
      				},
      				{
      					"name": "Maintenance_Order_Model",
      					"tags": [
      						"Adv_UNS"
      					],
      					"attributes": [
      						{
      							"name": "Maintenance_Order",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "Maintenance_Order_Description",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "Work_Center",
      							"type": "Any",
      							"array": false,
      							"required": false
      						},
      						{
      							"name": "Equipment_Name",
      							"type": "Any",
      							"array": false,
      							"required": false
      						}
      					]
      				}
      			],
      			"instances": [
      				{
      					"name": "CNC_Fanuc_Templated_Child_Instance",
      					"tags": [
      						"Adv_UNS"
      					],
      					"model": "CNC_Machine_Process_Data_Model",
      					"rootValueAs": "Object",
      					"attributes": [
      						{
      							"name": "AssetID",
      							"expression": "{{Connection.OPC_UA.Connection_OPC_UA_Input_CNC_Solution_All_Assets_Collection_Templated(AssetID={{this.AssetID}})}}.CNC_{{this.AssetID}}_AssetID"
      						},
      						{
      							"name": "AssetType",
      							"default": "CNC"
      						},
      						{
      							"name": "Temperature",
      							"expression": "({{Connection.OPC_UA.Connection_OPC_UA_Input_CNC_Solution_All_Assets_Collection_Templated(AssetID={{this.AssetID}})}}.CNC_{{this.AssetID}}_MachineTemperature-32)*.5556"
      						},
      						{
      							"name": "Temperature_UOM",
      							"default": "C"
      						},
      						{
      							"name": "CuttingSpeed",
      							"expression": "{{Connection.OPC_UA.Connection_OPC_UA_Input_CNC_Solution_All_Assets_Collection_Templated(AssetID={{this.AssetID}})}}.CNC_{{this.AssetID}}_CuttingSpeed"
      						},
      						{
      							"name": "PowerCurrent",
      							"expression": "{{Connection.OPC_UA.Connection_OPC_UA_Input_CNC_Solution_All_Assets_Collection_Templated(AssetID={{this.AssetID}})}}.CNC_{{this.AssetID}}_PowerCurrent"
      						},
      						{
      							"name": "FeedRate",
      							"expression": "{{Connection.OPC_UA.Connection_OPC_UA_Input_CNC_Solution_All_Assets_Collection_Templated(AssetID={{this.AssetID}})}}.CNC_{{this.AssetID}}_FeedRate"
      						},
      						{
      							"name": "LastServiceDate",
      							"expression": "{{Connection.SQL_CMMS.Connection_SQL_Server_Input_CNC_Solution_All_Service_Records_All_CNCs_Templated(AssetID={{this.AssetID}})}}[0].date"
      						},
      						{
      							"name": "LastServiceNotes",
      							"expression": "{{Connection.SQL_CMMS.Connection_SQL_Server_Input_CNC_Solution_All_Service_Records_All_CNCs_Templated(AssetID={{this.AssetID}})}}[0].notes"
      						}
      					],
      					"template": {
      						"name": "{{this.AssetID}}",
      						"type": "Static",
      						"params": {
      							"AssetID": "Fanuc_1001"
      						}
      					}
      				},
      				{
      					"name": "CNC_Machine_Instance",
      					"tags": [
      						"Adv_UNS"
      					],
      					"model": "CNC_Machine_Simple_Model",
      					"rootValueAs": "Object",
      					"attributes": [
      						{
      							"name": "Enterprise",
      							"default": "Enterprise"
      						},
      						{
      							"name": "Site",
      							"default": "Site-1"
      						},
      						{
      							"name": "Area",
      							"default": "Area-1"
      						},
      						{
      							"name": "Line",
      							"default": "Line-1"
      						},
      						{
      							"name": "ProcessData",
      							"expression": "{{Instance.CNC_Fanuc_Templated_Child_Instance(AssetID={{this.AssetID}})}}"
      						}
      					],
      					"template": {
      						"name": "{{this.AssetID}}",
      						"type": "Static",
      						"params": {
      							"AssetID": "Fanuc_1001"
      						}
      					}
      				},
      				{
      					"name": "CNC_Solution_CNC_Machine_Production_Data_Templated_Instance",
      					"tags": [
      						"Adv_UNS"
      					],
      					"model": "CNC_Machine_Production_Data_Model",
      					"rootValueAs": "Object",
      					"attributes": [
      						{
      							"name": "AssetID",
      							"default": "{{this.AssetID}}"
      						},
      						{
      							"name": "ProgramID",
      							"expression": "{{Connection.OPC_UA.Connection_OPC_UA_Input_CNC_Solution_Fanuc_CNC_PartProgramID_Templated(AssetID={{this.AssetID}})}}"
      						},
      						{
      							"name": "ToolID",
      							"expression": "{{Connection.OPC_UA.Connection_OPC_UA_Input_CNC_Solution_Fanuc_CNC_ToolID_Templated(AssetID={{this.AssetID}})}}"
      						},
      						{
      							"name": "MachineState",
      							"expression": "{{Connection.OPC_UA.Connection_OPC_UA_Input_CNC_Solution_Fanuc_CNC_MachineState_Templated(AssetID={{this.AssetID}})}}"
      						},
      						{
      							"name": "ProductionCount",
      							"expression": "{{Connection.OPC_UA.Connection_OPC_UA_Input_CNC_Solution_Fanuc_CNC_ProductionCount_Templated(AssetID={{this.AssetID}})}}"
      						},
      						{
      							"name": "RejectCount",
      							"expression": "{{Connection.OPC_UA.Connection_OPC_UA_Input_CNC_Solution_Fanuc_CNC_RejectCount_Templated(AssetID={{this.AssetID}})}}"
      						}
      					],
      					"template": {
      						"name": "{{this.AssetID}}",
      						"type": "Dynamic",
      						"reference": "{{Connection.SQL_CMMS.All_CNC_Machines_AssetIDs}}"
      					}
      				},
      				{
      					"name": "Maintenance_Order_Instance",
      					"tags": [
      						"Adv_UNS"
      					],
      					"model": "Maintenance_Order_Model",
      					"rootValueAs": "Array",
      					"attributes": [
      						{
      							"name": "Maintenance_Order",
      							"expression": "{{Condition.Condition_SAP_HANA_Maintenance_Order.Connection_SAP_Hana_REST_Maintenance_Orders}}[0].MaintenanceOrder"
      						},
      						{
      							"name": "Maintenance_Order_Description",
      							"expression": "{{Condition.Condition_SAP_HANA_Maintenance_Order.Connection_SAP_Hana_REST_Maintenance_Orders}}[0].MaintenanceOrderDesc"
      						},
      						{
      							"name": "Work_Center",
      							"expression": "{{Condition.Condition_SAP_HANA_Maintenance_Order.Connection_SAP_Hana_REST_Maintenance_Orders}}[0].MainWorkCenter"
      						},
      						{
      							"name": "Equipment_Name",
      							"expression": "{{Condition.Condition_SAP_HANA_Maintenance_Order.Connection_SAP_Hana_REST_Maintenance_Orders}}[0].EquipmentName"
      						}
      					]
      				}
      			]
      		},
      		"flows": [
      			{
      				"name": "Asset_Templated_Flow",
      				"tags": [
      					"Adv_UNS"
      				],
      				"inReferences": [
      					"{{Instance.CNC_Machine_Instance(AssetID={{this.AssetID}})}}"
      				],
      				"outReferences": [
      					"{{Pipeline.Pipeline_Asset_Transforms}}",
      					"{{Pipeline.Pipeline_Asset_Buffer}}"
      				],
      				"enabled": true,
      				"publishMode": "All",
      				"trigger": {
      					"type": "Polled",
      					"interval": {
      						"duration": 10,
      						"units": "Seconds"
      					},
      					"mode": "Always",
      					"expression": "{{Connection.OPC_UA.Connection_OPC_UA_Input_CNC_Solution_Fanuc_CNC_MachineState_Templated(AssetID={{this.AssetID}})}}",
      					"delay": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				},
      				"template": {
      					"name": "{{this.AssetID}}",
      					"type": "Dynamic",
      					"reference": "{{Connection.SQL_CMMS.All_CNC_Machines_AssetIDs}}"
      				}
      			},
      			{
      				"name": "CNC_Event_Based_Flow",
      				"tags": [
      					"Adv_UNS"
      				],
      				"inReferences": [
      					"{{Instance.CNC_Solution_CNC_Machine_Production_Data_Templated_Instance(AssetID={{this.AssetID}})}}"
      				],
      				"outReferences": [
      					"{{Connection.MQTT.On_State_Change_Program}}"
      				],
      				"enabled": true,
      				"publishMode": "All",
      				"trigger": {
      					"type": "Exception",
      					"interval": {
      						"duration": 1,
      						"units": "Seconds"
      					},
      					"mode": "OnChange",
      					"expression": "{{Connection.OPC_UA.Connection_OPC_UA_Input_CNC_Solution_Fanuc_CNC_MachineState_Templated(AssetID={{this.AssetID}})}}",
      					"delay": {
      						"duration": 1,
      						"units": "Seconds"
      					}
      				},
      				"template": {
      					"name": "{{this.AssetID}}",
      					"type": "Dynamic",
      					"reference": "{{Connection.SQL_CMMS.All_CNC_Machines_AssetIDs}}"
      				}
      			},
      			{
      				"name": "Maintenance_Order_Flow",
      				"tags": [
      					"Adv_UNS"
      				],
      				"inReferences": [
      					"{{Instance.Maintenance_Order_Instance}}"
      				],
      				"outReferences": [
      					"{{Connection.MQTT.SAP_Output}}"
      				],
      				"enabled": true,
      				"publishMode": "All",
      				"trigger": {
      					"type": "Polled",
      					"interval": {
      						"duration": 1,
      						"units": "Minutes"
      					},
      					"mode": "Always",
      					"delay": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				}
      			},
      			{
      				"name": "OPC_UA_Edge_Flow",
      				"tags": [
      					"Adv_UNS"
      				],
      				"inReferences": [
      					"{{Connection.OPC_UA.Fanuc}}",
      					"{{Connection.OPC_UA.INJECT1}}",
      					"{{Connection.OPC_UA.Packaging}}"
      				],
      				"outReferences": [
      					"{{Pipeline.Pipeline_OPC_UA_Breakup}}"
      				],
      				"enabled": true,
      				"publishMode": "All",
      				"trigger": {
      					"type": "Polled",
      					"interval": {
      						"duration": 1,
      						"units": "Minutes"
      					},
      					"mode": "Always",
      					"delay": {
      						"duration": 0,
      						"units": "Seconds"
      					}
      				}
      			}
      		],
      		"conditions": [
      			{
      				"name": "Condition_SAP_HANA_Maintenance_Order",
      				"uri": "condition.custom",
      				"tags": [
      					"Adv_UNS"
      				],
      				"settings": {
      					"inReferences": [
      						"{{Connection.SAP_Hana_REST.Maintenance_Orders}}"
      					],
      					"expression": "var payload = {{this.currentValue}}.d;\r\npayload.results"
      				}
      			}
      		],
      		"functions": [],
      		"tags": [
      			{
      				"name": "Adv_UNS"
      			}
      		],
      		"pipelines": [
      			{
      				"name": "Pipeline_Asset_Buffer",
      				"uri": "pipeline",
      				"tags": [
      					"Adv_UNS"
      				],
      				"settings": {
      					"inputStages": [
      						"Flatten"
      					],
      					"stages": [
      						{
      							"name": "Transform_Set_Metadata",
      							"config": {
      								"type": ".TransformConfig",
      								"transformExpression": "stage.setMetadata(\"ProcessData_AssetID\",event.value.ProcessData_AssetID);\r\nstage.setMetadata(\"ProcessData_AssetType\",event.value.ProcessData_AssetType);\r\nstage.setMetadata(\"Enterprise\",event.value.Enterprise);\r\nstage.setMetadata(\"Site\",event.value.Site);\r\nstage.setMetadata(\"Area\",event.value.Area);\r\nstage.setMetadata(\"Line\",event.value.Line);"
      							},
      							"outputs": [
      								"Time_Buffer_60_Seconds"
      							],
      							"display": {
      								"position": {
      									"x": 0,
      									"y": 300
      								}
      							}
      						},
      						{
      							"name": "Time_Buffer_60_Seconds",
      							"config": {
      								"type": ".TimedBufferConfig",
      								"windowExpression": "stage.setBufferKey(event.value.ProcessData_AssetID);",
      								"windowInterval": {
      									"duration": 60,
      									"units": "Seconds"
      								}
      							},
      							"outputs": [
      								"Write_Buffered_Payload_To_MQTT"
      							],
      							"display": {
      								"position": {
      									"x": 0,
      									"y": 450
      								}
      							}
      						},
      						{
      							"name": "Write_Buffered_Payload_To_MQTT",
      							"config": {
      								"type": ".DynamicWriteConfig",
      								"connectionReference": "{{Connection.MQTT}}",
      								"qualifier": {
      									"topic": "{{event.metadata.Enterprise}}/{{event.metadata.Site}}/{{event.metadata.Area}}/{{event.metadata.Line}}/Assets/{{event.metadata.ProcessData_AssetType}}/{{event.metadata.bufferKey}}/Buffered_Payload",
      									"qos": 0,
      									"namedRoot": false,
      									"retained": true,
      									"breakupArrays": false,
      									"filterList": [
      										"_name",
      										"_model",
      										"_timestamp"
      									]
      								},
      								"qualifierExpression": ""
      							},
      							"outputs": [],
      							"display": {
      								"position": {
      									"x": 0,
      									"y": 600
      								}
      							}
      						},
      						{
      							"name": "Flatten",
      							"config": {
      								"type": ".FlattenConfig",
      								"delimiter": "_"
      							},
      							"outputs": [
      								"Transform_Set_Metadata"
      							],
      							"display": {
      								"position": {
      									"x": 0,
      									"y": 150
      								}
      							}
      						}
      					],
      					"trackActivity": false
      				}
      			},
      			{
      				"name": "Pipeline_Asset_Transforms",
      				"uri": "pipeline",
      				"tags": [
      					"Adv_UNS"
      				],
      				"settings": {
      					"inputStages": [
      						"WriteOriginal",
      						"Flatten"
      					],
      					"stages": [
      						{
      							"name": "Flatten",
      							"config": {
      								"type": ".FlattenConfig",
      								"delimiter": "_"
      							},
      							"outputs": [
      								"Transform"
      							],
      							"display": {
      								"position": {
      									"x": 0,
      									"y": 150
      								}
      							}
      						},
      						{
      							"name": "Write_Flattened_Payload_To_MQTT",
      							"config": {
      								"type": ".DynamicWriteConfig",
      								"connectionReference": "{{Connection.MQTT}}",
      								"qualifier": {
      									"topic": "Enterprise/Site-1/Area-1/Line-1/Assets/{{event.metadata.ProcessData_AssetType}}/{{event.metadata.ProcessData_AssetID}}/Flattened_Payload",
      									"qos": 0,
      									"namedRoot": false,
      									"retained": false,
      									"breakupArrays": false,
      									"filterList": [
      										"_name",
      										"_model",
      										"_timestamp"
      									]
      								},
      								"qualifierExpression": ""
      							},
      							"outputs": [
      								"Breakup_Payload"
      							],
      							"display": {
      								"position": {
      									"x": 0,
      									"y": 450
      								}
      							}
      						},
      						{
      							"name": "Breakup_Payload",
      							"config": {
      								"type": ".BreakupConfig",
      								"breakupType": "all"
      							},
      							"outputs": [
      								"Write_Broken_Up_Payload_To_MQTT"
      							],
      							"display": {
      								"position": {
      									"x": 0,
      									"y": 600
      								}
      							}
      						},
      						{
      							"name": "Write_Broken_Up_Payload_To_MQTT",
      							"config": {
      								"type": ".DynamicWriteConfig",
      								"connectionReference": "{{Connection.MQTT}}",
      								"qualifier": {
      									"topic": "Enterprise/Site-1/Area-1/Line-1/Assets/{{event.metadata.ProcessData_AssetType}}/{{event.metadata.ProcessData_AssetID}}/Broken_Up_Payload/{{event.metadata.breakupName}}",
      									"qos": 0,
      									"namedRoot": false,
      									"retained": false,
      									"breakupArrays": false,
      									"filterList": [
      										"_name",
      										"_model",
      										"_timestamp"
      									]
      								},
      								"qualifierExpression": ""
      							},
      							"outputs": [],
      							"display": {
      								"position": {
      									"x": 0,
      									"y": 750
      								}
      							}
      						},
      						{
      							"name": "Transform",
      							"config": {
      								"type": ".TransformConfig",
      								"transformExpression": "stage.setMetadata(\"ProcessData_AssetID\",event.value.ProcessData_AssetID);\r\nstage.setMetadata(\"ProcessData_AssetType\",event.value.ProcessData_AssetType);"
      							},
      							"outputs": [
      								"Write_Flattened_Payload_To_MQTT"
      							],
      							"display": {
      								"position": {
      									"x": 0,
      									"y": 300
      								}
      							}
      						},
      						{
      							"name": "WriteOriginal",
      							"config": {
      								"type": ".WriteConfig",
      								"references": [
      									"{{Connection.MQTT.MQTT_CNC_Original}}"
      								]
      							},
      							"outputs": [],
      							"display": {
      								"position": {
      									"x": 325,
      									"y": 150
      								}
      							}
      						}
      					],
      					"trackActivity": false
      				}
      			},
      			{
      				"name": "Pipeline_OPC_UA_Breakup",
      				"uri": "pipeline",
      				"tags": [
      					"Adv_UNS"
      				],
      				"settings": {
      					"inputStages": [
      						"Flatten"
      					],
      					"trackActivity": false,
      					"stages": [
      						{
      							"name": "Breakup",
      							"outputs": [
      								"WriteNewTarget"
      							],
      							"config": {
      								"type": ".BreakupConfig",
      								"breakupType": "all"
      							},
      							"display": {
      								"position": {
      									"x": 0,
      									"y": 450
      								}
      							}
      						},
      						{
      							"name": "WriteNewTarget",
      							"outputs": [],
      							"config": {
      								"type": ".DynamicWriteConfig",
      								"connectionReference": "{{Connection.MQTT}}",
      								"qualifier": {
      									"qos": 0,
      									"namedRoot": false,
      									"retained": false,
      									"topic": "Enterprise/Site-1/Area-1/Line-1/OPC_UA_Edge/{{event.metadata.breakupName}}",
      									"breakupArrays": false
      								},
      								"qualifierExpression": ""
      							},
      							"display": {
      								"position": {
      									"x": 0,
      									"y": 600
      								}
      							}
      						},
      						{
      							"name": "Flatten",
      							"outputs": [
      								"Breakup"
      							],
      							"config": {
      								"type": ".FlattenConfig",
      								"delimiter": "/"
      							},
      							"display": {
      								"position": {
      									"x": 0,
      									"y": 300
      								}
      							}
      						}
      					]
      				}
      			}
      		]
      	},
      	"network": {
      		"groups": [],
      		"hubs": []
      	}
      }
  • Update the imported Connections as required

    • Navigate to Configure and click Connections, Click MQTT and Update the MQTT settings as required based on the prior preparation step #1

    • Navigate to Configure and click Connections, Click “SQL_CMMS” and type the following within the password field and click Save:

      password
  • Setup UNS Client

    • In the left-hand navigation panel, navigate to Tools and right click UNS client and open Link in New Tab
    • Enter login information
    • For Connection select MQTT, leave the default subscribe topic (wildcard #)
    • Click Connect
    • Confirm UNS client says “Connected to MQTT”
    • Return to the previous tab

Use Case: Replicating OPC UA Namespaces:

This use case showcases how Intelligence Hub can easily replicate existing source systems to a Unified Namespace. We are not modeling our data, we are replicating the source OPC UA data to MQTT using Pipelines. Users may elect to output this data to a functional sub-topic named “Raw_Namespace” indicating to users this is unmodeled and unstructured.

  1. Navigate to Flow “OPC_UA_Edge_Flow” and note the sources are direct branches from our OPC_UA connection.
  2. Click one of the Source branches, test Input and review the results.

OPC_UA “Branch” input type has two key settings: Max Branch Depth (many levels under the identifier to read) and Cache Interval (how often does the branch structure refresh to reflect new or removed tags).

  1. Navigate to Pipeline “Pipeline_OPC_UA_Breakup”.

  2. The first stage in Pipeline “Pipeline_OPC_UA_Breakup” is a Flatten stage, this flattens any complex JSON hierarchies into a flatten object.

    Original:
    {
    	"_name": "Packaging",
    	"_model": "ComplexData",
    	"_timestamp": 1711634379957,
    	"_Statistics": {
    		"_FailedReads": 0,
    		"_FailedWrites": 0,
    		"_MaxPendingReads": 0,
    		"_MaxPendingWrites": 0,
    		"_NextReadPriority": 0,
    		"_PendingReads": 0,
    		"_PendingWrites": 0,
    		"_Reset": false,
    		"_RxBytes": 0,
    		"_SuccessfulReads": 0,
    		"_SuccessfulWrites": 0,
    		"_TxBytes": 0
    	},
    	"_System": {
    		"_Description": null,
    		"_EnableDiagnostics": false,
    		"_FloatHandlingType": "Replaced with zero",
    		"_WriteOptimizationDutyCycle": 10
    	},
    	"InjectionMolding1": {
    		"_System": {
    			"_ActiveTagCount": 3,
    			"_DemandPoll": false,
    			"_Description": null,
    			"_DeviceId": "1",
    			"_Enabled": true,
    			"_Error": false,
    			"_NoError": true,
    			"_ScanMode": "UseClientRate",
    			"_ScanRateMs": 1000,
    			"_SecondsInError": 0,
    			"_Simulated": false
    		},
    		"MachineID": "MACHINE1",
    		"PressSpeed": 21.9,
    		"ProductID": 10003,
    		"Temperature": 75,
    		"TimeInOperation": 17568737
    	},
    	"InjectionMolding2": {
    		"_System": {
    			"_ActiveTagCount": 1,
    			"_DemandPoll": false,
    			"_Description": null,
    			"_DeviceId": "1",
    			"_Enabled": true,
    			"_Error": false,
    			"_NoError": true,
    			"_ScanMode": "UseClientRate",
    			"_ScanRateMs": 1000,
    			"_SecondsInError": 0,
    			"_Simulated": false
    		},
    		"MachineID": "MACHINE2",
    		"PressSpeed": 21.9,
    		"ProductID": 10001,
    		"Temperature": 24.44,
    		"TimeInOperation": 17568737
    	},
    	"PLC1": {
    		"_System": {
    			"_ActiveTagCount": 6,
    			"_DemandPoll": false,
    			"_Description": null,
    			"_DeviceId": "1",
    			"_Enabled": true,
    			"_Error": false,
    			"_NoError": true,
    			"_ScanMode": "UseClientRate",
    			"_ScanRateMs": 1000,
    			"_SecondsInError": 0,
    			"_Simulated": false
    		},
    		"LineState": "RUNNING",
    		"MachineID": "2500",
    		"TimeInOperation": 17568737,
    		"UnitsCompletedPerHour": 35364600,
    		"UnitsInRun": 35364500,
    		"WorkOrderID": 100895
    	},
    	"PLC2": {
    		"_System": {
    			"_ActiveTagCount": 6,
    			"_DemandPoll": false,
    			"_Description": null,
    			"_DeviceId": "1",
    			"_Enabled": true,
    			"_Error": false,
    			"_NoError": true,
    			"_ScanMode": "UseClientRate",
    			"_ScanRateMs": 1000,
    			"_SecondsInError": 0,
    			"_Simulated": false
    		},
    		"LineState": "RESETTING",
    		"MachineID": "2518",
    		"TimeInOperation": 17568737,
    		"UnitsCompletedPerHour": 58885160,
    		"UnitsInRun": 35364500,
    		"WorkOrderID": 100515
    	},
    	"PLC3": {
    		"_System": {
    			"_ActiveTagCount": 7,
    			"_DemandPoll": false,
    			"_Description": null,
    			"_DeviceId": "1",
    			"_Enabled": true,
    			"_Error": false,
    			"_NoError": true,
    			"_ScanMode": "UseClientRate",
    			"_ScanRateMs": 1000,
    			"_SecondsInError": 0,
    			"_Simulated": false
    		},
    		"LineState": "RESETTING",
    		"MachineID": "2518",
    		"TimeInOperation": 15810559,
    		"UnitsCompletedTotalCount": 53022980,
    		"UnitsInRun": 31846980,
    		"UnitsRejectedTotalCount": 1594488,
    		"WorkOrderID": 100515
    	}
    }
    
    Flatten:
    {
    	"_name": "Packaging",
    	"_model": "ComplexData",
    	"_timestamp": 1711634379957,
    	"_Statistics/_FailedReads": 0,
    	"_Statistics/_FailedWrites": 0,
    	"_Statistics/_MaxPendingReads": 0,
    	"_Statistics/_MaxPendingWrites": 0,
    	"_Statistics/_NextReadPriority": 0,
    	"_Statistics/_PendingReads": 0,
    	"_Statistics/_PendingWrites": 0,
    	"_Statistics/_Reset": false,
    	"_Statistics/_RxBytes": 0,
    	"_Statistics/_SuccessfulReads": 0,
    	"_Statistics/_SuccessfulWrites": 0,
    	"_Statistics/_TxBytes": 0,
    	"_System/_Description": null,
    	"_System/_EnableDiagnostics": false,
    	"_System/_FloatHandlingType": "Replaced with zero",
    	"_System/_WriteOptimizationDutyCycle": 10,
    	"InjectionMolding1/_System/_ActiveTagCount": 3,
    	"InjectionMolding1/_System/_DemandPoll": false,
    	"InjectionMolding1/_System/_Description": null,
    	"InjectionMolding1/_System/_DeviceId": "1",
    	"InjectionMolding1/_System/_Enabled": true,
    	"InjectionMolding1/_System/_Error": false,
    	"InjectionMolding1/_System/_NoError": true,
    	"InjectionMolding1/_System/_ScanMode": "UseClientRate",
    	"InjectionMolding1/_System/_ScanRateMs": 1000,
    	"InjectionMolding1/_System/_SecondsInError": 0,
    	"InjectionMolding1/_System/_Simulated": false,
    	"InjectionMolding1/MachineID": "MACHINE1",
    	"InjectionMolding1/PressSpeed": 21.9,
    	"InjectionMolding1/ProductID": 10003,
    	"InjectionMolding1/Temperature": 75,
    	"InjectionMolding1/TimeInOperation": 17568737,
    	"InjectionMolding2/_System/_ActiveTagCount": 1,
    	"InjectionMolding2/_System/_DemandPoll": false,
    	"InjectionMolding2/_System/_Description": null,
    	"InjectionMolding2/_System/_DeviceId": "1",
    	"InjectionMolding2/_System/_Enabled": true,
    	"InjectionMolding2/_System/_Error": false,
    	"InjectionMolding2/_System/_NoError": true,
    	"InjectionMolding2/_System/_ScanMode": "UseClientRate",
    	"InjectionMolding2/_System/_ScanRateMs": 1000,
    	"InjectionMolding2/_System/_SecondsInError": 0,
    	"InjectionMolding2/_System/_Simulated": false,
    	"InjectionMolding2/MachineID": "MACHINE2",
    	"InjectionMolding2/PressSpeed": 21.9,
    	"InjectionMolding2/ProductID": 10001,
    	"InjectionMolding2/Temperature": 24.44,
    	"InjectionMolding2/TimeInOperation": 17568737,
    	"PLC1/_System/_ActiveTagCount": 6,
    	"PLC1/_System/_DemandPoll": false,
    	"PLC1/_System/_Description": null,
    	"PLC1/_System/_DeviceId": "1",
    	"PLC1/_System/_Enabled": true,
    	"PLC1/_System/_Error": false,
    	"PLC1/_System/_NoError": true,
    	"PLC1/_System/_ScanMode": "UseClientRate",
    	"PLC1/_System/_ScanRateMs": 1000,
    	"PLC1/_System/_SecondsInError": 0,
    	"PLC1/_System/_Simulated": false,
    	"PLC1/LineState": "RUNNING",
    	"PLC1/MachineID": "2500",
    	"PLC1/TimeInOperation": 17568737,
    	"PLC1/UnitsCompletedPerHour": 35364600,
    	"PLC1/UnitsInRun": 35364500,
    	"PLC1/WorkOrderID": 100895,
    	"PLC2/_System/_ActiveTagCount": 6,
    	"PLC2/_System/_DemandPoll": false,
    	"PLC2/_System/_Description": null,
    	"PLC2/_System/_DeviceId": "1",
    	"PLC2/_System/_Enabled": true,
    	"PLC2/_System/_Error": false,
    	"PLC2/_System/_NoError": true,
    	"PLC2/_System/_ScanMode": "UseClientRate",
    	"PLC2/_System/_ScanRateMs": 1000,
    	"PLC2/_System/_SecondsInError": 0,
    	"PLC2/_System/_Simulated": false,
    	"PLC2/LineState": "RESETTING",
    	"PLC2/MachineID": "2518",
    	"PLC2/TimeInOperation": 17568737,
    	"PLC2/UnitsCompletedPerHour": 58885160,
    	"PLC2/UnitsInRun": 35364500,
    	"PLC2/WorkOrderID": 100515,
    	"PLC3/_System/_ActiveTagCount": 7,
    	"PLC3/_System/_DemandPoll": false,
    	"PLC3/_System/_Description": null,
    	"PLC3/_System/_DeviceId": "1",
    	"PLC3/_System/_Enabled": true,
    	"PLC3/_System/_Error": false,
    	"PLC3/_System/_NoError": true,
    	"PLC3/_System/_ScanMode": "UseClientRate",
    	"PLC3/_System/_ScanRateMs": 1000,
    	"PLC3/_System/_SecondsInError": 0,
    	"PLC3/_System/_Simulated": false,
    	"PLC3/LineState": "RESETTING",
    	"PLC3/MachineID": "2518",
    	"PLC3/TimeInOperation": 15810559,
    	"PLC3/UnitsCompletedTotalCount": 53022980,
    	"PLC3/UnitsInRun": 31846980,
    	"PLC3/UnitsRejectedTotalCount": 1594488,
    	"PLC3/WorkOrderID": 100515
    }
  3. The third stage in Pipeline “Pipeline_OPC_UA_Breakup” is a Breakup all stage, this takes the flattened branch object and breaks it up into individual key:value pairs. 

  1. Within the final WriteNewTarget Stage, we are utilizing the following syntax to dynamically build out our topics based on the Breakup all stage: {{event.metadata.breakupName}}

Use Case: Templating Asset Data to a Transform Pipeline

This use case outlines how to use Templating to model multiple sources of data together into a single payload. We will utilize a Transform Pipeline to show how you can transform the shape of the payloads to satisfy target systems’ data structure needs. This Pipeline is designed to scale to many like asset payloads utilizing standard attribute names.  

  1. Let’s start by reviewing our Dynamic Templating source. Navigate to Connections “SQL_CMMS”, click Inputs, open “All_CNC_Machines_AssetIDs” and click Test Input.

This returns an array of our AssetID values, which in this use case can be used to template configurations from one to many data points. To take advantage of Templating, you will need uniformity in the source systems.

  1. Navigate to Instance “CNC_Fanuc_Templated_Child_Instance”. Click Test Instance. Note that we have a Templated Instance with only one Template value “Fanuc_1001”, this single value is utilized for testing, we will dynamically drive Template parameters from our Flow.
  2. Within “CNC_Fanuc_Templated_Child_Instance”, you can see we are dynamically driving the Template parameters to our OPC UA collection and SQL_CMMS inputs:

  1. Navigate to Instance “CNC_Machine_Instance”. Click Test Instance. Note that we have a Parameterized Instance mapped to our “ProcessData” attribute. This shows how to re-use Models/Instances.
  2. Navigate to Flows “Asset_Templated_Flow”. Note we are have Templating enabled with our dynamic source {{Connection.SQL_CMMS.All_CNC_Machines_AssetIDs}}. We are dynamically driving the AssetID value to other configuration objects with the (AssetID={{this.AssetID}}) syntax within the Sources.

  1. Let’s review our first target. From the “Asset_Templated_Flow” Targets panel, click Pipeline “Pipeline_Asset_Transforms”. Note we are starting our Pipeline with a branch to WriteOriginal, which outputs the payload to the predefined MQTT_CNC_Original output. Click the WriteOriginal Target hyperlink {{Connection.MQTT.MQTT_CNC_Original}} and review the Topic structure. You can see we are leveraging Dynamic Referencing for the ProcessData.AssetType and ProcessData.AssetID Attributes.

Dynamic Referencing is a key design pattern to enable use cases to quickly scale to other like-payloads. As long as our source payloads have attributes ProcessData.AssetType and ProcessData.AssetID, they can utilize this output.

  1. Navigate back to the Pipeline Stage “Pipeline_Asset_Transforms”. The other branch path has a next stage that goes to Flatten, which flattens our JSON hierarchy to a single object.

  2. The next stage Transform utilizes stage.SetMetadata to enable us to reference the ProcessData_AssetID and ProcessData_AssetType values within our upcoming WriteNew stages.

    Original:
    {
    	"_name": "Fanuc_1002",
    	"_model": "CNC_Machine_Simple_Model",
    	"_timestamp": 1711635046385,
    	"Enterprise": "Enterprise",
    	"Site": "Site-1",
    	"Area": "Area-1",
    	"Line": "Line-1",
    	"ProcessData": {
    		"AssetID": "FANUC_1002",
    		"AssetType": "CNC",
    		"Temperature": 25.5576,
    		"Temperature_UOM": "C",
    		"CuttingSpeed": 101,
    		"PowerCurrent": 208.4758758544922,
    		"FeedRate": 13.97707748413086,
    		"LastServiceDate": "2023-09-07T00:00:00.000Z",
    		"LastServiceNotes": "Replaced spindle belt"
    	}
    }
    
    Flattened:
    {
    	"Enterprise": "Enterprise",
    	"Site": "Site-1",
    	"Area": "Area-1",
    	"Line": "Line-1",
    	"ProcessData_AssetID": "FANUC_1002",
    	"ProcessData_AssetType": "CNC",
    	"ProcessData_Temperature": 25.5576,
    	"ProcessData_Temperature_UOM": "C",
    	"ProcessData_CuttingSpeed": 101,
    	"ProcessData_PowerCurrent": 208.4758758544922,
    	"ProcessData_FeedRate": 13.97707748413086,
    	"ProcessData_LastServiceDate": "2023-09-07T00:00:00.000Z",
    	"ProcessData_LastServiceNotes": "Replaced spindle belt"
    }
  3. The next Stage, Transform, utilizes stage.setMetadata to enable referencing the ProcessData_AssetID and ProcessData_AssetType values within our upcoming WriteNew stages.

    Enterprise/Site-1/Area-1/Line-1/Assets/{{event.metadata.ProcessData_AssetType}}/{{event.metadata.ProcessData_AssetID}}/Flattened_Payload
  4. In our next Stage, Breakup_Payload, Breakup Type “All” breaks our JSON object of 13 attributes into 13 different payloads of individual events.

  5. Within our final stage, Write_Broken_Up_Payload_To_MQTT, we utilize the syntax {{event.metadata.breakupName}} to create our individual topics based on the previous Breakup_Payload Stage.

    1. Enterprise/Site-1/Area-1/Line-1/Assets/{{event.metadata.ProcessData_AssetType}}/{{event.metadata.ProcessData_AssetID}}/Broken_Up_Payload/{{event.metadata.breakupName}}
  6. From the UNS client, compare the following MQTT topics to review the differences.

Enterprise/Site-1/Area-1/Line-1/Assets/CNC/FANUC_1001/Original_Payload

Enterprise/Site-1/Area-1/Line-1/Assets/CNC/FANUC_1001/Flattened_Payload

Enterprise/Site-1/Area-1/Line-1/Assets/CNC/FANUC_1001/Broken_Up_Payload/#

Use Case: Templating Asset Data to a Buffer Pipeline

This use case outlines how to use Pipelines to buffer incoming payloads over a set time or size window. This functionality simplifies machine learning use cases. Opposed to writing data every second to a cloud storage endpoint (such as AWS S3 or Azure Blob Storage), we can create a buffered array of data, incorporate file formatting changes or compression, then output to the storage endpoint. This Pipeline is designed to scale to many like-asset payloads utilizing standard attribute names.

  1. Navigate to Pipeline, “Pipeline_Asset_Buffer”, this is the second target from our previously reviewed Asset_Templated_Flow.

  2. The first stage, Flatten, flattens our JSON hierarchy to a single object.

    Original:
    {
    	"_name": "Fanuc_1002",
    	"_model": "CNC_Machine_Simple_Model",
    	"_timestamp": 1711561066790,
    	"Enterprise": "Enterprise",
    	"Site": "Site-1",
    	"Area": "Area-1",
    	"Line": "Line-1",
    	"ProcessData": {
    		"AssetID": "FANUC_1002",
    		"AssetType": "CNC",
    		"Temperature": 21.3906,
    		"Temperature_UOM": "C",
    		"CuttingSpeed": 101,
    		"PowerCurrent": 241.2214813232422,
    		"FeedRate": 14.231868743896484,
    		"LastServiceDate": "2023-09-07T00:00:00.000Z",
    		"LastServiceNotes": "Replaced spindle belt"
    	}
    }
    
    Flattened:
    {
    	"Enterprise": "Enterprise",
    	"Site": "Site-1",
    	"Area": "Area-1",
    	"Line": "Line-1",
    	"ProcessData_AssetID": "FANUC_1002",
    	"ProcessData_AssetType": "CNC",
    	"ProcessData_Temperature": 25.94651830444336,
    	"ProcessData_Temperature_UOM": "C",
    	"ProcessData_CuttingSpeed": 101,
    	"ProcessData_PowerCurrent": 389.9405212402344,
    	"ProcessData_FeedRate": 13.844867706298828,
    	"ProcessData_LastServiceDate": "2023-09-07T00:00:00.000Z",
    	"ProcessData_LastServiceNotes": "Replaced spindle belt"
    }
  3. The next Stage, Transform_Set_Metadata, uses stage.setMetadata to store multiple source attributes for use within our upcoming Stages.

  4. The next Stage, Time_Buffer_60_Seconds, is a Time Buffer Stage to create an array of our events over the period of 60 seconds. The Flow interval is also relevant here - the “Asset_Templated_Flow” Flow is writing to the Pipeline every 10 seconds.

Take note of the Time Buffer Stage Window Expression: stage.setBufferKey(event.value.ProcessData_AssetID). Here we are utilizing ProcessData_AssetID from our earlier Transform stage as a unique “BufferKey” identifier to route into separate buffers. This will ensure the array payloads are separated per AssetID opposed to one large payload that mixes the AssetIDs.

  1. Our final stage Write_Buffered_Payload_To_MQTT is a WriteNew Stage that utilizes our event.metadata references to built an appropriate topic structure for output the buffered payloads to our namespace.
  2. Navigate to UNS client, topic Enterprise/Site-1/Area-1/Line-1/Assets/CNC/FANUC_1001/Buffered_Payload, and review the results.
Write New Syntax: 
{{event.metadata.Enterprise}}/{{event.metadata.Site}}/{{event.metadata.Area}}/{{event.metadata.Line}}/Assets/{{event.metadata.ProcessData_AssetType}}/{{event.metadata.bufferKey}}/Buffered_Payload

Example Output:
Enterprise/Site-1/Area-1/Line-1/Assets/CNC/FANUC_1001/Buffered_Payload

Use Case: Templating and Event Based Flows

This use case outlines how to use an Event type Flow to monitor an OPC UA MachineState for changes to control Output writes to the Target(s). This use case utilizes Templating to handle this Event driven Flow for multiple like-payloads using dynamic parameterization.

  1. Let’s start by reviewing our Dynamic Templating Source. Navigate to Connection “SQL_CMMS”. Click Inputs. Open “All_CNC_Machines_AssetIDs” and click Test Input.

    1. This returns an array of our AssetID values, which in this use case can be used to template configurations from one to many data points.
  2. Navigate to Flow “CNC_Event_Based_Flow” and review the usage of Templating. You can see the AssetID values from our SQL source are being dynamically driven into the Sources reference and the Event expression.

  1. The event Expression is listening for any changes to the templated OPC UA tag Input “Connection_OPC_UA_Input_CNC_Solution_Fanuc_CNC_MachineState_Templated”. If you review the payload topic (Enterprise/Site-1/Area-1/Line-1/On_State_Change/) in the UNS client, you should see Fanuc_1002 and Fanuc_1003 update frequently with a new value to MachineState. Whereas Fanuc_1001 MachineState is not changing and therefore not updating.

Use Case: Connecting and Conditioning ERP Data

This use case outlines how to connect ERP data over a REST connection, where we utilize a Condition to convert a complex REST input into a workable payload.

  1. Navigate to Connection “SAP_Hana_REST”, click Inputs and select “Maintenance_Orders”. Click Test Input and review the results.

Let’s assume for this use case we are only interested in the following attributes per work order: MaintenanceOrder, MaintenanceOrderDesc, MainWorkCenter and EquipmentName. This data lives in a nested “results” attribute. Let’s use Condition and Modeling to extract only what what’s relevant to our use case.

  1. Navigate to Conditions “Condition_SAP_HANA_Maintenance_Order” and review the Custom Condition type.
  2. Within Condition “Condition_SAP_HANA_Maintenance_Order”, in the top right, select the Source and click Test Condition to review the results.

We are utilizing a basic JavaScript expression to return the “results” attribute. De-referencing the property from the parent structure and creating a reference component to it directly will enable the usage of Expand Arrays within the Instance.

Unconditioned:

Conditioned:

  1. Navigate to Instances “Maintenance_Order_Instance”, perform a Test Instance and review the results.

    The conditioned object returns an array of data. We can now utilize the Expand Arrays feature. This enables us to map attributes from array element [0] and expand the array to the last element within a single Instance.

  2. Review this data within your UNS client within topic Enterprise/Site-1/Area-1/Line-1/Maintenance/#

Summary

This reference article provided you with a comprehensive overview of advanced functionality the Intelligence Hub provides to build and scale Unified Namespaces. We reviewed 5 different use cases within this project that can be referenced when building your own Unified Namespace. Use these techniques and design patterns to help accelerate and demonstrate the need for industrial DataOps in your own environment.

Other Resources