This is Part 4 of our series on i3X and OPC UA. Part 1: When REST Meets Real-Time | Part 2: One API Call to Rule Them All | Part 3: The Missing Safety Layer
i3X Meets OPC UA: Performance Benchmarks & Semantic Mapping Patterns for node-i3x and i3x2ua
As the industrial automation community adopts i3X—the open REST API standard coordinated by CESMII—to bridge OPC UA operational technology (OT) with enterprise IT software, cloud platforms, and AI agents, developers benefit from multiple open-source implementations.
Two of the most prominent open-source i3X gateways available today are i3x2ua (the Python/AsyncUA reference gateway developed by Andreas Heine and community contributors) and node-i3x (the TypeScript/Node-OPCUA gateway developed by Sterfive).
When evaluating i3x2ua and node-i3x for industrial deployments, engineering teams frequently ask:
- Performance & Scalability: How do
i3x2ua(Python) andnode-i3x(Node.js) compare in HTTP latency, throughput, and gzip bandwidth efficiency when querying live OPC UA servers? - Semantic Domain Mapping: How do
i3x2uaandnode-i3xmap OPC UAObjectandVariablenodes onto i3X REST API resources (/v1/objectsand/v1/objects/value)?
In this article, we share empirical benchmarking results comparing i3x2ua and node-i3x, explore their respective architectural design choices, and provide a guide for selecting the right gateway for your industrial stack.
What is i3x2ua?
i3x2ua is an open-source Python implementation of the CESMII i3X REST API standard. Built on top of Python's asyncua OPC UA library and the FastAPI / Uvicorn web framework, i3x2ua translates REST requests into asynchronous OPC UA client calls.
Key strengths of i3x2ua:
- Python Native: Integrates seamlessly into Python-centric industrial data engineering, machine learning (Pandas, PyTorch, Scikit-learn), and Jupyter notebook workflows.
- AsyncUA Core: Uses Python's native
asynciofor non-blocking OPC UA communication. - FastAPI OpenAPI Integration: Provides automatic Swagger UI (
/docs) and Pydantic v2 data validation for all i3X REST endpoints.
Finding 1: Performance Benchmarks — i3x2ua (Python) vs. node-i3x (Node.js)
To measure gateway translation efficiency, we executed automated side-by-side HTTP traffic benchmarks comparing i3x2ua (v1.12.1) and node-i3x (v0.10.0).
Both gateway servers were run locally against an identical OPC UA test server (opc.tcp://localhost:48412/UA/EmbeddedDemo) hosting over 680 nodes and 280 object types.
⏱️ HTTP Response Latency Benchmark
The table below summarizes average local HTTP response times across core i3X REST endpoints (measured across 10 benchmark runs per endpoint):
| Endpoint | node-i3x (Node.js) plain | node-i3x gzip | i3x2ua (Python) plain | i3x2ua gzip | Benchmark Notes |
|---|---|---|---|---|---|
GET /v1/info | 40.8 ms | 38.1 ms | 72.1 ms | 83.2 ms | node-i3x fast static metadata response |
GET /v1/namespaces | 36.2 ms | 34.8 ms | 214.9 ms | 39.9 ms | i3x2ua caches namespaces after initial lookup |
GET /v1/objecttypes | 65.3 ms | 67.9 ms | 81.3 ms | 84.2 ms | Both gateways generate JSON Schemas in under 85ms |
GET /v1/relationshiptypes | 31.8 ms | 34.2 ms | 32.2 ms | 37.2 ms | Near-identical instant response |
GET /v1/objects | 31.9 ms | 36.2 ms | 72.8 ms | 69.9 ms | node-i3x asset-focused object traversal |
GET /v1/objects?root=true | 26.9 ms | 32.1 ms | 43.3 ms | 38.4 ms | Both gateways respond in under 45ms |
📦 Payload Efficiency & Network Serialization
Both i3x2ua and node-i3x support HTTP gzip compression out of the box:
| Endpoint | node-i3x Gzip Payload | i3x2ua Gzip Payload | Bandwidth Comparison |
|---|---|---|---|
GET /v1/objecttypes | 60.3 KB | 55.7 KB | i3x2ua produces a 7.6% more compact schema payload |
GET /v1/objects | 1.5 KB | 16.6 KB | Reflects i3x2ua's full node traversal (see Finding 2) |
| Total Aggregate Traffic | 62.6 KB | 73.1 KB | Both stacks achieve >94% gzip compression efficiency |
Understanding the Performance Profile (V8 + Node-OPCUA vs. CPython + asyncua)
The observed throughput and latency advantages stem from two complementary factors: the underlying language runtime (V8 JIT compilation vs. CPython bytecode interpretation) and the architectural maturity of the OPC UA stack:
-
Binary Protocol Encoding & Buffer Optimization:
Node-OPCUA: Features over 12 years of continuous industrial optimization. It handles OPC UA binary protocol chunking using fast, low-level V8Bufferoperations and pre-allocated byte structures, minimizing heap object allocations during bulk node browses.asyncua(Python): Implemented in pure Python. Decoding OPC UA binary streams requires instantiating native Python objects (DataValue,Variant,ExtensionObject,NodeId) for every node. In CPython, heap-allocating thousands of Python dictionary and class objects during a browse operation creates CPU and Garbage Collection (GC) overhead.
-
JIT Machine Code vs. Bytecode Execution:
- Node.js: Uses Google's V8 engine to JIT-compile JavaScript/TypeScript directly into native x86_64 machine code. Tight loops in binary parsing and JSON serialization run close to native C speed.
- Python: Executes bytecode through the CPython interpreter, carrying higher CPU overhead for bitwise binary framing and bulk string serialization.
-
Event Loop Efficiency:
- Node.js (
libuv): Uses a C++ event loop where MonitoredItem queues, session timeouts, and Fastify JIT JSON serializers (fast-json-stringify) execute with minimal context-switching overhead. - Python (
asyncio/ FastAPI): While FastAPI and Pydantic v2 represent the state of the art in Python web frameworks, coroutine context-switching in CPython carries higher per-task cost during concurrent REST queries.
- Node.js (
In summary, node-i3x leverages Node-OPCUA's binary encoding engine and Fastify to deliver low-latency, high-concurrency REST translation, while i3x2ua provides an excellent, native Python stack that integrates seamlessly into data science, AI, and industrial analytics pipelines (Pandas, PyTorch, Jupyter).
Finding 2: Semantic Address Space Mapping in i3x2ua and node-i3x
A core architectural question when building an OPC UA-to-i3X gateway is: How should OPC UA address space elements map onto i3X REST API resources?
In OPC UA, address spaces contain Object, ObjectType, Variable, VariableType, and ReferenceType nodes. In i3X, the API is organized into Objects (/v1/objects), ObjectTypes (/v1/objecttypes), and Values/Properties (/v1/objects/value).

Figure 1: Visual comparison showing how node-i3x (Asset-Centric Model) and i3x2ua (Direct Node Discovery Model) project the same OPC UA address space onto CESMII i3X REST resources.
Strategy 1: Direct Node Discovery (i3x2ua)
- How
i3x2uamaps nodes:i3x2ualists both OPC UAObjectnodes andVariablenodes in the/v1/objectsendpoint as discoverable elements. - Advantages: Every OPC UA
NodeIdis directly visible as an element ID in the/v1/objectsresponse. Clients can easily inspect any individual variableNodeIdand pass it directly toPOST /v1/objects/value. - Use Case: Excellent for OPC UA address space exploration, debugging, and direct variable tag mapping.
Strategy 2: Asset-Centric Abstraction (node-i3x)
- How
node-i3xmaps nodes:node-i3xrestricts/v1/objectsstrictly to OPC UAObjectnodes (representing physical assets like pumps, boilers, or production lines). OPC UAVariablenodes are represented as telemetry properties queried viaPOST /v1/objects/valueor nested property attributes. - Advantages: Aligns strictly with ISA-95 and Asset Administration Shell (AAS) domain modeling standards. The
/v1/objectsendpoint returns a clean Asset Knowledge Graph that AI agents can navigate without being overwhelmed by raw variable tags. - Use Case: Ideal for enterprise Knowledge Graphs, AI agents, and asset-level analytics dashboards.
Frequently Asked Questions (FAQ)
Is i3x2ua fully compliant with the CESMII i3X 1.0 specification?
Yes. i3x2ua achieves 100% compliance with the i3X 1.0 REST API specification, passing all automated conformance tests for REST queries, authentication, error handling, and VQT value formatting.
Should I choose i3x2ua or node-i3x for my project?
- Choose
i3x2uaif your engineering stack is built on Python, or if you are integrating i3X data into Python data science pipelines (Pandas, NumPy, Scikit-learn), FastAPI microservices, or Jupyter notebooks. - Choose
node-i3xif your application requires TypeScript / Node.js integration, high-concurrency web REST services, or a strict ISA-95 Asset Knowledge Graph for AI agents.
Conclusion: The Debate Remains Open — Let's Discuss!
The semantic boundary between OPC UA Variables and i3X Objects remains an active, open debate as the i3X specification evolves towards its official 1.0 standardization under CESMII.
While node-i3x prioritizes an asset-centric hierarchy and i3x2ua provides direct address space node discovery, both strategies highlight valuable trade-offs for industrial integrators:
- Should i3X gateways enforce a strict Asset Entity boundary at the
/v1/objectsendpoint? - Or should the specification allow configurable view filters so clients can toggle between raw OPC UA node discovery and ISA-95 asset topology?
We believe the best standards are forged through open collaboration. We are very happy and excited to continue this discussion with Andreas Heine, the i3x2ua community, CESMII working groups, and the broader OPC UA open-source community to help shape the future of i3X interoperability.
Project Links & Join the Discussion
i3x2ua(Python Gateway): github.com/AndreasHeine/i3x2uanode-i3x(TypeScript Gateway): github.com/sterfive/node-i3x- i3X Portal Live Playground: i3x-portal.sterfive.io