Posted at
IoTLTDay 21

Raspberry Pi Zero WでFitbitからリアルタイムにデータを取る

More than 1 year has passed since last update.

これはIoTLT Advent Calendar 2017(その1)の21日目の記事です。


Fitbitネタを書きたいなぁと思っていましたが、Fitbit Advent Calendarがなかったので、ラズパイを絡めてIoT感を出してみます。

# Ionic Advent Calendarというのがありますが、Fitbit Ionicとはまるで別物の話でした。


Fitbit

言わずと知れた活動量計で、WebAPIからある程度まとまった形で歩数・カロリー・心拍数などのデータを取得することができますが、実はリアルタイムにデータをとる方法は公式には提供されていません。一方、公式のスマホアプリは、ユーザが身に着けたFitbitからリアルタイムにデータを取得できています。

今回、Fitbitから公式スマホアプリに送られるデータ(内部的にはlivedataと呼ばれる、心拍数や歩数などのデータのこと)を取得できるモジュールを作成し、それをラズパイ上で動作させてみました。細かい処理の流れはこちらにまとめています(随時更新)。


動作の様子

下の動画のような感じ取得できます。

fitbit-livedata.gif

ラズパイからBLEを通してFitbitに接続し、受信したlivedataをコンソールに出力しています。心拍数heartRateと歩数stepsの変化が取れているのがわかるかと思います。


fitbit-livedata

上の動画で使っているfitbit-livedataというコマンドが今回作成したnode.js製のモジュールで、nobleblenoと言う BLEでは定番ライブラリを使ってこちらのシーケンスを実装しています。

https://www.npmjs.com/package/fitbit-livedata

動作確認が取れているFitbitはCharge HRのみです。Ionicは一時期繋がってましたが、いつの間にかつながらなくなりました。他の機種は持っていないので、試せていません。

# 一応、自分以外でも、Charge HRとmacOS(Sierra)の組み合わせでの動作確認が取れています


インストール&使い方


ライブラリとして使うには

ライブラリとして使う(他のjsファイルからimport/requireして使う)場合は、


install-as-library

$ npm i fitbit-livedata


でインストールしてください。サンプルコードはgithubのREADME.mdをご覧ください。


コマンドとして使うには

上の動画のようにコマンドとして使う場合は、


install-as-command

$ npm i -g fitbit-livedata


でインストールするとPATHが通るのでお勧めです。使い方はgithubのREADME.mdをご覧(ry

ライブラリとして入れた場合でも、


execute-as-command

node ./node_modules/fitbit-livedata/dist/bin/cli.js


でコマンドと同様の動作をさせることもできますが、面倒なのでお勧めしません。


使用上の注意


その1

上記シーケンス自体はFitbit社が公開しているものではなく、AndroidアプリのBluetoothログとソースコードから再現したシーケンスの一部なので、Fitbit社がその気になれば(ファームウェアアップデートなど)いつでも動かなくなりますのでご注意ください。

# 実際、Fitbit Ionicは一時期動いていたのですが、今はシーケンスが変わってしまったのか、繋がらなくなりました:innocent:


その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から。


install-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から入れればいいと思います。


install-java

$ sudo apt-get install openjdk-8-jre-headless -y



Bluetooth用パッケージ

nobleblenoを使ってBluetoothにアクセスするので、ここに従って下記コマンドで必要なパッケージを入れます。


install-packages

$ sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev


ついでにsudoなしでbluetoothデバイスにアクセスできるよう、下記コマンドも実行しておきます。


change-permission

$ sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)


参考:https://github.com/sandeepmistry/noble#running-on-linux

最後にfitbit-livedataを入れます。


install-fitbit-livedata

$ npm i -g fitbit-livedata



実行

最初の動画はラズパイのシェルから下記コマンドを実行し、Fitbit Charge HRのlivedataを取得している様子で、この時は、FitbitアカウントとパスワードはそれぞれFITBIT_USERNAMEFITBIT_PASSWORDという環境変数に予め設定しておきました。


execute-as-cli

$ fitbit-livedata -u ${FITBIT_USERNAME} -p ${FITBIT_PASSWORD}


で、これをどう使ってどういうものを作るのかは、まだまだ思案中です。

アイデアください。


以下、余談

上の動画はCharge HRからのlivedata取得の様子なんですが、本当はIonicから取得した動画にするつもりでした。しかし、上記の通り、以前は接続できていたIonic、この記事を書き始めて確認しようと動作させてみたら、livedataが取れなくなっていました。

しかもそれをTwitterでつぶやいたら、うっかり公式アカウントの目に留まってしまいリプライが。


公式アカウント様、Fitbit自体の不具合じゃないんです。大変お騒がせしました:bow:

何度かIonicのファームウェアアップデートが降ってきて更新をしているので、接続手順が変わったのかもしれません。年が明けて時間ができたら解析しようと思います。