BadHistoryOperationUnsupported
BadPart 11 support
BadHistoryOperationUnsupported means the server accepted your HistoryRead or HistoryUpdate call but does not implement that particular history operation. Check the Server object's HistoryServerCapabilities and ServerProfileArray for the HistoricalRawData2022 or AggregateHistorical2022 facet before assuming the archive exists. Most PLC-embedded servers implement no historical access at all.
What you actually see
A raw or processed history read that works against one server returns nothing but this code against another, even though the variable clearly has live values.
Why it happens
- The server implements no historical accessHistorical access is a separate set of conformance units from data access. A server can be fully compliant for reads and subscriptions and implement none of Part 11. Embedded PLC servers are the usual case: they expose current values only, with no archive behind them.
- The operation you asked for is not the one the server supportsPart 11 defines distinct read details: raw, modified, at-time, processed, events and annotations. Servers commonly implement raw reads and nothing else. Asking for ReadProcessedDetails or ReadAtTimeDetails on such a server returns this code even though a plain raw read works.
- You are attempting a HistoryUpdate the server declares read-onlyHistoryServerCapabilities carries separate flags for InsertDataCapability, ReplaceDataCapability, UpdateDataCapability, DeleteRawCapability, DeleteAtTimeCapability and InsertAnnotationCapability. An archive that serves reads perfectly will reject inserts or deletes if those flags are false.
- Historical events requested on a data-only historianAccessHistoryDataCapability and AccessHistoryEventsCapability are independent. A server can archive variable values and archive no events, so a ReadEventDetails call against its notifier node fails while raw variable reads succeed.
- The node is not historized even though the server supports historyHistory is enabled per Variable through the Historizing attribute and the HistoryRead bit of AccessLevel. If a server supports Part 11 but the specific node was never added to the historian's collection group, some servers report an operation-level failure here rather than a node-level one.
How to fix it
In diagnostic order: work down, do not skip ahead.
- Read the server's declared history capabilityBrowse Server, ServerCapabilities, HistoryServerCapabilities and read AccessHistoryDataCapability and AccessHistoryEventsCapability. False on both means stop: there is no archive to query. Also read MaxReturnDataValues and MaxReturnEventValues so you size requests correctly later.
- Read ServerProfileArray and the capability codesLook for http://opcfoundation.org/UA-Profile/Server/HistoricalRawData2022 and .../AggregateHistorical2022. Then read the server's short capability codes: HD indicates historical data, HE historical events. If neither string is present the server is telling you plainly that it does not do this.
- Fall back to a plain raw readRetry with ReadRawModifiedDetails, isReadModified false, a narrow time window and numValuesPerNode set low. If the raw read succeeds, the unsupported thing was the specific read detail you used, not history in general.
- Check the Historizing attribute on the nodeRead attribute Historizing and AccessLevel on the target Variable. Historizing false, or AccessLevel without the HistoryRead bit, means the node is not collected. Enable collection in the server's historian configuration rather than changing the client.
- Move aggregation to a real historian if the server has noneIf the server genuinely implements no Part 11, put a collector in front of it: subscribe to the values and archive them yourself, or use a gateway that provides historical access on top of a live-only server. Do not keep retrying the history service.
Where it shows up, by tool and stack
| Tool / stack | What to do there |
|---|---|
| UaExpert | The History Trend View shows this as an empty plot with the status in the result column. Before trusting it, open the Attributes pane on the node and confirm Historizing is true; UaExpert will happily offer a trend for a node with no archive. |
| asyncua (Python) | node.read_raw_history() raises UaStatusCodeError carrying this code. Wrap it and read HistoryServerCapabilities via the Server object once at connect rather than per node, then skip history for servers that declare nothing. |
| node-opcua | session.readHistoryValue() returns the code in the HistoryReadResult statusCode rather than throwing. Check result.statusCode explicitly; a successful service call with a failed per-node result is easy to miss. |
| UA-.NETStandard (C#) | session.HistoryRead with a ReadProcessedDetails or ReadAtTimeDetails ExtensionObject surfaces it in HistoryReadResultCollection. The reference stack's HistoryClient helper covers raw, modified, at-time, processed and annotation reads, so it is easy to call one the server does not have. |
| Siemens S7-1500 | Treat historical access as absent unless you have confirmed otherwise on your firmware: PLC-embedded servers generally ship data access and methods, not Part 11. Collect and archive externally. |
What it looks like in the log
HistoryRead failed: BadHistoryOperationUnsupported (node=ns=3;s=Line1.Counter, details=ReadProcessedDetails)
AccessHistoryDataCapability=False - skipping historical read for 412 configured nodes
Confirm the fix
Re-run the same read after enabling collection or switching read details, and confirm HistoryServerCapabilities now reports the capability you depend on. A successful raw read returning at least one DataValue with a SourceTimestamp inside your window is proof.
Stop it happening again
At connect time, read HistoryServerCapabilities and ServerProfileArray once and cache what the server actually claims, then gate every history feature in your client on that. Fleet-wide, record per-server history capability in your asset inventory so integration work is scoped before a site visit.
Stuck on more than one of these? The troubleshooting clinic works through broken configurations end to end, on camera.
Troubleshooting clinic →Last verified 7 September 2026 against OPC UA 1.05.07. OPC UA Connect is an educational resource and is not affiliated with the OPC Foundation.