public DeviceTelemetryModel Get() { string DeviceID = "TSITestDevice"; string[] arr = { "temperatureC", "humidity" }; DeviceTelemetryModel result = GetAsync(DeviceID, arr, DateTime.UtcNow.AddHours(-1), DateTime.UtcNow).Result; return(result); }
/// <summary> /// Loads the most recent Device telemetry. /// </summary> /// <param name="deviceId"> /// The ID of the Device for which telemetry should be returned. /// </param> /// <param name="minTime"> /// The minimum time of record of the telemetry that should be returned. /// </param> /// <returns> /// Telemetry for the Device specified by deviceId, inclusively since /// minTime. /// </returns> public async Task <IEnumerable <DeviceTelemetryModel> > LoadLatestDeviceTelemetryAsync( string deviceId, IList <DeviceTelemetryFieldModel> telemetryFields, DateTime minTime) { IEnumerable <DeviceTelemetryModel> result = new DeviceTelemetryModel[0]; IEnumerable <DeviceTelemetryModel> blobModels; var telemetryBlobReader = await _blobStorageManager.GetReader(_telemetryDataPrefix, minTime); foreach (var telemetryStream in telemetryBlobReader) { try { blobModels = LoadBlobTelemetryModels(telemetryStream.Data, telemetryFields); } catch { continue; } if (blobModels == null) { break; } int preFilterCount = blobModels.Count(); blobModels = blobModels.Where( t => (t != null) && t.Timestamp.HasValue && t.Timestamp.Value >= minTime); if (preFilterCount == 0) { break; } result = result.Concat(blobModels); } if (!string.IsNullOrEmpty(deviceId)) { result = result.Where(t => t.DeviceId == deviceId); } return(result); }
public static DeviceTelemetryModel ToDeviceTelemetryModel(this JObject jobject) { if (jobject == null) { return(null); } DeviceTelemetryModel retVal = null; var lastTelemetry = jobject.Property("lastData").Value as JObject; if (lastTelemetry != null) { retVal = new DeviceTelemetryModel(); retVal.Timestamp = (DateTimeOffset)jobject.Property("lastUpdate").Value; retVal.Temperature = (double)lastTelemetry.Property("temperature").Value; retVal.Humidity = (double)lastTelemetry.Property("humidity").Value; } return(retVal); }
public static DeviceTelemetryModel ToDeviceTelemetryModel(this DurableEntityStatus entity) { if (entity == null) { return(null); } DeviceTelemetryModel retVal = null; var jobject = entity.State as JObject; if (jobject != null) { var lastTelemetry = jobject.Property("lastData").Value as JObject; if (lastTelemetry != null) { retVal = lastTelemetry.ToDeviceTelemetryModel(); } } return(retVal); }
private static List <DeviceTelemetryModel> LoadBlobTelemetryModels(Stream stream, IList <DeviceTelemetryFieldModel> telemetryFields) { Debug.Assert(stream != null, "stream is a null reference."); List <DeviceTelemetryModel> models = new List <DeviceTelemetryModel>(); try { stream.Position = 0; using (var reader = new StreamReader(stream)) { IEnumerable <StrDict> strdicts = ParsingHelper.ParseCsv(reader).ToDictionaries(); DeviceTelemetryModel model; string str; foreach (StrDict strdict in strdicts) { model = new DeviceTelemetryModel(); if (strdict.TryGetValue("deviceid", out str)) { model.DeviceId = str; } model.Timestamp = DateTime.Parse( //strdict["eventenqueuedutctime"], strdict["jerktimestamp"], CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces); IEnumerable <DeviceTelemetryFieldModel> fields; if (telemetryFields != null && telemetryFields.Count > 0) { fields = telemetryFields; } else { List <string> reservedColumns = new List <string> { "DeviceId", "EventEnqueuedUtcTime", "EventProcessedUtcTime", "IoTHub", "PartitionId" }; fields = strdict.Keys .Where((key) => !reservedColumns.Contains(key)) .Select((name) => new DeviceTelemetryFieldModel { Name = name, Type = "double" }); } foreach (var field in fields) { if (strdict.TryGetValue(field.Name, out str)) { switch (field.Type.ToUpperInvariant()) { case "INT": case "INT16": case "INT32": case "INT64": case "SBYTE": case "BYTE": int intValue; if ( int.TryParse( str, NumberStyles.Integer, CultureInfo.InvariantCulture, out intValue) && !model.Values.ContainsKey(field.Name)) { model.Values.Add(field.Name, intValue); } break; case "DOUBLE": case "DECIMAL": case "SINGLE": double dblValue; if ( double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out dblValue) && !model.Values.ContainsKey(field.Name)) { if (String.Equals(field.Name, "Latitude", StringComparison.InvariantCultureIgnoreCase)) { model.Latitude = dblValue; } else if (String.Equals(field.Name, "Longitude", StringComparison.InvariantCultureIgnoreCase)) { model.Longitude = dblValue; } else { model.Values.Add(field.Name, dblValue); } } break; } } } models.Add(model); } } } finally { } return(models); }
private static List <DeviceTelemetryModel> LoadBlobTelemetryModels(Stream stream, IList <DeviceTelemetryFieldModel> telemetryFields) { Debug.Assert(stream != null, "stream is a null reference."); List <DeviceTelemetryModel> models = new List <DeviceTelemetryModel>(); TextReader reader = null; try { stream.Position = 0; reader = new StreamReader(stream); IEnumerable <StrDict> strdicts = ParsingHelper.ParseCsv(reader).ToDictionaries(); DeviceTelemetryModel model; string str; foreach (StrDict strdict in strdicts) { model = new DeviceTelemetryModel(); if (strdict.TryGetValue("deviceid", out str)) { model.DeviceId = str; } model.Timestamp = DateTime.Parse( strdict["eventenqueuedutctime"], CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces); IEnumerable <DeviceTelemetryFieldModel> fields; if (telemetryFields != null && telemetryFields.Count > 0) { fields = telemetryFields; } else { List <string> reservedColumns = new List <string> { "DeviceId", "EventEnqueuedUtcTime", "EventProcessedUtcTime", "IoTHub", "PartitionId" }; fields = strdict.Keys .Where((key) => !reservedColumns.Contains(key)) .Select((name) => new DeviceTelemetryFieldModel { Name = name, Type = "double" }); } foreach (var field in fields) { if (strdict.TryGetValue(field.Name, out str)) { switch (field.Type.ToLowerInvariant()) { case "int": case "int16": case "int32": case "int64": case "sbyte": case "byte": int intValue; if ( int.TryParse( str, NumberStyles.Integer, CultureInfo.InvariantCulture, out intValue) && !model.Values.ContainsKey(field.Name)) { model.Values.Add(field.Name, intValue); } break; case "double": case "decimal": case "single": double dblValue; if ( double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out dblValue) && !model.Values.ContainsKey(field.Name)) { model.Values.Add(field.Name, dblValue); } break; } } } 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 Device telemetry. /// </summary> /// <param name="deviceId"> /// The ID of the Device for which telemetry should be returned. /// </param> /// <param name="minTime"> /// The minimum time of record of the telemetry that should be returned. /// </param> /// <returns> /// Telemetry for the Device specified by deviceId, inclusively since /// minTime. /// </returns> public async Task <IEnumerable <DeviceTelemetryModel> > LoadLatestDeviceTelemetryAsync( string deviceId, DateTime minTime) { IEnumerable <DeviceTelemetryModel> result = new DeviceTelemetryModel[0]; CloudBlobContainer container = await BlobStorageHelper.BuildBlobContainerAsync(this._telemetryStoreConnectionString, _telemetryContainerName); IEnumerable <IListBlobItem> blobs = await BlobStorageHelper.LoadBlobItemsAsync( async (token) => { return(await container.ListBlobsSegmentedAsync( _telemetryDataPrefix, true, BlobListingDetails.None, null, token, null, null)); }); blobs = blobs.OrderByDescending(t => BlobStorageHelper.ExtractBlobItemDate(t)); CloudBlockBlob blockBlob; IEnumerable <DeviceTelemetryModel> blobModels; foreach (IListBlobItem blob in blobs) { if ((blockBlob = blob as CloudBlockBlob) == null) { continue; } try { blobModels = await LoadBlobTelemetryModelsAsync(blockBlob); } catch { continue; } if (blobModels == null) { break; } int preFilterCount = blobModels.Count(); blobModels = blobModels.Where( t => (t != null) && t.Timestamp.HasValue && t.Timestamp.Value >= minTime); if (preFilterCount == 0) { break; } result = result.Concat(blobModels); if (preFilterCount != blobModels.Count()) { break; } } if (!string.IsNullOrEmpty(deviceId)) { result = result.Where(t => t.DeviceId == deviceId); } return(result); }
private async static Task <List <DeviceTelemetryModel> > LoadBlobTelemetryModelsAsync(CloudBlockBlob blob) { Debug.Assert(blob != null, "blob is a null reference."); List <DeviceTelemetryModel> models = new List <DeviceTelemetryModel>(); 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(); DeviceTelemetryModel model; string str; double number; foreach (StrDict strdict in strdicts) { model = new DeviceTelemetryModel(); if (strdict.TryGetValue("DeviceId", out str)) { model.DeviceId = str; } if (strdict.TryGetValue("ExternalTemperature", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.ExternalTemperature = number; } if (strdict.TryGetValue("Humidity", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.Humidity = number; } if (strdict.TryGetValue("Temperature", out str) && double.TryParse( str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) { model.Temperature = number; } DateTime date; if (strdict.TryGetValue("EventEnqueuedUtcTime", out str) && DateTime.TryParse( str, CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out date)) { model.Timestamp = date; } 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 Device telemetry. /// </summary> /// <param name="deviceId"> /// The ID of the Device for which telemetry should be returned. /// </param> /// <param name="minTime"> /// The minimum time of record of the telemetry that should be returned. /// </param> /// <returns> /// Telemetry for the Device specified by deviceId, inclusively since /// minTime. /// </returns> public async Task <IEnumerable <DeviceTelemetryModel> > LoadLatestDeviceTelemetryAsync( string deviceId, IList <DeviceTelemetryFieldModel> telemetryFields, DateTime minTime) { IEnumerable <DeviceTelemetryModel> result = new DeviceTelemetryModel[0]; CloudBlobContainer container = await BlobStorageHelper.BuildBlobContainerAsync(this._telemetryStoreConnectionString, this._telemetryContainerName); IEnumerable <IListBlobItem> blobs = await BlobStorageHelper.LoadBlobItemsAsync( async (token) => { return(await container.ListBlobsSegmentedAsync( this._telemetryDataPrefix, true, BlobListingDetails.None, null, token, null, null)); }); blobs = blobs .OrderByDescending(t => BlobStorageHelper.ExtractBlobItemDate(t)); CloudBlockBlob blockBlob; IEnumerable <DeviceTelemetryModel> blobModels; 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 ((blockBlob.Properties != null) && blockBlob.Properties.LastModified.HasValue && (blockBlob.Properties.LastModified.Value.LocalDateTime < minTime)) { break; } try { blobModels = await LoadBlobTelemetryModelsAsync(blockBlob, telemetryFields); } catch { continue; } if (blobModels == null) { break; } int preFilterCount = blobModels.Count(); blobModels = blobModels.Where( t => (t != null) && t.Timestamp.HasValue && t.Timestamp.Value >= minTime); if (preFilterCount == 0) { break; } result = result.Concat(blobModels); } if (!string.IsNullOrEmpty(deviceId)) { result = result.Where(t => t.DeviceId == deviceId); } return(result); }