Exemple #1
0
        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);
     }
 }
Exemple #3
0
        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());
        }
Exemple #5
0
        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);
        }
Exemple #7
0
      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();
                    }
                }
            }
        }