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()); }
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 }); }
public static DailyUsage ToDaily(this List <UsageRow> usageRows, int minutesOffset) { DailyUsage dailyUsage = DailyTransformation.GetUsage(usageRows, minutesOffset); return(dailyUsage); }
public static Data ToUI(this DailyUsage usage) { return(UITransformation.GetUIUsage(usage)); }