Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have 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のファームウェアアップデートが降ってきて更新をしているので、接続手順が変わったのかもしれません。年が明けて時間ができたら解析しようと思います。

iotlt
IoT縛りの勉強会です。 毎月イベントを実施しているので是非遊びに来てください! 登壇者を中心にQiitaでも情報発信していきます。 https://iotlt.connpass.com
https://iotlt.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away