前回の記事のとおり、Raspberry Pi + ホール素子 + 磁石でハムスター回転車を検知することまではできた。
そこからどうやってFirestoreに保存するかと考えると結構パターンができたのでメモ。
スマホで書いたので読みづらい。
ハードやデータ的には自転車のサイクルメーターがほぼ一緒なので、参考にしようとしたら、設置場所や稼働時間が異なるため、あまり参考にできなかった。
ざっくり要件
- 長期間常時稼働が必要。寿命を考えるとSDカードへの書き込みはしたくない。
- ネット家のWiFi使う、電源もコンセント。通信量と電気はあまり気にしなくてよい。
- リアルタイム性がほしい。久しぶりに回し始めた時とか検知したい。
1, 一定期間ごとに回転数を送信
ラズパイ側で一定期間回転数を保持して、サーバーに保存していく形式。
5分ごととか1時間ごとにコレクションに追加していくイメージ
/wheellogs/{documentID}
{
datetime: "2019/8/28 12:00",
value: 50
}
ドキュメント数=回転した期間の数
回転数がない時はスキップできるのでレコード数は節約できるかも。
欠点として、ラズパイの処理が落ちた場合、保存するまでの回転数は消える。あと1時間にした場合リアルタイム性は低い。
2, 回転するたびにFunctionsを叩く
ラズパイ側は一回転ごとにURLを叩くだけなのでラズパイ側はシンプルになり、複雑な処理はFunctions側に寄せられる。開発はしやすいかも。
データの持ち方も大きく2種類考えた。
2.1 1リクエスト、1ドキュメントとして追加する
これはシンプルだけどドキュメント数が多くなるので保存と集計コストが高い。
ドキュメントのデータは、タイムスタンプだけで良さそう。
/wheellogs/{documentID}
{ timestamp: タイムスタンプ}
ドキュメント数=回転数となる
2.2 リクエストを受けたら、期間ごとのドキュメントに対してインクリメント
もう一つは、一定期間ごとにドキュメントを用意して数字をインクリメントする形式。これは1と同じデータ形式となり、処理をラズパイからFunctionsに移した感じ。
/wheellogs/{documentID}
{
datetime: "2019/8/28 12:00",
value: 50
}
↑2019/8/28 12:00〜12:59:59だったら同じドキュメントのvalueを増やしていく。
まとめ
どれも費用は一人で使うとしたら大したことなさそうなので度外視できそう。
どれがいいかは、どんなデータやタイミングを、取りたいかが決め手になる。
よくある1日1回のレポートはどの形式でも、問題ないが、平均値やランキングを保持し、変化があったタイミングで通知送るなどをよく考えれられれば、いい設計が出てきそう。
開発やメンテナンス性を考えるとラズパイ側の変更は最小限に済むようにして、機能追加はFirebase側で行えるのが良さそう。
というわけで今のところは最後の2.2が有力。