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に移しつつあり、それはそれで楽しい