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); }
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); }
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"); }
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); //} }
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); }
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); }
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); }
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(); } }