これはIoTLT Advent Calendar 2017(その1)の21日目の記事です。
Fitbitネタを書きたいなぁと思っていましたが、Fitbit Advent Calendarがなかったので、ラズパイを絡めてIoT感を出してみます。
# Ionic Advent Calendarというのがありますが、Fitbit Ionicとはまるで別物の話でした。
Fitbit
言わずと知れた活動量計で、WebAPIからある程度まとまった形で歩数・カロリー・心拍数などのデータを取得することができますが、実はリアルタイムにデータをとる方法は公式には提供されていません。一方、公式のスマホアプリは、ユーザが身に着けたFitbitからリアルタイムにデータを取得できています。
今回、Fitbitから公式スマホアプリに送られるデータ(内部的にはlivedataと呼ばれる、心拍数や歩数などのデータのこと)を取得できるモジュールを作成し、それをラズパイ上で動作させてみました。細かい処理の流れはこちらにまとめています(随時更新)。
動作の様子
下の動画のような感じ取得できます。
ラズパイからBLEを通してFitbitに接続し、受信したlivedataをコンソールに出力しています。心拍数heartRate
と歩数steps
の変化が取れているのがわかるかと思います。
fitbit-livedata
上の動画で使っているfitbit-livedata
というコマンドが今回作成したnode.js製のモジュールで、nobleとblenoと言う BLEでは定番ライブラリを使ってこちらのシーケンスを実装しています。
動作確認が取れているFitbitはCharge HRのみです。Ionicは一時期繋がってましたが、いつの間にかつながらなくなりました。他の機種は持っていないので、試せていません。
# 一応、自分以外でも、Charge HRとmacOS(Sierra)の組み合わせでの動作確認が取れています
インストール&使い方
ライブラリとして使うには
ライブラリとして使う(他のjsファイルからimport/requireして使う)場合は、
$ npm i fitbit-livedata
でインストールしてください。サンプルコードはgithubのREADME.mdをご覧ください。
コマンドとして使うには
上の動画のようにコマンドとして使う場合は、
$ npm i -g fitbit-livedata
でインストールするとPATHが通るのでお勧めです。使い方はgithubのREADME.mdをご覧(ry
ライブラリとして入れた場合でも、
node ./node_modules/fitbit-livedata/dist/bin/cli.js
でコマンドと同様の動作をさせることもできますが、面倒なのでお勧めしません。
使用上の注意
その1
上記シーケンス自体はFitbit社が公開しているものではなく、AndroidアプリのBluetoothログとソースコードから再現したシーケンスの一部なので、Fitbit社がその気になれば(ファームウェアアップデートなど)いつでも動かなくなりますのでご注意ください。
# 実際、Fitbit Ionicは一時期動いていたのですが、今はシーケンスが変わってしまったのか、繋がらなくなりました
その2
このモジュールを使ってFitbitと接続した後、公式スマホアプリからの強制ログアウトが頻発します。
アカウントをBANされたわけではないので、慌てず再ログインしてください。
Raspberry PI Zero Wで動かす
一通り宣伝が終わったので、やっとIoT感だします。と言っても上のモジュールをラズパイ上で動かすだけです。
ラズパイの準備
無線LAN&ssh
Raspberry PI Zero Wは無線LANとBluetoothが最初から載っていてお得です。無線とsshd設定は@masciiさんの記事を参考にしました。
node.js
当然、node.jsが必要なのでv9.3.0を入れました。私はnodebrewから。
$ curl -L git.io/nodebrew | perl - setup
$ echo export PATH=\$HOME/.nodebrew/current/bin:\$PATH >> ~/.bashrc
$ source ~/.bashrc
$ nodebrew install-binary v9.3.0
$ nodebrew use v9.3.0
Javaランタイム
あとAndroidのjavaの一部をjavascriptに移植しきれておらず、苦肉の策でjarを同梱して実行いるので、javaも必要です。aptから入れればいいと思います。
$ sudo apt-get install openjdk-8-jre-headless -y
Bluetooth用パッケージ
nobleとblenoを使ってBluetoothにアクセスするので、ここに従って下記コマンドで必要なパッケージを入れます。
$ sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
ついでにsudoなしでbluetoothデバイスにアクセスできるよう、下記コマンドも実行しておきます。
$ sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)
参考:https://github.com/sandeepmistry/noble#running-on-linux
最後にfitbit-livedata
を入れます。
$ npm i -g fitbit-livedata
実行
最初の動画はラズパイのシェルから下記コマンドを実行し、Fitbit Charge HRのlivedataを取得している様子で、この時は、FitbitアカウントとパスワードはそれぞれFITBIT_USERNAME
とFITBIT_PASSWORD
という環境変数に予め設定しておきました。
$ fitbit-livedata -u ${FITBIT_USERNAME} -p ${FITBIT_PASSWORD}
で、これをどう使ってどういうものを作るのかは、まだまだ思案中です。
アイデアください。
以下、余談
上の動画はCharge HRからのlivedata取得の様子なんですが、本当はIonicから取得した動画にするつもりでした。しかし、上記の通り、以前は接続できていたIonic、この記事を書き始めて確認しようと動作させてみたら、livedataが取れなくなっていました。
しかもそれをTwitterでつぶやいたら、うっかり公式アカウントの目に留まってしまいリプライが。
ご連絡ありがとうございます!一度、Ionicの再起動:https://t.co/ekcM1AVt8s により、不具合が改善されるかどうかのお試しをお願いいたします。もし、再起動をお試し頂いても不具合が改善されない場合には、再度お知らせください。どうぞよろしくお願いします!
— Fitbit Japan (@fitbit_jp) 2017年12月18日
公式アカウント様、Fitbit自体の不具合じゃないんです。大変お騒がせしました
何度かIonicのファームウェアアップデートが降ってきて更新をしているので、接続手順が変わったのかもしれません。年が明けて時間ができたら解析しようと思います。