public async Task InsertAsync(AggregatedSensorData aggregatedSensorData)
    {
        var table = _client.GetTableClient(_tableName);
        await table.CreateIfNotExistsAsync();

        await table.UpsertEntityAsync(SensorDataMapper.Map(aggregatedSensorData));
    }
Пример #2
0
 public static TableEntity Map(AggregatedSensorData sensorData)
 {
     return(new TableEntity(sensorData.SensorBoxId, Guid.NewGuid().ToString())
     {
         [nameof(AggregatedSensorData.SensorType)] = sensorData.SensorType.ToString("G"),
         [nameof(AggregatedSensorData.AggregationType)] = sensorData.AggregationType.ToString("G"),
         Timestamp = sensorData.CreatedAt,
         [nameof(AggregatedSensorData.Value)] = sensorData.Value
     });
 }
Пример #3
0
        public async Task Run(
            [QueueTrigger("aggregated-sensor-data")] AggregatedSensorData aggregatedSensorData,
            [Queue("validated-sensor-data")] IAsyncCollector <AggregatedSensorData> output,
            CancellationToken cancellationToken)
        {
            await _validationService.ValidateSensorDataAsync(aggregatedSensorData);

            await output.AddAsync(aggregatedSensorData, cancellationToken);

            await output.FlushAsync(cancellationToken);
        }
Пример #4
0
 private async Task ValidateAggregatedData(AggregatedSensorData aggregatedSensorData, Sensor sensor)
 {
     if (!AggregationTypesToValidate.Contains(aggregatedSensorData.AggregationType))
     {
         return;
     }
     if (aggregatedSensorData.Value < sensor.Min || aggregatedSensorData.Value > sensor.Max)
     {
         await CreateSensorAlarm(sensor, AlarmStatus.InvalidData);
     }
 }
Пример #5
0
        public async Task ValidateSensorDataAsync(AggregatedSensorData aggregatedSensorData)
        {
            _logger.LogDebug($"Incoming aggregated sensor data: sensor id {aggregatedSensorData.SensorBoxId}");

            var sensor = await _sensorRepository.GetByBoxIdAndTypeAsync(aggregatedSensorData.SensorBoxId, aggregatedSensorData.SensorType);

            if (sensor == null)
            {
                _logger.LogError($"No sensor found for id {aggregatedSensorData.SensorBoxId}");
                return;
            }
            await CheckSensorAndUpdateLastSeen(sensor);
            await ValidateAggregatedData(aggregatedSensorData, sensor);
        }
Пример #6
0
        public async Task InsertAsyncTest()
        {
            var sensorDataRepository = A.Fake <ISensorDataRepository>();
            var service = new SensorDataService(sensorDataRepository);
            var aggregatedSensorData = new AggregatedSensorData
            {
                SensorBoxId     = "test",
                SensorType      = SensorType.Temperature,
                AggregationType = AggregationType.Mean,
                CreatedAt       = DateTimeOffset.UtcNow,
                Value           = 1
            };

            await service.InsertAsync(aggregatedSensorData);

            A.CallTo(() => sensorDataRepository.InsertAsync(aggregatedSensorData)).MustHaveHappened();
        }
    public async Task WritesAggregatedData()
    {
        var writeService = A.Fake <ISensorDataService>();
        var function     = new SensorDataWriteFunction(writeService, A.Fake <ILogger <SensorDataWriteFunction> >());

        var aggregatedSensorData = new AggregatedSensorData
        {
            SensorBoxId     = "test",
            SensorType      = SensorType.Temperature,
            AggregationType = AggregationType.Mean,
            CreatedAt       = DateTimeOffset.UtcNow,
            Value           = 1
        };
        await function.Run(aggregatedSensorData);

        A.CallTo(() => writeService.InsertAsync(aggregatedSensorData)).MustHaveHappened();
    }
Пример #8
0
 public async Task Run([QueueTrigger("validated-sensor-data")] AggregatedSensorData aggregatedSensorData)
 {
     await _sensorDataService.InsertAsync(aggregatedSensorData);
 }
 public Task InsertAsync(AggregatedSensorData aggregatedSensorData)
 {
     return(_sensorDataRepository.InsertAsync(aggregatedSensorData));
 }