Health Planetの体組成計データをInfluxDBに投入しGrafanaで見る

タニタの体組成計を使ってる
体組成計で計測した体重等のデータはHealth Planetというアプリで一覧できる
Health PlanetはAPIを公開してくれており、APIを使って過去に計測した体重等を一覧できたりする
今回はHealth Planetの体組成計データをInfluxDBに投入し、Grafanaでダッシュボードを作ってみた

Health Planet APIをつかって体組成計データを取得する

https://github.com/kefi550/go-healthplanet
Goでのクライアントライブラリ的なのを書いた
Health Planet APIでは血圧や歩数とかも取得できるが、とりあえずここでは体重体脂肪率のみに対応

Health Planet APIの仕様書: https://www.healthplanet.jp/apis/api.html
(筋肉量、内臓脂肪レベルなどは2020/6/29で連携を終了したらしい😢)

利用の流れ

  • Health Planet(www.healthplanet.jp)のアカウントが必要。user, passwordが要る
  • https://www.healthplanet.jp/apis_account.do でAPIを利用するアプリケーションを登録し、client_id, client_secretを得る
  • kefi550/go-healthplanetでは↑のuser, password, client_id, client_secretが必要

Health Planetから取得したデータをInfluxDBに投入する

https://github.com/kefi550/healthplanet-to-influxdb
kefi550/go-healthplanetを使ってHealth Planetからデータを取得し、InfluxDBに投入するプログラムを書いた
Docker化し、k8s cronjobで1日1回Health Planet -> InfluxDBへの投入をするようにした

apiVersion: batch/v1
kind: CronJob
metadata:
  name: healthplanet-to-influxdb
  namespace: healthplanet
spec:
  schedule: "0 16 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
            - name: healthplanet-to-influxdb
              image: kefi550/healthplanet-to-influxdb:v0.1.0
              env:
                - name: HEALTHPLANET_CLIENT_ID
                  valueFrom:
                    secretKeyRef:
                      name: healthplanet-to-influxdb
                      key: HEALTHPLANET_CLIENT_ID
                - name: HEALTHPLANET_CLIENT_SECRET
                  valueFrom:
                    secretKeyRef:
                      name: healthplanet-to-influxdb
                      key: HEALTHPLANET_CLIENT_SECRET
                - name: HEALTHPLANET_LOGIN_ID
                  valueFrom:
                    secretKeyRef:
                      name: healthplanet-to-influxdb
                      key: HEALTHPLANET_LOGIN_ID
                - name: HEALTHPLANET_LOGIN_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: healthplanet-to-influxdb
                      key: HEALTHPLANET_LOGIN_PASSWORD
                - name: INFLUXDB_URL
                  value: http://influxdb2.influxdb
                - name: INFLUXDB_TOKEN
                  valueFrom:
                    secretKeyRef:
                      name: healthplanet-to-influxdb
                      key: INFLUXDB_TOKEN
                - name: INFLUXDB_ORG
                  value: influxdata
                - name: INFLUXDB_BUCKET
                  value: healthplanet
                - name: INFLUXDB_MEASUREMENT
                  value: healthplanet
              imagePullPolicy: Always

InfluxDBをデータソースとしてGrafanaでダッシュボードを作る

シンプルだけど体重、体脂肪率をグラフにした
本当は移動平均線も描きたかったけど、やり方が分かってない

グラフのクエリはこんな感じ
(sample queryがいい感じだったのでちょっと変えるだけだった)

from(bucket: "healthplanet")
  |> range(start: v.timeRangeStart, stop:v.timeRangeStop)
  |> filter(fn: (r) =>
    r._measurement == "healthplanet" and
    r.tag == "Weight"
  )

おわりに

  • Grafanaだと簡単にカッコいいグラフが出来上がるので良い
  • Grafanaだと、discord連携とかもやりやすくて良い
    • 定期的なレポートとか、体重が良くなくなってきたときのアラートとかやりたいかも
  • 2020年まではもっと色んなデータをAPIから取得できたらしいので、それが今はできないのが残念
  • 今回cronjobを使いたいがためにk8sを使い始め、おうちの諸々をk8sに移しつつあり、それはそれで楽しい