UNS (Unified Namespace) Nodes
Overview
The Unified Namespace (UNS) is MaestroHub's central data fabric that organizes all operational data into a hierarchical topic tree following the ISA-95 model (enterprise / site / area / line / cell). UNS nodes allow pipelines to interact with this namespace — publishing live data, retrieving historical records, discovering topics, and triggering workflows when new data arrives.
Unlike industrial or database connector nodes, UNS nodes do not require an external connection profile. They communicate directly with the built-in UNS Manager service, making them zero-configuration from a connectivity standpoint.
Topic Structure
Every UNS topic path is prefixed with a version string that scopes the namespace schema. The current default version is mHv1.0.
mHv1.0/enterprise/site/area/machine/temperature
└─────┘ └──────────────────────────────────────┘
version topic path
The system automatically prepends the version prefix if it is not already present in the configured topic. In the UI, a version selector dropdown lets you choose the active version while you type the topic path.
Available Nodes
| Node | Type ID | Category | Purpose |
|---|---|---|---|
| UNS Subscribe Trigger | trigger.uns.subscribe | Trigger | Starts a pipeline when data is published to matching UNS topics |
| UNS Publish | system.uns.publish | UNS | Publishes data to a UNS topic |
| UNS Fetch Data | system.uns.fetchdata | UNS | Retrieves recent data from a UNS topic |
| UNS Search Nodes | system.uns.searchnodes | UNS | Searches the namespace for topics by keyword |
UNS Topic Selector
The UNS Publish and UNS Fetch Data nodes share a specialized UNS Topic Selector control for configuring the target topic. Understanding this component helps you work with any UNS node that requires a topic.
How It Works
- Version Selector — a dropdown on the left side of the field displays the available namespace versions (fetched from the backend). The default version (
mHv1.0) is pre-selected. - Topic Path Input — a text input where you type the topic path. As you type (minimum 2 characters), the system searches existing topics and shows autocomplete suggestions in a dropdown.
- Expression Support — the field accepts pipeline expressions (
{{ }}syntax). When an expression is detected, autocomplete is disabled and a live preview evaluates the expression against available upstream data. - Full Topic Preview — below the input, a preview badge shows the complete resolved path including the version prefix (e.g.,
mHv1.0/enterprise/site/area/machine/temperature).
Expression Preview States
| State | Indicator | Meaning |
|---|---|---|
| Evaluating | Spinner | Expression is being evaluated. |
| Success | Green checkmark | Expression resolved successfully; shows the resolved value. |
| Missing data | Info icon (muted) | Upstream node data not yet available — run upstream nodes first. |
| Error | Red alert | Syntax error or evaluation failure in the expression. |
UNS Publish
UNS Publish Node
Overview
The UNS Publish node writes data to a UNS topic. It is the primary way pipelines push processed results, enriched telemetry, calculated KPIs, or control signals back into the Unified Namespace for other systems and pipelines to consume.
Publishing is synchronous — the node waits for confirmation from the UNS Manager before completing, ensuring reliable delivery.
Node Handles
| Handle | Position | Description |
|---|---|---|
Input (in) | Left | Receives data from the upstream node. |
Output (out) | Right | Sends the publish confirmation and metadata to downstream nodes. |
Parameters
| Field | UI Control | Data Type | Required | Default | Validation | Description |
|---|---|---|---|---|---|---|
| UNS Topic | UNS Topic Selector (version dropdown + path input with autocomplete) | string | Yes | "" | Must not be empty after expression resolution | Full UNS topic path. The version prefix is auto-prepended if missing. Supports expressions. |
| Value | Expression Field (multiline textarea with preview) | any | Yes | "" | Must not be empty or null | Data to publish. Accepts literal values, JSON objects, or expressions that resolve to any type. |
| Data Source | Expression Field (single-line input with preview) | string | No | "" (auto-generated) | — | Identifier for the data source. If left empty, defaults to pipeline:{pipelineName}:{pipelineId}. Supports expressions. |
Settings
Description
A free-text area for documenting the node's purpose.
Execution Settings
| Setting | Options | Default | Description |
|---|---|---|---|
| Timeout (seconds) | 1–600 | Pipeline default | Maximum execution time for this node. |
| Retry on Timeout | Pipeline Default / Enabled / Disabled | Pipeline Default | Whether to retry if the node times out. |
| Retry on Fail | Pipeline Default / Enabled / Disabled | Pipeline Default | Whether to retry on failure. When Enabled, reveals Advanced Retry Configuration. |
| On Error | Pipeline Default / Stop Pipeline / Continue Execution | Pipeline Default | Behavior when the node fails after all retries. |
Advanced Retry Configuration (visible when Retry on Fail = Enabled)
| Field | Type | Default | Range | Description |
|---|---|---|---|---|
| Max Attempts | number | 3 | 1–10 | Maximum retry attempts. |
| Initial Delay (ms) | number | 1000 | 100–30,000 | Wait before first retry. |
| Max Delay (ms) | number | 120000 | 1,000–300,000 | Upper bound for backoff delay. |
| Multiplier | number | 2.0 | 1.0–5.0 | Exponential backoff multiplier. |
| Jitter Factor | number | 0.1 | 0–0.5 | Random jitter. |
Output Data Structure
On successful publish, the node produces:
{
"published": true,
"topic": "mHv1.0/enterprise/site/area/machine/temperature",
"value": { "temperature": 72.5, "unit": "F" },
"source": "pipeline:Temp-Monitor:abc-123",
"timestamp": "2026-02-11T14:15:00Z"
}
| Field | Type | Description |
|---|---|---|
published | boolean | Always true on success. |
topic | string | The full topic path the data was published to (including version prefix). |
value | any | The value that was published, as resolved from the input expression. |
source | string | The source identifier used for this publish operation. |
timestamp | string | ISO 8601 timestamp of when the publish occurred (UTC). |
Referencing in Downstream Nodes
{{ $node["UNS Publish"].published }} → true
{{ $node["UNS Publish"].topic }} → the full topic path
{{ $node["UNS Publish"].timestamp }} → when it was published
Validation Rules
| Rule | Error Message |
|---|---|
| Node name is required | "UNS Publish node must have a name" |
| UNS topic is required | "UNS topic is required" |
| Value is required | "Value is required" |
| Topic must resolve to non-empty string | "topic resolved to empty string" |
Usage Examples
Publish Transformed Sensor Data
| Field | Value |
|---|---|
| UNS Topic | mHv1.0/acme-corp/plant-1/assembly/robot-arm/temperature |
| Value | {{ $node["Set"].data }} |
| Data Source | (empty — auto-generated) |
The pipeline reads a raw sensor value, transforms it with a Set node, and publishes the enriched result back to the UNS.
Publish Aggregated KPIs
| Field | Value |
|---|---|
| UNS Topic | mHv1.0/acme-corp/plant-1/kpis/oee |
| Value | {"oee": {{ $node["Calculate OEE"].result }}, "shift": "morning", "timestamp": "{{ $execution.startedAt }}"} |
| Data Source | kpi-calculator |
Publishes a calculated OEE metric with context about the shift and execution time.
Dynamic Topic from Trigger Data
| Field | Value |
|---|---|
| UNS Topic | {{ $trigger._metadata.topic }}/processed |
| Value | {{ $node["Transform"].output }} |
| Data Source | (empty) |
Appends /processed to the original trigger topic, creating a parallel processed-data topic hierarchy.
UNS Fetch Data
UNS Fetch Data Node
Overview
The UNS Fetch Data node retrieves the most recent data records stored in the UNS for a given topic. It is ideal for building dashboards, performing trend analysis, or feeding historical context into decision-making logic within a pipeline.
Node Handles
| Handle | Position | Description |
|---|---|---|
Input (in) | Left | Receives data from the upstream node. |
Output (out) | Right | Sends the fetched records and metadata to downstream nodes. |
Parameters
| Field | UI Control | Data Type | Required | Default | Validation | Description |
|---|---|---|---|---|---|---|
| UNS Topic | UNS Topic Selector (version dropdown + path input with autocomplete) | string | Yes | "" | Must not be empty after expression resolution | The topic to fetch data from. Supports expressions. |
| Limit | Number input | number | No | 10 | 1–1,000 (clamped to 1,000 if exceeded) | Number of most recent records to retrieve. |
Settings
Description
A free-text area for documenting the node's purpose.
Execution Settings
| Setting | Options | Default | Description |
|---|---|---|---|
| Timeout (seconds) | 1–600 | Pipeline default | Maximum execution time for this node. |
| Retry on Timeout | Pipeline Default / Enabled / Disabled | Pipeline Default | Whether to retry if the node times out. |
| Retry on Fail | Pipeline Default / Enabled / Disabled | Pipeline Default | Whether to retry on failure. When Enabled, reveals Advanced Retry Configuration. |
| On Error | Pipeline Default / Stop Pipeline / Continue Execution | Pipeline Default | Behavior when the node fails after all retries. |
Advanced Retry Configuration (visible when Retry on Fail = Enabled)
| Field | Type | Default | Range | Description |
|---|---|---|---|---|
| Max Attempts | number | 3 | 1–10 | Maximum retry attempts. |
| Initial Delay (ms) | number | 1000 | 100–30,000 | Wait before first retry. |
| Max Delay (ms) | number | 120000 | 1,000–300,000 | Upper bound for backoff delay. |
| Multiplier | number | 2.0 | 1.0–5.0 | Exponential backoff multiplier. |
| Jitter Factor | number | 0.1 | 0–0.5 | Random jitter. |
Output Data Structure
The node returns an envelope containing the fetched records:
{
"records": [
{
"id": "rec-001",
"topic": "mHv1.0/enterprise/site/area/machine/temperature",
"value": { "temperature": 72.5, "unit": "F" },
"source": "pipeline:Temp-Monitor:abc-123",
"timestamp": "2026-02-11T14:10:00Z",
"retain": false
},
{
"id": "rec-002",
"topic": "mHv1.0/enterprise/site/area/machine/temperature",
"value": { "temperature": 73.1, "unit": "F" },
"source": "pipeline:Temp-Monitor:abc-123",
"timestamp": "2026-02-11T14:05:00Z",
"retain": false
}
],
"count": 2,
"topic": "mHv1.0/enterprise/site/area/machine/temperature",
"fetchMode": "recent"
}
The fetchMode field in the output is always "recent". Time-range based fetching is not currently available.
| Field | Type | Description |
|---|---|---|
records | array | Array of data records matching the query. |
records[].id | string | Unique record identifier. |
records[].topic | string | The topic the record belongs to. |
records[].value | any | The stored data value. |
records[].source | string | The source that published the record. |
records[].timestamp | string | ISO 8601 timestamp of when the record was published. |
records[].retain | boolean | Whether this was a retained message. |
count | number | Number of records returned. |
topic | string | The topic that was queried. |
fetchMode | string | The fetch mode used (currently always "recent"). |
Referencing in Downstream Nodes
{{ $node["UNS Fetch Data"].records }} → the full records array
{{ $node["UNS Fetch Data"].records[0].value }} → the most recent record's value
{{ $node["UNS Fetch Data"].count }} → number of records returned
{{ $node["UNS Fetch Data"].fetchMode }} → "recent"
Validation Rules
| Rule | Error Message |
|---|---|
| Node name is required | "UNS Fetch Data node must have a name" |
| UNS topic is required | "UNS topic is required" |
| Limit must be between 1 and 1,000 | "Limit must be between 1 and 1000" |
| Topic must resolve to non-empty string | "topic resolved to empty string" |
Usage Examples
Fetch Latest 5 Readings
| Field | Value |
|---|---|
| UNS Topic | mHv1.0/acme-corp/plant-1/assembly/robot-arm/temperature |
| Limit | 5 |
Downstream usage: {{ $node["UNS Fetch Data"].records }} to iterate over the readings in a For Each loop, or {{ $node["UNS Fetch Data"].records[0].value }} for the latest.
Fetch Maximum History for Trend Analysis
| Field | Value |
|---|---|
| UNS Topic | mHv1.0/acme-corp/plant-1/assembly/robot-arm/temperature |
| Limit | 1000 |
Downstream usage: Feed up to 1,000 recent records into a downstream calculation node for trend analysis or anomaly detection.
Dynamic Topic from Upstream Node
| Field | Value |
|---|---|
| UNS Topic | {{ $node["Set"].topic }} |
| Limit | 10 |
Downstream usage: The topic is dynamically determined by an upstream Set node, enabling reusable fetch logic across different data sources.
UNS Search Nodes
UNS Search Nodes
Overview
The UNS Search Nodes node discovers topics in the Unified Namespace by keyword. It returns matching topic metadata with pagination support, making it useful for dynamic topic discovery, namespace exploration, and building guided selection flows.
Node Handles
| Handle | Position | Description |
|---|---|---|
Input (in) | Left | Receives data from the upstream node. |
Output (out) | Right | Sends the search results to downstream nodes. |
Parameters
| Field | UI Control | Data Type | Required | Default | Validation | Description |
|---|---|---|---|---|---|---|
| Search Keyword | Expression Field (single-line input with preview) | string | Yes | "" | Minimum 3 characters (unless it's an expression). Must not resolve to empty. | Keyword to search for in UNS topic names. Supports expressions. |
| Offset | Number input | number | No | 0 | Must be ≥ 0 | Number of results to skip for pagination. |
| Limit | Number input | number | No | 10 | 1–1,000 (clamped to 1,000 if exceeded) | Maximum number of results to return. |
Settings
Execution Settings
| Setting | Options | Default | Description |
|---|---|---|---|
| Timeout (seconds) | 1–600 | Pipeline default | Maximum execution time for this node. |
| Retry on Timeout | Pipeline Default / Enabled / Disabled | Pipeline Default | Whether to retry if the node times out. |
| Retry on Fail | Pipeline Default / Enabled / Disabled | Pipeline Default | Whether to retry on failure. When Enabled, reveals Advanced Retry Configuration. |
| On Error | Pipeline Default / Stop Pipeline / Continue Execution | Pipeline Default | Behavior when the node fails after all retries. |
Advanced Retry Configuration (visible when Retry on Fail = Enabled)
| Field | Type | Default | Range | Description |
|---|---|---|---|---|
| Max Attempts | number | 3 | 1–10 | Maximum retry attempts. |
| Initial Delay (ms) | number | 1000 | 100–30,000 | Wait before first retry. |
| Max Delay (ms) | number | 120000 | 1,000–300,000 | Upper bound for backoff delay. |
| Multiplier | number | 2.0 | 1.0–5.0 | Exponential backoff multiplier. |
| Jitter Factor | number | 0.1 | 0–0.5 | Random jitter. |
Output Data Structure
{
"topics": [
{
"id": "topic-abc-123",
"name": "temperature",
"parentId": "node-xyz-789",
"parentName": "robot-arm",
"createdAt": "2026-01-15T10:00:00Z",
"updatedAt": "2026-02-11T14:10:00Z"
}
],
"total": 42,
"offset": 0,
"limit": 10,
"keyword": "temperature"
}
| Field | Type | Description |
|---|---|---|
topics | array | Array of matching topic metadata objects. |
topics[].id | string | Unique topic node identifier. |
topics[].name | string | Topic node name (the leaf segment of the topic path). |
topics[].parentId | string | ID of the parent node in the namespace tree. |
topics[].parentName | string | Name of the parent node. |
topics[].createdAt | string | ISO 8601 timestamp of when the topic was created. |
topics[].updatedAt | string | ISO 8601 timestamp of the last update. |
total | number | Total number of matching results (across all pages). |
offset | number | The offset used in this query. |
limit | number | The limit used in this query. |
keyword | string | The keyword that was searched. |
Referencing in Downstream Nodes
{{ $node["UNS Search Nodes"].topics }} → the full topics array
{{ $node["UNS Search Nodes"].topics[0].name }} → name of the first match
{{ $node["UNS Search Nodes"].total }} → total matches found
{{ $node["UNS Search Nodes"].keyword }} → the search keyword used
Validation Rules
| Rule | Error Message |
|---|---|
| Node name is required | "UNS Search Nodes node must have a name" |
| Search keyword is required | "Search keyword is required" |
| Keyword must be at least 3 characters (unless expression) | "Search keyword must be at least 3 characters" |
| Offset must be non-negative | "Offset must be a non-negative number" |
| Limit must be between 1 and 1,000 | "Limit must be between 1 and 1000" |
| Keyword must resolve to non-empty string | "keyword resolved to empty string" |
Usage Examples
Discover All Temperature Topics
| Field | Value |
|---|---|
| Search Keyword | temperature |
| Offset | 0 |
| Limit | 50 |
Downstream usage: {{ $node["UNS Search Nodes"].topics }} in a For Each loop to process each discovered temperature topic.
Paginated Search with Dynamic Keyword
| Field | Value |
|---|---|
| Search Keyword | {{ $trigger.payload.searchTerm }} |
| Offset | {{ $trigger.payload.page * 20 }} |
| Limit | 20 |
Downstream usage: Build a searchable topic browser where the keyword and page come from a webhook trigger or manual input.
Namespace Audit
| Field | Value |
|---|---|
| Search Keyword | alarm |
| Offset | 0 |
| Limit | 1000 |
Downstream usage: Discover all alarm-related topics in the namespace for an audit report. {{ $node["UNS Search Nodes"].total }} shows the full count.
Best Practices
Topic Naming Conventions
- Follow the ISA-95 hierarchy:
enterprise/site/area/line/cell/resource - Use lowercase, hyphen-separated segments:
acme-corp/plant-1/assembly/robot-arm - Place measured values as leaf nodes:
.../robot-arm/temperature,.../robot-arm/status - Keep topic paths stable — changing paths breaks downstream subscribers
Expression-Driven Topics
- Use expressions like
{{ $trigger._metadata.topic }}to build dynamic, reusable pipelines that work across multiple topics - Combine static prefixes with dynamic suffixes:
mHv1.0/acme-corp/{{ $node["Set"].area }}/temperature - Always validate that expressions resolve to non-empty strings before publishing
Error Handling for UNS Nodes
- Enable Retry on Fail for publish operations to handle transient UNS Manager unavailability
- Use Continue Execution on error for fetch and search nodes in non-critical data paths
- Use Stop Pipeline on error for publish nodes in critical data paths where data loss is unacceptable
Performance Considerations
- Keep fetch Limit values as low as practical — fetching 1,000 records when you need 10 wastes resources
- When using UNS Search in a loop, add pagination to avoid fetching all results at once