Пример #1
0
        private async Task RunAsync(CancellationToken cancellationToken)
        {
            ILogger logger = new ApplicationInsightsLogger();
            string  brokerIp;
            int     numberOfThreads;

            try
            {
                brokerIp = CloudConfigurationManager.GetSetting("BrokerIp");

                var threadSet = int.TryParse(CloudConfigurationManager.GetSetting("Threads"), out numberOfThreads);
                if (!threadSet)
                {
                    numberOfThreads = DefaultNumberOfThreads;
                }
            }
            catch (Exception exception)
            {
                brokerIp        = string.Empty;
                numberOfThreads = DefaultNumberOfThreads;
                logger.LogException(exception);
            }


            while (!cancellationToken.IsCancellationRequested)
            {
                try
                {
                    var concurrentConnectonTest      = new ConcurrentConnectionTest();
                    var concurrentConnectonTestSetup = new TestSetup(logger, brokerIp, concurrentConnectonTest, numberOfThreads);
                    concurrentConnectonTestSetup.RunTest(int.MaxValue, new TimeSpan(0, 60, 0), new TimeSpan(0, 0, 3), new TimeSpan(0, 0, 3), new TimeSpan(0, 0, 30), new TimeSpan(0, 1, 0));
                }
                catch (Exception exception)
                {
                    logger.LogEvent("Incomplete", "Completed test using " + numberOfThreads + " threads");
                    logger.LogException(exception);
                }

                await Task.Delay(new TimeSpan(0, 1, 0));

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.WaitForFullGCComplete();
                GC.Collect();
            }
        }
