これはNode-RED Advent Calendar 2017の21日目の記事です。
「Raspberry Pi Zero WでFitbitからリアルタイムにデータを取る」はシェルから実行しましたが、ラズパイにNode-REDを入れて、Node-RED上でFitbitのlivedataを取得する試みです。
ネタがこちらの記事とほぼカブってますが気にしない!!
以下、言い訳。
FitbitはBLEのHeart Rate profileに則っていないので、node-red-contrib-ble-heart-rate
が使えないのです。
言い訳、終わり。
まずは動作の様子をご覧ください。
UIの作成には、node-red-dashboardを使いました。
最初50と表示しているのは、ただ単に最低値を50にしているからだけで、
また心拍数がやたらと高いのは、動画を撮る前に1分ほどスクワットしたからです
node-red-contrib-fitbit-livedata
Node-REDからfitbit-livedataを使えるようにラップした自作Nodeです。ソースはこちら。
作ったNodeは[tracker Node](tracker Node)と[livedata Node](#livedata Node)の二つで、こちらの記事を参考に作りました(ほぼ写経です)。
それぞれ、fitbit-livedataモジュールのメソッド`getTrackers`と`scanTrackers`に相当します。 ちなみに、Nodeの色はFitbitのロゴの色を少し意識しました。 ### tracker NodeFitbit.comのアカウント情報を入力すると、そのアカウントに登録されたFitbitのリストを、デバイス認証情報をつけて出力します。
[
{
"name": "Charge HR",
"auth": {
"btleClientAuthCredentials": {
"authSubKey": "abcdef0123456789abcdef0123456789",
"nonce": 0123456789
},
"type": "XTEA"
},
"serialNumber": "0123456789ab",
"address": "fe:dc:ba:98:76:54"
},
{
"name": "Ionic",
"auth": {
"btleClientAuthCredentials": {
"authSubKey": "0123456789abcdef0123456789abcdef",
"nonce": -987654321
},
"type": "AES"
},
"serialNumber": "abcdef0123456",
"address": "98:76:54:32:10:fe"
}
]
一番欲しいのは、各Fitbitのauth
以下の情報です。これが正しくない場合、次のFitbit
への接続時に失敗します。
ちなみにtrackerというのは、Fitbitデバイスそのもののことです。
livedata Node
[tracker Node](#tracker Node)から出力されたFitbitのリスト(もしくは、そのリストをfunction Node等を使ってフィルタリングしたもの)を入力すると、Node-REDが動作するデバイス(今回はラズパイ)のbluetoothを使って周囲にあるFitbitを探し、connected
/data
/disconnected
の3つのイベントを出力します。data
イベントがFitbitから通知されるlivedataです。
このNodeは複数配置できますが、スキャン/接続に使っているbluetoothデバイス自体は一つしか存在しないので、そこをうまくハンドリングしないといけないのですが、まだその辺りの実装は甘々です(なのでまだnpmでは公開していません)。
動作環境
当然、Node.jsとNode-REDが必要なので、それぞれv9.3.0とv0.17.5を入れました。またUIを簡単に作れるnode-red-dashboardをNode-REDに追加しています。
Flow
最後に上の動画で使ったFlowです。
まだデバッグしながら作っているので、だいぶ無駄が多いですね。。。
Node-REDから使えると、Fitbitから取得したlivedataをリアルタイムに外部に送信して連携しやすくなるので、使い道が広がるかと思い作ってみました。
心拍数をとるだけなら冒頭に紹介したこちらの方が参考になると思いますが、何らかの事情でFitbitを使う場合は、本記事を参考にしていただくか、または、私宛に連絡いただければ相談に乗れるかもしれません。
# こういうネタの方がよかったですかね?