From 008f0b36b21e80bd11ca301e20e6a7aa37acf4d2 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Thu, 12 Nov 2026 10:02:21 -0500 Subject: [PATCH] =?UTF-8?q?docs(evidence):=20#801=20real-AVEVA=20history?= =?UTF-8?q?=20gate=20=E2=80=94=20SDK=202.0.1=20identical=20to=201.5.378.18?= =?UTF-8?q?2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both builds served HistoryRead from the real AVEVA Historian via the DEV HistorianGateway (vd03, ea9f21c): 225 cases / 3,855 rows / events, 0 differences. Raw also matches direct SQL on Runtime.dbo.History (6/6) and histgw-cli; simple aggregates match a recomputation from raw (336/336). Modified, HistoryUpdate, seven refused aggregates and HistoryServerCapabilities answer as before. No write reached the historian. Findings (pre-existing, not SDK): all HistoryServerCapabilities booleans false; AVEVA attribute-alarm events unreachable per source. Claude-Session: https://claude.ai/code/session_01GT67ACmpMR7b9LGRPLijMi --- .../2026-11-10-opcua2/aveva-history-801.md | 78 ++++++++++++++++++ .../aveva-gate-sdk1-efb9197a.json.gz | Bin 0 -> 25086 bytes .../aveva-gate-sdk2-d46044f5.json.gz | Bin 0 -> 25190 bytes .../aveva-history-801/compare.txt | 36 ++++++++ .../histgw-cli-read-raw.tar.gz | Bin 0 -> 4010 bytes .../aveva-history-801/test-runs.txt | 2 + 6 files changed, 116 insertions(+) create mode 100644 docs/plans/evidence/2026-11-10-opcua2/aveva-history-801.md create mode 100644 docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/aveva-gate-sdk1-efb9197a.json.gz create mode 100644 docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/aveva-gate-sdk2-d46044f5.json.gz create mode 100644 docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/compare.txt create mode 100644 docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/histgw-cli-read-raw.tar.gz create mode 100644 docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/test-runs.txt diff --git a/docs/plans/evidence/2026-11-10-opcua2/aveva-history-801.md b/docs/plans/evidence/2026-11-10-opcua2/aveva-history-801.md new file mode 100644 index 000000000..b11e99e63 --- /dev/null +++ b/docs/plans/evidence/2026-11-10-opcua2/aveva-history-801.md @@ -0,0 +1,78 @@ +# #801: real AVEVA history through HistorianGateway, SDK 2.0.1 vs 1.5.378.182 (2026-11-12) + +**Scope.** This covers the "real AVEVA historian" part of [#801](https://gitea.dohertylan.com/dohertj2/lmxopcua/issues/801) only. +Consumer compatibility, pair/failover and #800 are separate gates and are not covered here. + +**Result.** SDK 2.0.1 serves HistoryRead from the real AVEVA Historian with output identical to SDK 1.5.378.182. Both builds +ran the same queries over the same fixed past windows, through the same gateway. The comparison covered 225 cases, +3,855 rows and the event rows, and found 0 differences. + +Raw rows also match two independent sources: +- direct SQL on `Runtime.dbo.History`, read-only (6/6 tag-windows); +- HistorianGateway's own CLI. + +The simple aggregates also match a recomputation from the raw rows (336/336). + +Unsupported capabilities answer the same way on both builds: modified history, HistoryUpdate, the seven refused +aggregates and the HistoryServerCapabilities flags. + +## Setup + +| | | +|---|---| +| Server under test | Local `d46044f5` = master `438484fd` + this harness (SDK **2.0.1**). It was pushed as `f607ee75` after a rebase onto `c266971d`, which adds only #789 docs and a ScriptRunner perf test, so no server or historian code changed. Baseline: `efb9197a`, master's first parent before the SDK 2 merge `b36e688f` (SDK **1.5.378.182**). Both use HistorianGateway Client/Contracts **1.0.0**. | +| How | `AvevaGatewayHistoryLiveGateTests` boots the OtOpcUa server in-process on the Mac. It wires the **production** Gateway backend (`HistorianBackendRegistry` → `GatewayHistorianDataSource`, default `ServerHistorianOptions`) and reads over a real SDK client session (`None`, anonymous, ACL off). The SDK 1 build runs the same file with [`sdk1-baseline-port.patch`](../../../../scripts/validation/aveva-history-801/sdk1-baseline-port.patch), which changes API spelling only. | +| Gateway | wonder-app-vd03 (DEV) `http://…:5221` (h2c), HistorianGateway **`ea9f21c`**. The SHA was read from the deployed `Server.dll` over SMB. The gateway talks gRPC to the AVEVA 2023 R2 historian on wonder-sql-vd03. The gateway config and service were not touched. | +| Credential | vd03 OtOpcUa's existing `ServerHistorian__ApiKey` (`OtOpcUa-wonder`, from the box's env backup, read over SMB). It was used only through env/a 0600 file and was never printed. A bogus key gets `Unauthenticated` (negative control). | +| Tags | `ZIPSEN.WTC1` (float, ~2 s), `ZIPSEN.OvenPressureTransducer` (float, sparse), `SysPerfCPUTotal` (5 s). The tag `Z28061` was not used. | +| Windows (UTC) | W1 `2026-11-10 11:30–11:41`: brackets the DevWinPlatform System.Stop at 11:32:35. It has a stored NULL/Bad row at 11:32:36, a gap, and a recovery row at 11:38:34 (QualityDetail 248). W2 `2026-11-11 14:00–14:10`: steady. Events: `2026-11-05 15:00` → `2026-11-12 00:00`. | +| Writes | **None reached the historian.** The Gateway provider has no updater (asserted). The only HistoryUpdate went to a node bound to the designated sandbox `HistGW.LiveTest.Sandbox` (`HISTORIAN_WRITE_SANDBOX_TAG`), and the server refused it. No provisioner, recorder or alarm writer was built. | +| Runs | SDK 2 run at 2026-11-12 15:00:06Z, SDK 1 run straight after. Both passed with every in-test assertion green. | + +## Capability table + +"Reference" means the same backend's direct `IHistorianDataSource` answer (asserted in-test, row by row: value, StatusCode, +SourceTimestamp), plus the SDK 1 run (diffed) and, for raw, SQL and histgw-cli. + +| Capability | Query | SDK 2 result | Reference | Verdict | +|---|---|---|---|---| +| Raw | `ReadRawModifiedDetails`, `NumValuesPerNode=0`, `ReturnBounds=false`, 3 tags × 2 windows | 80 / 300 / 14 / 35 / 51 / 120 rows. W1's stored NULL is **null + `Bad` (0x80000000)**. QD 248 and QD 44 rows are Good. AVEVA's synthetic Q133 start row is dropped (#687). | Backend: identical. SDK 1: identical. SQL `History` (Full, UTC): 6/6 tag-windows match on value, ms timestamp and Good/Bad class. histgw-cli: 4/6 complete matches. On the 2 W1 windows of the ZIPSEN tags, histgw-cli stops at the NULL, but the prefix matches. | **PASS** | +| Raw paging | same, page 37 via continuation points | Concatenated pages (1–9 pages) equal the unpaged read. | identical on SDK 1 | **PASS** | +| Raw reverse | `StartTime > EndTime`, 25 | Newest first. The Part 11 window `(start, end]` includes a sample stored exactly at the end (SysPerfCPUTotal 11:41:00). | Backend `(start, end]`, reversed: identical. SDK 1: identical. | **PASS** | +| Raw bounds | `ReturnBounds=true` | Real prior and next samples are added at each end (e.g. 11:29:59.62 / 11:44:09.107). | SDK 1: identical | **PASS** | +| Modified | `IsReadModified=true` | `BadHistoryOperationUnsupported` | SDK 1: identical (Gateway has no modified history) | **PASS** (unsupported preserved) | +| Processed | 60 s interval, Average, Count, Minimum, Maximum, Range, Start, End, Delta, MinimumActualTime, MaximumActualTime | Values match. Statuses: Good+Calculated `0x00000401`. The outage interval is `UncertainDataSubNormal` `0x40A40401`. Empty intervals are `BadNoData` `0x809B0401`. Start/End carry the raw sample's own time and status (End of 11:32 = the NULL: null + Bad). | Backend: identical (asserted). SDK 1: identical (application aggregate semantics unchanged, `TreatUncertainAsBad=false`). Recomputed from raw: 336/336 non-empty all-Good intervals. | **PASS** | +| Processed, refused | TimeAverage, Total, TimeAverage2, Interpolative, PercentGood, DurationGood, StandardDeviationSample | `BadAggregateNotSupported` | SDK 1: identical. Native time-weighted is still off; no string backfill. | **PASS** (no new aggregates) | +| AtTime | window start, a stored time, a midpoint | Stored value exact (Good). Midpoints are linear + Interpolated `0x00000402`. | Backend: identical. SDK 1: identical. | **PASS** | +| Events | `ReadEventDetails` on folder `DevWinPlatform`: all, 1-event pages, reverse | 2 events, `System.Stop` 11:32:35.095Z / `System.Start` 11:43:46.563Z, with EventId, Time, ReceiveTime, SourceName, Message and Severity. Paging takes 2 pages. Reverse returns the newest first. | Backend: identical. SDK 1: identical. | **PASS** | +| Events, attribute alarm | same, folder `DevWinPlatform.CPULoadAvg` | `GoodNoData`. The gateway reports these 70 events with SourceName `DevWinPlatform.CPULoadAvg` in an unfiltered read, but a per-source read for that name returns none (Source_Object is `DevWinPlatform`). | SDK 1: identical | **PASS** (pre-existing gap, see Findings) | +| HistoryUpdate | Insert and DeleteRaw on the `HistGW.LiveTest.Sandbox`-bound node | `BadHistoryOperationUnsupported` on both | SDK 1: identical. No updater, no backend call. | **PASS** (unsupported preserved) | +| Node metadata | Historizing, AccessLevel, UserAccessLevel | `true`, `5` (CurrentRead + HistoryRead, **no HistoryWrite**), `5`, DataType `i=11` | SDK 1: identical | **PASS** | +| History capabilities | `HistoryServerCapabilities` children + AggregateFunctions | AggregateFunctions = the Gateway's ten. Every boolean capability flag is `false` (incl. AccessHistoryData/Events). `MaxReturnDataValues=10000`, `MaxReturnEventValues=0`. | SDK 1: identical | **PASS** (existing metadata preserved, see Findings) | +| Missing tag | raw on `OtOpcUa.Gate801.DoesNotExist` | `GoodNoData`, 0 rows (#653) | SDK 1: identical | **PASS** | +| SysTimeSec raw | 10 s window | Good, 10 rows, 69 ms | SDK 1: identical | **PASS**, informational. historiangw#29's timeout did **not** reproduce on `ea9f21c`. | + +ServerTimestamp on history values is the read time (`now`) on both builds. Its presence is compared; its value is not. + +## Findings (none caused by the SDK) + +1. **The boolean flags under `HistoryServerCapabilities` are all `false`** on both SDKs, including AccessHistoryDataCapability and + AccessHistoryEventsCapability, even though the server serves data and event history. Clients that check these flags before + calling HistoryRead would skip it. This is existing behaviour and the upgrade preserves it. It is a candidate follow-up, not filed. +2. **AVEVA attribute-alarm events cannot be read per source.** An unfiltered read reports SourceName = `Source_ProcessVariable` + (e.g. `DevWinPlatform.CPULoadAvg`), but a per-source read with that name returns nothing. Reading by `Source_Object` returns + only the rows whose SourceName equals it: OtOpcUa's client-side filter drops the rest. Native AVEVA alarms are therefore + invisible through OtOpcUa's event history unless their object-level name matches. This is a gateway/consumer contract gap, + identical on SDK 1. It is a candidate follow-up, not filed. +3. **historiangw `histgw-cli read-raw` aborts on a stored NULL.** Its JSON writer cannot emit NaN. This is a CLI-only issue: OtOpcUa + maps the same row to null + Bad. +4. **historiangw#29 (SysTimeSec raw timeout) did not reproduce** against the `ea9f21c` gateway. + +## Files + +- [`aveva-history-801/aveva-gate-sdk2-d46044f5.json.gz`](aveva-history-801/aveva-gate-sdk2-d46044f5.json.gz), sha256 of the JSON `00b5ecb6…fc27`. +- [`aveva-history-801/aveva-gate-sdk1-efb9197a.json.gz`](aveva-history-801/aveva-gate-sdk1-efb9197a.json.gz), sha256 `21fe4985…751d`. +- [`aveva-history-801/compare.txt`](aveva-history-801/compare.txt): diff, SQL, recompute and histgw-cli outputs. + [`histgw-cli-read-raw.tar.gz`](aveva-history-801/histgw-cli-read-raw.tar.gz) holds the CLI rows. + [`test-runs.txt`](aveva-history-801/test-runs.txt) holds the two test-run summaries. +- Reproduction: [`scripts/validation/aveva-history-801/README.md`](../../../../scripts/validation/aveva-history-801/README.md). diff --git a/docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/aveva-gate-sdk1-efb9197a.json.gz b/docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/aveva-gate-sdk1-efb9197a.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..0820fcab450992cd62c8c9afe0e954e7e6244724 GIT binary patch literal 25086 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 literal 0 HcmV?d00001 diff --git a/docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/aveva-gate-sdk2-d46044f5.json.gz b/docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/aveva-gate-sdk2-d46044f5.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..df8e370c6fc18ce2b2f45e018ba67e42b2496278 GIT binary patch literal 25190 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 Xi@vH20&vO!g^uUVdc92@3(fxk2xQ$F literal 0 HcmV?d00001 diff --git a/docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/compare.txt b/docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/compare.txt new file mode 100644 index 000000000..80eecd7ab --- /dev/null +++ b/docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/compare.txt @@ -0,0 +1,36 @@ +$ diff_runs.py sdk2 sdk1 +A=sdk2-d46044f5 sdk=2.0.1.0 cases=225 failures=0 +B=sdk1-efb9197a sdk=1.5.378.0 cases=225 failures=0 +compared 225 cases: identical=225 differing=0; rows compared=3855, events compared=8 (ServerTimestamp compared for presence only: it is the read time) + +$ sql_raw_check.py sdk2-d46044f5 +ZIPSEN.WTC1 2026-11-10T11:30:00 sql_stored=80 (boundary rows dropped=1) wire=80 quality(Q,QD,OPC)={('0', '192', '192'): 78, ('1', '24', '0'): 1, ('0', '248', '192'): 1} -> MATCH +ZIPSEN.WTC1 2026-11-11T14:00:00 sql_stored=300 (boundary rows dropped=1) wire=300 quality(Q,QD,OPC)={('0', '192', '192'): 300} -> MATCH +ZIPSEN.OvenPressureTransducer 2026-11-10T11:30:00 sql_stored=14 (boundary rows dropped=1) wire=14 quality(Q,QD,OPC)={('0', '192', '192'): 12, ('1', '24', '0'): 1, ('0', '248', '192'): 1} -> MATCH +ZIPSEN.OvenPressureTransducer 2026-11-11T14:00:00 sql_stored=35 (boundary rows dropped=1) wire=35 quality(Q,QD,OPC)={('0', '192', '192'): 35} -> MATCH +SysPerfCPUTotal 2026-11-10T11:30:00 sql_stored=51 (boundary rows dropped=0) wire=51 quality(Q,QD,OPC)={('0', '192', '192'): 50, ('0', '44', '192'): 1} -> MATCH +SysPerfCPUTotal 2026-11-11T14:00:00 sql_stored=120 (boundary rows dropped=0) wire=120 quality(Q,QD,OPC)={('0', '192', '192'): 120} -> MATCH +6 tag-windows compared, 0 mismatching + +$ aggregate_recompute.py sdk2-d46044f5 +336 non-empty interval values recomputed from raw, 0 mismatching + +$ sql_raw_check.py sdk1-efb9197a +ZIPSEN.WTC1 2026-11-10T11:30:00 sql_stored=80 (boundary rows dropped=1) wire=80 quality(Q,QD,OPC)={('0', '192', '192'): 78, ('1', '24', '0'): 1, ('0', '248', '192'): 1} -> MATCH +ZIPSEN.WTC1 2026-11-11T14:00:00 sql_stored=300 (boundary rows dropped=1) wire=300 quality(Q,QD,OPC)={('0', '192', '192'): 300} -> MATCH +ZIPSEN.OvenPressureTransducer 2026-11-10T11:30:00 sql_stored=14 (boundary rows dropped=1) wire=14 quality(Q,QD,OPC)={('0', '192', '192'): 12, ('1', '24', '0'): 1, ('0', '248', '192'): 1} -> MATCH +ZIPSEN.OvenPressureTransducer 2026-11-11T14:00:00 sql_stored=35 (boundary rows dropped=1) wire=35 quality(Q,QD,OPC)={('0', '192', '192'): 35} -> MATCH +SysPerfCPUTotal 2026-11-10T11:30:00 sql_stored=51 (boundary rows dropped=0) wire=51 quality(Q,QD,OPC)={('0', '192', '192'): 50, ('0', '44', '192'): 1} -> MATCH +SysPerfCPUTotal 2026-11-11T14:00:00 sql_stored=120 (boundary rows dropped=0) wire=120 quality(Q,QD,OPC)={('0', '192', '192'): 120} -> MATCH +6 tag-windows compared, 0 mismatching + +$ aggregate_recompute.py sdk1-efb9197a +336 non-empty interval values recomputed from raw, 0 mismatching + +$ hgcli_raw_check.py sdk2 +SysPerfCPUTotal 2026-11-10T11:30:00 histgw-cli=51 wire=51 compared=51 MATCH +SysPerfCPUTotal 2026-11-11T14:00:00 histgw-cli=120 wire=120 compared=120 MATCH +ZIPSEN.OvenPressureTransducer 2026-11-10T11:30:00 histgw-cli=11 wire=14 compared=11 MATCH (histgw-cli stopped at the stored NULL: its JSON writer cannot emit NaN) +ZIPSEN.OvenPressureTransducer 2026-11-11T14:00:00 histgw-cli=35 wire=35 compared=35 MATCH +ZIPSEN.WTC1 2026-11-10T11:30:00 histgw-cli=77 wire=80 compared=77 MATCH (histgw-cli stopped at the stored NULL: its JSON writer cannot emit NaN) +ZIPSEN.WTC1 2026-11-11T14:00:00 histgw-cli=300 wire=300 compared=300 MATCH diff --git a/docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/histgw-cli-read-raw.tar.gz b/docs/plans/evidence/2026-11-10-opcua2/aveva-history-801/histgw-cli-read-raw.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..79dc8831e0bdf1ba94d1f58a3f371887507501ea GIT binary patch literal 4010 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