Пример #2
0
        private async Task RunAsync(CancellationToken cancellationToken)
        {
            ILogger logger   = new ApplicationInsightsLogger();
            var     brokerIp = CloudConfigurationManager.GetSetting("BrokerIp");
            int     numberOfThreads;
            var     threadSet = int.TryParse(CloudConfigurationManager.GetSetting("Threads"), out numberOfThreads);

            if (!threadSet)
            {
                numberOfThreads = DefaultNumberOfThreads;
            }

            while (!cancellationToken.IsCancellationRequested)
            {
                try
                {
                    var throughputTest = new MessageThroughputTest();
                    var testSetup      = new TestSetup(logger, brokerIp, throughputTest, numberOfThreads);
                    testSetup.RunTest();

                    //var concurrentConnectonTest = new ConcurrentConnectionTest();
                    //var concurrentConnectonTestSetup = new TestSetup(logger, brokerIp, concurrentConnectonTest, numberOfThreads);
                    //concurrentConnectonTestSetup.RunTest(int.MaxValue, new TimeSpan(0, 10, 0), new TimeSpan(0, 1, 0), new TimeSpan(0, 1, 0));
                }
                catch (Exception exception)
                {
                    logger.LogException(exception);
                }

                await Task.Delay(new TimeSpan(0, 0, 10));

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.WaitForFullGCComplete();
                GC.Collect();
            }
        }
        /// <summary>
        /// Process current day consumption and predict current week electricity consumption.
        /// </summary>
        /// <param name="timerInfo">The timer information.</param>
        /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
        public static async Task ProcessWeeklyConsumptionPrediction([TimerTrigger("0 0/50 * * * *")] TimerInfo timerInfo)
        {
            try
            {
                var meterService = new MeterService();

                using (SqlConnection sqlConnection = new SqlConnection(ConfigurationSettings.DbConnectionString))
                {
                    sqlConnection.Open();

                    var piServers = meterService.GetPiServerList(sqlConnection);

                    foreach (var piServer in piServers)
                    {
                        try
                        {
                            DateTime today       = piServer.PiServerCurrentDateTime.AddDays(-1);
                            int      prev        = (int)(today.DayOfWeek - 1);
                            int      next        = (int)(7 - today.DayOfWeek);
                            var      rowModified = 0;

                            using (SqlTransaction sqlTransaction = sqlConnection.BeginTransaction())
                            {
                                var powerScouts = meterService.GetMeterListByPiServer(sqlConnection, sqlTransaction, piServer.PiServerName);

                                foreach (var powerScout in powerScouts)
                                {
                                    double weeklyPredictedKWH      = 0;
                                    var    dailyConsumptionDetails = meterService.GetTodaysDailyConsumptionDetails(sqlConnection, sqlTransaction, powerScout, piServer);

                                    if (dailyConsumptionDetails != null)
                                    {
                                        DateTime initialDate = dailyConsumptionDetails.Timestamp;

                                        if (prev > 0)
                                        {
                                            for (int i = 1; i <= prev; i++)
                                            {
                                                dailyConsumptionDetails.Timestamp = today.AddDays(-i);
                                                var response = await meterService.GetAnomalyPrediction(dailyConsumptionDetails, sqlConnection, sqlTransaction, piServer.PiServerName, false);

                                                if (response != null)
                                                {
                                                    List <string> columnNames = response.Results.Output1.Value.ColumnNames.ToList();
                                                    weeklyPredictedKWH += Convert.ToDouble(response.Results.Output1.Value.Values[0][columnNames.IndexOf("Scored Labels")]);
                                                }
                                            }
                                        }

                                        for (int i = 0; i <= next; i++)
                                        {
                                            dailyConsumptionDetails.Timestamp = today.AddDays(i);
                                            var response = await meterService.GetAnomalyPrediction(dailyConsumptionDetails, sqlConnection, sqlTransaction, piServer.PiServerName, false);

                                            if (response != null)
                                            {
                                                List <string> columnNames = response.Results.Output1.Value.ColumnNames.ToList();
                                                weeklyPredictedKWH += Convert.ToDouble(response.Results.Output1.Value.Values[0][columnNames.IndexOf("Scored Labels")]);
                                            }
                                        }

                                        if (weeklyPredictedKWH != 0)
                                        {
                                            var weeklyConsumptionPrediction = new WeeklyConsumptionPrediction();

                                            weeklyConsumptionPrediction.Start_Time                  = today.AddDays(-prev).Date;
                                            weeklyConsumptionPrediction.End_Time                    = today.AddDays(next).Date;
                                            weeklyConsumptionPrediction.PowerScout                  = powerScout;
                                            weeklyConsumptionPrediction.Breaker_details             = dailyConsumptionDetails.Breaker_details;
                                            weeklyConsumptionPrediction.Weekly_Predicted_KWH_System = weeklyPredictedKWH;
                                            weeklyConsumptionPrediction.Building                    = dailyConsumptionDetails.Building;

                                            SaveWeeklyPrediction(weeklyConsumptionPrediction, sqlConnection, sqlTransaction, piServer.PiServerName);
                                            rowModified++;
                                        }
                                    }
                                }

                                sqlTransaction.Commit();
                            }

                            Console.WriteLine("WeeklyConsumptionPredictionJob Insert/Update  - PiServer - {0}, Rows {1}", piServer.PiServerName, rowModified);
                        }
                        catch (Exception e)
                        {
                            var errorMsg = string.Format("WeeklyConsumptionPredictionJob Error : Weekly consumption failed for PiServer - {0}", piServer.PiServerName);

                            Console.WriteLine(errorMsg);
                            Console.WriteLine("Error Message - {0}", e.Message);
                            Console.WriteLine("StackTrace - {0}", e.StackTrace);

                            ApplicationInsightsLogger.LogException(e, new Dictionary <string, string> {
                                { "Job Error Message", errorMsg }
                            });
                        }
                    }

                    sqlConnection.Close();
                }
            }
            catch (Exception e)
            {
                ApplicationInsightsLogger.LogException(e);

                throw;
            }
        }
        /// <summary>
        /// Detects the anomalies and generate alert.
        /// </summary>
        /// <param name="timerInfo">The timer information.</param>
        /// <returns>
        /// A <see cref="Task" /> representing the asynchronous operation.
        /// </returns>
        public static async Task ProcessAnomalyDetection([TimerTrigger("0 0 0 * * *")] TimerInfo timerInfo)
        {
            try
            {
                var alertService = new AlertService();
                var meterService = new MeterService();
                var requestModel = new AnomalyServiceRequest();

                using (SqlConnection sqlConnection = new SqlConnection(ConfigurationSettings.DbConnectionString))
                {
                    sqlConnection.Open();

                    var piServers = meterService.GetPiServerList(sqlConnection);

                    foreach (var piServer in piServers)
                    {
                        try
                        {
                            DateTime anomalyDetectionStartTime = piServer.PiServerCurrentDateTime.AddDays(-1).Date;
                            DateTime anomalyDetectionEndTime   = anomalyDetectionStartTime.AddHours(24).AddSeconds(-1);

                            using (SqlTransaction sqlTransaction = sqlConnection.BeginTransaction())
                            {
                                var query = "SELECT PowerScout, Temperature, Timestamp, Visibility, kW_System, days, Breaker_details FROM LiveData WHERE Timestamp > @startTime AND Timestamp <= @endTime and PiServerName = @PiServerName  ORDER BY Timestamp";

                                requestModel.GlobalParameters = new GlobalParameter();
                                Inputs inputs = new Inputs();
                                Input1 input  = new Input1()
                                {
                                    ColumnNames = new List <string> {
                                        "PowerScout", "Temperature", "Timestamp", "Visibility", "kW_System", "days", "Breaker_details"
                                    }
                                };
                                List <List <string> > values = new List <List <string> >();

                                using (SqlCommand selectDataCommand = new SqlCommand(query, sqlConnection, sqlTransaction))
                                {
                                    selectDataCommand.Parameters.AddWithValue("@startTime", anomalyDetectionStartTime.ToString(Constants.DATE_TIME_FORMAT));
                                    selectDataCommand.Parameters.AddWithValue("@endTime", anomalyDetectionEndTime.ToString(Constants.DATE_TIME_FORMAT));
                                    selectDataCommand.Parameters.AddWithValue("@PiServerName", piServer.PiServerName);

                                    using (SqlDataReader result = selectDataCommand.ExecuteReader())
                                    {
                                        List <string> rowValues = null;

                                        while (result.Read())
                                        {
                                            rowValues = new List <string>();

                                            rowValues.Add(SqlTypeConverter.ToString(result["PowerScout"]));
                                            rowValues.Add(SqlTypeConverter.ToString(result["Temperature"]));
                                            rowValues.Add(SqlTypeConverter.ToDateTime(result["Timestamp"]).ToString(Constants.DATE_TIME_FORMAT));
                                            rowValues.Add(SqlTypeConverter.ToString(result["Visibility"]));
                                            rowValues.Add(SqlTypeConverter.ToString(result["kW_System"]));
                                            rowValues.Add(SqlTypeConverter.ToString(result["days"]));
                                            rowValues.Add(SqlTypeConverter.ToString(result["Breaker_details"]));
                                            values.Add(rowValues);
                                        }

                                        result.Close();
                                    }
                                }

                                if (values.Count > 0)
                                {
                                    input.Values        = values;
                                    inputs.input1       = input;
                                    requestModel.Inputs = inputs;
                                    var azureMLConfigurationService = new AzureMLConfigurationService();
                                    var anomalyConfig = azureMLConfigurationService.GetAnomalyConfigData(sqlConnection, sqlTransaction);
                                    var responseModel = await AzureMLClient.CallAzureMLAsync(requestModel, anomalyConfig.AzureMlAnomalyDetectionApiUrl, anomalyConfig.AzureMlAnomalyDetectionApiKey);

                                    if (responseModel != null)
                                    {
                                        AddAnomalyToDatabase(sqlConnection, sqlTransaction, responseModel, piServer.PiServerName, anomalyDetectionStartTime, anomalyDetectionEndTime, alertService);
                                    }
                                }

                                sqlTransaction.Commit();
                            }
                        }
                        catch (Exception e)
                        {
                            var errorMsg = string.Format("AnomalyDetectionJob Error : Anomaly detection failed for pi server - {0}", piServer.PiServerName);

                            Console.WriteLine(errorMsg);
                            Console.WriteLine("Error Message - {0}", e.Message);
                            Console.WriteLine("StackTrace - {0}", e.StackTrace);

                            ApplicationInsightsLogger.LogException(e, new Dictionary <string, string> {
                                { "Job Error Message", errorMsg }
                            });
                        }
                    }

                    sqlConnection.Close();
                }
            }
            catch (Exception e)
            {
                ApplicationInsightsLogger.LogException(e);

                throw;
            }
        }
        /// <summary>
        /// Process electricity consumption to generate recommendation for power saving.
        /// </summary>
        /// <param name="timerInfo">The timer information.</param>
        public static void ProcessConsumptionAlert([TimerTrigger("0 0 0 * * *")] TimerInfo timerInfo)
        {
            try
            {
                var meterService = new MeterService();

                using (SqlConnection sqlConnection = new SqlConnection(ConfigurationSettings.DbConnectionString))
                {
                    sqlConnection.Open();

                    var piServers = meterService.GetPiServerList(sqlConnection);

                    foreach (var piServer in piServers)
                    {
                        try
                        {
                            DateTime prevWeekDay       = piServer.PiServerCurrentDateTime.Date.AddDays(-1);
                            DateTime lastWeekendSunday = prevWeekDay.AddDays(-(int)prevWeekDay.DayOfWeek);

                            // if today is weekend(saturday) move back to Friday.
                            if (prevWeekDay.DayOfWeek == DayOfWeek.Saturday)
                            {
                                prevWeekDay       = prevWeekDay.AddDays(-1);
                                lastWeekendSunday = prevWeekDay.AddDays(-5);
                            }

                            // if today is weekend(sunday) move back to Friday.
                            else if (prevWeekDay.DayOfWeek == DayOfWeek.Sunday)
                            {
                                prevWeekDay       = prevWeekDay.AddDays(-2);
                                lastWeekendSunday = prevWeekDay.AddDays(-5);
                            }

                            // Weekend Logic
                            DateTime        lastWeekendSaturday = lastWeekendSunday.AddDays(-1);
                            List <DateTime> lastWeekendDays     = new List <DateTime>();
                            lastWeekendDays.Add(lastWeekendSaturday);
                            lastWeekendDays.Add(lastWeekendSunday);

                            using (SqlTransaction sqlTransaction = sqlConnection.BeginTransaction())
                            {
                                long nonWorkingHourWeekendConsumption = 0;

                                foreach (var day in lastWeekendDays)
                                {
                                    DateTime           startdayTime = day.AddHours(5);
                                    DateTime           endDayTime   = startdayTime.AddHours(24).AddSeconds(-1);
                                    DayConsumptionInfo info         = GetConsumption(startdayTime, endDayTime, sqlConnection, sqlTransaction, piServer.PiServerName);
                                    nonWorkingHourWeekendConsumption += info.NonWorkingHourConsumption;
                                }

                                if (nonWorkingHourWeekendConsumption > 0)
                                {
                                    long weekendConsumption = (nonWorkingHourWeekendConsumption / 2) * 52; // here 52 is for weeks in a year

                                    GenerateConsumptionAlertAndNotification(sqlConnection, sqlTransaction, weekendConsumption, piServer);
                                }

                                // Previous Week Day Logic
                                DateTime           startTime   = prevWeekDay.AddHours(5);
                                DateTime           endTime     = startTime.AddHours(24).AddSeconds(-1);
                                DayConsumptionInfo weekDayInfo = GetConsumption(startTime, endTime, sqlConnection, sqlTransaction, piServer.PiServerName);

                                if (weekDayInfo.NonWorkingHourConsumption > 0)
                                {
                                    long weekdayConsumption = (weekDayInfo.NonWorkingHourConsumption / 2) * 365;

                                    GenerateConsumptionAlertAndNotification(sqlConnection, sqlTransaction, weekdayConsumption, piServer, false);
                                }

                                sqlTransaction.Commit();
                            }
                        }
                        catch (Exception e)
                        {
                            var errorMsg = string.Format("ConsumptionAlertJob Error : Consumption alert failed for pi server - {0}", piServer.PiServerName);

                            Console.WriteLine(errorMsg);
                            Console.WriteLine("Error Message - {0}", e.Message);
                            Console.WriteLine("StackTrace - {0}", e.StackTrace);

                            ApplicationInsightsLogger.LogException(e, new Dictionary <string, string> {
                                { "Job Error Message", errorMsg }
                            });
                        }
                    }

                    sqlConnection.Close();
                }
            }
            catch (Exception e)
            {
                ApplicationInsightsLogger.LogException(e);

                throw;
            }
        }
        /// <summary>
        /// Processes half hourly data to generate daily consumption details .
        /// </summary>
        /// <param name="timerInfo">The timer information.</param>
        public static void ProcessDailyConsumption([TimerTrigger("0 0/40 * * * *")] TimerInfo timerInfo)
        {
            try
            {
                using (SqlConnection sqlConnection = new SqlConnection(ConfigurationSettings.DbConnectionString))
                {
                    sqlConnection.Open();
                    var meterService = new MeterService();
                    var piServerList = meterService.GetPiServerList(sqlConnection);

                    foreach (var piServer in piServerList)
                    {
                        try
                        {
                            using (SqlTransaction sqlTransaction = sqlConnection.BeginTransaction())
                            {
                                var meterList = meterService.GetMeterListByPiServer(sqlConnection, sqlTransaction, piServer.PiServerName);
                                var dailyConsumptionDataList = new List <AzureLiveData>();
                                var processedDataHistory     = meterService.GetDailyConsumptionProcessedStatus(sqlConnection, sqlTransaction, piServer.PiServerName);

                                foreach (var meter in meterList)
                                {
                                    List <AzureLiveData> azureLiveDataList = new List <AzureLiveData>();

                                    var query = "select AMPS_SYSTEM_AVG, Breaker_details, Building, Daily_electric_cost, Daily_KWH_System, Monthly_electric_cost," +
                                                "Monthly_KWH_System, PowerScout, Temperature, Timestamp, Visibility, kW_System, PiServerName  from " +
                                                "(SELECT CAST(Timestamp AS DATE) DailyTime, Max(Daily_KWH_System) DKS FROM LiveData " +
                                                "WHERE {0} " +
                                                "group by CAST(Timestamp AS DATE)) AS dailyData " +
                                                "inner join LiveData as ALD " +
                                                "on(dailyData.DKS = ALD.Daily_KWH_System and dailyData.DailyTime = CAST(ALD.Timestamp AS DATE)) " +
                                                "WHERE {0} ";

                                    if (processedDataHistory.ContainsKey(meter))
                                    {
                                        query = string.Format(query, "PowerScout = @meter AND PiServerName = @PiServerName AND Timestamp > @processedTime ");
                                    }
                                    else
                                    {
                                        query = string.Format(query, "PowerScout = @meter AND PiServerName = @PiServerName ");
                                    }

                                    using (SqlCommand sqlCommand = new SqlCommand(query, sqlConnection, sqlTransaction))
                                    {
                                        sqlCommand.Parameters.Add(new SqlParameter("@meter", meter));
                                        sqlCommand.Parameters.Add(new SqlParameter("@PiserverName", piServer.PiServerName));

                                        if (processedDataHistory.ContainsKey(meter))
                                        {
                                            sqlCommand.Parameters.Add(new SqlParameter("@processedTime", processedDataHistory[meter]));
                                        }

                                        using (SqlDataReader result = sqlCommand.ExecuteReader())
                                        {
                                            while (result.Read())
                                            {
                                                AzureLiveData azureLiveData = new AzureLiveData();

                                                azureLiveData.AMPS_SYSTEM_AVG = SqlTypeConverter.ToDouble(result["AMPS_SYSTEM_AVG"]);

                                                azureLiveData.Breaker_details = SqlTypeConverter.ToString(result["Breaker_details"]);

                                                azureLiveData.Building = SqlTypeConverter.ToString(result["Building"]);

                                                azureLiveData.Daily_electric_cost = SqlTypeConverter.ToDouble(result["Daily_electric_cost"]);

                                                azureLiveData.Daily_KWH_System = SqlTypeConverter.ToDouble(result["Daily_KWH_System"]);

                                                azureLiveData.Monthly_electric_cost = SqlTypeConverter.ToDouble(result["Monthly_electric_cost"]);

                                                azureLiveData.Monthly_KWH_System = SqlTypeConverter.ToDouble(result["Monthly_KWH_System"]);

                                                azureLiveData.PowerScout = SqlTypeConverter.ToString(result["PowerScout"]);

                                                azureLiveData.Temperature = SqlTypeConverter.ToDouble(result["Temperature"]);

                                                azureLiveData.Timestamp = SqlTypeConverter.ToDateTime(result["Timestamp"]);

                                                azureLiveData.Visibility = SqlTypeConverter.ToDouble(result["Visibility"]);

                                                azureLiveData.KW_System = SqlTypeConverter.ToDouble(result["kW_System"]);

                                                azureLiveData.PiServerName = SqlTypeConverter.ToString(result["PiServerName"]);

                                                azureLiveDataList.Add(azureLiveData);
                                            }

                                            result.Close();
                                        }
                                    }

                                    var dailyData = azureLiveDataList.OrderByDescending(m => m.Timestamp).GroupBy(m => new { m.Timestamp.Date, m.Daily_KWH_System }).Select(s => s.First());


                                    dailyConsumptionDataList.AddRange(dailyData);
                                }

                                if (dailyConsumptionDataList.Count > 0)
                                {
                                    SaveDailyConsumptionData(sqlConnection, sqlTransaction, dailyConsumptionDataList);

                                    Console.WriteLine("DailyConsumptionJob RowInserted :  Piserver - {0},  Entries - {1}.", piServer.PiServerName, dailyConsumptionDataList.Count);
                                }

                                sqlTransaction.Commit();
                            }
                        }
                        catch (Exception e)
                        {
                            var errorMsg = string.Format("DailyConsumptionJob Error : Daily consumption failed for PiServer - {0}", piServer.PiServerName);

                            Console.WriteLine(errorMsg);
                            Console.WriteLine("Error Message - {0}", e.Message);
                            Console.WriteLine("StackTrace - {0}", e.StackTrace);

                            ApplicationInsightsLogger.LogException(e, new Dictionary <string, string> {
                                { "Job Error Message", errorMsg }
                            });
                        }
                    }

                    sqlConnection.Close();
                }
            }
            catch (Exception e)
            {
                ApplicationInsightsLogger.LogException(e);

                throw;
            }
        }
