この記事はなに?
以下の育児支援ダッシュボードの構築ポストに触発され、自分もダッシュボートを作ってみました。
我が家の最終形態こんな
— Dr.10(どく・とぉと読んでください) (@Dr10_TakeHiro) 2023年10月2日
日中妻が試す→不満・希望を夕方俺に伝達→夜俺が治すみたいなサイクルを2週間回した後の図 pic.twitter.com/PHYRx7m1MS
現時点で、自分が作ったダッシュボードは以下のようになっています。
この記事では、上記の育児支援ダッシュボードを支える技術について解説します。
構成・実装
ダッシュボードには大きく分けて以下の3つの項目を載せています。
- 育児記録:「ぴよログ」から取得
- 室内の温湿度:SwitchBotから取得
- 現在の天気:OpenWeatherMap APIから取得
以下の図は、上記の情報の取得および連携の流れを表します。
それぞれの情報の取得および連携の実装を詳しく説明していきます。
育児記録
育児記録は育児記録アプリ ぴよログからエクスポートしたデータを取得しています。
ぴよログは赤ちゃんがいつ排泄したか・ミルクをいつどれくらい与えたかなど、育児に関する情報を記録できます。
また、複数の端末から同一の育児記録を操作できるため、夫婦の携帯にそれぞれぴよログをインストールしておくことで、育児記録を簡単に共有できます。
さらに、ぴよログは育児記録をテキストデータとしてエクスポートできます。今回はGoogle Drive上に育児記録をエクスポートします。
以下はエクスポート結果の例です。
ぴよログ-2023/10/24 <名前> <年齢> 01:15 おしっこ 01:20 ミルク 100ml 04:30 ミルク 80ml 04:45 おしっこ 05:25 おしっこ ...
エクスポートは各自の携帯で手動で行うこともできますが、ダッシュボードにリアルタイムに情報を漏れなく掲出したいことを考えると、手作業は除外できると良さそうです。
今回は、家に転がっていたNexus 7 (2013) をぴよログエクスポート専用端末としてセットアップし、自宅サーバーからAndroid Debug Bridge (ADB) を介して端末を自動操作するようにしました。*1
def tap(x, y): subprocess.call([ADB_PATH, "shell", "input", "tap", x, y]) # ぴよログの起動 subprocess.call( [ADB_PATH, "shell", "am", "start", "-n", "jp.co.sakabou.piyolog/.InitialActivity"] ) time.sleep(10) # "メニュー"をタップ tap("800", "1850") time.sleep(5) ...
Nexus 7 (2013) は10年前のタブレットなので、さすがに動作がもっさりしてしまいますね。。スリープを適宜挟まないと処理が追いつかなくなってしまうことがありました。
室内の温湿度
室内の温湿度は、SwitchBotのスマートリモコンハブ2を赤ちゃん部屋に設置し、SwitchBotAPIから取得しています。
ハブ2はスマートリモコンとしての機能だけでなく、温度・湿度の計測も可能です。
SwitchBotが公式に提供しているアプリからスマートリモコンの操作・温湿度の確認ができますが、アプリだけでなくAPIも提供されています。
注意として、SwitchBot APIは1日に10,000回までしか叩くことができません。 デバイスの数にも依りますが、リクエスト間隔は適宜調整する必要があります。 後述しますが、現状は5分に1回の間隔で室内の温湿度を取得しています。
現在の天気
現在の天気はOpenWeatherMapが提供するCurrent weather data APIから取得しています。
現在天気だけでなく天気予報も取得できるようです。 これから乳児を連れてお散歩にでかけられるようになったら、追加でダッシュボードに天気予報を掲出し、お散歩のタイミングを伺うのも良いかもしれませんね。
ダッシュボード
ダッシュボードの構築には Grafana Cloudを利用しました。 Grafana Cloudはマネージド型のGrafanaサービスで、いくつか制約はありますが、無料プランも提供されています。 今回構築する育児支援ダッシュボードには、これで十分な機能が揃っているため、Grafana Cloudを採用しました。
Grafanaは、Prometheusをはじめとする多くのデータソースと連携できますが、今回はMySQLをデータソースとして採用しました。 具体的には、育児記録・室内の温湿度・現在の天気情報をMySQLデータベースに格納しておき、GrafanaからSQLを実行してこれらの情報を取得する方針としています。
取得情報のデータベースへの格納
育児記録・室内の温湿度・天気情報の取得方法について説明しましたが、これらの情報を定期的にMySQLデータベースに格納する必要があります。
初めに、MySQLデータベースを準備する必要がありますが、今回は PlanetScaleというマネージドMySQLサービスを利用しました。
PlanetScaleは以下の無料プランを提供しており、育児支援ダッシュボードの構築には十分な内容です。
- 5GB storage
- 1B row reads/ month
- 10M row writes/ month
育児記録(テキストデータ)、SwitchBot API、OpenWeatherMap APIから情報を取得しMySQLデータベースに格納する処理はPythonで実装しました。 そして、そのコードはGCPのCloud Functionsで実行させています。
Cloud Functionsを定期的にトリガーするために、Cloud Schedulerを利用してスケジューリングを行なっています。 現在のスケジュール間隔は以下の通りです。
- 育児記録:5分毎(ぴよログのエクスポートも5分毎に実行)
- 室内の温湿度:5分毎(リアルタイムに近い情報取得を目指しているが、SwitchBot APIの制限も考慮する)
- 現在の天気:30分毎(天気の変化はそれほど頻繁ではない)
Google Driveでは、Google Drive APIを利用して、Drive上の変更をトリガーとして特定のURL(Webhook URL)にリクエストを送ることができます。
なので、Cloud Functionsを5分毎に実行するのではなく、Google Drive上に育児記録がエクスポートされたタイミングをトリガーにする方法も可能なはずです。 ただ、以下の理由から、Cloud Schedulerを使った方法を採用しています。
- 認証付きでCloud Functionsを実行する場合、Webhook URLにCloud Functions URLを指定しても、認証が通らないため実行できない。
- Cloud Functionsを未認証で実行可能に設定すると、URLが漏洩した際にリクエストされまくってクラウド破産するリスクがある(心配しすぎかもだが)。
- 認証を挟んだ上で実行する場合、API Gatewayなどの利用が考えられますが、労力が…
ダッシュボードに何を掲出すべきか?
絶賛育児進行中なので、必要に応じて情報を追加していく予定です。
情報の追加基準としては、赤ちゃんが泣いたとき(アラート時)に即座に参照でき、次の育児イベントの準備ができるような情報をファーストビューに配置しておくことが重要です。
- 室内が暑いか寒いか、エアコンの調整や窓を開けるなどの対応が必要か。
- 前回の排泄から時間が経って、お腹が張っていないか。
- 前回のミルクから時間が経って、お腹が空いていないか。
- 次回のミルクは何時ごろか、それまでの間に家事をするか、休息を取るか。
まあ、ダッシュボードを見て全て解決することはなく、抱っこしてグズりなども度々あるわけですが、、
まとめ
育児支援ダッシュボードを支える技術について解説してきました。
特にぴよログにはダッシュボード関係なく大変助かっています、ありがとうございますmm
ところで、誤解の無いように言っておきますが、ダッシュボードの構築が手段の目的化になっていることをある程度認めます。
だって、作ってるとき楽しかったし、、
参考
*1:なおNexus7 (2013) はOSのversionが古すぎて、そのままの状態ではぴよログをインストールできません。自分はLineageOS 20を焼き直しました。