はじめに
ベビィ誕生をきっかけに、Raspberry Piでベビィモニター&ミルクタイマーを自作しました。
今は安価で高性能な市販品もあるので「なぜ自作?」と言われそうですが、せっかく完成したので記事にまとめます。
あえて作った理由
- Raspberry Piや関連パーツが余っていた
- 専用アプリを使わず、どのデバイスからでも見られるようにしたかった
- ベビィアプリが多すぎて渋滞するのでなるべく入れない
- PC開きながら右上に常駐させたい
- 古すぎる端末をモニターに再利用
- 楽しそうだったから (ほぼこれ)
開発方針
この時代にゼロから書くのは非効率なので、AIエージェントを活用して「Vibe Coding」しました。
実際に自分で書いたコードは3行程度です(後述)。
- 開発エディタ:Cursor
- 利用モデル:GPT-4o
- Claudeの方が体感的に高精度な印象もありますが、今回はGPT-4oで完結
作業風景A | 作業風景B(雑) |
---|---|
![]() |
![]() |
この記事も骨組みはGPTで、推敲もGPT…
成果物の話
制作(この場合生成?)したコード一式は GitHubで公開しています。
この記事では実装詳細は省略します。
機能の話
- 昼夜対応のカメラ映像配信
- OV5647 IRカメラを利用
- (当時3,500円ほど。今はこの程度でモニターカメラが…)
- IRフィルターは自動でON/OFF
- OV5647 IRカメラを利用
- 10秒ごとのタイムラプス撮影
- 写真 → 動画変換は別端末で実施
- 成長記録として保存しているもの
- 顔認識機能
- MediaPipe利用
- うつぶせ通知は取り止め
- 映像判定では恐ろしいので、
乳児用体動センサ
を利用普通に買った
- 映像判定では恐ろしいので、
- ミルク時刻からの経過時間表示
- 330円で購入したBluetoothスイッチ利用
- ボタンを押すと経過時間が表示。ミルク目安に利用。
- 育児メモ開かなくてもいい。楽。
- 世の中にはうんこボタンなるものもあるみたい
- 室内湿度のモニタリング
- 普段使いしてたSwitchBot温湿度計を利用
本体(Raspberry Pi 4とミルクスイッチ) | カメラ(OV5647) | 上から |
---|---|---|
![]() |
![]() |
![]() |
上記装置に対しては、以下のようにブラウザからアクセスできます。
専用アプリは不要で、ローカル環境内で完結しているため、
自己責任にはなりますが、古いデバイスでも活用できる点が利点です。
昼 | 夜 (現実は真暗) | 10年以上昔の遺物でも |
---|---|---|
![]() |
![]() |
![]() |
自分で調査・修正した箇所
調査1 : 朝起きたらジーニー
タイトル通り、朝になるとベビィが真青になっている事象。
GPTに聞いても「IRカメラフィルターの切り替えがおかしいことが原因」と一貫して説明していました。
原因は、使用していたライブラリごとに色情報の扱い方が異なっていたことでした。
具体的には、OpenCVはBGR形式、PillowはRGB形式で色情報を扱っており、この違いが問題を引き起こしていました。
GPTに提案された修正をいくつか試すうちに、軽く迷宮入りしてしまいましたが、
最終的には直接デバッグを仕込んだところすぐに原因が判明。
以下の1行を追加するだけで解決しました。
frame = cv2.cvtColor(np.array(frame), cv2.COLOR_RGB2BGR)
調査2 : 夜寝るときピンク
最初はとにかく夜ピンクでした。
デフォルト(ピンクすぎ..) | 修正後(フィルタ指定後) |
---|---|
![]() |
![]() |
GPTに相談すると、「IR LEDの出力が強すぎる」といった回答ばかりが続きましたが、問題は解消しませんでした。
そこでpicamera2のGitHub を参照しながら設定を見直したところ、
適切なカラーフィルタファイルを指定すれば解決することが分かりました。
以下のコードを追加することで、色合いが正しく表示されるようになりました。
tuning = Picamera2.load_tuning_file("ov5647_noir.json")
調査3 : スイッチが反応しない
Bluetooth連携したスイッチを用いて、ミルク経過時間を記録する機能を実装していました。
これが検証時は問題なくても時間をおくと反応しなくなる状態。
100均(330円)で買ったスイッチ | デバイス検出状態確認 |
---|---|
![]() |
![]() |
GPTに相談したところ、「電池切れの可能性」「遮蔽物の存在」「距離が離れていないか」といった指摘が繰り返されるばかりでした。
しかし、原因はもっと単純で、時間の経過によってBluetoothのペアリングが切れていただけでした。
押した直後はデバイスリストに表示されますが、しばらくするとリストから消える状態でした。
対策として、デバイス検知とスイッチ押下の監視を常駐サービスとしてループ実行するようにしましたが、
もっとスマートな実装方法もありそうです。
調査4 : service起動時にpythonパッケージが見つからない
venvを使って環境を構成していたのですが、起動時にinstallしたはずのパッケージが見つからないエラーになりました。
GPTはとにかくpip installしてという回答しかなかったので、ササッとパスを追加して対応。
Environment=PYTHONPATH=$PYTHONPATH:/usr/lib/python3/dist-packages
運用中の不備・不調
一見正常に動作しているようでも、一定期間の運用中にいくつか不具合が発生しました。
対策は基本的なもので、内蔵Wi-Fiを使わずLANケーブルを使用する、CPUファンを取り付ける、SDカードのスペックを向上させるなどです。
これらは実装時に特に指摘もなかったため、問題に気付くたび調査・修正を繰り返しました。
聞かれてないから答えてないだけで聞き方の問題ですね。
CPUクーラー + ファン接続後の温度 | カーネルパニック |
---|---|
![]() |
![]() |
モニタリング
アカウント数や転送量に制限はあるものの、Freeアカウントでも十分に実用的だったため、NewRelicを使ってのモニタリングも導入しました。
Summary | CPU温度(nri-flex) |
---|---|
![]() |
![]() |
仕事では当然のように導入していますが、プライベートでも機会があれば試してみると良いと思います。
(人間では処理しきれない情報量でもAIが補ってくれるため、これからの時代において特に重要な仕組みになると感じています。)
感想
公私ともにAIを活用する場面が増えていますが、ここ1年ほどでWebエンジニアの役割は大きく変化したと感じています。
AIへの「問いの立て方」と「入力情報の質」が重要なのは当然ですが、今回のケースでもその大切さを実感しました。
今回はアプリケーション層の情報は入力していた一方で、それ以下のレイヤーについては最低限だったため、
回答が循環したり過不足が出たりする場面もありました。
最近はMCPのような仕組みの提供も活発なので、いずれこのあたりも意識せず扱えるようになるのではと思っています。
そして何より、アウトプットのスピードが異常なほど速くなったと感じています。
「この機能欲しいな」と思ってから、10分以内に実装完了することがほとんどでした。
自分の役割は、構成や仕様の指示、そして微調整の繰り返しに変わりつつあります。
その一方で、面白さ半分・物足りなさ半分という感覚もあります。
(むしろ、予想外のトラブルが発生したときのほうが楽しいと感じることさえあります)
今回紹介した内容以外にも、
「外出先からベビィモニターを確認したい」「タイムラプス動画の保存先を整備したい」といった、
細かな不満にも随時対応していました。
immichを使って自宅にメディアサーバを構築したり、
wireguard を使って外出先から安全にアクセスできるようにしたりもしているので、
これらもいずれ記事にするかもしれません。
作業があまりにスムーズに進むため、これまでなら満足して終わっていた部分が、
余ったエネルギーとして次の活動へとつながっている…。
際限なく機能を追加するGold Plating Rushの時代の到来かもしれない。
Views: 1