Пример #7
0
        /// <summary>
        /// Processes the daily consumption and predict next day electricity consumption.
        /// </summary>
        /// <param name="timerInfo">The timer information.</param>
        /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
        public static async Task ProcessDailyConsumptionPrediction([TimerTrigger("0 0/50 * * * *")] TimerInfo timerInfo)
        {
            try
            {
                var meterService = new MeterService();

                using (SqlConnection sqlConnection = new SqlConnection(ConfigurationSettings.DbConnectionString))
                {
                    sqlConnection.Open();

                    var piServers = meterService.GetPiServerList(sqlConnection);

                    foreach (var piServer in piServers)
                    {
                        try
                        {
                            using (SqlTransaction sqlTransaction = sqlConnection.BeginTransaction())
                            {
                                var      predictionProcessedStatus = meterService.GetDailyPredictionProcessedStatus(sqlConnection, sqlTransaction, piServer.PiServerName);
                                var      meterlist = meterService.GetMeterListByPiServer(sqlConnection, sqlTransaction, piServer.PiServerName);
                                DateTime?timestamp = null;
                                int      rows      = 0;

                                foreach (var meter in meterlist)
                                {
                                    if (predictionProcessedStatus.ContainsKey(meter))
                                    {
                                        timestamp = predictionProcessedStatus[meter].AddDays(-1);
                                    }
                                    else
                                    {
                                        timestamp = null;
                                    }

                                    var dailyConsumptionDetails = meterService.GetDailyConsumptionDetails(sqlConnection, sqlTransaction, meter, piServer.PiServerName, timestamp);

                                    foreach (var dailyConsumptionDetail in dailyConsumptionDetails)
                                    {
                                        var response = await meterService.GetAnomalyPrediction(dailyConsumptionDetail, sqlConnection, sqlTransaction, piServer.PiServerName);

                                        if (response != null)
                                        {
                                            rows++;
                                            var           dailyConsumptionPrediction = new DailyConsumptionPrediction();
                                            List <string> columnNames = response.Results.Output1.Value.ColumnNames.ToList();
                                            var           values      = response.Results.Output1.Value.Values.First();

                                            dailyConsumptionPrediction.PowerScout = values[columnNames.IndexOf("PowerScout")];
                                            dailyConsumptionPrediction.Timestamp  = dailyConsumptionDetail.Timestamp.AddDays(1);
                                            dailyConsumptionPrediction.Daily_Predicted_KWH_System = Convert.ToDouble(values[columnNames.IndexOf("Scored Labels")]);
                                            dailyConsumptionPrediction.Building        = dailyConsumptionDetail.Building;
                                            dailyConsumptionPrediction.Breaker_details = dailyConsumptionDetail.Breaker_details;

                                            meterService.AddDailyConsumptionPrediction(dailyConsumptionPrediction, sqlConnection, sqlTransaction, piServer.PiServerName);
                                        }
                                    }
                                }

                                if (rows > 0)
                                {
                                    Console.WriteLine("DailyConsumptionPredictionJob RowInserted : PiServer - {0}, Rows - {1}", piServer.PiServerName, rows);
                                }

                                sqlTransaction.Commit();
                            }
                        }
                        catch (Exception e)
                        {
                            var errorMsg = string.Format("DailyConsumptionPredictionJob Error : Daily consumption prediction failed for PiServer - {0}", piServer.PiServerName);

                            Console.WriteLine(errorMsg);
                            Console.WriteLine("Error Message - {0}", e.Message);
                            Console.WriteLine("StackTrace - {0}", e.StackTrace);

                            ApplicationInsightsLogger.LogException(e, new Dictionary <string, string> {
                                { "Job Error Message", errorMsg }
                            });
                        }
                    }

                    sqlConnection.Close();
                }
            }
            catch (Exception e)
            {
                ApplicationInsightsLogger.LogException(e);

                throw;
            }
        }
