Node-REDからFitbitのLiveDataを取得してみる

これは[Node-RED Advent Calendar 2017](https://qiita.com/advent-calendar/2017/nodered)の21日目の記事です。

「[Raspberry Pi Zero WでFitbitからリアルタイムにデータを取る](https://qiita.com/horihiro/items/de8822edc403b97a776d)」はシェルから実行しましたが、ラズパイにNode-REDを入れて、Node-RED上でFitbitのlivedataを取得する試みです。

ネタが[こちらの記事](https://qiita.com/tomo_makes/items/e6d40bfe874aae699b5b)とほぼカブってますが気にしない！！

* * *
以下、言い訳。

FitbitはBLEのHeart Rate profileに則っていないので、`node-red-contrib-ble-heart-rate`が使えないのです。

言い訳、終わり。
* * *

まずは動作の様子をご覧ください。
UIの作成には、node-red-dashboardを使いました。

![node-red-contrib-fitbit-livedata.gif](https://qiita-image-store.s3.amazonaws.com/0/90361/e706b8a3-0b5c-6311-282e-9336211313cd.gif)


最初50と表示しているのは、ただ単に最低値を50にしているからだけで、
また心拍数がやたらと高いのは、動画を撮る前に1分ほどスクワットしたからです:muscle::muscle::muscle:

## node-red-contrib-fitbit-livedata

Node-REDから[fitbit-livedata](https://www.npmjs.com/package/fitbit-livedata)を使えるようにラップした自作Nodeです。ソースは[こちら](https://github.com/horihiro/node-red-contrib-fitbit-livedata)。

作ったNodeは[tracker Node](tracker Node)と[livedata Node](#livedata Node)の二つで、[こちらの記事](https://qiita.com/tamaki/items/f491c74d86684bb95cea)を参考に作りました（ほぼ写経です）。

<img src="https://qiita-image-store.s3.amazonaws.com/0/90361/aa7ce10e-b267-33a7-f8c8-60c57db0213b.png" width="200px">
それぞれ、fitbit-livedataモジュールのメソッド`getTrackers`と`scanTrackers`に相当します。
ちなみに、Nodeの色はFitbitのロゴの色を少し意識しました。
### tracker Node
<img src="https://qiita-image-store.s3.amazonaws.com/0/90361/c1da9496-f6db-8bc9-52c7-d7bd0b8bcf8a.png" width="200px">

Fitbit.comのアカウント情報を入力すると、そのアカウントに登録されたFitbitのリストを、デバイス認証情報をつけて出力します。

```json
[
  {
    "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
<img src="https://qiita-image-store.s3.amazonaws.com/0/90361/67340398-b103-d726-b179-925526297962.png" width="200px">

[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です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/90361/7c039085-50cd-ea2e-1740-e8d80aad7430.png)
まだデバッグしながら作っているので、だいぶ無駄が多いですね。。。


Node-REDから使えると、Fitbitから取得したlivedataをリアルタイムに外部に送信して連携しやすくなるので、使い道が広がるかと思い作ってみました。

心拍数をとるだけなら冒頭に紹介した[こちら](https://qiita.com/tomo_makes/items/e6d40bfe874aae699b5b)の方が参考になると思いますが、何らかの事情でFitbitを使う場合は、本記事を参考にしていただくか、または、私宛に連絡いただければ相談に乗れるかもしれません。

\# [こういうネタ](https://qiita.com/horihiro/items/9104541a0fd44dd24b1f)の方がよかったですかね？