Nokia の体重計で得たデータを Google スプレッドシートに記録するようにした

ダイエットしたい

すべてはここから始まりました。
何故したいかというと...

bobpp.hateblo.jp

前回の山登りサイクリングで山の前にあまりにも無力だったためです。ここは脂肪を落としてすこしでも重力に抗えるようにしようと決意しました。

ここまでやったこと

  • 目標と達成時の、自分へのご褒美を決めた
  • カロリー制限
  • 自転車乗る頻度を上げる
  • ご飯を減らしてプロテイン

まぁなどなど色々やってみていますが、やはり正しく記録することも必要だろうと。

我が家には Nokia (旧 Withings) の体重計があります。
そのため、朝体重を測れば Web で見れます。

だがしかし、Google スプレッドシートにも記帳するようにしたいと考えています。
こうすることで目標値の達成予定日の計算なども出来るし、適当なルールで今日に近いほうが重みの強い加重平均もどきを取ったりできるので、楽しみがいがあります。(なお、目標達成となる達成基準は瞬間的な体重じゃなくて先程あげた加重平均もどきで行うことも決めました)

それ IFTTT で出来るよ

まぁそうなんですよ。IFTTT で体重のデータが増えたらそれをスプレッドシートに載せるなんて造作でもないんです。

なのですが... f:id:BoBpp:20171203233127p:plain

日付のフォーマットがおかしいのですよ!"November 29, 2017 at 09:49AM" このフォーマットをスプレッドシートが日付として理解してくれないのです。
これでは、達成日の予想は難しいですし、データとして使いづらそう。

なので、どこかで日付のフォーマットを変換してあげる必要がありそうです。

IFTTT Webhook を活用しよう

まず考えたのは f:id:BoBpp:20171203235104p:plain

こういうプランです。なんやかんやの部分はなんやかんやあとで考えるのですが、ひとまず

  1. 体重が登録されたら IFTTT 経由でまずなんやかんやの Webhook を呼び出す
  2. なんやかんやの Webhook は "at" なキーに入った日付を strptime して strftime して、Google スプレッドシートが読めそうな日付のフォーマットにする
  3. そして IFTTT の Webhook に送信し、その値を Google スプレッドシートに記帳する

こういう流れです。

Sinatra で書こう

これくらいなら、Sinatra で十分ですよね。すいすいー。
30分くらいで書けました。

ですが、デプロイだ、エラーの監視だ、ああだこうだって考え始めると、この程度のことをやるにしては重厚な準備が必要だなと感じてきました。

そこで Google Cloud Functions

なんか Ruby で書いて、自前のサーバで走らせたりする程度のものではないと判断、いいサービスはないかなと探した結果、 cloud.google.com こちらにたどり着きました。

バイトサイズのビジネス ロジックからアプリケーションを構築すると、コードが実行される時間に対してのみ、最も近い 100 ミリ秒単位で課金されます。インフラストラクチャを一切管理することなく、ゼロから地球規模に至るまでユーザーにサービスを提供できます。

自分用だから、1回/日 だし、余裕で無料範囲内で収まりそう。コレで行きましょう。

ということで書いたよ。

github.com

こういうものを書きました。

{
  "at": "{{MeasuredAt}}",
  "weight": {{WeightKg}},
  "fat": {{FatMassKg}}
}

こういう JSONGoogle Cloud Function に飛ばすようにして上記のコードが処理して、

{
  "value1": 変換した日付,
  "value2": weight と同じ値,
  "value3": fat と同じ値
}

こういうフォーマットの JSON を IFTTT の Webhook に送信し、この値を IFTTT がスプレッドシートに記帳します。

これできっちり記録が出来るダイエット生活が出来るようになりました。結果がちゃんと出るのが待ち遠しいです。