Пример #8
0
        /// <summary>
        /// Processes the daily consumption and generate monthly consumption.
        /// </summary>
        /// <param name="timerInfo">The timer information.</param>
        public static void ProcessMonthlyConsumption([TimerTrigger("0 0/50 * * * *")] TimerInfo timerInfo)
        {
            try
            {
                using (SqlConnection sqlConnection = new SqlConnection(ConfigurationSettings.DbConnectionString))
                {
                    sqlConnection.Open();

                    var meterService = new MeterService();
                    var piServerList = meterService.GetPiServerList(sqlConnection);

                    foreach (var piServer in piServerList)
                    {
                        try
                        {
                            using (SqlTransaction sqlTransaction = sqlConnection.BeginTransaction())
                            {
                                var meterlist = meterService.GetMeterListByPiServer(sqlConnection, sqlTransaction, piServer.PiServerName);
                                var monthlyConsumptionStatus = meterService.GetMonthlyConsumptionProcessedStatus(sqlConnection, sqlTransaction, piServer.PiServerName);
                                int rows = 0;

                                foreach (var meter in meterlist)
                                {
                                    DateTime currentDate = default(DateTime);

                                    if (!monthlyConsumptionStatus.ContainsKey(meter))
                                    {
                                        // if monthly consumption does not exists then process from start of daily consumption.
                                        currentDate = meterService.GetDailyConsumptionInitialStatus(sqlConnection, sqlTransaction, piServer.PiServerName, meter);
                                    }
                                    else
                                    {
                                        // process from processed last month of monthly consumption.
                                        currentDate = monthlyConsumptionStatus[meter];
                                    }

                                    do
                                    {
                                        var query = "SELECT Max(building) building, max(breaker_Details) breaker_Details, sum(Daily_electric_cost) Monthly_electric_cost, sum(Daily_KWH_System) Monthly_KWH_System, max(Timestamp) Timestamp FROM DailyConsumptionDetails WHERE PowerScout = @meter and PiServerName = @PiServerName and month([timestamp])= @CurrentMonth and year([timestamp])= @CurrentYear group by month([timestamp])";

                                        MonthlyConsumptionData monthlyConsumptionData = null;

                                        using (SqlCommand cmd = new SqlCommand(query, sqlConnection, sqlTransaction))
                                        {
                                            cmd.Parameters.Add(new SqlParameter("@meter", meter));
                                            cmd.Parameters.Add(new SqlParameter("@CurrentMonth", currentDate.Month));
                                            cmd.Parameters.Add(new SqlParameter("@CurrentYear", currentDate.Year));
                                            cmd.Parameters.Add(new SqlParameter("@PiServerName", piServer.PiServerName));
                                            SqlDataReader result = cmd.ExecuteReader();

                                            while (result.Read())
                                            {
                                                monthlyConsumptionData = new MonthlyConsumptionData();

                                                monthlyConsumptionData.Building = SqlTypeConverter.ToString(result["Building"]);

                                                monthlyConsumptionData.Breaker_details = SqlTypeConverter.ToString(result["Breaker_details"]);

                                                monthlyConsumptionData.Monthly_electric_cost = SqlTypeConverter.ToDouble(result["Monthly_electric_cost"]);

                                                monthlyConsumptionData.Monthly_KWH_System = SqlTypeConverter.ToDouble(result["Monthly_KWH_System"]);

                                                monthlyConsumptionData.Timestamp = SqlTypeConverter.ToDateTime(result["Timestamp"]);
                                            }

                                            result.Close();
                                        }

                                        if (monthlyConsumptionData != null)
                                        {
                                            using (SqlCommand cmdNew = new SqlCommand("SP_InsertUpdateMonthlyConsumptionDetails", sqlConnection, sqlTransaction))
                                            {
                                                cmdNew.Parameters.Add(new SqlParameter("@Building", monthlyConsumptionData.Building));
                                                cmdNew.Parameters.Add(new SqlParameter("@Breaker_details", monthlyConsumptionData.Breaker_details));
                                                cmdNew.Parameters.Add(new SqlParameter("@Month", currentDate.ToString("MMM")));
                                                cmdNew.Parameters.Add(new SqlParameter("@Year", currentDate.Year.ToString()));
                                                cmdNew.Parameters.Add(new SqlParameter("@Monthly_electric_cost", monthlyConsumptionData.Monthly_electric_cost));
                                                cmdNew.Parameters.Add(new SqlParameter("@Monthly_KWH_System", monthlyConsumptionData.Monthly_KWH_System));
                                                cmdNew.Parameters.Add(new SqlParameter("@PowerScout", meter));
                                                cmdNew.Parameters.Add(new SqlParameter("@Timestamp", monthlyConsumptionData.Timestamp));
                                                cmdNew.Parameters.Add(new SqlParameter("@PiServerName", piServer.PiServerName));
                                                cmdNew.CommandType = CommandType.StoredProcedure;
                                                cmdNew.ExecuteNonQuery();
                                            }

                                            rows++;
                                        }

                                        currentDate = currentDate.AddMonths(1);
                                    }while (currentDate.Year < piServer.PiServerCurrentDateTime.Year ? true : currentDate.Year == piServer.PiServerCurrentDateTime.Year && currentDate.Month <= piServer.PiServerCurrentDateTime.Month); // process up-to current month and year.
                                }

                                if (rows > 0)
                                {
                                    Console.WriteLine("MonthlyConsumptionJob RowInserted : Piserver - {0}, Rows - {1}", piServer.PiServerName, rows);
                                }

                                sqlTransaction.Commit();
                            }
                        }
                        catch (Exception e)
                        {
                            var errorMsg = string.Format("MonthlyConsumptionJob Error : monthly consumption failed for pi server - {0}", piServer.PiServerName);

                            Console.WriteLine(errorMsg);
                            Console.WriteLine("Error Message - {0}", e.Message);
                            Console.WriteLine("StackTrace - {0}", e.StackTrace);

                            ApplicationInsightsLogger.LogException(e, new Dictionary <string, string> {
                                { "Job Error Message", errorMsg }
                            });
                        }
                    }

                    sqlConnection.Close();
                }
            }
            catch (Exception e)
            {
                ApplicationInsightsLogger.LogException(e);

                throw;
            }
        }