これまでのあらすじ
最近ウェストが気になってきたので、計測結果を Web サイト(Health Planet)に自動アップロードしてくれるタニタの体重計を買ったところ、そのサイトにエクスポート機能がなかった……。で、しぶしぶ Embulk output plugin を書いたら、とりあえず動いたのだった。
今回の内容
体重計(体組成計)の測定結果と一緒に、腹囲の測定結果や、ちょっとしたメモを記録したくなってきました。しかし、Health Planet のほうには自由記入欄のようなものはありません。
色々考えた結果、@kataring さん作の kataring/embulk-output-google_spreadsheets で Google Spreadsheet にデータを入れて、そこに手入力用の列を足すことにしました。これがうまくいったので、今回はその方法をご紹介します。
この記事を書いた時点のバージョン
- Embulk 0.8.1
- GitHub のページ にある指示通りにインストール
- embulk-input-healthplanet 1.0.1 (紹介記事)
embulk gem install embulk-input-healthplanet
- embulk-output-google_spreadsheets 0.2.0
embulk gem install embulk-output-google_spreadsheets
OS X でしか試してませんが、Windows でも多分動くと思います。
事前準備
結構いろいろ用意する必要があります。
- Health Planet API の準備
- Google Drive API の準備
- Google Spreadsheet ファイルの作成
- Google Spreadsheet ファイルのパーミッション設定
Health Planet API の準備
前回の記事(Health Planet からデータをエクスポートするための embulk-input-healthplanet プラグイン)に詳しく書いたので、そちらをご覧ください。以下の情報が揃っていれば OK です。
- Health Planet のログイン ID およびパスワード
- 上記のアカウントで作成した Client ID および Client Secret
Google Drive API の準備
以下の手順で API を準備します。ただ、Google Developer Console の画面デザインはときどき変わるみたいなので、もし以下の手順と違っていたら、同じ機能を探してください。
Drive API の有効化
まず、以下の手順で Drive API を有効化します。Sheets API というものもありますが、embulk-output-google_spreadsheets が使うのはそっちじゃないのでご注意ください。
- Google Developer Console にログインする
- 何か適当な名前のプロジェクトを作る(名前は、例えば healthplanet とかでいい)
- 「Google API を利用する」書かれたリンクなどから API Manager に移動して、Drive API を検索
- Drive API の表示画面で、「API を有効にする」ボタンをクリック
Drive API に接続するための認証情報の作成
次に、以下の手順でサービスアカウント ID と、P12 キーを入手します。
- API Manager のサイドバーから、認証情報の画面へ移動
- 「新しい認証情報」ボタンを押し、「サービスアカウントキー」を選択
- サービスアカウントとして「新しいサービスアカウント」を選択し、アカウント名を記入
- アカウント名はなんでも良い。このアカウント名によってサービスアカウント ID が決まる
- 例えば exporter というアカウント名を入力すると、サービスアカウント ID は exporter@healthplanet-xxxx.iam.gserviceaccount.com のようになる
- キーのタイプとして P12 を選択
- 拡張子 .p12 のファイルのダウンロードが始まるので、好きな場所に保存する
- このファイルは二度とダウンロードできないので、なくしてしまったら認証情報の作成からやり直し
- 秘密鍵のパスワードが表示されるので、メモする(※今回は特に使いません)
Google Spreadsheet ファイルの作成
Health Planet からエクスポートしたデータを追記する先を、Google Spreadsheet に作成します。
ファイルの URL は以下のような形式になります。 {{spreadsheet_id}}
の部分がこの Spreadsheet ファイルの ID です。あとで使うのでメモしてください。
https://docs.google.com/spreadsheets/d/{{spreadsheet_id}}/edit
また、このファイルの1行目に、以下の内容を記載します。タブ区切りで示していますが、実際は11列に分けて書きます。列の名前が少しでも変わるとアップロードできなくなるので、最初はこのまま書いてください。
測定日時 モデル 体重 体脂肪率 筋肉量 筋肉スコア 内臓脂肪レベル2 内臓脂肪レベル1 基礎代謝量 体内年齢 推定骨量
Embulk の filter プラグインでカラム名を変えて、列名をそのカラム名と同じにすれば、上記と違う列名でも登録できます。ただ、この文章の意味がわからない場合はいじらないのが無難です。
Google Spreadsheet ファイルのパーミッション設定
最後に、サービスアカウントがこのファイルにアクセスできるように、パーミッションを設定します。これで、準備は完了です。
- Spreadsheet ファイルの右上に表示されている「共有」ボタンをクリック
- サービスアカウント ID(メールアドレス形式)を入力し、「完了」をクリック
- このとき、権限は「編集可能」のままにしておくこと
設定ファイル
ここまでの準備が完了したら、以下の情報が手元に揃っているはずです。
- Health Planet のログイン ID
- Health Planet のパスワード
- Client ID
- Client Secret
- サービスアカウント ID
- P12 キー
- Spreadsheet ファイルの ID
これらの情報を、以下の Embulk の設定ファイルの、{{ }} で囲まれた場所に記載してください。設定ファイルの名前はなんでもいいですが、この例では embulk-healthplanet.yml とします。
happyturn% cat embulk-healthplanet.yml in: type: healthplanet login_id: {{Health Planet のログイン ID}} password: {{Health Planet のパスワード}} client_id: {{Client ID}} client_secret: {{Client Secret}} lang: ja exec: {} out: type: google_spreadsheets service_account_email: '{{サービスアカウント ID}}' p12_keyfile: '{{P12 キーが置かれた場所のファイルパス}}' spreadsheet_id: '{{Spreadsheet ファイルの ID}}' default_timezone: Asia/Tokyo
エクスポート処理の実行方法
以下のコマンドを実行すると、エクスポート処理が実行されます。
$ embulk run embulk-healthplanet.yml -o embulk-healthplanet.yml
設定に成功していれば、以下の図のように、エクスポートしたデータが Spreadsheet ファイルにポコポコ追加されていきます。
また、コマンドの実行が完了すると、embulk-healthplanet.yml のなかに、最後に取得したデータの計測日時が記録されます。そのため、同じコマンドをもう1回実行すると、新しいデータだけがエクスポートされて、同じファイルの末尾に追加されます。バッチファイルとか作って、1日1回くらいのペースで自動実行させておきましょう。
まとめ
こんな感じで、Embulk を使って、タニタの体重計の測定結果をいろいろいじれる環境が整いました。すでに追加された行については、値をいじったり、他の列にメモなどを追加したりしても大丈夫なので、他のデータ(腹囲とか運動記録とか)と組み合わせて色々遊んでみたいと思います。
参考文献
- PHPからGoogle Spreadsheets APIを使う – K blog
- 「P12 キーって一体どこで作るの……」と悩んでたときに参考にさせていただきました。
- GoogleスプレッドシートのデータをJSONで取得してみた | アライドアーキテクツのクリエイターブログ
- これは Sheet API に関する記事ですが、Google Spreadsheet の URL のルールについて参考にさせて頂きました。
2016-02-02追記:launchd での定期実行
何度か動かして、特に問題無さそうなので、Mac OS Xでlaunchdでcronのように定期実行するメモ - launchd.plistの作成とか(tweeeetyのぶろぐ的めも) と A launchd Tutorial を参考に、launchd で 30 分ごとに定期実行するようにしました。