private async Task PersistAverages(string stationId, string sensorId, DateTime day) { var dayStates = statePersister.DayStates(stationId, sensorId, day); var yesterdayStates = hourlyStatePersister.DayStates(stationId, sensorId, day.AddDays(-1)); var dayStatesActive = from s in dayStates where s.Active select s; var yesterdayStatesActive = from s in yesterdayStates where s.Active select s; var minutesAverages = (from s in dayStatesActive group s by new { Hour = s.At.Hour, Lapse = s.At.Minute / eachMinutes } into g select new SensorStateHourly { At = new DateTimeOffset(day.Year, day.Month, day.Day, g.Key.Hour, g.Key.Lapse * eachMinutes, 0, g.Select(x => x.At.Offset).FirstOrDefault()), State = sensorId.ToLowerInvariant() == "rain" ? g.Sum(x => x.State) : g.Average(x => x.State), Active = g.Count() >= 0.75 * eachMinutes ? true : false, Max = g.Max(x => x.State), Min = g.Min(x => x.State), }); var hourAverages = generateList(minutesAverages, yesterdayStatesActive); await hourlyStatePersister.Persist(stationId, sensorId, hourAverages.ToArray()); logger.LogTrace(() => $"Actualizados promedios horarios para '{sensorId}' de '{stationId}' del {day}"); }
public Task <IEnumerable <Models.SensorDetailState> > DayDetail(string stationId, string sensorId, int year, int month, int day) { DateTime dayDate; if (!DateTime.TryParseExact($"{year:D4}{month:D2}{day:D2}", "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dayDate)) { throw new HttpResponseException(HttpStatusCode.BadRequest); } var dayStates = sensorStatesPersister.DayStates(stationId, sensorId, dayDate); return(Task.FromResult(dayStates.Select(x => new Models.SensorDetailState { At = x.At, State = x.State, Active = x.Active }))); }