/// <summary> /// Update the browser alert list data using SignalR /// </summary> private static async Task UpdateSessionsAlertData(CancellationToken ct) { while (true) { _updateClientAlertData.WaitOne(Timeout.Infinite); if (ct.IsCancellationRequested) { break; } AlertDataUpdate[] sessionAlertDataUpdate = new AlertDataUpdate[Startup.SessionList.Count]; int sessionUpdateIndex = 0; try { foreach (KeyValuePair <string, DashboardModel> session in Startup.SessionList) { AlertDataUpdate sessionAlertData = new AlertDataUpdate(); string topNodeKey = session.Value.TopNode.Key; // Update the alert data. sessionAlertData.SessionId = session.Key; sessionAlertData.TopNode = topNodeKey; sessionAlertData.Alerts = Startup.Topology.GetAlerts(topNodeKey); // Update the data sent to the clients. sessionAlertDataUpdate[sessionUpdateIndex] = sessionAlertData; sessionUpdateIndex++; } if (Startup.SessionList.Count > 0 && sessionUpdateIndex > 0) { string _sessionAlertDataUpdateJson = JsonConvert.SerializeObject(sessionAlertDataUpdate); IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext <TelemetryHub>(); hubContext.Clients.All.updateSessionAlertData(_sessionAlertDataUpdateJson); } } catch (Exception e) { Trace.TraceInformation($"Exception in UpdateSessionsAlertData ({e.Message})"); } } }
public string AlertActionExecute(long alertId, int alertActionId) { var jsonResponse = new List <object>(); try { // Lookup the alert. ContosoAlert alert = Startup.Topology.FindAlert(alertId); if (alert != null) { // Validate the action id. ContosoTopologyNode topologyNode = Startup.Topology[alert.Key] as ContosoTopologyNode; List <ContosoAlertActionDefinition> alertActions = topologyNode.GetAlertActions(alert.Cause, alert.SubKey); if (alertActions == null || alertActionId >= alertActions.Count) { Trace.TraceError($"alertActionId '{alertActionId}' is out of scope or unknown."); Response.StatusCode = 1; jsonResponse.Add(new { errorMessage = Strings.AlertIdUnknown }); } else { bool updateSessionAlerts = false; // Process the requested action. switch (alertActions[alertActionId].Type) { case ContosoAlertActionType.AcknowledgeAlert: // Update alert status. if (topologyNode.AcknowledgeAlert(alertId) == false) { Trace.TraceError( $"alertId '{alertId}' in node '{topologyNode.Key}' could not be acknowledged."); Response.StatusCode = 1; jsonResponse.Add(new { errorMessage = Strings.AlertIdUnknown }); } updateSessionAlerts = true; jsonResponse.Add(new { actionType = ContosoAlertActionType.AcknowledgeAlert }); break; case ContosoAlertActionType.CloseAlert: // Update alert status. if (topologyNode.CloseAlert(alertId) == false) { Trace.TraceError( $"alertId '{alertId}' in node '{topologyNode.Key}' could not be acknowledged."); Response.StatusCode = 1; jsonResponse.Add(new { errorMessage = Strings.AlertIdUnknown }); } updateSessionAlerts = true; jsonResponse.Add(new { actionType = ContosoAlertActionType.CloseAlert }); break; case ContosoAlertActionType.CallOpcMethod: // Validate that this is a OPC UA server. if (topologyNode.GetType() != typeof(Station)) { Trace.TraceError($"Toplogy node '{topologyNode.Key}' is not an OPC UA server. No method call possible."); Response.StatusCode = 1; jsonResponse.Add(new { errorMessage = Strings.AlertIdUnknown }); break; } // Parameter format: "<parent nodeId>, <method nodeId>, <opcua server uri>" string[] parameter = alertActions[alertActionId].Parameter.Split(','); jsonResponse.Add(new { errorMessage = CallOpcMethod(parameter[2].Trim(), parameter[0].Trim(), parameter[1].Trim()) }); break; case ContosoAlertActionType.OpenWebPage: jsonResponse.Add(new { actionType = ContosoAlertActionType.OpenWebPage }); string urlPath = alertActions[alertActionId].Parameter; jsonResponse.Add(new { url = urlPath }); break; case ContosoAlertActionType.None: default: Trace.TraceWarning($"alert type '{alertActions[alertActionId].Type}' of alert '{alertId}' resulted in no action."); break; } // Update session alerts if requested. if (updateSessionAlerts) { // Prepare the updated alert list. AlertDataUpdate[] sessionAlertDataUpdate = new AlertDataUpdate[Startup.SessionList.Count]; int sessionUpdateIndex = 0; foreach (KeyValuePair <string, DashboardModel> session in Startup.SessionList) { AlertDataUpdate sessionAlertData = new AlertDataUpdate(); string topNodeKey = session.Value.TopNode.Key; // Update the alert data. sessionAlertData.SessionId = Session.SessionID; sessionAlertData.TopNode = topNodeKey; sessionAlertData.Alerts = Startup.Topology.GetAlerts(topNodeKey); // Update the data sent to the clients. sessionAlertDataUpdate[sessionUpdateIndex] = sessionAlertData; sessionUpdateIndex++; } // Update all clients string sessionAlertDataUpdateJson = JsonConvert.SerializeObject(sessionAlertDataUpdate); if (Startup.SessionList.Count > 0 && sessionUpdateIndex > 0) { IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext <TelemetryHub>(); hubContext.Clients.All.updateSessionAlertData(sessionAlertDataUpdateJson); } } } } else { Trace.TraceError($"alertId '{alertId}' is out of scope or unknown."); Response.StatusCode = 1; jsonResponse.Add(new { errorMessage = Strings.AlertIdUnknown }); } } catch (Exception ex) { Trace.TraceError($"exception '{ex.Message}' while processing alertId '{alertId}' and alertActionId '{alertActionId}"); Response.StatusCode = 1; jsonResponse.Add(new { errorMessage = Strings.AlertIdUnknown }); } return(JsonConvert.SerializeObject(jsonResponse)); }
/// <summary> /// Update the browser content using SignalR /// </summary> private void BrowserUpdate() { ChildrenDataUpdate[] sessionChildrenDataUpdate = new ChildrenDataUpdate[Startup.SessionList.Count]; OeeKpiDataUpdate[] sessionOeeKpiDataUpdate = new OeeKpiDataUpdate[Startup.SessionList.Count]; AlertDataUpdate[] sessionAlertDataUpdate = new AlertDataUpdate[Startup.SessionList.Count]; int sessionUpdateIndex = 0; foreach (KeyValuePair <string, DashboardModel> session in Startup.SessionList) { ChildrenDataUpdate sessionChildrenData = new ChildrenDataUpdate(); OeeKpiDataUpdate sessionOeeKpiData = new OeeKpiDataUpdate(); AlertDataUpdate sessionAlertData = new AlertDataUpdate(); string topNodeKey = session.Value.TopNode.Key; // Update the OEE/KPI relevant data. sessionOeeKpiData.SessionId = session.Key; sessionOeeKpiData.TopNode = topNodeKey; // Add the performance data relevant for the session. ContosoTopologyNode topNode = (ContosoTopologyNode)Startup.Topology[topNodeKey]; ContosoAggregatedOeeKpiTimeSpan oeeKpiLast = topNode.Last; sessionOeeKpiData.Kpi1Last = oeeKpiLast.Kpi1; sessionOeeKpiData.Kpi1PerformanceSetting = topNode.Kpi1PerformanceSetting; sessionOeeKpiData.Kpi2Last = oeeKpiLast.Kpi2; sessionOeeKpiData.Kpi2PerformanceSetting = topNode.Kpi2PerformanceSetting; sessionOeeKpiData.OeeAvailabilityLast = oeeKpiLast.OeeAvailability; sessionOeeKpiData.OeeAvailabilityPerformanceSetting = topNode.OeeAvailabilityPerformanceSetting; sessionOeeKpiData.OeePerformanceLast = oeeKpiLast.OeePerformance; sessionOeeKpiData.OeePerformancePerformanceSetting = topNode.OeePerformancePerformanceSetting; sessionOeeKpiData.OeeQualityLast = oeeKpiLast.OeeQuality; sessionOeeKpiData.OeeQualityPerformanceSetting = topNode.OeeQualityPerformanceSetting; sessionOeeKpiData.OeeOverallLast = oeeKpiLast.OeeOverall; sessionOeeKpiData.OeeOverallPerformanceSetting = topNode.OeeOverallPerformanceSetting; // Update the alert data. sessionAlertData.SessionId = session.Key; sessionAlertData.TopNode = topNodeKey; sessionAlertData.Alerts = Startup.Topology.GetAlerts(topNodeKey); // Update the children data. sessionChildrenData.SessionId = session.Key; sessionChildrenData.TopNode = topNodeKey; sessionChildrenData.Children = Startup.Topology.GetChildrenInfo(topNodeKey); // Update the data sent to the clients. sessionChildrenDataUpdate[sessionUpdateIndex] = sessionChildrenData; sessionOeeKpiDataUpdate[sessionUpdateIndex] = sessionOeeKpiData; sessionAlertDataUpdate[sessionUpdateIndex] = sessionAlertData; sessionUpdateIndex++; } if (Startup.SessionList.Count > 0 && sessionUpdateIndex > 0) { string _sessionChildrenDataUpdateJson = JsonConvert.SerializeObject(sessionChildrenDataUpdate); string _sessionOeeKpiDataUpdateJson = JsonConvert.SerializeObject(sessionOeeKpiDataUpdate); string _sessionAlertDataUpdateJson = JsonConvert.SerializeObject(sessionAlertDataUpdate); IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext <TelemetryHub>(); hubContext.Clients.All.updateSessionChildrenData(_sessionChildrenDataUpdateJson); hubContext.Clients.All.updateSessionOeeKpiData(_sessionOeeKpiDataUpdateJson); hubContext.Clients.All.updateSessionAlertData(_sessionAlertDataUpdateJson); } }