Alarms: a client Acknowledge/Confirm/AddComment emits no condition event (AutoReportStateChanges false + delta-gate) #587
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?
Found by the independent review of the #586 fix (pre-existing — reproduced identically on master
35152fcaand the #586 branch).What is wrong: a client Acknowledge (and likely Confirm / AddComment / Shelve) on a Part 9 condition emits no condition event to any subscriber.
OnAcknowledgeCalledappliesAckedStateitself, but its own state-change event is gated onConditionState.AutoReportStateChanges, which this repo never sets (false).WriteAlarmCondition's delta-gate, sees the node already Acked, and suppresses the event.OtOpcUaNodeManager.cs~826 and ~1286) are wrong.Observed: Acknowledge succeeded (the audit event carried
Status=True), yet noAcked=truecondition event reached either an equipment-folder item or a Server-object (i=2253) item. A client that tracks alarm state from events never sees the ack transition; onlyConditionRefreshshows it.Consumer impact: any HMI that acks over OPC UA and follows events. ScadaBridge does not ack over OPC UA, so it is not directly affected.
To do:
AutoReportStateChangesand make the re-projection delta-gate not double-report, or report explicitly from the method handlers. Exactly once, both native and scripted alarms.AreEventsMonitoredbookkeeping correct for Server-object-only subscribers (see #586 review finding 2) so the auto-report path actually fires.Acked=trueevent after Acknowledge; same for Confirm/AddComment/Shelve.Fixed: each successful method-driven transition reports exactly one condition event (Acknowledge, Confirm, AddComment, Enable/Disable, OneShotShelve/TimedShelve/Unshelve) for scripted alarms; native alarms support Acknowledge + AddComment only (Confirm/Shelve → BadNotSupported, no event) and stay ConfirmedState=true; no-op re-acks emit nothing; TimedShelve works over OPC UA (MaxTimeShelved). Reviewed twice (FIX-FIRST → APPROVE). Note: a scripted TimedShelve's UnshelveTime field reads ~24.8 days though the engine expires it on time (pre-existing). (merge
3803df04on master, pushed 2026-10-08)