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.SensorHourlyState> > Day(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 = hourlyStatePersister.DayStates(stationId, sensorId, dayDate); return(Task.FromResult(dayStates.Select(x => new Models.SensorHourlyState { At = x.At, State = x.State, Active = x.Active, Max = x.Max, Min = x.Min, EightHour = x.EightHour, FullDay = x.FullDay, }))); }
public async Task ProcessMessage([QueueTrigger("stationsensordaystatechanged")] StationSensorDayStateChanged message) { if (message == null) { return; } var stationId = message.StationId; var sensorId = message.SensorId; var day = message.Day; var dayStates = hourlyStatePersister.DayStates(stationId, sensorId, day); var dayStatesActive = from s in dayStates where s.Active select s; var dayAverage = new SensorDayAverageState { Day = day, Average = sensorId.ToLowerInvariant() == "rain" ? dayStatesActive.Sum(x => x.State) : dayStatesActive.Average(x => x.State) }; await dailyStatePersister.Persist(stationId, sensorId, dayAverage); logger.LogTrace(() => $"Actualizado promedio diario para '{sensorId}' de '{stationId}' del {day}"); await sensorActivityPersister.Persist(stationId, sensorId, day.Year); logger.LogTrace(() => $"Registrado '{sensorId}' de '{stationId}' en {day.Year}"); }