コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
 public double Calculate(SharedModels.SensorReadings readings, Measurement measurement)
 {
     return(readings.Readings.First().Reading + 10f);
 }