Four open-source OPC UA stacks are realistic candidates for an industrial product: S2OPC, open62541, node-opcua and python-asyncua. This page compares them across the capabilities most often asked about when specifying a device or a gateway: security policies, PubSub and TSN, historical access, alarms, companion specifications, embedded targets and licensing.
Every cell below was read in the stack's own source tree at a pinned release. Nothing here comes from a vendor feature chart.
This is the overview. We maintain a much more granular comparison behind it (the full per-specification-Part matrix and a scored rubric), and how to get at those is at the bottom of this page.
Each capability was checked by reading the source at a named tag, then confirmed against the project's release history rather than a single snapshot.
Baselines. S2OPC S2OPC_Toolkit_1.7.3 (b4c5c7d63, 2026-06-08) · open62541 v1.5.5 (3bdeed5df, 2026-06-28) · node-opcua v2.175.6 (e233d9061, 2026-07-30) · python-asyncua v2.0.1 (f0e48e3f, 2026-06-29). Read 2026-07-30.
Two rules make the difference between this and a search-and-summarise exercise, and both were earned the hard way while building it:
| Capability | S2OPC 1.7.3 | open62541 v1.5.5 | node-opcua v2.175.6 | asyncua v2.0.1 |
|---|---|---|---|---|
| Security policies (Part 2) | ✅ classic set | ✅ classic set plus ECC | ✅ classic set | ✅ classic set |
| PubSub (Part 14) | ✅ UADP over UDP, raw Ethernet, MQTT | ✅ as S2OPC, plus JSON encoding | ❌ | ⚠️ UADP over UDP |
TSN transmit scheduling (ETF, SO_TXTIME) | ✅ | ✅ | ❌ | ❌ |
| Alarms & conditions (Part 9) | ✅ server and client | ✅ server | ✅ full alarm type hierarchy | ⚠️ events and refresh only |
| Historical access (Part 11) | ⚠️ raw read, off by default, storage delegated | ✅ pluggable historian backend | ✅ raw read, replaceable historian | ✅ pluggable backend, SQLite included |
| Certificate management, GDS push (Part 12) | ✅ | ❌ | ✅ | ❌ |
| Companion specs and nodeset tooling | ⚠️ utility scripts | ✅ nodeset compiler | ✅ 30+ companion models pre-generated | ⚠️ runtime XML loader |
| Embedded targets | ✅ FreeRTOS, Zephyr, PikeOS | ✅ FreeRTOS, Zephyr | ❌ needs a Node.js runtime | ❌ needs CPython |
| Licence | Apache-2.0 permissive | MPL-2.0 file-scoped copyleft | MIT permissive | LGPL-3.0-or-later ship as a separate, relinkable library |
✅ implemented · ⚠️ present but scoped, as stated in the cell · ❌ not present at the pinned release
Short factual notes that a category-level table cannot carry, and that are easy to get wrong from a feature search:
SO_TXTIME) transmit scheduling, which is what lets a publisher be placed inside a TSN transmission window. What we checked is that the machinery is in the library and that each project's TSN sample drives it. Whether the library's own publisher wires it for you, without you writing that part, is a question for the project.The four span the range, and the difference only bites once a design has hardened. In outline, and subject to the disclaimer at the foot of this page:
Every one of these projects is under active development, and this page is a reading taken on 2026-07-30 at the releases named above. Treat it as a map of where the differences were, accurate enough to shortlist with and not a substitute for checking the tag you will actually ship.
Two things we would say plainly about that, having just spent two passes on it:
For anything load-bearing (a capability a design depends on, or an absence you are planning around), go to the project's own repository and release notes at your target version. We are happy to do that with you; we are not a substitute for it.
The table above is deliberately a category-level view of the capabilities that come up most often. Behind it we maintain two larger documents, both current as of the baselines named above:
Both are available on request, and we will walk you through them. If you are running a stack selection now, the faster route is usually to tell us the constraints (target hardware, whether PubSub or TSN is in scope, historian requirements, certification obligations) and let us apply the rubric to your shortlist rather than to ours.
Notes and disclaimers. Every cell on this page was read in the named project's own source tree at the release stated above, on 2026-07-30, and is not a vendor claim; line and file references drift between releases. A ❌ means we read the tree and did not find it, at that release, not that the capability does not exist elsewhere or will not arrive. These projects are under active development, so for anything a design depends on, verify against the project's own repository at the version you will ship. Licence descriptions are a plain-language summary for orientation only, not legal advice and not a complete statement of terms. Check the current licence text with the respective project, and take your own advice on how it applies to how you intend to ship.