1. Fitbit HR

Fitbit HR 提供了全天候的心率 (heart rate) 数据。HR数据可以反应很多的指标(健康,活动量),甚至是什么时候洗澡或者…。除了HR数据,还有HRV (Heart Rate Variablity)也很常用。这部分好像Fitbit HR还不支持。需要精确度更好的设备。比如 Garmin HR Run.

一般通过fitbit app不能够得到每天的HR数据。估计需要付费成为会员才可以看到这部分。好在fitbit提供了API,可以自己获取。

2. 获取 Fitbit HR 数据

首先去 Fitbit Dev 注册一个app,注意如果你想获取到精确到秒级别心率数据,选择app的类型是 personal, fitbit对这个好像有限制。如前面所说,HR数据能反应太多。。。

注册以后拿到ClientID, Client_Secret然后就是标准的OAuth 2 的应用验证。推荐 node js开源的包 fitbit-oauth2

验证通过获取每天精确到秒级别的心率数据的uri是

https://api.fitbit.com/1/user/-/activities/heart/date/today/1d/1sec.json

3. 显示 Fitbit HR 数据

获得了数据以后,怎么用呢?最简单的办法是plot,可以直观的看。这里推荐 Plotly 应用。免费使用,不过作出的图需要公开。注册,获取一个API_KEY
然后在使用 node js 的 plotly库 plotly-nodej。 Then you are good to go…

简单的画图 nodejs 实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
app.get('/plot/:bday', function(req, res, next) {
bday = req.params.bday;
fs.readFile('./bpm/bpm-' + bday + '.json', 'utf8', function(err, data) {
if (err) throw err; // we'll not consider error handling for now
var profile = JSON.parse(data);
res.send('<pre>' + JSON.stringify(profile[
'activities-heart-intraday'], null, 2) + '</pre>');
// plot here
var x = [];
var y = [];
var plotly = require('plotly')('mouse_potato', 'rmoeisc3m8');
var graphOptions = {
fileopt: "overwrite",
filename: "bpm-" + bday
};
var intradaydata = profile['activities-heart-intraday'];
var dataset = intradaydata['dataset'];
//console.log(dataset.length);
for (var i = 0; i < dataset.length; i++) {
x.push(dataset[i]['time']);
y.push(dataset[i]['value']);
}
var data = [x, y];
plotly.plot(data, graphOptions, function(err, msg) {
console.log(msg);
});
});
});

怎么样,想看看我圣诞节那天的心率么?-:) bpm-2015-12-24

4. One more thing…

怎么偷懒,实现了一个每天夜里2:30AM 把前天的心率数据读取出来,作好图然后发一封链接邮件到我邮箱。
使用 nodemailer 吧。记得如果使用gmail,需要打开 gmail allow less secure apps
Allow less secure apps

代码是这样,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var nodemailer = require('nodemailer');
// create reusable transporter object using the default SMTP transport
// Put your email username and password here
var transporter = nodemailer.createTransport(
'smtps://MYEMAILUSERNAME%40gmail.com:[email protected]'
);
// setup e-mail data with unicode symbols
var mailOptions = {
from: "HR Monitoring <[email protected]>",
subject: "Your yesterday's HR is ready",
text: msg.url,
html: "Please click <a href=" + msg.url + ">plot</a> for the data."
};
// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info) {
if (error) {
return console.log(error);
}
console.log('Message sent: ' + info.response);
});

然后建立一个 cron job, 去执行一个 shell 脚本

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
TODAY=`date +%F`
YESTERDAY=$(date --date yesterday "+%F")
ACCESS_TOKEN=$(cat fb-token.json |jq ".access_token")
echo $ACCESS_TOKEN
sleep 3
curl -H "Authorization: Bearer $ACCESS_TOKEN" http://yourdomain.com/getbpm/$YESTERDAY
sleep 7
curl --ipv4 "http://yourdomain/plot/$YESTERDAY" -v

That’s it!!!