Example #1
0
        internal static IntradayData GetIntradayTimeSeriesData(this JsonDotNetSerializer serializer, string intradayDataJson)
        {
            if (string.IsNullOrWhiteSpace(intradayDataJson))
            {
                throw new ArgumentNullException(nameof(intradayDataJson), "intradayDataJson can not be empty, null or whitespace.");
            }

            var parsedJToken = JToken.Parse(intradayDataJson);

            // need to parse the date first
            var date       = parsedJToken.SelectToken(serializer.RootProperty).First["dateTime"];
            var dataPoints = parsedJToken.SelectTokens(serializer.RootProperty + "-intraday.dataset");

            var result = new IntradayData
            {
                DataSet = (from item in dataPoints.Children()
                           select new IntradayDataValues
                {
                    Time = DateTime.Parse(date + " " + item["time"]),
                    Value = item["value"].ToObject <double>().ToString("R"),    //converting to double is required to keep precision
                    METs = item["mets"] != null ? item["mets"].ToString() : null,
                    Level = item["level"] != null ? item["level"].ToString() : null
                }).ToList()
            };

            return(result);
        }
Example #2
0
        private static async Task <IntradayData> GetIntraDayTimeSeriesAsync(FitbitClient client, DateTime date)
        {
            TimeSpan     timeSpan = date.AddDays(1) - date;
            IntradayData x        = await client.GetIntraDayTimeSeriesAsync(IntradayResourceType.Steps, date, timeSpan);

            return(x);
        }
Example #3
0
        public void Can_Deserialize_IntradayActivitiesCalories()
        {
            string content = File.ReadAllText(SampleData.PathFor("IntradayActivitiesCalories.txt"));

            var deserializer = new RestSharp.Deserializers.XmlDeserializer();

            //var deserializer = new RestSharp.Deserializers.JsonDeserializer();
            deserializer.DateFormat = "HH:mm:ss";
            //TimeSeriesResourceType type = TimeSeriesResourceType.Steps.GetRootElement();

            //deserializer.RootElement = "dataset";
            deserializer.RootElement = "activities-log-calories-intraday";

            IntradayData result = deserializer.Deserialize <IntradayData>(new RestResponse()
            {
                Content = content
            });

            //var result = deserializer.Deserialize<dynamic>(new RestResponse() { Content = content });

            Assert.IsNotNull(result);

            Assert.AreEqual(new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day), result.DataSet[0].Time);
            Assert.AreEqual("1.3125", result.DataSet[0].Value);
            Assert.AreEqual("0", result.DataSet[0].Level);

            Assert.AreEqual(new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 1, 0), result.DataSet[1].Time);
            Assert.AreEqual("1.3125", result.DataSet[1].Value);
            Assert.AreEqual("1", result.DataSet[1].Level);

            //Assert.AreEqual(1440, result.DataSet.Count);

            //Assert.AreEqual(8, result.Count);
        }
        public async Task GetIntraDayTimeSeriesStepsAsync_Success()
        {
            DateTime expectedResult = new DateTime(2016, 3, 8, 0, 1, 0);

            string content = SampleDataHelper.GetContent("IntradayActivitiesSteps.json");
            Func <HttpResponseMessage> responseMessage = new Func <HttpResponseMessage>(() =>
            {
                return(new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StringContent(content)
                });
            });

            Action <HttpRequestMessage, CancellationToken> verification = new Action <HttpRequestMessage, CancellationToken>((message, token) =>
            {
                message.Method.Should().Be(HttpMethod.Get);
                message.RequestUri.AbsoluteUri.Should().Be("https://api.fitbit.com/1/user/-/activities/steps/date/2016-03-08/1d.json");
            });

            FitbitClient fitbitClient = Helper.CreateFitbitClient(responseMessage, verification);
            IntradayData response     = await fitbitClient.GetIntraDayTimeSeriesAsync(IntradayResourceType.Steps, new DateTime(2016, 3, 8), new TimeSpan(24, 0, 0));

            response.DataSet[1].Time.Should().Be(expectedResult);
            response.DataSet[1].Value.Should().Be("2");
        }
