Example #1
0
        public async Task <List <DynoCard> > GetPreviousCards(DynoCardAnomalyResult anomalyCard)
        {
            DateTime start      = anomalyCard.Timestamp.Subtract(TimeSpan.FromMinutes(30));
            DateTime end        = anomalyCard.Timestamp;
            int      startEpoch = (int)(start.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
            int      endEpoch   = (int)(end.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

            System.Console.WriteLine($"Start: {startEpoch}");
            System.Console.WriteLine($"End: {endEpoch}");

            var sql = new StringBuilder()
                      .Append("WITH cteEndCardID (cardID) ")
                      .Append("AS ( ")
                      .Append("SELECT TOP 1 h.DC_ID ")
                      .Append("FROM ACTIVE.CARD_HEADER h ")
                      .Append($"WHERE h.CH_EPOC_DATE >= {endEpoch} ")
                      .Append("ORDER BY h.CH_EPOC_DATE ), ")
                      .Append("cteStartCardID(cardID) ")
                      .Append("AS ( ")
                      .Append("SELECT TOP 1 h.DC_ID ")
                      .Append("FROM ACTIVE.CARD_HEADER h ")
                      .Append($"WHERE h.CH_EPOC_DATE <= {startEpoch} ")
                      .Append("OR h.CH_EPOC_DATE = (SELECT MIN(CH_EPOC_DATE) FROM ACTIVE.CARD_HEADER) ")
                      .Append("ORDER BY h.DC_ID DESC) ")
                      .Append("SELECT h.CH_CARD_TYPE, ")
                      .Append("dc.DC_ID, ")
                      .Append("h.CH_ID, ")
                      .Append("h.CH_SCALED_MAX_LOAD, ")
                      .Append("h.CH_SCALED_MIN_LOAD, ")
                      .Append("h.CH_STROKE_LENGTH, ")
                      .Append("h.CH_STROKE_PERIOD, ")
                      .Append("h.CH_GROSS_STROKE, ")
                      .Append("h.CH_NET_STROKE, ")
                      .Append("h.CH_PUMP_FILLAGE, ")
                      .Append("h.CH_FLUID_LOAD, ")
                      .Append("d.CD_ID, ")
                      .Append("d.CD_POSITION, ")
                      .Append("d.CD_LOAD, ")
                      .Append("h.CH_EPOC_DATE, ")
                      .Append("dc.PU_ID, ")
                      .Append("h.CH_NUMBER_OF_POINTS ")
                      .Append("FROM [ACTIVE].[DYNO_CARD] dc ")
                      .Append("JOIN [ACTIVE].[CARD_HEADER] h ON dc.DC_ID = h.DC_ID ")
                      .Append("JOIN [ACTIVE].[CARD_DETAIL] d ON h.CH_ID = d.CH_ID ")
                      .Append("JOIN cteStartCardID sc ON h.DC_ID >= sc.cardID ")
                      .Append("JOIN cteEndCardID ec ON h.DC_ID <= ec.cardID ")
                      .Append("ORDER BY h.CH_ID DESC");

            Dictionary <int, DynoCard> cardList = new Dictionary <int, DynoCard>();

            // //Store the data in SQL db
            using (Sql.SqlConnection conn = new Sql.SqlConnection(ConnectionString))
            {
                conn.Open();

                using (Sql.SqlCommand cardHistorySelect = new Sql.SqlCommand(sql.ToString(), conn))
                {
                    var results = await cardHistorySelect.ExecuteReaderAsync();

                    if (results.HasRows)
                    {
                        PumpCard    pumpCard       = null;
                        SurfaceCard surfaceCard    = null;
                        int         previousCardID = 0;
                        DateTime    epoch          = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

                        while (await results.ReadAsync())
                        {
                            string cardTypeValue = results.GetString(0);
                            int    dynoCardID    = results.GetInt32(1);

                            CardType cardType = "P".Equals(cardTypeValue) ? CardType.Pump : CardType.Surface;

                            if (previousCardID != dynoCardID)
                            {
                                previousCardID = dynoCardID;
                                pumpCard       = null;
                                surfaceCard    = null;
                            }

                            if (cardType == CardType.Surface)
                            {
                                if (surfaceCard == null)
                                {
                                    surfaceCard = new SurfaceCard()
                                    {
                                        Id              = results.GetInt32(2),
                                        Timestamp       = epoch.AddSeconds(results.GetInt32(14)),
                                        ScaledMaxLoad   = (int)results.GetFloat(3),
                                        ScaledMinLoad   = (int)results.GetFloat(4),
                                        StrokeLength    = (int)results.GetFloat(5),
                                        StrokePeriod    = (int)results.GetFloat(6),
                                        NumberOfPoints  = results.GetInt32(16),
                                        CardType        = cardType,
                                        CardCoordinates = new List <CardCoordinate>()
                                    };

                                    surfaceCard.CardCoordinates.Add(new CardCoordinate()
                                    {
                                        Order    = results.GetInt32(11),
                                        Position = (int)results.GetFloat(12),
                                        Load     = (int)results.GetFloat(13)
                                    });

                                    DynoCard dynoCard = null;
                                    if (cardList.ContainsKey(dynoCardID))
                                    {
                                        dynoCard = cardList[dynoCardID];
                                    }
                                    else
                                    {
                                        dynoCard           = new DynoCard();
                                        dynoCard.Id        = dynoCardID;
                                        dynoCard.Timestamp = surfaceCard.Timestamp;
                                    }

                                    dynoCard.SurfaceCard = surfaceCard;
                                    cardList[dynoCardID] = dynoCard;
                                }
                                else
                                {
                                    cardList[dynoCardID].SurfaceCard.CardCoordinates.Add(new CardCoordinate()
                                    {
                                        Position = (int)results.GetFloat(12),
                                        Load     = (int)results.GetFloat(13)
                                    });
                                }
                            }
                            else if (cardType == CardType.Pump)
                            {
                                if (pumpCard == null)
                                {
                                    pumpCard = new PumpCard()
                                    {
                                        Id              = results.GetInt32(2),
                                        Timestamp       = epoch.AddSeconds(results.GetInt32(14)),
                                        ScaledMaxLoad   = (int)results.GetFloat(3),
                                        ScaledMinLoad   = (int)results.GetFloat(4),
                                        GrossStroke     = (int)results.GetFloat(7),
                                        NetStroke       = (int)results.GetFloat(8),
                                        PumpFillage     = (int)results.GetFloat(9),
                                        FluidLoad       = (int)results.GetFloat(10),
                                        NumberOfPoints  = results.GetInt32(16),
                                        CardType        = cardType,
                                        CardCoordinates = new List <CardCoordinate>()
                                    };

                                    pumpCard.CardCoordinates.Add(new CardCoordinate()
                                    {
                                        Order    = results.GetInt32(11),
                                        Position = (int)results.GetFloat(12),
                                        Load     = (int)results.GetFloat(13)
                                    });

                                    DynoCard dynoCard = null;
                                    if (cardList.ContainsKey(dynoCardID))
                                    {
                                        dynoCard = cardList[dynoCardID];
                                    }
                                    else
                                    {
                                        dynoCard           = new DynoCard();
                                        dynoCard.Id        = dynoCardID;
                                        dynoCard.Timestamp = pumpCard.Timestamp;
                                    }

                                    dynoCard.PumpCard    = pumpCard;
                                    cardList[dynoCardID] = dynoCard;
                                }
                                else
                                {
                                    cardList[dynoCardID].PumpCard.CardCoordinates.Add(new CardCoordinate()
                                    {
                                        Position = (int)results.GetFloat(12),
                                        Load     = (int)results.GetFloat(13)
                                    });
                                }
                            }
                        }
                    }
                }
            }

            var cards = cardList?.Values?.OrderBy(c => c.Timestamp).ToList();

            if (cards != null && cards.Count > 0)
            {
                cards.Last().TriggeredEvents = true;
            }

            return(await Task.FromResult(cards));
        }
Example #2
0
      private static async Task <MessageResponse> GeneratedTelemetryInput(Message message, object userContext)
      {
          Console.WriteLine("Processing generated telemetry input");

          var counterValue = Interlocked.Increment(ref counter);

          try
          {
              ModuleClient deviceClient  = (ModuleClient)userContext;
              var          messageBytes  = message.GetBytes();
              var          messageString = Encoding.UTF8.GetString(messageBytes);

              if (!string.IsNullOrEmpty(messageString))
              {
                  DynoCard card   = JsonConvert.DeserializeObject <DynoCard>(messageString);
                  int      cardID = await(new DataHelper()).PersistDynoCard(card);

                  if (cardID > 0)
                  {
                      card.Id = cardID;

                      var dynoCardMessage = card.ToDeviceMessage();
                      await deviceClient.SendEventAsync("output1", dynoCardMessage);
                  }

                  // Simulating ML alerts - generate a random number 10 percent of the time
                  int random = (new Random()).Next(1, 10);
                  System.Console.WriteLine(   );

                  if (random == 1)
                  {
                      var fakeAnomaly = new DynoCardAnomalyResult()
                      {
                          Id        = cardID.ToString(),
                          Timestamp = card.Timestamp,
                          Anomaly   = "true"
                      };

                      var anomalydBytes     = JsonConvert.SerializeObject(fakeAnomaly);
                      var anomalyByteString = Encoding.UTF8.GetBytes(anomalydBytes);
                      var anomalydMessage   = new Message(anomalyByteString);
                      await deviceClient.SendEventAsync("telemetryOutput", anomalydMessage);
                  }
              }

              // 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 generated telemetry input: {0}", exception);
              }

              return(MessageResponse.Completed);
          }
          catch (Exception ex)
          {
              Console.WriteLine();
              Console.WriteLine("Error in generated telemetry input: {0}", ex.Message);

              return(MessageResponse.Completed);
          }
      }