はじめに
うちには猫が3匹います。全員よく食べますが、食べ方には少し気をつける必要がありました。
うちの猫たちは早食いなので、一度に多くあげるとすぐ吐いてしまうことがあります。そのため、あえて少ない量を分けてあげるやり方を取っていました。ただ、その運用には難しさがありました。複数の家族がそれぞれのタイミングで餌をあげるので、今日は何回あげたのかを全員で正確に共有する手段がなかったのです。
誰かが先にあげていても、別の誰かが「まだかもしれない」と思ってもう一度あげてしまうことがある。逆に、今日は少なかったのか多かったのかも、あとから記憶をたどるしかない。体重も思いついたときに測るだけだったので、給餌との関係までは見えていませんでした。
そこで作ったのが、給餌棚の開閉を記録し、LINEから給餌履歴や平均、体重を確認できる Cat Feed Tracker です。
今回は、給餌記録を残す仕組みをどう作ったかだけでなく、それを家族で共有し、少しずつ猫たちの健康管理につなげていく形にどう広げていったかを書きます。
背景
最初のきっかけはとても単純で、猫たちに今日何回餌をあげたのかを、家族全員で共有するすべがなかったことです。
声をかけたり、LINEで連絡したりもしていましたが、その場では役に立っても、あとから見返せる記録にはなりませんでした。しかも複数人でばらばらに対応しているので、感覚だけでは全体像がわかりません。今日は多かったのか少なかったのか、最近はどういうペースなのか、といったことが曖昧なままになりやすかったです。
もともと気になっていたのは、単に一回多くあげてしまうことだけではありませんでした。餌のあげ過ぎを防ぎたいこと、そして長期的には猫たちの健康管理も見ていきたいこと。その二つが最初からつながっていました。
給餌の回数が記録され、あとから見返せるようになれば、その日の判断が共有できます。さらに体重も同じ場所に残せるようになれば、給餌と健康の関係も少しずつ見えてきます。今回作りたかったのは、そのための最初の土台でした。
構成をどう分けたか
構成はかなりシンプルです。
給餌棚
└─ リードスイッチ + Pico W
└─ FastAPI
└─ PostgreSQL
└─ LINE
Pico W 側では、給餌棚の扉が開いたことを検知してイベントを送るだけにしています。記録の保存、集計、LINEへの応答、定時通知といったロジックはすべて VPS 側に置きました。
こうした構成にした理由はかなり実務的です。Pico W は検知だけに絞るとシンプルに保てますし、変更が入ったときもサーバー側を直せばよい場面が多くなります。いっぽう VPS 側は、もともと普段使っている環境が整っていたので、今回の機能を追加のアプリのように載せるだけで済みました。
もしデバイス側にもっと多くのロジックを持たせる構成にすると、更新や管理の手間が増えます。今回はそこに重さを持ち込みたくありませんでした。棚で起きたことは棚で拾い、考えるのはサーバー側に寄せる。その役割分担にしています。
なぜリードスイッチか
センサーは最初から給餌棚に置くつもりでした。うちでは、その扉を開けるのは餌を取り出すときだけです。つまり、余計な行動を拾わずに、必要な動作だけを自然に記録できます。
方法としてはカメラや重量センサーも考えられますが、今回はそこまで複雑なものは必要ありませんでした。ほしかったのは、家族の誰がやっても同じように記録される、単純で再現性のある仕組みです。その条件にいちばん合っていたのがリードスイッチでした。
設置についても、今回は比較的素直でした。テレビの近くで電源を取りやすい場所があり、物理的にも薄いマグネットを貼るだけで収まりそうだと最初から見込めていました。扉の見た目や開閉をほとんど損なわずに置けることも、この方式を選んだ理由のひとつです。
LINEをアプリ代わりにしてみる
通知や確認のインターフェースに LINE を使ったのは、家族全員がすでに使っているからです。
専用アプリを作ることもできますが、インストールしてもらい、使い方を説明し、習慣として定着させるにはそれなりの摩擦があります。今回はそこに新しい操作を増やしたくありませんでした。棚を開ければ記録され、確認したいときは LINE を開けば見られる。そのくらいの軽さにしたかったのです。
実際の画面イメージは Demo にまとめています。
LINE のリッチメニューには、今日の記録、平均、設定、体重を置いています。テキストを打たなくても必要な情報に触れられるので、家族全員が同じ入り口を使えます。新しい仕組みを覚えてもらうのではなく、すでにある生活の動線の中にそのまま載せることを意識しました。
今回の設計で大きかったのは、LINE という身近なインターフェイスを置けたことで、単なる通知ではなく、観察のための入り口を日常の中に作れたことでした。
観察から学習へ
このシステムでやりたかったのは、単に給餌履歴を残すことだけではありませんでした。記録を、観察と学習につながる形にしたいと思っていました。
「今日の記録」を見れば、その日に何時に何回あげたかがわかります。「平均」を見れば、最近のペースが以前と比べてどうかを確認できます。 実装上も、「今日の記録」は回数だけでなく前回からの間隔が見える形で返すようにしています。
lines = [" 今日の記録\n"]
prev_time = None
for (received_at,) in rows:
jst_time = received_at + JST
time_str = jst_time.strftime("%H:%M")
if prev_time is None:
lines.append(time_str)
else:
diff = int((received_at - prev_time).total_seconds() / 60)
lines.append(f"{time_str} {_format_duration(diff)}")
prev_time = received_at
lines.append(f"\n本日計{len(rows)}回")
return "\n".join(lines)
単発の出来事だけでなく、少し長い時間軸で猫たちの様子を見られるようにしたかったのです。
そこに体重を加えると、さらに見え方が変わります。体重だけでは増減の理由はわかりませんし、給餌回数だけでもそれが多いのか少ないのか判断しにくいことがあります。ただ、この二つが同じ場所に残っていくと、少しずつ関係を考えられるようになります。
大事なのは、システムが答えを出し切らないことでした。最適な回数を自動で決めるのではなく、その日の回数、最近の平均、体重の変化を見ながら、家族の側で判断できるようにしたかったのです。派手なことをしているわけではありませんが、記録が一か所に集まり、見返しやすくなるだけでも、感覚だけだったものを少しずつ比較できるようになります。今回はそこに価値があると感じています。
実際に使ってみて
まだ長期的な傾向を語れるほどの期間ではありませんが、使い始めてすぐに変わったことはあります。いちばん大きいのは、給餌の判断が家族の中で共有しやすくなったことです。
たとえば、猫がお腹を空かせて鳴いていると、「今日は餌をあげすぎていないかな」「さっきあげたって通知が来ていた気がする」と、その場で LINE を見て確認する会話が自然に出るようになりました。以前なら記憶や声かけに頼るしかなかったところが、同じ記録を見ながら話せるようになったのです。
さらに、「体重は最近どうだったかな」と同じ流れで振り返れるようになったことで、給餌と健康をばらばらではなく、ひとつの流れとして見やすくなってきました。まだ結論を出す段階ではありませんが、記録が散らばらず、家族の中で共有できるだけでもかなり安心感があります。
愛猫のために小さな仕組みを作り、それを LINE で家族みんなが同じように使える形にする。その結果として、日々の給餌だけでなく、彼女たちの健康も少しずつ見えてくるようにしたかったので、いまのところはその入口を作れたと思っています。
おわりに
Cat Feed Tracker は、餌のあげ過ぎを防ぎたいことと、長期的に猫たちの健康管理を見ていきたいことから作り始めたシステムです。
最初は給餌回数を共有するための仕組みとして考えていましたが、作っていく中で、記録をただ残すだけではなく、あとから見返し、少しずつ判断につなげられる形にすることのほうが大事だと感じるようになりました。
そして今回は、LINE という普段使っているインターフェイスを入口にできたことで、その流れをかなり自然な形で作れました。記録が共有されること、観察しやすくなること、そこから少しずつ学べること。その設計を、生活の中に無理なく置けたことが、このシステムではいちばん大きかったと思っています。
技術的な詳細やセットアップ手順は GitHub にまとめています。