/// <summary> /// Loads the most recent DeviceTelemetrySummaryModel for a specified Device. /// </summary> /// <param name="deviceId"> /// The ID of the Device for which a telemetry summary model should be /// returned. /// </param> /// <param name="minTime"> /// If provided the the minimum time stamp of the summary data that should /// be loaded. /// </param> /// <returns> /// The most recent DeviceTelemetrySummaryModel for the Device, /// specified by deviceId. /// </returns> public async Task <DeviceTelemetrySummaryModel> LoadLatestDeviceTelemetrySummaryAsync( string deviceId, DateTime?minTime) { DeviceTelemetrySummaryModel summaryModel = null; IEnumerable <DeviceTelemetrySummaryModel> blobModels; var telemetryBlobReader = await _blobStorageManager.GetReader(_telemetrySummaryPrefix, minTime); foreach (var telemetryStream in telemetryBlobReader) { try { blobModels = LoadBlobTelemetrySummaryModels(telemetryStream.Data, telemetryStream.LastModifiedTime); } catch { continue; } if (blobModels == null) { break; } blobModels = blobModels.Where(t => t != null); if (!string.IsNullOrEmpty(deviceId)) { blobModels = blobModels.Where(t => t.DeviceId == deviceId); } summaryModel = blobModels.LastOrDefault(); if (summaryModel != null) { break; } } return(summaryModel); }
private static List <DeviceTelemetrySummaryModel> LoadBlobTelemetrySummaryModels(Stream stream, DateTime?lastModifiedTime) { Debug.Assert(stream != null, "stream is a null reference."); var models = new List <DeviceTelemetrySummaryModel>(); try { stream.Position = 0; using (var reader = new StreamReader(stream)) { IEnumerable <StrDict> strdicts = ParsingHelper.ParseCsv(reader).ToDictionaries(); DeviceTelemetrySummaryModel model; double number; string str; foreach (StrDict strdict in strdicts) { model = new DeviceTelemetrySummaryModel(); if (strdict.TryGetValue("deviceid", out str)) { model.DeviceId = str; } if (strdict.TryGetValue("averagespeed", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.AverageSpeed = number; } if (strdict.TryGetValue("maximumspeed", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.MaximumSpeed = number; } if (strdict.TryGetValue("minimumspeed", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.MinimumSpeed = number; } if (strdict.TryGetValue("timeframeminutes", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.TimeFrameMinutes = number; } model.Timestamp = lastModifiedTime; models.Add(model); } } } finally { } return(models); }
private static List <DeviceTelemetrySummaryModel> LoadBlobTelemetrySummaryModels(Stream stream, DateTime?lastModifiedTime) { Debug.Assert(stream != null, "stream is a null reference."); var models = new List <DeviceTelemetrySummaryModel>(); TextReader reader = null; try { stream.Position = 0; reader = new StreamReader(stream); IEnumerable <StrDict> strdicts = ParsingHelper.ParseCsv(reader).ToDictionaries(); DeviceTelemetrySummaryModel model; double number; string str; foreach (StrDict strdict in strdicts) { model = new DeviceTelemetrySummaryModel(); if (strdict.TryGetValue("deviceid", out str)) { model.DeviceId = str; } if (strdict.TryGetValue("averagehumidity", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.AverageHumidity = number; } if (strdict.TryGetValue("maxhumidity", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.MaximumHumidity = number; } if (strdict.TryGetValue("minimumhumidity", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.MinimumHumidity = number; } //********************************************************************************* // Demo code - Step #3 - Parse 3 new temperature fields from the CSV file stored in // Blob storage from Streal Analytics // if (strdict.TryGetValue("averagetemperature", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.AverageTemperature = number; } if (strdict.TryGetValue("maxtemperature", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.MaximumTemperature = number; } if (strdict.TryGetValue("minimumtemperature", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.MinimumTemperature = number; } //******************************************************************************* if (strdict.TryGetValue("timeframeminutes", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.TimeFrameMinutes = number; } model.Timestamp = lastModifiedTime; models.Add(model); } } finally { IDisposable disp; if ((disp = stream) != null) { disp.Dispose(); } if ((disp = reader) != null) { disp.Dispose(); } } return(models); }
private async static Task <List <DeviceTelemetrySummaryModel> > LoadBlobTelemetrySummaryModelsAsync( CloudBlockBlob blob) { Debug.Assert(blob != null, "blob is a null reference."); var models = new List <DeviceTelemetrySummaryModel>(); TextReader reader = null; MemoryStream stream = null; try { stream = new MemoryStream(); await blob.DownloadToStreamAsync(stream); stream.Position = 0; reader = new StreamReader(stream); IEnumerable <StrDict> strdicts = ParsingHelper.ParseCsv(reader).ToDictionaries(); DeviceTelemetrySummaryModel model; double number; string str; foreach (StrDict strdict in strdicts) { model = new DeviceTelemetrySummaryModel(); if (strdict.TryGetValue("deviceid", out str)) { model.DeviceId = str; } if (strdict.TryGetValue("averagehumidity", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.AverageHumidity = number; } if (strdict.TryGetValue("maxhumidity", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.MaximumHumidity = number; } if (strdict.TryGetValue("minimumhumidity", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.MinimumHumidity = number; } if (strdict.TryGetValue("timeframeminutes", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.TimeFrameMinutes = number; } // Translate LastModified to local time zone. DateTimeOffsets // don't do this automatically. This is for equivalent behavior // with parsed DateTimes. if ((blob.Properties != null) && blob.Properties.LastModified.HasValue) { model.Timestamp = blob.Properties.LastModified.Value.LocalDateTime; } models.Add(model); } } finally { IDisposable disp; if ((disp = stream) != null) { disp.Dispose(); } if ((disp = reader) != null) { disp.Dispose(); } } return(models); }
/// <summary> /// Loads the most recent DeviceTelemetrySummaryModel for a specified Device. /// </summary> /// <param name="deviceId"> /// The ID of the Device for which a telemetry summary model should be /// returned. /// </param> /// <param name="minTime"> /// If provided the the minimum time stamp of the summary data that should /// be loaded. /// </param> /// <returns> /// The most recent DeviceTelemetrySummaryModel for the Device, /// specified by deviceId. /// </returns> public async Task <DeviceTelemetrySummaryModel> LoadLatestDeviceTelemetrySummaryAsync( string deviceId, DateTime?minTime) { DeviceTelemetrySummaryModel summaryModel = null; CloudBlobContainer container = await BlobStorageHelper.BuildBlobContainerAsync( this._telemetryStoreConnectionString, _telemetryContainerName); IEnumerable <IListBlobItem> blobs = await BlobStorageHelper.LoadBlobItemsAsync( async (token) => { return(await container.ListBlobsSegmentedAsync( _telemetrySummaryPrefix, true, BlobListingDetails.None, null, token, null, null)); }); blobs = blobs.OrderByDescending(t => BlobStorageHelper.ExtractBlobItemDate(t)); IEnumerable <DeviceTelemetrySummaryModel> blobModels; CloudBlockBlob blockBlob; foreach (IListBlobItem blob in blobs) { if ((blockBlob = blob as CloudBlockBlob) == null) { continue; } // Translate LastModified to local time zone. DateTimeOffsets // don't do this automatically. This is for equivalent behavior // with parsed DateTimes. if (minTime.HasValue && (blockBlob.Properties != null) && blockBlob.Properties.LastModified.HasValue && (blockBlob.Properties.LastModified.Value.LocalDateTime < minTime.Value)) { break; } try { blobModels = await LoadBlobTelemetrySummaryModelsAsync(blockBlob); } catch { continue; } if (blobModels == null) { break; } blobModels = blobModels.Where(t => t != null); if (!string.IsNullOrEmpty(deviceId)) { blobModels = blobModels.Where(t => t.DeviceId == deviceId); } summaryModel = blobModels.LastOrDefault(); if (summaryModel != null) { break; } } return(summaryModel); }
private async static Task <List <DeviceTelemetrySummaryModel> > LoadBlobTelemetrySummaryModelsAsync( CloudBlockBlob blob) { IDisposable disp; IEnumerable <StrDict> strdicts; DeviceTelemetrySummaryModel model; List <DeviceTelemetrySummaryModel> models; double number; TextReader reader; string str; MemoryStream stream; Debug.Assert(blob != null, "blob is a null reference."); models = new List <DeviceTelemetrySummaryModel>(); reader = null; stream = null; try { stream = new MemoryStream(); await blob.DownloadToStreamAsync(stream); stream.Position = 0; reader = new StreamReader(stream); strdicts = ParsingHelper.ParseCsv(reader).ToDictionaries(); foreach (StrDict strdict in strdicts) { model = new DeviceTelemetrySummaryModel(); if (strdict.TryGetValue("deviceid", out str)) { model.DeviceId = str; } if (strdict.TryGetValue("averagehumidity", out str) && double.TryParse(str, out number)) { model.AverageHumidity = number; } if (strdict.TryGetValue("maxhumidity", out str) && double.TryParse(str, out number)) { model.MaximumHumidity = number; } if (strdict.TryGetValue("minimumhumidity", out str) && double.TryParse(str, out number)) { model.MinimumHumidity = number; } if (strdict.TryGetValue("timeframeminutes", out str) && double.TryParse(str, out number)) { model.TimeFrameMinutes = number; } if ((blob.Properties != null) && blob.Properties.LastModified.HasValue) { model.Timestamp = blob.Properties.LastModified.Value.UtcDateTime; } models.Add(model); } } finally { if ((disp = stream) != null) { disp.Dispose(); } if ((disp = reader) != null) { disp.Dispose(); } } return(models); }