private static async Task SendEvent(DeviceClient deviceClient, DynoCardAnomalyEvent dcae) { string msgBody = JsonConvert.SerializeObject(dcae); Message eventMessage = new Message(Encoding.UTF8.GetBytes(msgBody)); await deviceClient.SendEventAsync(eventMessage).ConfigureAwait(false); }
public void Post([FromBody] DynoCardAnomalyEvent dcae) { if (dcae != null) { dynoCardAnomalyEventRepo.Add(dcae); } }
public void Send(DynoCardAnomalyEvent dcae) { DeviceClient deviceClient = DeviceClient.CreateFromConnectionString(settings.ConnectionStrings.DeviceConnectionString); if (deviceClient == null) { throw new Exception("Failed to create device client. Please check the connection string and ensure that the device is registered."); } SendEvent(deviceClient, dcae).Wait(); }
private int InsertDynoCard(SqlConnection sqlConn, SqlTransaction sqlTrans, DynoCardAnomalyEvent dcae) { string cmdText = string.Empty; SqlCommand sqlCmd = null; // Insert into the Dyno Card Table cmdText = "INSERT INTO ACTIVE.DYNO_CARD " + "(PU_ID, " + "DC_UPDATE_DATE, " + "DC_UPDATE_BY) " + "OUTPUT INSERTED.DC_ID " + "VALUES(" + "@PumpId, " + "GETUTCDATE(), " + "'SYSTEM')"; sqlCmd = new SqlCommand(cmdText, sqlConn, sqlTrans); sqlCmd.Parameters.AddWithValue("@PumpId", dcae.PumpId); return((int)sqlCmd.ExecuteScalar()); }
public async Task PersistAnomaly(DynoCardAnomalyEvent anomaly) { try { // //Store the data in SQL DB using (Sql.SqlConnection conn = new Sql.SqlConnection(ConnectionString)) { conn.Open(); var insertEvent = new StringBuilder("INSERT INTO [ACTIVE].[EVENT] ([PU_ID], [EV_EPOC_DATE], [EV_ANOMALY_ID], [EV_UPDATE_DATE], [EV_UPDATE_BY]) ") .Append("OUTPUT INSERTED.EV_ID ") .Append($"VALUES ({anomaly.PumpId}, CONVERT(int, DATEDIFF(ss, '01-01-1970 00:00:00', '{anomaly.Timestamp}')), '{anomaly.AnomalyId}', '{DateTime.Now}', 'edgeModule') "); var insertEventDetail = new StringBuilder("INSERT INTO [ACTIVE].[EVENT_DETAIL] ([EV_ID], [DC_ID], [ED_TRIGGERED_EVENTS], [ED_UPDATE_DATE], [ED_UPDATE_BY]) ") .Append("VALUES ({0}, ") .Append($"{anomaly.DynoCard.Id}, '{anomaly.DynoCard.TriggeredEvents}', '{DateTime.Now}', 'edgeModule'); "); using (Sql.SqlCommand anomalyCommand = new Sql.SqlCommand()) { anomalyCommand.Connection = conn; string eventSQL = insertEvent.ToString(); //System.Console.WriteLine($"Event SQL: {eventSQL}"); anomalyCommand.CommandText = eventSQL; var eventID = (int)await anomalyCommand.ExecuteScalarAsync(); string eventDetailSQL = string.Format(insertEventDetail.ToString(), eventID); //System.Console.WriteLine($"Event detail SQL: {eventDetailSQL}"); anomalyCommand.CommandText = eventDetailSQL; await anomalyCommand.ExecuteScalarAsync(); } } } catch (Exception ex) { System.Console.WriteLine($"Exception persisting anomaly: {ex.Message}"); } }
private int InsertEvent(SqlConnection sqlConn, SqlTransaction sqlTrans, DynoCardAnomalyEvent dcae) { string cmdText = string.Empty; SqlCommand sqlCmd = null; cmdText = "DECLARE @EventId AS INT " + "SELECT @EventId = EV_ID FROM ACTIVE.EVENT WITH(UPDLOCK, HOLDLOCK) WHERE EV_ANOMALY_ID = @AnomalyId; " + "IF ISNULL(@EventId, 0) = 0 " + " BEGIN " + "INSERT INTO ACTIVE.EVENT( " + "PU_ID, " + "EV_EPOC_DATE, " + "EV_ANOMALY_ID, " + "EV_UPDATE_DATE, " + "EV_UPDATE_BY) " + "OUTPUT INSERTED.EV_ID " + "VALUES( " + "@PumpId, " + "@EpochDate, " + "@AnomalyId, " + "GETUTCDATE(), " + "'SYSTEM') " + " END " + "ELSE " + " BEGIN " + " SELECT @EventId " + " END"; sqlCmd = new SqlCommand(cmdText, sqlConn, sqlTrans); sqlCmd.Parameters.AddWithValue("@PumpId", dcae.PumpId); sqlCmd.Parameters.AddWithValue("@EpochDate", TimeHelper.ConvertToEpoch(dcae.Timestamp)); sqlCmd.Parameters.AddWithValue("@AnomalyId", dcae.AnomalyId.ToString()); var eventId = sqlCmd.ExecuteScalar(); return((int)eventId); }
private static async Task <MessageResponse> ProcessAlert(Message message, object userContext) { Console.WriteLine("Processing an alert"); var counterValue = Interlocked.Increment(ref counter); try { DeviceClient deviceClient = (DeviceClient)userContext; var messageBytes = message.GetBytes(); var messageString = Encoding.UTF8.GetString(messageBytes); Console.WriteLine($"Received anomaly notification {counterValue}: [{messageString}]"); if (!string.IsNullOrEmpty(messageString)) { var alertMessage = JsonConvert.DeserializeObject <DynoCardAnomalyResult>(messageString); string anomalyString = alertMessage.Anomaly; bool isAnomaly = false; if (!(string.IsNullOrEmpty(anomalyString))) { isAnomaly = Boolean.Parse(anomalyString); } if (isAnomaly) { var previousCardList = await(new DataHelper()).GetPreviousCards(alertMessage); if (previousCardList != null && previousCardList.Count > 0) { Console.WriteLine($"Number of previous entries: {previousCardList.Count}"); Guid anomalyEventId = Guid.NewGuid(); foreach (var card in previousCardList) { DynoCardAnomalyEvent dynoCardAnomaly = new DynoCardAnomalyEvent() { AnomalyId = anomalyEventId, Timestamp = alertMessage.Timestamp, DynoCard = card, PumpId = 1 }; var dynoCardAnomalyString = JsonConvert.SerializeObject(dynoCardAnomaly); var dynoCardAnomalyBytes = Encoding.UTF8.GetBytes(dynoCardAnomalyString); var previousCardsMessage = new Message(dynoCardAnomalyBytes); Console.WriteLine($"Sending anomaly ID: {anomalyEventId}, with dyno card #: {card.Id}"); previousCardsMessage.Properties["MessageType"] = "Alert"; await deviceClient.SendEventAsync("alertOutput", previousCardsMessage); } //Need to add logic to know what register to use for the shut down event // string writeMessage1 = "{\"HwId\": \"Pump1-DynoCard\", \"UId\":\"1\", \"Address\":\"00109\", \"Value\":\"1\"}"; // await WriteModbusValue(writeMessage1, deviceClient); var stopModbusString = JsonConvert.SerializeObject(new StopModbusMessage()); var stopModbusBytes = Encoding.UTF8.GetBytes(stopModbusString); var stopModbusMessage = new Message(stopModbusBytes); await deviceClient.SendEventAsync("shutdownOutput", stopModbusMessage); Console.WriteLine("Completed processing alert"); } } } // Indicate that the message treatment is completed return(MessageResponse.Completed); } catch (AggregateException ex) { foreach (Exception exception in ex.InnerExceptions) { Console.WriteLine(); Console.WriteLine("Error in sample: {0}", exception); } // Indicate that the message treatment is not completed var deviceClient = (DeviceClient)userContext; return(MessageResponse.None); } catch (Exception ex) { Console.WriteLine(); Console.WriteLine("Error in sample: {0}", ex.Message); // Indicate that the message treatment is not completed //DeviceClient deviceClient = (DeviceClient)userContext; return(MessageResponse.None); } }
private DynoCardAnomalyEvent GetDynoCardMsg() { DynoCardAnomalyEvent dcae = new DynoCardAnomalyEvent(); string dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss"; // Add dyno card header Info dcae.PumpId = 1; dcae.Timestamp = DateTime.UtcNow.ToString(dateFormat); dcae.AnomalyId = Guid.NewGuid(); DynoCard dynoCard = null; ////// // Add Dyno Card #1 ////// dynoCard = new DynoCard(); dynoCard.TriggeredEvents = true; // Add Surface Card #1 dynoCard.surfaceCard = new SurfaceCard(); dynoCard.surfaceCard.Timestamp = DateTime.UtcNow.ToString(dateFormat); dynoCard.surfaceCard.NumPoints = 100; dynoCard.surfaceCard.ScaledMaxLoad = 101; dynoCard.surfaceCard.ScaledMinLoad = 102; dynoCard.surfaceCard.StrokeLength = 103; dynoCard.surfaceCard.StrokePeriod = 104; dynoCard.surfaceCard.cardCoordinates.Add(new CardCoordinate(1, 1.1F, 1.2F)); dynoCard.surfaceCard.cardCoordinates.Add(new CardCoordinate(2, 1.3F, 1.4F)); dynoCard.surfaceCard.cardCoordinates.Add(new CardCoordinate(3, 1.5F, 1.6F)); // Add Pump Card #1 dynoCard.pumpCard = new PumpCard(); dynoCard.pumpCard.Timestamp = DateTime.UtcNow.ToString(dateFormat); dynoCard.pumpCard.FluidLoad = 200; dynoCard.pumpCard.GrossStroke = 201; dynoCard.pumpCard.NetStroke = 202; dynoCard.pumpCard.NumPoints = 203; dynoCard.pumpCard.PumpFillage = 204; dynoCard.pumpCard.ScaledMaxLoad = 205; dynoCard.pumpCard.ScaledMinLoad = 206; dynoCard.pumpCard.cardCoordinates.Add(new CardCoordinate(1, 2.1F, 1.2F)); dynoCard.pumpCard.cardCoordinates.Add(new CardCoordinate(2, 2.3F, 2.4F)); dynoCard.pumpCard.cardCoordinates.Add(new CardCoordinate(3, 2.5F, 2.6F)); dcae.DynoCard = dynoCard; /* * ////// * // Add Dyno Card #2 * ////// * dynoCard = new DynoCard(); * dynoCard.TriggeredEvents = false; * * // Add Surface Card #3 * dynoCard.surfaceCard = new SurfaceCard(); * dynoCard.surfaceCard.Timestamp = DateTime.UtcNow.ToString(dateFormat); * dynoCard.surfaceCard.NumPoints = 300; * dynoCard.surfaceCard.ScaledMaxLoad = 301; * dynoCard.surfaceCard.ScaledMinLoad = 302; * dynoCard.surfaceCard.StrokeLength = 303; * dynoCard.surfaceCard.StrokePeriod = 304; * * dynoCard.surfaceCard.cardCoordinates.Add(new CardCoordinate(3.1F, 3.2F)); * dynoCard.surfaceCard.cardCoordinates.Add(new CardCoordinate(3.3F, 3.4F)); * dynoCard.surfaceCard.cardCoordinates.Add(new CardCoordinate(3.5F, 3.6F)); * * // Add Pump Card #4 * dynoCard.pumpCard = new PumpCard(); * dynoCard.pumpCard.Timestamp = DateTime.UtcNow.ToString(dateFormat); * dynoCard.pumpCard.FluidLoad = 400; * dynoCard.pumpCard.GrossStroke = 401; * dynoCard.pumpCard.NetStroke = 402; * dynoCard.pumpCard.NumPoints = 403; * dynoCard.pumpCard.PumpFillage = 404; * dynoCard.pumpCard.ScaledMaxLoad = 405; * dynoCard.pumpCard.ScaledMinLoad = 406; * * dynoCard.pumpCard.cardCoordinates.Add(new CardCoordinate(4.1F, 4.2F)); * dynoCard.pumpCard.cardCoordinates.Add(new CardCoordinate(4.3F, 4.4F)); * dynoCard.pumpCard.cardCoordinates.Add(new CardCoordinate(4.5F, 4.6F)); * * dcae.dynoCards.Add(dynoCard); */ return(dcae); }
public void Add(DynoCardAnomalyEvent dcae) { // validate that the main objects are present if (dcae == null || dcae.DynoCard == null || dcae.DynoCard.surfaceCard == null || dcae.DynoCard.pumpCard == null) { return; } // Create a new SQL Connection using (SqlConnection sqlConn = new SqlConnection(this.settings.ConnectionStrings.DynoCardDbConnString)) { // Open a connection to the database sqlConn.Open(); // Begin a SQL transaction var sqlTrans = sqlConn.BeginTransaction(); string cmdText = string.Empty; try { // Insert into the Event Table int eventId = InsertEvent(sqlConn, sqlTrans, dcae); // Insert the dyno card into the database int dynoCardId = InsertDynoCard(sqlConn, sqlTrans, dcae); // Associate the event with the dyno card int eventDetailId = InsertEventDetail(sqlConn, sqlTrans, eventId, dynoCardId, dcae.DynoCard.TriggeredEvents); ///// // Insert surface and pump card for the dyno card ///// // Insert Surface Card int surfaceCardId = InsertSurfaceCardHeader(sqlConn, sqlTrans, dynoCardId, dcae.DynoCard); // Loop through all of the coordinates and save them to the database foreach (var cardCoordinate in dcae.DynoCard.surfaceCard.cardCoordinates) { InsertCardCoordinates(sqlConn, sqlTrans, surfaceCardId, cardCoordinate); } // Insert Pump Card int pumpCardId = InsertPumpCardHeader(sqlConn, sqlTrans, dynoCardId, dcae.DynoCard); // Loop through all of the coordinates and save them to the database foreach (var cardCoordinate in dcae.DynoCard.pumpCard.cardCoordinates) { InsertCardCoordinates(sqlConn, sqlTrans, pumpCardId, cardCoordinate); } // Commit the transaction sqlTrans.Commit(); } catch (Exception) { sqlTrans.Rollback(); throw; } finally { // Close the database connection if (sqlConn != null && sqlConn.State == System.Data.ConnectionState.Open) { sqlConn.Close(); } } } }