public Task <CalcData[]> Calculate(BatchTelemetry batchTelemetry) { var batchStatsBySensors = batchTelemetry.DataPoints.GroupBy(x => x.SensorId) .Select(x => { decimal avg = 0, stdDev = 0; try { avg = x.Average(y => y.Value); stdDev = (decimal)Math.Sqrt((double)x.Select(y => y.Value - avg).Select(y => y * y).Average()); } catch (OverflowException) { //todo: logs } return(new CalcData { BatchId = batchTelemetry.BatchId, BatchStartTime = batchTelemetry.BatchStartTime, SensorId = x.Key, Average = avg, StandardDeviation = stdDev }); }) .ToArray(); return(Task.FromResult(batchStatsBySensors)); }
public Task HandleAsync(IMessage message) { var dataPoint = message as DataPoint; if (dataPoint == null) { return(Task.CompletedTask); } var currentBatchTelemetry = batchCachingService.GetCurrentBatchTelemetry(); if (currentBatchTelemetry?.BatchId == dataPoint.BatchId) { // add telemetry to current batch currentBatchTelemetry.DataPoints.Add(dataPoint); batchCachingService.AddCurrentBatchTelemetry(currentBatchTelemetry); return(Task.CompletedTask); } else if (currentBatchTelemetry != null) { // send previous batch telemetry to calc service eventBus.Publish(EventTopic.BatchData, currentBatchTelemetry); } // new batch started currentBatchTelemetry = new BatchTelemetry { BatchId = dataPoint.BatchId, BatchStartTime = dataPoint.BatchTimestamp, DataPoints = new List <DataPoint> { dataPoint } }; batchCachingService.AddCurrentBatchTelemetry(currentBatchTelemetry); return(Task.CompletedTask); }
public void AddCurrentBatchTelemetry(BatchTelemetry batchTelemetry) { cache.Store(BatchCacheKey, batchTelemetry, TimeSpan.FromSeconds(batchSettings.BatchCachingTime)); }