public async Task <IActionResult> Report([FromBody] SharedModels.SensorReadings readings) { try { if (!IsDeviceKeyValid()) { return(BadRequest()); } var measurement = await _dataContext.Measurements .Include(m => m.SensorRoles) .ThenInclude(r => r.Sensor) .Include(m => m.Calculators) .FirstOrDefaultAsync(m => m.IsActive); if (measurement == null) { return(NotFound()); } if (measurement.SensorRoles.Count == 0) { return(NoContent()); } foreach (var sensorRole in measurement.SensorRoles) { var readingForSensor = readings.Readings.FirstOrDefault(r => r.SensorId == sensorRole.Sensor.Id); if (readingForSensor == null) { continue; } var reading = new SensorReading(); reading.ReadingTime = readings.ReadingTime; reading.SensorRole = sensorRole; reading.Value = readingForSensor.Reading; reading.Measurement = measurement; _dataContext.Readings.Add(reading); } var calcs = _calculatorProvider.GetCalculators(); foreach (var registeredCalculator in measurement.Calculators) { if (!calcs.ContainsKey(registeredCalculator.Name)) { continue; } var calc = calcs[registeredCalculator.Name]; calc.SetParameters(registeredCalculator.Parameters); if (calc.ReturnsReading) { var reading = new CalculatorReading(); reading.Calculator = registeredCalculator; reading.Measurement = measurement; reading.ReadingTime = readings.ReadingTime; reading.Value = calc.Calculate(readings, measurement); _dataContext.Readings.Add(reading); } else { calc.Calculate(readings, measurement); } } await _dataContext.SaveChangesAsync(); return(NoContent()); } catch (Exception ex) { _log.LogError(ex.ToString()); throw ex; } }
public double Calculate(SharedModels.SensorReadings readings, Measurement measurement) { if (measurement == null) { return(-1000); } if (measurement.CoolingRate.HasValue) { return(-1000); } var readingTime = readings.ReadingTime; var previousAmbientReading = GetPreviousAmbientReading(measurement.Id, readingTime); if (previousAmbientReading == null) { return(-1000); } double?currentAmbientReading = readings.GetSensorReading(previousAmbientReading.SensorId); if (currentAmbientReading == null) { return(-1000); } readingTime = previousAmbientReading.Reading.ReadingTime; var previousLiquidReading = GetPreviousLiquidReading(measurement.Id, readingTime); if (previousLiquidReading == null) { return(-1000); } double?currentLiquidReading = readings.GetSensorReading(previousLiquidReading.SensorId); if (currentLiquidReading == null) { return(-1000); } var delta = (readings.ReadingTime - previousLiquidReading.Reading.ReadingTime).TotalMinutes; var coolingRate = GetCoolingRate((double)previousLiquidReading.Reading.Value, (double)previousAmbientReading.Reading.Value, currentLiquidReading.Value, delta); if (coolingRate == 0) { return(-1000); } if (double.IsNaN(coolingRate) || double.IsInfinity(coolingRate)) { return(-1000); } measurement.CoolingRate = coolingRate; return(-1000); }
public double Calculate(SharedModels.SensorReadings readings, Measurement measurement) { return(readings.Readings.First().Reading + 10f); }