Exemple #1
0
        private HeatingCoolingDegreeDays HeatingCoolingDegreeDaysValueOf(ReadingsQueryResult result, List <WeatherData> weatherDataList)
        {
            HeatingCoolingDegreeDays hcdd = new HeatingCoolingDegreeDays();

            hcdd.CDD = 0.0;
            hcdd.HDD = 0.0;

            if (result.B3 == 0 && result.B5 == 0)
            {
                return(hcdd);
            }

            foreach (WeatherData weatherData in weatherDataList)
            {
                if (result.B5 > 0)
                {
                    if (weatherData.AvgTmp >= result.B5)
                    {
                        hcdd.CDD = hcdd.CDD + (weatherData.AvgTmp.Value - result.B5);
                    }
                }
                else if (result.B3 > 0)
                {
                    if (weatherData.AvgTmp <= result.B3)
                    {
                        hcdd.HDD = hcdd.HDD + (result.B3 - weatherData.AvgTmp.Value);
                    }
                }
            }

            return(hcdd);
        }
Exemple #2
0
        private void DoCalculation(ReadingsQueryResult result, HeatingCoolingDegreeDays heatingCoolingDegreeDays)
        {
            // Normalized Energy Usage = E = B1(DAYS) + B2(HDDB3) + B4(CDDB5)
            double? resultAsDouble  = (result.B1 * result.Days) + (result.B2 * heatingCoolingDegreeDays.HDD) + (result.B4 * heatingCoolingDegreeDays.CDD);
            decimal resultAsDecimal = decimal.Round(Convert.ToDecimal(resultAsDouble), 4, MidpointRounding.AwayFromZero);

            bool success = _weatherRepository.InsertWthExpUsage(result.RdngID, resultAsDecimal);

            if (success)
            {
                Log.Debug($"Inserted into WthExpUsage >> RdngID: {result.RdngID} WthExpUsage: {resultAsDecimal} (actual usage: {result.Units}) ... " +
                          $"B1: {result.B1} Days: {result.Days}, " +
                          $"B2: {result.B2} B3: {result.B3} Hdd: {heatingCoolingDegreeDays.HDD}, " +
                          $"B4: {result.B4} B5: {result.B5} Cdd: {heatingCoolingDegreeDays.CDD}, " +
                          $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, R2: {result.R2}.");

                _actualWthExpUsageInserts++;
            }
            else
            {
                Log.Error($"FAILED attempt: insert into WthExpUsage >> RdngID: {result.RdngID} WthExpUsage: {resultAsDecimal} ... B1: {result.B1} B2: " +
                          $"{result.B2} B3: {result.B3} Hdd: {heatingCoolingDegreeDays.HDD} B4: {result.B4} B5: {result.B5} Cdd: {heatingCoolingDegreeDays.CDD} " +
                          $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, R2: {result.R2}");
            }
        }
Exemple #3
0
        private bool[] DoCalculation(ReadingsQueryResult result, HeatingCoolingDegreeDays heatingCoolingDegreeDays)
        {
            double  resultAsDouble  = (result.B1 * result.Days) + (result.B2 * heatingCoolingDegreeDays.HDD) + (result.B4 * heatingCoolingDegreeDays.CDD);
            decimal resultAsDecimal = decimal.Round(Convert.ToDecimal(resultAsDouble), 4, MidpointRounding.AwayFromZero);

            bool existed = _weatherRepository.GetWthExpUsageExists(result.RdngID);
            bool success;

            if (existed)
            {
                success = _weatherRepository.UpdateWthExpUsage(result.RdngID, resultAsDecimal);
            }
            else
            {
                success = _weatherRepository.InsertWthExpUsage(result.RdngID, resultAsDecimal);
            }

            if (existed && success)
            {
                Log.Debug($"Updated WthExpUsage >> RdngID: {result.RdngID} WthExpUsage: {resultAsDecimal} (actual usage: {result.Units}) ... " +
                          $"B1: {result.B1} Days: {result.Days}, " +
                          $"B2: {result.B2} B3: {result.B3} Hdd: {heatingCoolingDegreeDays.HDD}," +
                          $" B4: {result.B4} B5: {result.B5} Cdd: {heatingCoolingDegreeDays.CDD}, " +
                          $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, R2: {result.R2}.");
            }
            else if (existed && !success)
            {
                Log.Error($"Failed attempt: Update WthExpUsage >> RdngID: {result.RdngID} WthExpUsage: {resultAsDecimal} (actual usage: {result.Units}) ... " +
                          $"B1: {result.B1} Days: {result.Days}, " +
                          $"B2: {result.B2} B3: {result.B3} Hdd: {heatingCoolingDegreeDays.HDD}, " +
                          $"B4: {result.B4} B5: {result.B5} Cdd: {heatingCoolingDegreeDays.CDD}, " +
                          $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, R2: {result.R2}.");
            }
            else if (!existed && success)
            {
                Log.Debug($"Inserted into WthExpUsage >> RdngID: {result.RdngID} WthExpUsage: {resultAsDecimal} (actual usage: {result.Units}) ... " +
                          $"B1: {result.B1} Days: {result.Days}, " +
                          $"B2: {result.B2} B3: {result.B3} Hdd: {heatingCoolingDegreeDays.HDD}, " +
                          $"B4: {result.B4} B5: {result.B5} Cdd: {heatingCoolingDegreeDays.CDD}, " +
                          $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, R2: {result.R2}.");
            }
            else if (!existed && !success)
            {
                Log.Error($"Failed attempt: Insert into WthExpUsage >> RdngID: {result.RdngID} WthExpUsage: {resultAsDecimal} (actual usage: {result.Units}) ... " +
                          $"B1: {result.B1} Days: {result.Days}, " +
                          $"B2: {result.B2} B3: {result.B3} Hdd: {heatingCoolingDegreeDays.HDD}, " +
                          $"B4: {result.B4} B5: {result.B5} Cdd: {heatingCoolingDegreeDays.CDD}, " +
                          $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, R2: {result.R2}.");
            }

            return(new bool[] { success, existed });
        }
Exemple #4
0
        private void PopulateWthExpUsageTable()
        {
            Log.Information("Starting PopulateWthExpUsage()...");

            string fromDateStartStr = $"{fromDateStart.Month}-{fromDateStart.Day}-{fromDateStart.Year}";

            try
            {
                List <ReadingsQueryResult> readings = _weatherRepository.GetReadings(fromDateStartStr);

                expectedWthExpUsageInserts = readings.Count;

                foreach (ReadingsQueryResult result in readings)
                {
                    try
                    {
                        List <WeatherData> weatherDataList = _weatherRepository.GetWeatherDataByZipStartAndEndDate(result.Zip, result.DateStart, result.DateEnd);
                        if (weatherDataList.Count != result.Days)
                        {
                            Log.Error($"WeatherDataList.Count != reading.Days; WeatherDataList.Count = {weatherDataList.Count} reading.Days = {result.Days}. " +
                                      $"RdngID: {result.RdngID}.");
                        }
                        HeatingCoolingDegreeDays heatingCoolingDegreeDays = HeatingCoolingDegreeDaysValueOf(result, weatherDataList);

                        DoCalculation(result, heatingCoolingDegreeDays);
                    }
                    catch (Exception e)
                    {
                        Log.Error(e.Message);
                        Log.Error(e.StackTrace);
                    }
                }

                int expectedTotalWthExpUsageEntries = _weatherRepository.GetExpectedWthExpUsageRowCount(fromDateStartStr);
                int actualTotalWthExpUsageEntries   = _weatherRepository.GetActualWthExpUsageRowCount();

                Log.Information($"Finished PopulateWthExpUsage(). Expected inserts: {expectedWthExpUsageInserts}, Actual: {actualWthExpUsageInserts}");
                Log.Information($"Expected WthExpUsage total entries: {expectedTotalWthExpUsageEntries}, Actual: {actualTotalWthExpUsageEntries}.\n");
            }
            catch (Exception ex)
            {
                Log.Error(ex.Message + " " + ex.StackTrace);
            }

            expectedWthExpUsageInserts = 0;
            actualWthExpUsageInserts   = 0;
        }
Exemple #5
0
        private HeatingCoolingDegreeDays HeatingCoolingDegreeDaysValueOf(ReadingsQueryResult result, List <WeatherData> weatherDataList)
        {
            HeatingCoolingDegreeDays hcdd = new HeatingCoolingDegreeDays();

            hcdd.CDD = 0.0;
            hcdd.HDD = 0.0;

            if (result.B3 == 0 && result.B5 == 0)
            {
                return(hcdd);
            }

            foreach (WeatherData weatherData in weatherDataList)
            {
                if (!weatherData.AvgTmp.HasValue)
                {
                    throw new Exception($"WeatherData.AvgTmp is null for {weatherData.ZipCode} on {weatherData.RDate}");
                }
                //else if (result.B5 > 0)
                //{
                //    if (weatherData.AvgTmp >= result.B5)
                //    {
                //        hcdd.CDD = hcdd.CDD + (weatherData.AvgTmp.Value - result.B5);
                //    }

                //}
                //else if (result.B3 > 0)
                //{
                //    if (weatherData.AvgTmp <= result.B3)
                //    {
                //        hcdd.HDD = hcdd.HDD + (result.B3 - weatherData.AvgTmp.Value);
                //    }
                //}

                if (result.B5 > 0 && weatherData.AvgTmp >= result.B5)
                {
                    hcdd.CDD = hcdd.CDD + (weatherData.AvgTmp.Value - result.B5);
                }

                if (result.B3 > 0 && weatherData.AvgTmp <= result.B3)
                {
                    hcdd.HDD = hcdd.HDD + (result.B3 - weatherData.AvgTmp.Value);
                }
            }

            return(hcdd);
        }
Exemple #6
0
        private HeatingCoolingDegreeDays HeatingCoolingDegreeDaysValueOf(BalancePointPair balancePointPair, List <WeatherData> weatherDataList)
        {
            HeatingCoolingDegreeDays hcdd = new HeatingCoolingDegreeDays
            {
                CDD = 0.0,
                HDD = 0.0,
            };

            foreach (WeatherData weatherData in weatherDataList)
            {
                if (!weatherData.AvgTmp.HasValue)
                {
                    throw new Exception("WeatherData.AvgTmp is null for " + weatherData.ZipCode + " on " + weatherData.RDate);
                }
                //else if (balancePointPair.CoolingBalancePoint > 0 && weatherData.AvgTmp >= balancePointPair.CoolingBalancePoint)
                //{
                //    hcdd.CDD += (weatherData.AvgTmp.Value - balancePointPair.CoolingBalancePoint);
                //}
                //else if (balancePointPair.HeatingBalancePoint > 0 && weatherData.AvgTmp < balancePointPair.HeatingBalancePoint)
                //{
                //    hcdd.HDD += (balancePointPair.HeatingBalancePoint - weatherData.AvgTmp.Value);
                //}

                if (balancePointPair.CoolingBalancePoint > 0 && weatherData.AvgTmp >= balancePointPair.CoolingBalancePoint)
                {
                    hcdd.CDD += (weatherData.AvgTmp.Value - balancePointPair.CoolingBalancePoint);
                }

                if (balancePointPair.HeatingBalancePoint > 0 && weatherData.AvgTmp <= balancePointPair.HeatingBalancePoint)
                {
                    hcdd.HDD += (balancePointPair.HeatingBalancePoint - weatherData.AvgTmp.Value);
                }
            }

            return(hcdd);
        }
Exemple #7
0
        private void UpdateWthExpUsage(List <WthNormalParams> newNormalParamsList)
        {
            Log.Information("Starting UpdateWthExpUsage()...");

            //string fromDateStartStr = $"{_fromDateStart.Month}-{_fromDateStart.Day}-{_fromDateStart.Year}";

            int updateCount = 0;
            int insertCount = 0;
            int failCount   = 0;

            foreach (WthNormalParams normalParams in newNormalParamsList)
            {
                try
                {
                    List <ReadingsQueryResult> readings = _weatherRepository.GetReadingsForExpUsageUpdate(_MoID, normalParams);

                    foreach (ReadingsQueryResult result in readings)
                    {
                        try
                        {
                            if (normalParams.R2 < Convert.ToDecimal(0.75))
                            {
                                bool exists = _weatherRepository.GetWthExpUsageExists(result.RdngID);

                                if (exists)
                                {
                                    bool updateNoModel = _weatherRepository.UpdateWthExpUsage(result.RdngID, result.Units.Value);

                                    if (updateNoModel)
                                    {
                                        updateCount++;
                                        Log.Debug($"Updated WthExpUsage (No Valid Model) >> RdngID: {result.RdngID} ExpUsage: {result.Units.Value} << " +
                                                  $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}.");
                                    }
                                    else
                                    {
                                        failCount++;
                                        Log.Error($"Failed attempt : Update WthExpUsage (No Valid Model) >> RdngID: {result.RdngID} ExpUsage: {result.Units.Value} << " +
                                                  $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}.");
                                    }
                                }
                                else
                                {
                                    bool insertNoModel = _weatherRepository.InsertWthExpUsage(result.RdngID, result.Units.Value);

                                    if (insertNoModel)
                                    {
                                        insertCount++;
                                        Log.Debug($"Inserted into WthExpUsage (No Valid Model) >> RdngID: {result.RdngID} ExpUsage: {result.Units.Value} << " +
                                                  $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}.");
                                    }
                                    else
                                    {
                                        failCount++;
                                        Log.Error($"Failed attempt : Insert into WthExpUsage (No Valid Model) >> RdngID: {result.RdngID} ExpUsage: {result.Units.Value} << " +
                                                  $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}.");
                                    }
                                }
                                continue;
                            }

                            if (result.DateStart == DateTime.MinValue || result.DateEnd == DateTime.MinValue)
                            {
                                throw new Exception($"Cannot compute ExpUsage for RdngID: {result.RdngID} >> DateStart and/or DateEnd is null.");
                            }

                            int daysInReading = result.DateEnd.Subtract(result.DateStart).Days;

                            List <WeatherData> weatherDataList = _weatherRepository.GetWeatherDataByZipStartAndEndDate(result.Zip, result.DateStart, result.DateEnd);

                            if (weatherDataList.Count != daysInReading)
                            {
                                throw new Exception($"WeatherDataList.Count != daysInReading; WeatherDataList.Count = {weatherDataList.Count}, " +
                                                    $"daysInReading = {daysInReading}. Reading.EndDate = {result.DateEnd}");
                            }

                            BalancePointPair balancePointPair = new BalancePointPair()
                            {
                                HeatingBalancePoint = normalParams.B3,
                                CoolingBalancePoint = normalParams.B5
                            };

                            HeatingCoolingDegreeDays heatingCoolingDegreeDays = HeatingCoolingDegreeDaysValueOf(balancePointPair, weatherDataList);

                            bool[] successCommaAlreadyExisted = DoCalculation(result, heatingCoolingDegreeDays);

                            if (successCommaAlreadyExisted[0])
                            {
                                if (successCommaAlreadyExisted[1])
                                {
                                    updateCount++;
                                }
                                else
                                {
                                    insertCount++;
                                }
                            }
                            else
                            {
                                failCount++;
                            }
                        }
                        catch (Exception e)
                        {
                            failCount++;
                            Log.Debug($"Failure. Cannot calculate ExpUsage for RdngID: {result.RdngID} >> {e.Message} {e.StackTrace}");
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.Error($"AccID/UtilID/UnitID: {normalParams.AccID}/{normalParams.UtilID}/{normalParams.UnitID} >> {ex.Message}");
                    Log.Debug($"{ex.StackTrace}");
                }
            }

            if (failCount == 0)
            {
                Log.Information($"Finished UpdateWthExpUsage() on Readings going back to MoID: {_MoID}. " +
                                $"Inserts: {insertCount}, Updates: {updateCount}, Failures: {failCount}.");
            }
            else
            {
                Log.Warning($"Finished UpdateWthExpUsage() on Readings going back to MoID: {_MoID}. " +
                            $"Inserts: {insertCount}, Updates: {updateCount}, Failures: {failCount}.");
            }
        }
Exemple #8
0
        private List <BalancePointPair> CalculateOneYearOfDegreeDaysForAllBalancePoints(List <WNRdngData> wNRdngData)
        {
            List <BalancePointPair> allBalancePointPairs = new List <BalancePointPair>();

            DateTime _yearOfReadsDateStart = wNRdngData.First().DateStart;
            DateTime _yearOfReadsDateEnd   = wNRdngData.Last().DateEnd;
            int      _readingsCount        = wNRdngData.First().MoCt;
            int      daysInYear            = 0;

            bool badData = false;

            foreach (WNRdngData reading in wNRdngData)
            {
                if (reading.DateStart == DateTime.MinValue || reading.DateEnd == DateTime.MinValue)
                {
                    badData = true;
                    Log.Warning($"MoID: {reading.MoID} >> DateStart and/or DateEnd is null for " +
                                $"AccID/UtilID/UnitID: {reading.AccID}/{reading.UtilID}/{reading.UnitID}");
                }
                else
                {
                    var t = reading.DateEnd.Subtract(reading.DateStart).Days;
                    daysInYear += t;
                }
            }

            if (badData)
            {
                throw new BadWNRdngDataException($"Bad/null WNRdngData for AccID/UtilID/UnitID: " +
                                                 $"{wNRdngData.First().AccID}/{wNRdngData.First().UtilID}/{wNRdngData.First().UnitID}.");
            }

            foreach (WNRdngData reading in wNRdngData)
            {
                int daysInReading = reading.DateEnd.Subtract(reading.DateStart).Days;

                if (daysInReading == 0)
                {
                    continue;
                }

                HeatingCoolingDegreeDays hcdd = new HeatingCoolingDegreeDays
                {
                    CDD = 0.0,
                    HDD = 0.0
                };

                List <WeatherData> weatherDataList = _weatherRepository.GetWeatherDataByZipStartAndEndDate(reading.Zip, reading.DateStart, reading.DateEnd);

                if (weatherDataList.Count != daysInReading)
                {
                    throw new BadWNRdngDataException($"WeatherData.Count != daysInReading ({weatherDataList.Count} != {daysInReading}) << " +
                                                     $"Acc/Util/UnitID: {reading.AccID}/{reading.UtilID}/{reading.UnitID}, Zip: {reading.Zip} MoID: {reading.MoID}");
                }

                int rangeMin = 45;
                int rangeMax = 75;
                int range    = rangeMax - rangeMin + 1;

                List <int[]> comboList = new List <int[]>();

                for (int i = 0; i < range; i++)
                {
                    int[] hdsOnly = new int[2] {
                        rangeMin + i, 0
                    };
                    int[] cdsOnly = new int[2] {
                        0, rangeMin + i
                    };

                    comboList.Add(hdsOnly);
                    comboList.Add(cdsOnly);

                    int k = range - 1 - i;
                    while (k >= 0)
                    {
                        int[] both = new int[2] {
                            rangeMin + i, rangeMin + i + k
                        };
                        k--;

                        comboList.Add(both);
                    }
                }

                comboList.Add(new int[] { 0, 0 });

                foreach (int[] combo in comboList)
                {
                    BalancePointPair bpPair = new BalancePointPair
                    {
                        CoolingBalancePoint = combo[1],
                        HeatingBalancePoint = combo[0]
                    };

                    hcdd = HeatingCoolingDegreeDaysValueOf(bpPair, weatherDataList);

                    bpPair.CoolingDegreeDays = hcdd.CDD;
                    bpPair.HeatingDegreeDays = hcdd.HDD;
                    bpPair.ActualUsage       = reading.Units;
                    bpPair.ZipCode           = reading.Zip;
                    bpPair.DaysInReading     = daysInReading;
                    bpPair.DaysInYear        = daysInYear;

                    allBalancePointPairs.Add(bpPair);
                }
            }

            return(allBalancePointPairs);
        }
Exemple #9
0
        public void PopulateWthExpUsageTable()
        {
            Log.Information("Starting PopulateWthExpUsage()...");

            //string fromDateStartStr = $"{_fromDateStart.Month}-{_fromDateStart.Day}-{_fromDateStart.Year}";

            try
            {
                List <ReadingsQueryResult> readings = _weatherRepository.GetReadings(_MoID);

                _expectedWthExpUsageInserts = readings.Count;

                foreach (ReadingsQueryResult result in readings)
                {
                    try
                    {
                        if (!result.R2.HasValue
                            //|| result.R2.Value > 1
                            //|| result.R2 < 0
                            )
                        {
                            continue;
                        }

                        if (result.R2.Value < 0.7500)
                        {
                            bool successAndNoModel = _weatherRepository.InsertWthExpUsage(result.RdngID, result.Units ?? 0);

                            if (successAndNoModel)
                            {
                                _actualWthExpUsageInserts++;
                                Log.Debug($"Inserted into WthExpUsage (No Weather Model) >> RdngID: {result.RdngID} ExpUsage: {result.Units ?? 0} << " +
                                          $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, Actual Units: {result.Units}.");
                            }
                            else
                            {
                                Log.Error($"Failed attempt: Insert into WthExpUsage (without an accepted weather model) " +
                                          $">> RdngID: {result.RdngID} ExpUsage: {result.Units ?? 0} << " +
                                          $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, Actual Units: {result.Units}");
                            }
                            continue;
                        }

                        if (result.DateStart == DateTime.MinValue || result.DateEnd == DateTime.MinValue)
                        {
                            throw new Exception("DateStart and/or DateEnd is null.");
                        }

                        int daysInReading = result.DateEnd.Subtract(result.DateStart).Days;

                        List <WeatherData> weatherDataList = _weatherRepository.GetWeatherDataByZipStartAndEndDate(result.Zip, result.DateStart, result.DateEnd);

                        if (weatherDataList.Count != daysInReading)
                        {
                            throw new Exception($"WeatherDataList.Count != daysInReading; WeatherDataList.Count = {weatherDataList.Count}, " +
                                                $"daysInReading = {daysInReading}. Reading.StartDate = {result.DateStart} Reading.EndDate = {result.DateEnd}");
                        }

                        HeatingCoolingDegreeDays heatingCoolingDegreeDays = HeatingCoolingDegreeDaysValueOf(result, weatherDataList);

                        DoCalculation(result, heatingCoolingDegreeDays);
                    }
                    catch (Exception e)
                    {
                        Log.Error($"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID} >> " +
                                  $"Cannot calculate ExpUsage for RdngID: {result.RdngID} >> {e.Message}");
                        Log.Debug(e.StackTrace);
                    }
                }

                int expectedTotalWthExpUsageEntries = _weatherRepository.GetExpectedWthExpUsageRowCount(_MoID);
                int actualTotalWthExpUsageEntries   = _weatherRepository.GetActualWthExpUsageRowCount();

                Log.Information($"Finished PopulateWthExpUsage(). Expected inserts: {_expectedWthExpUsageInserts}, Actual: {_actualWthExpUsageInserts}");
                Log.Information($"Expected WthExpUsage total entries: {expectedTotalWthExpUsageEntries}, Actual: {actualTotalWthExpUsageEntries}.");
            }
            catch (Exception ex)
            {
                Log.Error($"Problem getting Readings >> {ex.Message} { ex.StackTrace}");
            }

            _expectedWthExpUsageInserts = 0;
            _actualWthExpUsageInserts   = 0;
        }