Native AVEVA alarm events on an attribute are not readable per source (source is <Object>.<Attribute>, folder notifier is the object) #882
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
HistoryReadEvents for the source
DevWinPlatform.CPULoadAvgreturnsGoodNoData, although HistorianGateway returns 70 such events in the window with that source name. Object-level events (DevWinPlatform: System.Stop/Start) are returned correctly.The gateway names attribute alarms
<Object>.<Attribute>, but OtOpcUa's equipment-folder event notifier filters on the object-level name. Native attribute alarms therefore can't be reached from an equipment folder's event history.To decide: should a folder's event history include
<Object>.*sources (prefix match), or should attribute-level notifiers be exposed? Check the ACL implications, since per-folder event ACL (#826/#838) keys on the folder. Coordinate with historiangw if the source naming should change instead.Evidence: lmxopcua#801 AVEVA history gate (comment 11735), OtOpcUa master
008f0b36docs/plans/evidence/2026-11-10-opcua2/aveva-history-801.md; harnessAvevaGatewayHistoryLiveGateTests(f607ee75). Reproduces identically on SDK 1.5.378.182 (efb9197a) and SDK 2.0.1, so it is not an SDK2 regression.Fixed on master
da948e5f, OtOpcUa only. No HistorianGateway wire change.Root cause. OtOpcUa sends a per-source
ReadEventsasSource_Object = <source>. The gateway reports each row'sSourceNameasSource_ProcessVariable, falling back toSource_Object. A read-only probe of vd03's gatewayea9f21cforSource_Object = DevWinPlatformover the #801 window returned 72 rows: 2DevWinPlatform(System.Stop/Start) and 70DevWinPlatform.CPULoadAvg(Alarm.Set/Clear,source_object=DevWinPlatform,source_conditionvariable=DevWinPlatform.CPULoadHiAlarm). The gateway was already returning the attribute alarms in one request. OtOpcUa's defensive client-side filter inGatewayHistorianDataSourcecomparedSourceNamefor equality, so it threw 70 of them away. A read forSource_Object = DevWinPlatform.CPULoadAvgreturns 0 rows, as expected, because that name is not an object.Design (the default from the issue). A notifier folder's event history includes events whose source is the folder's source or
<source>.+ anything. The match is on the.boundary and ordinal (Mapping/EventSourceMatch).DevWinPlatformnever matchesDevWinPlatform2,DevWinPlatform2.XorDevWinPlatform_X. The rule applies to the page filter and to the past-the-cap "more events" signal. It still makes one request per page.GoodNoData.ACL. The attribute events come from the notifier's own HistoryRead, so the per-folder verdict governs them (
AuthorizeHistoryRead, #826). WithSecurity:Acl:Enabled, a session denied the folder getsBadUserAccessDeniedwith no HistoryData, and the backend is never called (fail closed). No per-event path bypasses it.Tests (rebased on #881
b27b5b9c; Gateway backend still declares Events):GatewayAttributeEventSourceTests, 16 tests:DevWinPlatform2/DevWinPlatform2.X/DevWinPlatformX.X. The sibling rows are asserted to have reached the filter (negative control);AttributeEventHistoryWireTests, 2 tests, over a real SDK session with the production Gateway backend on an AVEVA-shaped deterministic gateway that filters loosely, so the sibling reaches OtOpcUa:BadUserAccessDenied, none of its events, and zero backend requests. Positive control: the same session on its granted folder gets that object's attribute alarm..boundary fails the wire sibling check and 6 unit tests.Live re-run (vd03 HistorianGateway
ea9f21c, read-only, no WinRM, API key read over SMB and not printed, local copy deleted).AvevaGatewayHistoryLiveGateTestsnow asserts #882:DevWinPlatform: 2 → 72 events (whole read, 72 one-event pages, reverse), exactly the unfiltered read's rows namedDevWinPlatformorDevWinPlatform.*.DevWinPlatform.CPULoadAvgfolder: stillGoodNoData.DevWinPlatformevent cases. Harness failures: 0.docs/plans/evidence/2026-11-10-opcua2/aveva-history-801.md§ "#882 re-run".Not covered: filed #886. A production folder's source is its NodeId identifier (a RawPath or an EquipmentId), never a Galaxy
tag_name. So AVEVA's own A&E history reaches a folder only where an EquipmentId happens to equal the object name. The #801 harness names the folder after the object. #886 also covers AVEVA's lower-case property keys:priorityandalarm_idare not mapped, so Severity is 1 and ConditionName/SourceNode are null on AVEVA rows.Cross-link. historiangw#133 (closed) carried a "should the gateway naming change?" note. It doesn't need to: the gateway's
Source_Objectfilter is the right granularity.Claude-Session: https://claude.ai/code/session_01GT67ACmpMR7b9LGRPLijMi