Example #5
0
        public void Retrieve_Intraday_Calories()
        {
            IntradayData intradayData = client.GetIntraDayTimeSeries(IntradayResourceType.CaloriesOut, new DateTime(2014, 3, 30, 0, 0, 0), new TimeSpan(24, 0, 0));

            Assert.IsNotNull(intradayData);
            Assert.IsTrue(intradayData.DataSet.Count() == 1440);

            //Console.WriteLine("# of devices:" + userDevices.Count);
            //foreach (Device device in userDevices)
            //{
            //    Console.WriteLine("Device:" + device.Id + " - " + device.DeviceVersion + " - " + device.Type + " - Battery:" + device.Battery);
            //}
        }
Example #6
0
        public async Task <IntradayData> GetIntraDayTimeSeriesAsync(IntradayResourceType timeSeriesResourceType, DateTime dayAndStartTime, TimeSpan intraDayTimeSpan)
        {
            string apiCall;

            if (intraDayTimeSpan > new TimeSpan(0, 1, 0) &&                       //the timespan is greater than a minute
                dayAndStartTime.Day == dayAndStartTime.Add(intraDayTimeSpan).Day) //adding the timespan doesn't go in to the next day
            {
                apiCall = string.Format("/1/user/-{0}/date/{1}/1d/time/{2}/{3}.json",
                                        timeSeriesResourceType.GetStringValue(),
                                        dayAndStartTime.ToFitbitFormat(),
                                        dayAndStartTime.ToString("HH:mm"),
                                        dayAndStartTime.Add(intraDayTimeSpan).ToString("HH:mm"));
            }
            else //just get the today data, there was a date specified but the timerange was likely too large or negative
            {
                apiCall = string.Format("/1/user/-{0}/date/{1}/1d.json",
                                        timeSeriesResourceType.GetStringValue(),
                                        dayAndStartTime.ToFitbitFormat());
            }

            apiCall = FitbitClientHelperExtensions.ToFullUrl(apiCall);

            HttpResponseMessage response = await HttpClient.GetAsync(apiCall);

            await HandleResponse(response);

            string responseBody = await response.Content.ReadAsStringAsync();

            if (string.IsNullOrWhiteSpace(responseBody))
            {
                throw new FitbitRequestException(response, null, "The Intraday data response body was null");
            }

            var serializer = new JsonDotNetSerializer {
                RootProperty = timeSeriesResourceType.ToTimeSeriesProperty()
            };

            IntradayData data = null;

            try
            {
                data = serializer.GetIntradayTimeSeriesData(responseBody);
            }
            catch (Exception ex)
            {
                FitbitRequestException fEx = new FitbitRequestException(response, null, "Serialization Error in GetIntradayTimeSeriesData", ex);
                throw fEx;
            }

            return(data);
        }
