Command Handler Block
The OPC-UA Command Handler adapter block is capable of receiving requests from a topic on the Predix Edge Broker, sending those requests to an OPC-UA server, and returning the results from those requests back to a topic on the Predix Edge Broker.
This block’s “type” field is “opcuacommandhandler”, and an example configuration file that includes the block is shown later in this document.


First, a request is sent to the Predix Edge Broker on the request topic to which the OPC-UA Command Handler block is subscribed. In the above diagram, the sender of this request is the “Custom Client Edge App”. The request is then translated to the OPC-UA-specific request that is sent to the OPC-UA server. The result is processed and published to the Predix Edge Broker on the corresponding response topic. Any application subscribed to the response topic will then receive the result of the request. The response topic is based off of the request topic and is described in more detail below.
Request and Response Topics
/edgeAgent/predix-edge-opc-ua-browser/<request_id>/request/edgeAgent/predix-edge-opc-ua-browser/<request_id>/response
Where <request_id> is a unique identifier for the request that is set by whichever application is sending the request. The application that sends the request should first subscribe to the response topic with the same <request_id> in order to ensure it receives the response successfully.
Base Input Request
{
"command": "<command type>",
"params": {
<command-specific parameters>
}
}
Commandis a string that determines the type of request the block will execute.Paramsis an object that contains specific arguments for the given command.
Example Configuration
type field is opcuacommandhandler. An example of its configuration is: {
"blocks": {
"opcua-command-handler": {
"type": "opcuacommandhandler",
"config": {
"broker_address": "mqtt-tcp://predix-edge-broker",
"log_name": "opcua-handler",
"log_level": "debug"
}
}
},
"mappings": {}
}
config object for a block of type opcuacommandhandler contains the following fields.| Field | Type | Required | Default |
|---|---|---|---|
| log_name | String | No | <block name> |
| log_level | String | No | 'off' |
| broker_address | String | No | ‘mqtt-tcp://predix-edge-broker’ |
log_name and log_level fields are consistent with other blocks and configure how log messages will be printed The broker_address field specifies the address of the MQTT broker from which it will receive requests. config object are required, the config field itself is not required. However, the block and its type field still must be included in the configuration file.OPC-UA Browse Requests
The OPC-UA specification allows you to browse the child nodes of a given starting node on an OPC-UA server. The OPC-UA Command Handler adapter block allows you to do this using the BrowseServer command.
Browse Input Request
{
"command": "BrowseServer",
"params": {
"endpoint": "opc-tcp://your-opcua-server"
"nodeid": "ns=0;i=84",
"depth": 1
}
}
commandis a string that determines what type of request the block will execute. In this example,BrowseServercorresponds to a browse request.paramsis an object that contains the arguments for the command.endpointis a string that determines which server to connect to for the request.nodeidis a string that specifies at which OPC-UA node to start the browse.depthis an integer that specifies how many levels deep to browse nodes. If the request’sdepthfield is 2, the result will contain the starting node, its children, and its children’s children.
Browse Output Response
{
"nodeClass": "Object",
"identifier": "i=84",
"displayName": "Root",
"children": [
{
"nodeClass": "Object",
"identifier": "i=85",
"displayName": "Objects",
"children": []
},
{
"nodeClass": "Object",
"identifier": "i=86",
"displayName": "Types",
"children": []
},
{
"nodeClass": "Object",
"identifier": "i=87",
"displayName": "Views",
"children": []
}
]
}
nodeClass: corresponds to the OPC-UA spec’sNodeClassattribute. This essentially specifies the type of the node.identifier: corresponds to the Node IDdisplayName: provides a name for the node to be displayed in a more readable format.children: a list of the child nodes of the current node. This list can be empty either if the node has no children, or if thedepthfield in the input request has been reached.
OPC-UA Node Attributes Requests
All nodes in an OPC-UA server contain some list of attributes, and this list varies with the type of node – i.e., the NodeClass of the node. The OPC-UA Command Handler adapter block allows you to query for the values of this list of attributes using the GetNodeAttributes command.
Node Attributes Input Request
{
"command": "GetNodeAttributes",
"params": {
"endpoint": "opc-tcp://your-opcua-server"
"nodeid": "ns=2;s=Counter1",
}
}
commandis a string that determines what type of request the block will execute. In this example,GetNodeAttributescorresponds to a node attributes request.paramsis an object that contains the arguments for the command.endpointis a string that determines which server to connect to for the request.nodeidis a string that specifies from which OPC-UA node to retrieve the attributes.
Node Attributes Output Response
{
"NodeId": "ns=2;s=Counter1",
"NodeClass": "Variable",
"BrowseName": "Counter1",
"DisplayName": "Counter1",
"WriteMask": 0,
"UserWriteMask": 0,
"Value": 42,
"DataType": "i=6",
"ValueRank": -1,
"AccessLevel": 3,
"UserAccessLevel": 3,
"MinimumSamplingInterval": 0,
"Historizing": false
}
The fields of the response will differ depending on the type of node being queried and the attributes set on that node. A list of possible attributes an OPC-UA node can have is available here. The names of the fields in the response will directly correspond to the names of the attributes in that link.