Skip to main content

Explore

The OPC UA Explore node enables discovery and navigation of an OPC UA server's address space. It traverses the hierarchical structure of objects, variables, and methods, returning the results as a JSON object that mirrors the server's organization.

Overview​

The Explore node helps you understand what data is available on an OPC UA server and how it's structured. Unlike browsing which shows one level at a time, the Explore node recursively traverses the address space and returns a complete structure in a single operation.

Key Features:

  • Recursive Exploration: Automatically traverse entire subtrees
  • Multiple Output Types: Return values, NodeIds, browse paths, or metadata
  • Flexible Input: Static configuration or dynamic injection
  • Filtering Options: Control depth, exclude empty nodes, follow specific references
  • Direct Integration: Connect output to Monitor node for automatic monitoring setup

Tutorials​

Quick Start​

Basic Example - Explore Server Status:

  1. Add an Explore node to your flow
  2. Configure the OPC UA endpoint
  3. Set NodeId to /Server/ServerStatus
  4. Set Output Type to Value
  5. Add a debug node to see the structure
  6. Deploy and inject a message

The node returns the complete ServerStatus structure with all current values.

Exploration Concepts​

Address Space Hierarchy​

The OPC UA address space is organized hierarchically:

Objects (root)
├── Server
│ ├── ServerStatus
│ │ ├── StartTime
│ │ ├── CurrentTime
│ │ └── BuildInfo
│ │ ├── ProductName
│ │ └── SoftwareVersion
│ └── ServerCapabilities
└── Equipment
└── Reactor1
├── Temperature
├── Pressure
└── Status

Node Types​

Objects: Containers for other nodes (equipment, systems, folders) Variables: Data points with values (temperature, pressure, status) Methods: Callable functions ObjectTypes: Templates for objects

Exploration Behavior​

  1. Start at the specified NodeId
  2. Traverse following configured references
  3. Read values when reaching variables
  4. Return structured JSON object

Output Control​

Control what is returned for leaf nodes (variables):

Output TypeReturnsUse Case
ValueCurrent valuesDisplay, analysis
NodeIdNode identifiersMonitoring setup
DataValueValues with metadataQuality checking
BrowsePathNavigation pathsDocumentation

Use Cases​

Monitoring Setup​

Explore equipment and automatically configure monitoring:

// Explore with NodeId output
msg.outputType = "NodeId";
msg.nodeId = "ns=2;s=Equipment.Reactor1";
// Connect to Monitor node

Data Discovery​

Find what data is available on the server:

// Explore with Value output
msg.outputType = "Value";
msg.nodeId = "ns=2;s=Equipment";

Documentation Generation​

Create documentation of available variables:

// Explore with AliasedBrowsePath output
msg.outputType = "AliasedBrowsePath";
msg.nodeId = "/Objects";

System Health Check​

Check data quality across the system:

// Explore with DataValue output
msg.outputType = "DataValue";
// Analyze statusCode for each variable

Configuration Parameters​

Common Settings​

ParameterDescriptionDefault
NameNode identifier-
EndpointOPC UA server connection-
NodeIdStarting point (optional)-
Output TypeWhat to return for variablesValue
Follow OrganizesFollow folder referencestrue
Exclude EmptyRemove empty foldersfalse

Input Properties​

Override configuration via message properties:

{
"nodeId": "ns=2;s=Equipment.Reactor1",
"outputType": "NodeId",
"followOrganizes": true,
"excludeEmpty": true
}

Output Structure​

The Explore node returns a JSON object that mirrors the server's structure:

Input:

msg.nodeId = "/Server/ServerStatus/BuildInfo";
msg.outputType = "Value";

Output:

{
"payload": {
"ProductUri": "urn:MyServer",
"ManufacturerName": "ACME Corp",
"ProductName": "MyServer",
"SoftwareVersion": "1.0.0",
"BuildNumber": "12345",
"BuildDate": "2024-01-01T00:00:00.000Z"
}
}

NodeId Specification​

Multiple ways to specify what to explore:

Static Configuration​

// In node settings
nodeId: "ns=1;s=Equipment.Reactor1"

Dynamic Injection​

Set the NodeId source to the message with the path nodeId, then:

// Via the nodeId property
msg.nodeId = "ns=1;s=Equipment.Reactor1";

// A browse path works just as well
msg.nodeId = "/Server/ServerStatus";

Priority (when the NodeId source is not set — flows saved before 3.40): msg.nodeId, then the configured NodeId. The Explore node does not read msg.topic.

Under this node the configured value always wins; under the message the field names the path to read. See Where does the NodeId come from?.

Tips & Best Practices​

Start with Small Subtrees​

Begin with specific equipment rather than the entire server:

✅ Good:

nodeId: "ns=2;s=Equipment.Reactor1"

❌ Avoid:

nodeId: "i=85" // Objects folder - entire server!

Use Appropriate Output Types​

Match output type to your use case:

  • Monitoring: Use NodeId
  • Display: Use Value
  • Quality Check: Use DataValue
  • Documentation: Use AliasedBrowsePath

Cache Exploration Results​

Structure rarely changes - cache to improve performance:

const cached = flow.get('structure_cache');
if (cached && Date.now() - cached.timestamp < 3600000) {
msg.payload = cached.structure;
return msg;
}

Limit Exploration Depth​

Prevent excessive exploration by using specific NodeIds:

// Use specific equipment NodeIds instead of root nodes
msg.nodeId = "ns=2;s=Equipment.Reactor1";

Exclude Empty Nodes​

Clean up output by removing empty folders:

msg.excludeEmpty = true;

Common Patterns​

Explore → Monitor​

// 1. Explore with NodeId
msg.outputType = "NodeId";

// 2. Send to Monitor node
// Monitor automatically subscribes to all variables

Explore → Read​

// 1. Explore to find NodeIds
msg.outputType = "NodeId";

// 2. Extract NodeIds
// 3. Read specific variables

Explore → Analyze​

// 1. Explore with Value
msg.outputType = "Value";

// 2. Process structure
// 3. Generate reports/alerts

Troubleshooting​

No Results Returned​

  • Verify NodeId exists and is correct
  • Check endpoint connection
  • Try Server object: i=2253
  • Check followOrganizes setting

Too Much Data​

  • Use more specific starting NodeId
  • Enable excludeEmpty
  • Set followOrganizes to false

Missing Variables​

  • Set followOrganizes to true
  • Check server permissions
  • Verify NodeId is correct
  • Try exploring from parent node

Performance Issues​

  • Reduce exploration scope
  • Use more specific NodeIds
  • Cache results
  • Use excludeEmpty
  • Read - Read specific variables
  • Monitor - Monitor value changes
  • Browse - Browse one level at a time
  • Connection - Configure server connections

Resources​