コード例 #1
0
        public DeviceTelemetryModel Get()
        {
            string DeviceID = "TSITestDevice";

            string[]             arr    = { "temperatureC", "humidity" };
            DeviceTelemetryModel result = GetAsync(DeviceID, arr, DateTime.UtcNow.AddHours(-1), DateTime.UtcNow).Result;

            return(result);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #9
0
        /// <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);
        }