public async Task <StationGraphDto> StationGraphData(int stationId, int variableId, DateTime?date, bool isMetricUnits) { StationGraphDto stationGraphDto = new StationGraphDto { Title = "24 hour graph of Air Temperature at 1.5m (4.92ft)", YAxisTitle = "Degrees Fahrenheit", Series = new List <StationGraphSeriesDto> { new StationGraphSeriesDto { Name = "Temperature", LineWidth = 0.5, Data = new List <List <double> >() } } }; DateTime dateStart = new DateTime(2019, 11, 1, 0, 0, 0); DateTime dateToReach = new DateTime(2019, 11, 2, 0, 0, 0); Random random = new Random(); double i = 0.1; while (dateStart < dateToReach) { stationGraphDto.Series[0].Data.Add(new List <double>() { (double)new DateTimeOffset(dateStart.ToUniversalTime()).ToUnixTimeMilliseconds(), 75 + i }); dateStart = dateStart.AddMinutes(1); i += 0.1; if (i > 25) { i = 15; } } return(stationGraphDto); }
/// <summary> /// Gets data for station info displays. /// </summary> /// <param name="stationId">Station Id filter</param> /// <param name="variableId">Variable Id filter</param> /// <param name="date">Timestamp filter</param> /// <param name="isMetricUnits">Returns data in metric units if true, english units if false</param> /// <returns>A StationGraphDto for a station</returns> public async Task <StationGraphDto> StationGraphData(int stationId, int variableId, DateTime?date, bool isMetricUnits) { // Get the VariableDescription with the VariableType var variableDescription = await _dbContext.VariableDescription .AsNoTracking() .Include(x => x.VariableType) .Where(x => x.Id == variableId) .SingleAsync(); // Build the StationGraphDto var stationGraphDto = new StationGraphDto { Title = "24 hour graph of " + variableDescription.VariableDescription1, YAxisTitle = isMetricUnits ? variableDescription.VariableType.MetricUnit : variableDescription.VariableType.EnglishUnit, Series = new List <StationGraphSeriesDto> { new StationGraphSeriesDto { Name = variableDescription.VariableType.VariableType1.Replace("_", " "), LineWidth = 1 } } }; // Get the first datetime data entry for the station stationGraphDto.FirstDateTimeEntry = await _dbContext.StationData .AsNoTracking() .Where(x => x.Station.Id == stationId) .OrderBy(x => x.Ts) .Select(x => x.Ts) .FirstOrDefaultAsync(); // Get the last datetime data entry for the station stationGraphDto.LastDateTimeEntry = await _dbContext.StationData .AsNoTracking() .Where(x => x.Station.Id == stationId) .OrderByDescending(x => x.Ts) .Select(x => x.Ts) .FirstOrDefaultAsync(); // Set first and last datetime entries null if defaulted if (stationGraphDto.FirstDateTimeEntry == DateTime.MinValue) { stationGraphDto.FirstDateTimeEntry = null; } // Set first and last datetime entries null if defaulted if (stationGraphDto.LastDateTimeEntry == DateTime.MinValue) { stationGraphDto.LastDateTimeEntry = null; } // Default date to LastDateTimeEntry if (!date.HasValue) { date = stationGraphDto.LastDateTimeEntry; } // Get the VariableEnum and VariableTypeEnum values based on the Variable // Retrive the data entries for the station and variable in a timespan of 24 hours from the date if (date != null) { if (System.Enum.TryParse(variableDescription.VariableName, out VariableEnum variableEnum)) { if (System.Enum.TryParse(variableDescription.VariableType.VariableType1, out VariableTypeEnum variableTypeEnum)) { stationGraphDto.Series[0].Data = await _dbContext.StationData .AsNoTracking() .Where(x => x.Ts >= date.Value.Date && x.Ts < date.Value.Date.AddDays(1)) .Where(x => x.Station.Id == stationId) .OrderBy(x => x.Ts) .Select(x => new List <double>() { (double)new DateTimeOffset(x.Ts).ToUnixTimeMilliseconds(), x.ValueForVariable(isMetricUnits, false, variableTypeEnum, variableEnum) ?? 0 }) .ToListAsync(); } } } return(stationGraphDto); }