Example #7
0
        public void Can_Deserialize_IntradayActivitiesCalories()
        {
            string content = File.ReadAllText(SampleData.PathFor("IntradayActivitiesCalories.txt"));

            var deserializer = new RestSharp.Deserializers.XmlDeserializer();

            //var deserializer = new RestSharp.Deserializers.JsonDeserializer();
            deserializer.DateFormat = "HH:mm:ss";
            //TimeSeriesResourceType type = TimeSeriesResourceType.Steps.GetRootElement();

            //deserializer.RootElement = "dataset";
            //deserializer.RootElement = "activities-log-calories-intraday";
            XDocument doc = XDocument.Parse(content);

            var rootElement = doc.Descendants("result").FirstOrDefault().Descendants().Where(t => t.Name.LocalName.Contains("-intraday")).FirstOrDefault();

            //sometimes the API doesn't return that node, for isnstance a date queried before the start of an account
            if (rootElement != null && !string.IsNullOrWhiteSpace(rootElement.Name.LocalName))
            {
                deserializer.RootElement = rootElement.Name.LocalName;
            }

            IntradayData result = deserializer.Deserialize <IntradayData>(new RestResponse()
            {
                Content = content
            });

            //var result = deserializer.Deserialize<dynamic>(new RestResponse() { Content = content });

            Assert.IsNotNull(result);

            Assert.AreEqual(new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day), result.DataSet[0].Time);
            Assert.AreEqual("1.159999966621399", result.DataSet[0].Value);
            Assert.AreEqual("0", result.DataSet[0].Level);
            Assert.AreEqual("10", result.DataSet[0].METs);


            Assert.AreEqual(new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 1, 0), result.DataSet[1].Time);
            Assert.AreEqual("1.159999966621399", result.DataSet[1].Value);
            Assert.AreEqual("2", result.DataSet[1].Level);
            Assert.AreEqual("32", result.DataSet[1].METs);

            //Assert.AreEqual(1440, result.DataSet.Count);

            //Assert.AreEqual(8, result.Count);
        }
        /// <summary>
        /// This requires the Fitbit staff approval of your app before it can be called
        /// </summary>
        /// <returns></returns>
        public string TestIntraDay()
        {
            FitbitClient client = new FitbitClient(ConfigurationManager.AppSettings["FitbitConsumerKey"],
                                                   ConfigurationManager.AppSettings["FitbitConsumerSecret"],
                                                   Session["FitbitAuthToken"].ToString(),
                                                   Session["FitbitAuthTokenSecret"].ToString());

            IntradayData data = client.GetIntraDayTimeSeries(IntradayResourceType.Steps, new DateTime(2012, 5, 28, 11, 0, 0), new TimeSpan(1, 0, 0));

            string result = "";

            foreach (IntradayDataValues intraData in data.DataSet)
            {
                result += intraData.Time.ToShortTimeString() + " - " + intraData.Value + Environment.NewLine;
            }

            return(result);
        }
        public async Task GetIntraDayTimeSeriesCaloriesIntensityMetsAsync_ReturnsNullIfMissingDateTime()
        {
            string content         = SampleDataHelper.GetContent("IntradayActivitiesCaloriesMissingDateTime.json");
            var    responseMessage = new Func <HttpResponseMessage>(() =>
            {
                return(new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StringContent(content)
                });
            });

            var verification = new Action <HttpRequestMessage, CancellationToken>((message, token) =>
            {
                message.Method.Should().Be(HttpMethod.Get);
                message.RequestUri.AbsoluteUri.Should().Be("https://api.fitbit.com/1/user/-/activities/calories/date/2015-03-20/1d.json");
            });

            var          fitbitClient = Helper.CreateFitbitClient(responseMessage, verification);
            IntradayData response     = await fitbitClient.GetIntraDayTimeSeriesAsync(IntradayResourceType.CaloriesOut, new DateTime(2015, 3, 20), new TimeSpan(24, 0, 0));

            response.Should().Be(null);
        }
        internal static IntradayData GetIntradayTimeSeriesData(this JsonDotNetSerializer serializer, string intradayDataJson)
        {
            if (string.IsNullOrWhiteSpace(intradayDataJson))
            {
                throw new ArgumentNullException(nameof(intradayDataJson), "intradayDataJson can not be empty, null or whitespace.");
            }

            var parsedJToken = JToken.Parse(intradayDataJson);

            // need to parse the date first
            JToken date;

            try
            {
                date = parsedJToken.SelectToken(serializer.RootProperty).First["dateTime"];
            }
            catch (NullReferenceException nullReferenceException)
            {
                //We'll nullref here if we're querying a future date - Fitbit omits dateTime in that case.
                //Return null since this error will, in all cases, coincide with an otherwise empty (all zeros) object
                return(null);
            }
            var dataPoints = parsedJToken.SelectTokens(serializer.RootProperty + "-intraday.dataset");

            var result = new IntradayData
            {
                DataSet = (from item in dataPoints.Children()
                           select new IntradayDataValues
                {
                    Time = DateTime.Parse(date + " " + item["time"]),
                    Value = item["value"].ToObject <double>().ToString("R"),    //converting to double is required to keep precision
                    METs = item["mets"] != null ? item["mets"].ToString() : null,
                    Level = item["level"] != null ? item["level"].ToString() : null
                }).ToList()
            };

            return(result);
        }
Example #11
0
        internal static IntradayData GetIntradayTimeSeriesData(this JsonDotNetSerializer serializer, string intradayDataJson)
        {
            if (string.IsNullOrWhiteSpace(intradayDataJson))
            {
                throw new ArgumentNullException("intradayDataJson", "intradayDataJson can not be empty, null or whitespace.");
            }

            var dataPoints = JToken.Parse(intradayDataJson)[serializer.RootProperty + "-intraday"];

            var result = new IntradayData
            {
                DataSet = (from item in dataPoints["dataset"]
                           select new IntradayDataValues
                {
                    Time = DateTime.Parse(item["time"].ToString()),
                    Value = item["value"].ToString(),
                    METs = item["value"].ToString(),
                    Level = item["level"].ToString()
                }).ToList()
            };

            return(result);
        }
