Example #1
0
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Request["eventId"] != null)
            {
                postedEventId = Request["eventId"];

                using (AdoDataConnection connection = new AdoDataConnection("systemSettings"))
                {
                    try
                    {
                        MeterDataQualitySummary theevent = (new TableOperations <MeterDataQualitySummary>(connection)).QueryRecordWhere("ID = {0}", Convert.ToInt32(postedEventId));

                        postedDate      = theevent.Date.ToShortDateString();
                        postedMeterId   = theevent.MeterID.ToString();
                        postedMeterName = connection.ExecuteScalar <string>("SELECT Name From Meter WHERE ID = {0}", theevent.MeterID);
                    }

                    catch (Exception ex)
                    {
                        postedDate      = "";
                        postedEventId   = "";
                        postedMeterId   = "";
                        postedMeterName = "";
                    }
                    finally
                    {
                    }
                }
            }
        }
    }
Example #2
0
        public override void Execute(MeterDataSet meterDataSet)
        {
            Dictionary <Channel, List <DataGroup> > trendingGroups = meterDataSet.GetResource <TrendingGroupsResource>().TrendingGroups;

            if (trendingGroups.Count == 0)
            {
                Log.Debug($"No trending data found; skipping {nameof(DataQualityOperation)}.");
                return;
            }

            // Process the data quality range limits to identify unreasonable values
            ProcessDataQualityRangeLimits(meterDataSet);

            // Get the total cumulative samples per hour
            // of each of the enabled channels in the meter
            double meterSamplesPerHour = meterDataSet.Meter.Channels
                                         .Where(channel => channel.Enabled)
                                         .Where(channel => channel.SamplesPerHour <= 60.0D)
                                         .Select(channel => channel.SamplesPerHour)
                                         .DefaultIfEmpty(0.0D)
                                         .Sum();

            // Convert trending data summaries to channel summaries
            // so that we can order by date to make processing easier
            List <ChannelSummary> channelSummaries = meterDataSet.GetResource <TrendingDataSummaryResource>().TrendingDataSummaries
                                                     .SelectMany(kvp => kvp.Value.Select(summary => new ChannelSummary(kvp.Key, summary)))
                                                     .Where(channelSummary => channelSummary.Channel.Enabled)
                                                     .OrderBy(channelSummary => channelSummary.Date)
                                                     .ThenBy(channelSummary => channelSummary.Channel.ID)
                                                     .ToList();

            if (channelSummaries.Count == 0)
            {
                return;
            }

            using (AdoDataConnection connection = meterDataSet.CreateDbConnection())
            {
                TableOperations <ChannelDataQualitySummary> channelDataQualitySummaryTable = new TableOperations <ChannelDataQualitySummary>(connection);
                TableOperations <MeterDataQualitySummary>   meterDataQualitySummaryTable   = new TableOperations <MeterDataQualitySummary>(connection);

                ChannelDataQualitySummary channelDataQualitySummary = null;
                MeterDataQualitySummary   meterDataQualitySummary   = null;

                foreach (ChannelSummary channelSummary in channelSummaries)
                {
                    // If the current channel summary's data does not belong in the same aggregate as the previous channel summary,
                    // update the meter summary record, submit the current channel summary record, and create a new channel summary record
                    if ((object)channelDataQualitySummary != null && (channelSummary.Channel.ID != channelDataQualitySummary.ChannelID || channelSummary.Date != channelDataQualitySummary.Date))
                    {
                        meterDataQualitySummary.GoodPoints         += channelDataQualitySummary.GoodPoints;
                        meterDataQualitySummary.LatchedPoints      += channelDataQualitySummary.LatchedPoints;
                        meterDataQualitySummary.UnreasonablePoints += channelDataQualitySummary.UnreasonablePoints;
                        meterDataQualitySummary.NoncongruentPoints += channelDataQualitySummary.NoncongruentPoints;
                        meterDataQualitySummary.DuplicatePoints    += channelDataQualitySummary.DuplicatePoints;

                        channelDataQualitySummaryTable.Upsert(channelDataQualitySummary);
                        channelDataQualitySummary = null;
                    }

                    // If the current channel summary's data does not fall on the same date as the previous
                    // channel summary's data, submit the current meter summary record and create a new one
                    if ((object)meterDataQualitySummary != null && channelSummary.Date != meterDataQualitySummary.Date)
                    {
                        meterDataQualitySummaryTable.Upsert(meterDataQualitySummary);
                        meterDataQualitySummary = null;
                    }

                    // If there is no existing record to aggregate
                    // channel summary data, create a new one
                    if ((object)channelDataQualitySummary == null)
                    {
                        channelDataQualitySummary                    = new ChannelDataQualitySummary();
                        channelDataQualitySummary.ChannelID          = channelSummary.Channel.ID;
                        channelDataQualitySummary.Date               = channelSummary.Date;
                        channelDataQualitySummary.ExpectedPoints     = (int)Math.Round(24.0D * channelSummary.Channel.SamplesPerHour);
                        channelDataQualitySummary.GoodPoints         = 0;
                        channelDataQualitySummary.LatchedPoints      = 0;
                        channelDataQualitySummary.UnreasonablePoints = 0;
                        channelDataQualitySummary.NoncongruentPoints = 0;
                        channelDataQualitySummary.DuplicatePoints    = 0;
                    }

                    // If there is no existing record to aggregate
                    // meter summary data, create a new one
                    if ((object)meterDataQualitySummary == null)
                    {
                        meterDataQualitySummary                    = new MeterDataQualitySummary();
                        meterDataQualitySummary.MeterID            = meterDataSet.Meter.ID;
                        meterDataQualitySummary.Date               = channelSummary.Date;
                        meterDataQualitySummary.ExpectedPoints     = (int)Math.Round(24.0D * meterSamplesPerHour);
                        meterDataQualitySummary.GoodPoints         = 0;
                        meterDataQualitySummary.LatchedPoints      = 0;
                        meterDataQualitySummary.UnreasonablePoints = 0;
                        meterDataQualitySummary.NoncongruentPoints = 0;
                        meterDataQualitySummary.DuplicatePoints    = 0;
                    }

                    // Update the channel summary aggregates
                    // based on the current channel summary
                    if (channelSummary.TrendingSummary.IsDuplicate)
                    {
                        channelDataQualitySummary.DuplicatePoints++;
                    }
                    else if (channelSummary.TrendingSummary.Latched)
                    {
                        channelDataQualitySummary.LatchedPoints++;
                    }
                    else if (channelSummary.TrendingSummary.Unreasonable)
                    {
                        channelDataQualitySummary.UnreasonablePoints++;
                    }
                    else if (channelSummary.TrendingSummary.NonCongruent)
                    {
                        channelDataQualitySummary.NoncongruentPoints++;
                    }
                    else
                    {
                        channelDataQualitySummary.GoodPoints++;
                    }
                }

                // Make sure the last channel and meter summary
                // records get submitted to the database
                if ((object)channelDataQualitySummary != null)
                {
                    meterDataQualitySummary.GoodPoints         += channelDataQualitySummary.GoodPoints;
                    meterDataQualitySummary.LatchedPoints      += channelDataQualitySummary.LatchedPoints;
                    meterDataQualitySummary.UnreasonablePoints += channelDataQualitySummary.UnreasonablePoints;
                    meterDataQualitySummary.NoncongruentPoints += channelDataQualitySummary.NoncongruentPoints;
                    meterDataQualitySummary.DuplicatePoints    += channelDataQualitySummary.DuplicatePoints;

                    channelDataQualitySummaryTable.Upsert(channelDataQualitySummary);
                    meterDataQualitySummaryTable.Upsert(meterDataQualitySummary);
                }
            }
        }