ぴよログデータをGrafanaで可視化しよう!
はじめに
作成者について
- 作成者は職業プログラマ
- そこまでイケてないプログラムを日々書いています
- 24年9月末に息子誕生
- 記載時点では5ヶ月弱
リソースについて
本記事で使っているコードは以下のリポジトリで公開しています。
パース処理のスクリプトについては使いまわしていただけると思います。
- 本記事と同じようにGoogleドライブを利用する場合、OAuth2認証のキーが必要です。
- 初回のOAuth2認証を行うため、Pythonの動作環境が必要です。
- 動作環境でのDockerのインストールが必要です。
実行方法についてはリポジトリのreadmeをご参照ください。
育児データは可視化したい
育児中の皆様であれば、育児する際にもデータを日々蓄積し、また共有されていることかと思います。
データが時系列に蓄積されているということは...
そうですね。可視化したいですよね。
ということで、思い立って即実行したのが本成果物になります。
お金は子どもに使っていてありませんので、
- DBはセルフホストしてケチる
- ダッシュボードはOSSのものを使ってセルフホストしてケチる
- データ共有はGoogleドライブとAndroid実機でがんばってケチる
とひたすらケチ構成となっています。
DBなどはクラウドサービスを使うと楽だと思います。
各々お好きな構成にしていただければと思います。
ぴよログについて
ところで、育児の情報を夫婦間で共有されていない方はぜひとも行ってください。
夫婦不和の遠因となります。
我々が使っているのは普通に大人気の「ぴよログ」です。
使っている人間としては、以下のポイントがうれしいです。
- 入力が簡単
- (iOS)ウィジェットでロック画面やホーム画面に表示できていつでも確認可能
- 片方が仕事中、もしくは睡眠中の動きが確認可能
- とくに夜泣きのある期間で、もう一方に対応内容を残せるのが最強に強いです
- Apple Watchのコンプリケーション対応が地味にうれしい
- 画像付きで日々の日記が残せるのがうれしい
- 広告表示のみで無料利用が可能
ウィジェット パッと見てこの3種類の情報が見えているのはありがたいです
アプリ画面 レコードを登録していくようなイメージです
プログラマ的うれしいポイントとしては以下の通りです。
- iOS/Androidを問わず、複数デバイスでの同時ログインが可能
- データはサーバーに保管されており、素早い同期がかかる
- PDF/テキストファイルでのエクスポートが可能
ただし、テキストファイルは決してプログラマフレンドリーではありません。(後述)
育児メトリック可視化大作戦
今回は以下の構成でデータの可視化を行いました。
構成
全体概要
内容 | 技術 | Docker |
---|---|---|
データの自動エクスポート | Automate(Androidアプリ) | X |
データの自動エクスポート先 | Googleドライブ | X |
データの取得・パース | Python | O |
データの永続化 | MySQL | O |
データの可視化 | Grafana | O |
Docker Compose
リポジトリに配置しているdocker-compose.yaml
の内容は以下の通りです。
サービス名 | 内容 |
---|---|
retriever | Googleドライブからデータを取得するPythonスクリプト |
db | データを永続化するMySQL |
grafana | Grafanaインスタンス |
立ちはだかる壁
ぴよログアプリからデータをエクスポートする際に、以下の2点で問題があります。
- テキストファイルのパースが必要なこと
- 定期的にデータエクスポートを行う手段がないこと
テキストファイルのパースが必要
エクスポートできる「テキストファイル」はCSVなどではなく、人間フレンドリーな形式です。
そのため、DBに放り込むためにはパース処理が必要です。
今回はPythonでパーサーを実装し、テキストファイルからDBに登録できるようにしました。
エクスポートされるテキストファイルはこんな感じです。
めんどくさ~...
余談ですが、データはAndroidとiOSでデリミタや一部書式が微妙に異なります。
実装しようと思う方は注意してくださいね。
定期的にデータエクスポートを行う手段がない
ぴよログはAPIなどでのデータ取得の手段がありません。
正規の方法では、スマホアプリから手動でエクスポートする必要があります。
が、そんなことを毎日毎日毎日毎日やってられませんよね。
子ども育てるのが本業なので。
そのため、今回はAndroid端末にマクロアプリを導入して1分ごとに自動でGoogleドライブにアップロードするようにしました。
マクロアプリは「Automate」を利用しました。
(「MacroDroid」も試しましたが、こっちのほうが今回は使いやすかったです)
また、1分ごとにデータ取得してDBに投入するサービス(retriever
)でプログラムをループさせておきます。
そうすることでDBが最新の状態を維持できるようにしています。
データ取得プログラムについて
Googleドライブの指定フォルダの内容を取得し、ファイルがあればパース・投入して削除するプログラムです。
リポジトリではmain.py
にあたり、retriever
サービスで呼ばれます。
雑に1分でループしています。
また、ドライブ内のファイルを削除を行うためにOAuth2認証が必要です。
しかし、コンテナイメージではブラウザが存在しないために認証エラーとなります。
そのため、初回だけは開発環境で認証し、token.json
に認証情報を書き出しています。
コンテナ内ではトークンのリフレッシュ処理のみ行います。
そして可視化へ...
上記対応により、
- 1分ごとにぴよログからデータをエクスポート
- DBには最新のぴよログデータが投入されている
- Grafanaから上記DBへアクセスできる
という状態になりました。
あとは、Grafanaでダッシュボードを作って遊ぶだけです!
とりあえずこんなダッシュボードを作りました。
- 前回ミルクからの経過時間
- 前回おむつ交換からの経過時間
- 睡眠時間・ミルク量の変動
- ぴよログ入力内容
などなど...
データがあればなんでもできる!
気持ち良すぎます
まとめ・余談
一般的にメトリックを可視化するとやる気が出ると思います。
みなさんも是非、お試しください。
全体の技術スタックとしてはそこまで複雑ではないと思われます。
私は終わってるテキストファイル形式と、初めてのGrafanaに翻弄されてしまいました。
休日と、仕事のサボりを兼ねてだいたい5人日くらいの開発となっています。
Discussion