Skip to content

Commit

Permalink
updated fitbit api to get aggregated data over time, and calculate th…
Browse files Browse the repository at this point in the history
…at avg data over time
  • Loading branch information
danmayer committed Jul 10, 2010
1 parent 3a63b09 commit 58f3ff2
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 1 deletion.
19 changes: 18 additions & 1 deletion README.rdoc
Expand Up @@ -55,13 +55,30 @@ Currently the gem uses screen scraping to get the data, but it will switch over

done

Aggregated Data
ruby bin/ruby-fitbit dan@email.com pass summary 07/07/2010 07/04/2010

getting aggregated data
| 2010-07-04 | {"miles_walked"=>"2.97", "steps"=>"6976", "lightly_active"=>"3hrs 3min", "sedentary_active"=>"18hrs ... |
| 2010-07-05 | {"miles_walked"=>"4.98", "steps"=>"11711", "lightly_active"=>"2hrs 21min", "sedentary_active"=>"2hrs... |
| 2010-07-06 | {"miles_walked"=>"4.68", "steps"=>"10014", "lightly_active"=>"1hr 17min", "sedentary_active"=>"20hrs... |
...
Average Data over that time
+--------------+------------------+
| miles_walked | 4.03857142857143 |
| steps | 8953.85714285714 |
| calories | 2247.71428571429 |
+--------------+------------------+


== TODOs

* get food intake tracked etc
* add ability for gem to write data to fitbit, such as log and food entries
* build everything needed for a nice fitbit IPhone app to use this API.
* build everything needed for a nice fitbit mobile app to use this API.
* better cmd line output
* add data caching, currently it refetches every time. especially dumb when it does it twice for aggragate and avg data
* Support Avgs over all data_point

== Note on Patches/Pull Requests

Expand Down
15 changes: 15 additions & 0 deletions bin/ruby-fitbit
Expand Up @@ -10,6 +10,12 @@ if(ARGV[0]!=nil && ARGV[1]!=nil)
rescue
date = Time.now
end

begin
end_date = Time.parse(ARGV[4])
rescue
end_date = Time.now
end

fitbit.get_data(date)
puts "Fitbit Data for #{date}"
Expand Down Expand Up @@ -41,4 +47,13 @@ if ARGV[2]!=nil
puts Hirb::Helpers::AutoTable.render(data)
end

if ARGV[4]!=nil
puts "getting aggregated data"
data = fitbit.get_aggregated_data(date, end_date)
puts Hirb::Helpers::AutoTable.render(data)
puts "Average Data over that time"
data = fitbit.get_avg_data(date, end_date)
puts Hirb::Helpers::AutoTable.render(data)
end

puts "done"
52 changes: 52 additions & 0 deletions lib/ruby-fitbit.rb
Expand Up @@ -46,6 +46,58 @@ def get_data(date = Time.now)
@lightly_active = page.search("//div[@class='lightly caption']/div[@class='number']").text.strip
@fairly_active = page.search("//div[@class='caption fairly']/div[@class='number']").text.strip
@very_active = page.search("//div[@class='caption very']/div[@class='number']").text.strip
data = {}
data['calories'] = @calories
data['steps'] = @steps
data['miles_walked'] = @miles_walked
data['sedentary_active'] = @sedentary_active
data['lightly_active'] = @lightly_active
data['fairly_active'] = @fairly_active
data['very_active'] = @very_active
data
end

def get_aggregated_data(start_date = Time.now, end_date = Time.now)
data = {}
formatted_date = get_fitbit_date_format(end_date)
data[formatted_date] = get_data(end_date)

date = end_date + (24 * 60 * 60)
while date < start_date
formatted_date = get_fitbit_date_format(date)
data[formatted_date] = get_data(date)
date = date + (24 * 60 * 60)
end

data
end

def get_avg_data(start_date = Time.now, end_date = Time.now)
data = {}
data['calories'] = 0
data['steps'] = 0
data['miles_walked'] = 0
# TODO these aren't numbers but times need to convert all to minutes and then back
#data['sedentary_active'] = 0
#data['lightly_active'] = 0
#data['fairly_active'] = 0
#data['very_active'] = 0
days = 0

days_data = get_aggregated_data(start_date, end_date)
days_data.keys.each do |key|
days += 1
current_data = days_data[key]
data.keys.each do |stat|
data[stat] += current_data[stat].to_f
end
end

data.keys.each do |key|
data[key] = (data[key]/days)
end

data
end

def get_steps_data(date = Time.now)
Expand Down

0 comments on commit 58f3ff2

Please sign in to comment.