Example #12
0
        static void Main(string[] args)
        {
            var clientId             = "22CR42";
            var clientSecret         = "072b825966d4ce4a05b58c4ab84154d5";
            var userId               = "*****@*****.**";
            var token                = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIzUTU5TTkiLCJhdWQiOiIyMkNSNDIiLCJpc3MiOiJGaXRiaXQiLCJ0eXAiOiJhY2Nlc3NfdG9rZW4iLCJzY29wZXMiOiJ3aHIgd251dCB3cHJvIHdzbGUgd3dlaSB3c29jIHdzZXQgd2FjdCB3bG9jIiwiZXhwIjoxNTUwNzk3NzU1LCJpYXQiOjE1MTkyNjE3NTV9.WQsgVrO9Gt1KKgFMIyj75CGOuXXnmr_WlTHnDKP0i3M";
            var fitbitAppCredentials = new FitbitAppCredentials
            {
                ClientId     = clientId,
                ClientSecret = clientSecret
            };

            var oAuth2AccessToken = new OAuth2AccessToken
            {
                UserId    = userId,
                Token     = token,
                ExpiresIn = 31536000,
                TokenType = "Bearer",
                //https://dev.fitbit.com/build/reference/web-api/oauth2/#scope All of these items are displayed to the user when requesting access
                Scope = "profile+activity+settings+social+weight+location+heartrate+sleep+nutrition"
            };


            try
            {
                FitbitClient client = new FitbitClient(fitbitAppCredentials, oAuth2AccessToken);
                var          date   = new DateTime(2018, 2, 10, 5, 30, 0); //changed date
                //what is Activity?  not a variable, but what?

                //Calls method to get the data
                Activity dayActivity = GetDayActivityAsync(client, date).GetAwaiter().GetResult();

                Console.WriteLine("steps on " + date.ToShortDateString() + " " + dayActivity.Summary.Steps.ToString());
                Console.WriteLine("Activity Calories" + " " + dayActivity.Summary.ActivityCalories);
                Console.WriteLine("CaloriesBMR" + " " + dayActivity.Summary.CaloriesBMR);
                Console.WriteLine("CaloriesOut" + " " + dayActivity.Summary.CaloriesOut);
                //Distances is a list
                Console.WriteLine("Distances" + " ");
                foreach (var distance in dayActivity.Summary.Distances)
                {
                    Console.Write(distance.Distance + " ");
                    Console.WriteLine(distance.Activity);
                }
                Console.WriteLine("Elevation" + " " + dayActivity.Summary.Elevation);
                Console.WriteLine("Fairly Active Minutes" + " " + dayActivity.Summary.FairlyActiveMinutes);
                Console.WriteLine("Floors" + " " + dayActivity.Summary.Floors);
                Console.WriteLine("HeartRateZones" + " " + dayActivity.Summary.HeartRateZones);
                Console.WriteLine("LightlyActiveMinutes" + " " + dayActivity.Summary.LightlyActiveMinutes);
                Console.WriteLine("MarginalCalories" + " " + dayActivity.Summary.MarginalCalories);
                Console.WriteLine("RestingHeartRate" + " " + dayActivity.Summary.RestingHeartRate);
                Console.WriteLine("SedentaryMinutes" + " " + dayActivity.Summary.SedentaryMinutes);
                Console.WriteLine("Very Active Minutes" + " " + dayActivity.Summary.VeryActiveMinutes);

                //Calls method to get the intradayData
                IntradayData intradayData = GetIntraDayTimeSeriesAsync(client, date).GetAwaiter().GetResult();

                Console.WriteLine("Intraday Data:");
                using (var sw = new StreamWriter(@"IntraDayData.csv"))
                {
                    var writer = new CsvWriter(sw);
                    foreach (var set in intradayData.DataSet.Where(d => d.Value != "0"))
                    {
                        Console.Write(set.Value + " ");
                        Console.WriteLine(set.Time);
                        writer.WriteField(set.Value);
                        writer.WriteField(set.Time);
                        writer.NextRecord();
                        //want to use CsvHelper to write data to a file
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("error:");
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
            finally
            {
                Console.WriteLine("press any key");
                Console.ReadKey();
            }
        }