//example using the time series, one per day public ActionResult LastYearWeight() { FitbitClient client = GetFitbitClient(); TimeSeriesDataList weightSeries = client.GetTimeSeries(TimeSeriesResourceType.Weight, DateTime.UtcNow, DateRangePeriod.OneYear); return(View(weightSeries)); }
public ActionResult LastWeekSteps() { FitbitClient client = GetFitbitClient(); TimeSeriesDataList results = client.GetTimeSeries(TimeSeriesResourceType.Steps, DateTime.UtcNow.AddDays(-7), DateTime.UtcNow); return(View(results)); }
private void ValidateDataList(TimeSeriesDataList dataList) { Assert.IsNotNull(dataList); Assert.IsNotNull(dataList.DataList); Assert.AreEqual(8, dataList.DataList.Count); var item = dataList.DataList.First(); dataList.DataList.Remove(item); Assert.AreEqual("1.0", item.Value); Assert.AreEqual(DateTime.Parse("2014-08-12"), item.DateTime); item = dataList.DataList.First(); dataList.DataList.Remove(item); Assert.AreEqual("2.0", item.Value); Assert.AreEqual(DateTime.Parse("2014-08-13"), item.DateTime); item = dataList.DataList.First(); dataList.DataList.Remove(item); Assert.AreEqual("4.0", item.Value); Assert.AreEqual(DateTime.Parse("2014-08-14"), item.DateTime); item = dataList.DataList.First(); dataList.DataList.Remove(item); Assert.AreEqual("8.0", item.Value); Assert.AreEqual(DateTime.Parse("2014-08-15"), item.DateTime); item = dataList.DataList.First(); dataList.DataList.Remove(item); Assert.AreEqual("16.0", item.Value); Assert.AreEqual(DateTime.Parse("2014-08-16"), item.DateTime); item = dataList.DataList.First(); dataList.DataList.Remove(item); Assert.AreEqual("32.0", item.Value); Assert.AreEqual(DateTime.Parse("2014-08-17"), item.DateTime); item = dataList.DataList.First(); dataList.DataList.Remove(item); Assert.AreEqual("64.0", item.Value); Assert.AreEqual(DateTime.Parse("2014-08-18"), item.DateTime); item = dataList.DataList.First(); dataList.DataList.Remove(item); Assert.AreEqual("128.0", item.Value); Assert.AreEqual(DateTime.Parse("2014-08-19"), item.DateTime); Assert.AreEqual(0, dataList.DataList.Count); }
public ActionResult LastWeekActiveScore() { FitbitClient client = new FitbitClient(ConfigurationManager.AppSettings["FitbitConsumerKey"], ConfigurationManager.AppSettings["FitbitConsumerSecret"], Session["FitbitAuthToken"].ToString(), Session["FitbitAuthTokenSecret"].ToString()); TimeSeriesDataList results = client.GetTimeSeries(TimeSeriesResourceType.ActiveScore, DateTime.UtcNow.AddDays(-7), DateTime.UtcNow); return(View(results)); }
public void Can_Deserialize_Activities_Distance() { string content = SampleDataHelper.GetContent("TimeSeries-ActivitiesDistance.json"); JsonDotNetSerializer deserializer = new JsonDotNetSerializer { RootProperty = TimeSeriesResourceType.Distance.ToTimeSeriesProperty() }; TimeSeriesDataList result = deserializer.GetTimeSeriesDataList(content); ValidateDataList(result); }
private void DownloadMetric(TimeSeriesResourceType type, DateTime dateStart) { TimeSeriesDataList fitbitData = null; try { fitbitData = _client.GetTimeSeriesAsync(type, dateStart, DateRangePeriod.OneYear).Result; SaveSeries(type, fitbitData); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); return; } }
private void SaveSeries(TimeSeriesResourceType type, TimeSeriesDataList fitbitData) { var metricType = MetricTypeConversion.FromFitBitType(type); List <Metric> currentlyStoredMetrics = _unitOfWork.CRUDRepository.GetByUserId <Metric>(_userId) .Where(m => m.MetricType == metricType) .ToList(); foreach (Fitbit.Models.TimeSeriesDataList.Data item in fitbitData.DataList) { // no value so ignore if (string.IsNullOrEmpty(item.Value)) { continue; } decimal convertedValue = FitbitConversion.ConvertFitbitValue(type, item.Value); // 0 = no value for the type/date so ignore if (convertedValue == FitbitConversion.InvalidValue) { continue; } // check if we already have a metric for the given date. var existingMetric = currentlyStoredMetrics.Where(m => m.Recorded == item.DateTime).FirstOrDefault(); if (existingMetric == null) { // add metric _unitOfWork.Metrics.AddMetric(Metric.CreateMetric(_userId, metricType, item.DateTime, convertedValue, false)); } else { // don't overwrite any manually entered metrics. if (!existingMetric.IsManual) { existingMetric.Value = convertedValue; _unitOfWork.Metrics.UpdateMetric(existingMetric); } } } _unitOfWork.Complete(); }
/// <summary> /// GetTimeSeriesDataList has to do some custom manipulation with the returned representation /// </summary> /// <param name="serializer"></param> /// <param name="timeSeriesDataJson"></param> /// <returns></returns> internal static TimeSeriesDataList GetTimeSeriesDataList(this JsonDotNetSerializer serializer, string timeSeriesDataJson) { if (string.IsNullOrWhiteSpace(timeSeriesDataJson)) { throw new ArgumentNullException(nameof(timeSeriesDataJson), "timeSeriesDataJson can not be empty, null or whitespace."); } var dataPoints = JToken.Parse(timeSeriesDataJson)[serializer.RootProperty]; var result = new TimeSeriesDataList { DataList = (from item in dataPoints select new TimeSeriesDataList.Data { DateTime = DateTime.Parse(item["dateTime"].ToString()), Value = item["value"].ToString() }).ToList() }; return(result); }
public async Task GetTimeSeriesDataListAsync_DoubleDate_Success() { string content = SampleDataHelper.GetContent("TimeSeries-ActivitiesDistance.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) => { Assert.AreEqual(HttpMethod.Get, message.Method); Assert.AreEqual("https://api.fitbit.com/1/user/-/activities/distance/date/2014-09-07/2014-09-14.json", message.RequestUri.AbsoluteUri); }); FitbitClient fitbitClient = Helper.CreateFitbitClient(responseMessage, verification); TimeSeriesDataList response = await fitbitClient.GetTimeSeriesAsync(TimeSeriesResourceType.Distance, new DateTime(2014, 9, 7), new DateTime(2014, 9, 14)); ValidateDataList(response); }
protected void UploadFitBitData() { try { // Get the fitbit client data FitbitClient client = GetFitbitClient(); // Get the most recent upload date for steps string userId = Session["UserId"].ToString(); var latestSteps = db.Steps.Where(m => m.AspNetUser.Id == userId) .OrderByDescending(m => m.StepDate) .FirstOrDefault(); // Convert lastUpload date to DateTime for comparison DateTime lastUploadDateSteps = (DateTime)latestSteps.StepDate; // Get total days between now and last upload int daysSteps = Convert.ToInt32((DateTime.Now - lastUploadDateSteps).TotalDays); TimeSeriesDataList stepsData = client.GetTimeSeries(TimeSeriesResourceType.Steps, DateTime.Now.AddDays(-daysSteps), DateTime.Now); // Loop through results to total steps since last upload int dayCountSteps = stepsData.DataList.Count - 1; foreach (var d in stepsData.DataList) { int steps = Convert.ToInt32(d.Value); if (Convert.ToDateTime(latestSteps.StepDate).AddDays(-(dayCountSteps--)) == d.DateTime) { Step lastSteps = db.Steps.Where(m => m.AspNetUser.Id == userId && m.StepDate == d.DateTime) .FirstOrDefault(); lastSteps.StepCount = steps; // Change state to modified db.Entry(lastSteps).State = System.Data.Entity.EntityState.Modified; db.SaveChanges(); } else { // Add the record to the database Step step = new Step(); step.StepCount = steps; step.StepDate = d.DateTime; step.UserId = Session["UserId"].ToString(); db.Steps.Add(step); db.SaveChanges(); } } // Get the most recent upload date for distances var latestDistance = db.Distances.Where(m => m.AspNetUser.Id == userId) .OrderByDescending(m => m.DistanceDate) .FirstOrDefault(); // Convert lastUpload date to DateTime for comparison DateTime lastUploadDateDistances = (DateTime)latestDistance.DistanceDate; // Get total days between now and last upload int daysDistances = Convert.ToInt32((DateTime.Now - lastUploadDateDistances).TotalDays); TimeSeriesDataList distanceData = client.GetTimeSeries(TimeSeriesResourceType.Distance, DateTime.Now.AddDays(-daysDistances), DateTime.Now); // Loop through results to total steps since last upload int dayCountDistances = distanceData.DataList.Count - 1; foreach (var d in distanceData.DataList) { decimal distances = Convert.ToDecimal(d.Value); if (Convert.ToDateTime(latestDistance.DistanceDate).AddDays(-(dayCountDistances--)) == d.DateTime) { Distance lastDistances = db.Distances.Where(m => m.AspNetUser.Id == userId && m.DistanceDate == d.DateTime) .FirstOrDefault(); lastDistances.DistanceCount = distances; // Change state to modified db.Entry(lastDistances).State = System.Data.Entity.EntityState.Modified; db.SaveChanges(); } else { // Add the record to the database Distance distance = new Distance(); distance.DistanceCount = distances; distance.DistanceDate = d.DateTime; distance.UserId = Session["UserId"].ToString(); db.Distances.Add(distance); db.SaveChanges(); } } // Get the most recent upload date for minutes var latestMinutes = db.Minutes.Where(m => m.AspNetUser.Id == userId) .OrderByDescending(m => m.MinuteDate) .FirstOrDefault(); // Convert lastUpload date to DateTime for comparison DateTime lastUploadDateMinutes = (DateTime)latestMinutes.MinuteDate; // Get total days between now and last upload int daysMinutes = Convert.ToInt32((DateTime.Now - lastUploadDateMinutes).TotalDays); TimeSeriesDataList lightlyActive = client.GetTimeSeries(TimeSeriesResourceType.MinutesLightlyActive, DateTime.Now.AddDays(-daysMinutes), DateTime.Now); TimeSeriesDataList fairlyActive = client.GetTimeSeries(TimeSeriesResourceType.MinutesFairlyActive, DateTime.Now.AddDays(-daysMinutes), DateTime.Now); // Join the results of both minute datas together so we only have to use one loop to get total minutes var minutesData = lightlyActive.DataList.Zip(fairlyActive.DataList, (lightly, fairly) => new { LightlyActive = lightly, FairlyActive = fairly }).ToList(); // Loop through results to total steps since last upload int dayCountMinutes = minutesData.Count - 1; foreach (var d in minutesData) { decimal minutes = Convert.ToDecimal(d.FairlyActive.Value) + Convert.ToDecimal(d.LightlyActive.Value); if (Convert.ToDateTime(latestMinutes.MinuteDate).AddDays(-(dayCountMinutes--)) == d.FairlyActive.DateTime) { Minute lastMinutes = db.Minutes.Where(m => m.AspNetUser.Id == userId && m.MinuteDate == d.FairlyActive.DateTime) .FirstOrDefault(); lastMinutes.MinuteCount = minutes; // Change state to modified db.Entry(lastMinutes).State = System.Data.Entity.EntityState.Modified; db.SaveChanges(); } else { // Add the record to the database Minute minute = new Minute(); minute.MinuteCount = minutes; minute.MinuteDate = d.FairlyActive.DateTime; minute.UserId = Session["UserId"].ToString(); db.Minutes.Add(minute); db.SaveChanges(); } } lblCRUDMessage.Text = "FitBit Data successfully synchronized."; lblCRUDMessage.CssClass = "text-success"; } catch (DataException dx) { lblCRUDMessage.Text = "Unable to synchronize FitBit Data. To try again, click the 'Synchronize FitBit Data' button. If the error persists, please inform an Administrator."; lblCRUDMessage.CssClass = "text-danger"; LogFile.WriteToFile("FitBitManager.aspx.cs", "UploadFitBitData", dx, User.Identity.Name + " tried to synchronize FitBit Data.", "HPSErrorLog.txt"); } catch (Exception ex) { lblCRUDMessage.Text = "Unable to synchronize FitBit Data. To try again, click the 'Synchronize FitBit Data' button. If the error persists, please inform an Administrator."; lblCRUDMessage.CssClass = "text-danger"; LogFile.WriteToFile("FitBitManager.aspx.cs", "UploadFitBitData", ex, User.Identity.Name + " tried to synchronize FitBit Data.", "HPSErrorLog.txt"); } }
public List <List <string> > GatherFitBitChartData(int dayCount, string type) { // Get the fitbit client data FitbitClient client = GetFitbitClient(); // Store data into a dual list of strings List <List <string> > data = new List <List <string> >(); List <string> values = new List <string>(); List <string> dates = new List <string>(); // Check which type of data to get if (type == "Steps") { var steps = client.GetTimeSeries(TimeSeriesResourceType.Steps, DateTime.Now.AddDays(-dayCount), DateTime.Now).DataList.ToList(); // Loop through data and assign data to its own seperate list foreach (var result in steps) { values.Add(result.Value.ToString()); dates.Add(result.DateTime.ToString()); } // Add lists together and return data.Add(values); data.Add(dates); return(data); } else if (type == "Distance") { var distances = client.GetTimeSeries(TimeSeriesResourceType.Distance, DateTime.Now.AddDays(-dayCount), DateTime.Now).DataList.ToList(); // Loop through data and assign data to its own seperate list foreach (var result in distances) { values.Add(result.Value.ToString()); dates.Add(result.DateTime.ToString()); } // Add lists together and return data.Add(values); data.Add(dates); return(data); } else { TimeSeriesDataList lightlyActive = client.GetTimeSeries(TimeSeriesResourceType.MinutesLightlyActive, DateTime.Now.AddDays(-dayCount), DateTime.Now); TimeSeriesDataList fairlyActive = client.GetTimeSeries(TimeSeriesResourceType.MinutesFairlyActive, DateTime.Now.AddDays(-dayCount), DateTime.Now); var minutes = lightlyActive.DataList.Zip(fairlyActive.DataList, (lightly, fairly) => new { LightlyActive = lightly, FairlyActive = fairly }).ToList(); // Loop through data and assign data to its own seperate list foreach (var result in minutes) { values.Add((Convert.ToDecimal(result.FairlyActive.Value) + Convert.ToDecimal(result.LightlyActive.Value)).ToString()); dates.Add(result.FairlyActive.DateTime.ToString()); } // Add lists together and return data.Add(values); data.Add(dates); return(data); } }