畑の監視システムの構築
今うちには畑(家庭菜園)があり、その監視システムを作成してひと段落ついたので記念にまとめます。
主な機能は以下の通りです。
- ライブストリーミング
- 毎朝の撮影
- 1日の映像をgifにする
モチベーション
- 夏休み自由研究として記録したい
- grpcのストリーミングrpcでいろいろやりたい
- 映像配信周り触ってみたい
構成
全体の構成をざっくりまとめます
物理構成
- カメラ
- 家にあった Elecom のwebカメラ
- カメラ用PC
- 中継用サーバー (Vultr)
- 家のサービスに外から繋ぎたい時用に借りているもの
- メインクラスタ
- k8sクラスタ
- ここに全部乗っけている
ソフトウェア的な構成
ネーミングセンスはおわってる
- farmcamera-server
- 映像配信をするサーバー
- カメラから取得した映像フレームを配信する
- farmcamera-streamer
- 映像中継サーバー
- farmcamera-serverからフレームを受け取り配信する
- farmchat
- 配信画面で利用しているチャット用サーバー
- farm-poster
- k8sのcronjob
- 毎朝の撮影, gif用の3分間隔の撮影, 1日のおわりにgifの生成をする
- blog
- 主にフロントの役割
- https://blog.im-neko.net/farm
今後の展望
現在のライブ配信が multipart/x-mixed-replace
を使っためちゃくちゃ簡易的な配信になっている。
なこれを camera server 側で hls 形式にエンコードしてもう少し扱いやすい形にしたい。
farmcamera-server <-> farmcamera-streamer 間をせっかくなので SRT でやり取りするのも視野にいれたい。
映像配信から離れた部分ではデータがあつまったら土の表面の色合いから水やりタイミングを判定出来るようにするとかしないとかその辺もちょっと検討中になっている。
感想
触りたかった gRPC の Streaming を試せたのでだいたい満足した。
何度か偶々ストリームが詰まったのか一度に大きなサイズのデータが流れてエラーになっていた。
- grpcのデフォルトでメッセージサイズの上限値があった
カメラPCの性能次第だけどいい感じにエンコードしてからやりとり出来るともっといい感じの世界になるかもしれない。
ただ、フレーム単位でのやりとりからtsファイルとかになると gRPC で送受信するにはでかい気もしていて結局この部分でのgRPCを辞めることになるかもしれない。