示例#1
0
        private static DailyUsage GetDailyUsageImproved(DateTime yesterday)
        {
            yesterday = yesterday.Date;
            var today = yesterday.AddDays(1);

            var todayRecords              = GetP1RecordsForDay(today);
            var yesterdayRecords          = GetP1RecordsForDay(yesterday);
            var dayBeforeYesterdayRecords = GetP1RecordsForDay(yesterday.AddDays(-1));

            var yesterdayLocal = yesterday.AddHours(12).ToLocalTime().Date;
            var todayLocal     = yesterdayLocal.AddDays(1);

            var records     = dayBeforeYesterdayRecords.Concat(yesterdayRecords).Concat(todayRecords);
            var improved    = P1Improved.FromP1Records(records).ToArray();
            var firstRecord = improved.First(p1I => p1I.DateTime >= yesterdayLocal);
            var lastRecord  = improved.First(p1I => p1I.DateTime >= todayLocal);
            var usageTotal  = Usage.FromRecords(firstRecord, lastRecord);
            var range       = Enumerable.Range(0, 25).ToArray();
            var hours       = range.Select(i => yesterdayLocal.AddHours(i)).ToArray();
            var hourRecords = hours.Select(h => improved.First(p1I => p1I.DateTime >= h)).ToArray();
            var hourly      = range.Skip(1).Select(r => new Usage
            {
                kWh = hourRecords[r].kWhTotal - hourRecords[r - 1].kWhTotal,
                M3  = hourRecords[r].M3Total - hourRecords[r - 1].M3Total,
            }).ToArray();
            var dailyUsage = new DailyUsage {
                Total = usageTotal, Day = yesterday, Hourly = hourly
            };

            return(dailyUsage);
        }
        public void When_Only_Two_Consecutive_Readings_Are_Available_In_Collection_For_A_Same_Device_Returns_Battery_Usage_Average()
        {
            List <UsageReading> usageReadings = new List <UsageReading>();

            usageReadings.Add(new UsageReading
            {
                AcademyId    = 30006,
                BatteryLevel = 1,
                EmployeeId   = "T1007384",
                SerialNumber = "1805C67HD02259",
                TimeStamp    = Convert.ToDateTime("2019-06-19T04:30:00.000+01:00")
            });
            usageReadings.Add(new UsageReading
            {
                AcademyId    = 30006,
                BatteryLevel = 0.90,
                EmployeeId   = "T1007384",
                SerialNumber = "1805C67HD02259",
                TimeStamp    = Convert.ToDateTime("2019-06-18T16:30:00.000+01:00")
            });
            var        test       = (Convert.ToDateTime("2019-06-19T16:30:00.000+01:00") - Convert.ToDateTime("2019-06-18T04:30:00.000+01:00")).TotalHours;
            DailyUsage dailyUsage = new DailyUsage();
            IEnumerable <AverageReading> output = dailyUsage.Average(usageReadings);

            Assert.AreEqual(20, output.Select(x => x.Reading).FirstOrDefault());
        }
        public void When_Only_One_Reading_Is_Available_In_Collection_Returns_Battery_Usage_Unknown()
        {
            List <UsageReading> usageReadings = new List <UsageReading>();

            usageReadings.Add(new UsageReading
            {
                AcademyId    = 30006,
                BatteryLevel = 0.68,
                EmployeeId   = "T1007384",
                SerialNumber = "1805C67HD02259",
                TimeStamp    = new DateTime(2020, 08, 01, 9, 0, 0)
            });

            DailyUsage dailyUsage = new DailyUsage();
            IEnumerable <AverageReading> output = dailyUsage.Average(usageReadings);

            Assert.AreEqual("Unknown", output.Select(x => x.Reading).FirstOrDefault());
        }
示例#4
0
        public static Data GetUIUsage(DailyUsage usage)
        {
            var idToName   = new Dictionary <uint, string>();
            var idToColor  = new Dictionary <uint, string>();
            var idToLegend = new Dictionary <uint, bool>();

            var appTimes = new Dictionary <string, double>();

            foreach (string appName in usage.AppNames)
            {
                uint hash = StringUtils.HashString(appName);

                idToName[hash]    = appName;
                idToColor[hash]   = ColorGenerator.GetColor(hash);
                idToLegend[hash]  = true;
                appTimes[appName] = 0.0f;
            }

            if (usage.Hours.Length != 24)
            {
                throw new DataMisalignedException(
                          string.Format("There should be 24 hours of data, but there are [{0}] instead.",
                                        usage.Hours.Length));
            }

            var hourly = new List <HourlyData> [24];


            for (int i = 0; i < 24; i++)
            {
                var         thisHour = new List <HourlyData>();
                HourlyUsage hour     = usage.Hours[i];
                int         count    = hour.AppUsedSeconds.Length;

                for (int j = 0; j < count; j++)
                {
                    uint   appUsed     = hour.AppUsedNameHashCodes[j];
                    double secondsUsed = hour.AppUsedSeconds[j];

                    string name   = idToName[appUsed];
                    string color  = idToColor[appUsed];
                    bool   legend = idToLegend[appUsed];

                    if (legend)
                    {
                        idToLegend[appUsed] = false;
                    }

                    appTimes[name] += secondsUsed;

                    thisHour.Add(new HourlyData(name, legend, color, secondsUsed));
                }

                hourly[i] = thisHour;
            }


            double maxVal = 0.0f;
            string maxKey = null;

            appTimes.Remove(UsageRepository.noActivity);

            List <string> keys         = appTimes.Keys.ToList();
            double        totalSeconds = appTimes.Values.Sum();

            foreach (var key in keys)
            {
                var val = (float)Math.Round(appTimes[key] / totalSeconds, 2);
                if (val > maxVal)
                {
                    maxVal = val;
                    maxKey = key;
                }
                appTimes[key] = val * 100;
            }

            double diff = 100.0 - appTimes.Values.Sum();

            if (maxKey != null)
            {
                appTimes[maxKey] += Math.Round(diff, 2);
            }

            // TODO: normalize the summary values.
            var summary = appTimes.Keys
                          .Where(key => key != UsageRepository.noActivity)
                          .Select(key => new SummaryData(key, appTimes[key])).ToList();

            return(new Data
            {
                HourlyUsage = hourly,
                Summary = summary
            });
        }
示例#5
0
        public static DailyUsage ToDaily(this List <UsageRow> usageRows, int minutesOffset)
        {
            DailyUsage dailyUsage = DailyTransformation.GetUsage(usageRows, minutesOffset);

            return(dailyUsage);
        }
示例#6
0
 public static Data ToUI(this DailyUsage usage)
 {
     return(UITransformation.GetUIUsage(usage));
 }