From 296a1f6add2696a2f7900919cb18ba09d9d18bd5 Mon Sep 17 00:00:00 2001 From: Pranay265 <145991890+Pranay265@users.noreply.github.com> Date: Sat, 30 May 2026 14:30:42 +0530 Subject: [PATCH 1/2] fix: wrap condition observations in durable relay path to populate DataItem.Device --- .../Module.cs | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/agent/Modules/MTConnect.NET-AgentModule-MqttRelay/Module.cs b/agent/Modules/MTConnect.NET-AgentModule-MqttRelay/Module.cs index 9cbedb141..d33e3e934 100644 --- a/agent/Modules/MTConnect.NET-AgentModule-MqttRelay/Module.cs +++ b/agent/Modules/MTConnect.NET-AgentModule-MqttRelay/Module.cs @@ -899,7 +899,25 @@ await AsyncVoidGuard.Run( if (observation.Category == DataItemCategory.CONDITION) { var conditionObservations = Agent.GetCurrentObservations(observation.DeviceUuid, observation.DataItemId); - var result = await _entityServer.PublishObservations(_mqttClient, conditionObservations.OfType()); + var wrapped = conditionObservations?.Select(obs => + { + var x = new Observation(); + x.DeviceUuid = obs.DeviceUuid; + x.DataItemId = obs.DataItemId; + x.DataItem = obs.DataItem; + x.Name = obs.Name; + x.Category = obs.Category; + x.Type = obs.Type; + x.SubType = obs.SubType; + x.Representation = obs.Representation; + x.CompositionId = obs.CompositionId; + x.InstanceId = obs.InstanceId; + x.Sequence = obs.Sequence; + x.Timestamp = obs.Timestamp; + x.AddValues(obs.Values); + return (IObservation)x; + }); + var result = await _entityServer.PublishObservations(_mqttClient, wrapped); if (result != null && result.IsSuccess && conditionObservations != null && conditionObservations.Any()) { RecordLastSentSequence(conditionObservations.Max(o => o.Sequence)); From 248b81a81bfbce6a7d5a9ad80e454f826860fb61 Mon Sep 17 00:00:00 2001 From: Patrick Ritchie Date: Thu, 4 Jun 2026 00:25:52 -0400 Subject: [PATCH 2/2] Update Module.cs Updated to use existing CloneAsObservation() method. --- .../Module.cs | 33 +++++++------------ 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/agent/Modules/MTConnect.NET-AgentModule-MqttRelay/Module.cs b/agent/Modules/MTConnect.NET-AgentModule-MqttRelay/Module.cs index d33e3e934..5791b0b33 100644 --- a/agent/Modules/MTConnect.NET-AgentModule-MqttRelay/Module.cs +++ b/agent/Modules/MTConnect.NET-AgentModule-MqttRelay/Module.cs @@ -899,28 +899,19 @@ await AsyncVoidGuard.Run( if (observation.Category == DataItemCategory.CONDITION) { var conditionObservations = Agent.GetCurrentObservations(observation.DeviceUuid, observation.DataItemId); - var wrapped = conditionObservations?.Select(obs => - { - var x = new Observation(); - x.DeviceUuid = obs.DeviceUuid; - x.DataItemId = obs.DataItemId; - x.DataItem = obs.DataItem; - x.Name = obs.Name; - x.Category = obs.Category; - x.Type = obs.Type; - x.SubType = obs.SubType; - x.Representation = obs.Representation; - x.CompositionId = obs.CompositionId; - x.InstanceId = obs.InstanceId; - x.Sequence = obs.Sequence; - x.Timestamp = obs.Timestamp; - x.AddValues(obs.Values); - return (IObservation)x; - }); - var result = await _entityServer.PublishObservations(_mqttClient, wrapped); - if (result != null && result.IsSuccess && conditionObservations != null && conditionObservations.Any()) + if (!conditionObservations.IsNullOrEmpty()) { - RecordLastSentSequence(conditionObservations.Max(o => o.Sequence)); + var multipleObservations = new List(conditionObservations.Count()); + foreach (var observation in conditionObservations) + { + multipleObservations.Add(CloneAsObservation(observation)); + } + + var result = await _entityServer.PublishObservations(_mqttClient, multipleObservations); + if (result != null && result.IsSuccess) + { + RecordLastSentSequence(conditionObservations.Max(o => o.Sequence)); + } } } else