/baby-cam

ラズパイとUSBカメラを用いた自作ベビーカメラ

Primary LanguageVue

ベビーカメラ

Summary

ベッドに寝かせた赤ちゃんを遠隔監視するためのソリューションです。
映像によるリアルタイム配信に加え、部屋の気温・湿度や赤ちゃんが泣いているかどうかを可視化できます。

babycam

Architecture

architecture

(Raspberry Pi) 配信元マシン

以下のデーモンプロセスを起動します。

  • ビデオストリーム配信用プロセス (FFmpeg)
  • ボリュームレベル配信用プロセス (Node.js)
  • ビデオストリーム配信障害発生時のリブート要求待ち受け用サーバープロセス (Node.js)
    • ビデオストリームの配信が停止する障害は原因不明。 →カメラデバイスの相性の問題であることが判明。別のカメラに変更したところ解決済み。

RTMPサーバー

配信元マシンから受け取ったビデオストリームをRTMPで配信します。
バックグラウンドでビデオストリーム配信障害監視用のデーモンプロセスを走らせ、配信が停止されると配信元に対しリブート要求を投げます。

Webサーバー

サイト表示用の静的コンテンツとHLSによるビデオストリームを提供します。

アプリケーションサーバー

WebSocketサーバーとして以下の役割を担います。

  • (From 配信元マシン) マイクから入力されたボリュームレベルを受信
    • 一定時間のボリュームレベルを分析し、赤ちゃんが泣いているかどうかを判定します。
  • (To Webブラウザー) ボリュームレベル/気温/湿度を配信
    • 気温と湿度はSwitchBotのAPI経由で取得します。

また、SlackのWebhook経由で通知を行います。

  • 一定時間赤ちゃんが泣いていることを検知した時
  • 気温と湿度が閾値を超えた時

Dependency

Setup

本リポジトリーからクローンして実際に動かすまでの手順を示します。

(Raspberry Pi) 配信元マシン

  1. Raspberry Pi OS (32bit) をインストールします。
    • 必要に応じてIPアドレス固定化の設定等を行います。
  2. USBカメラとUSBマイクを接続します。
  3. Node.js (16-) と Yarn をインストールします。
  4. 本リポジトリーを /usr/local/src/ にクローンします。
  5. 必要な設定値を埋め込みます。
    • /usr/local/src/baby-cam/camera/config/environment/babycam
      • BABYCAM_AUDIO_SOURCE: 配信用オーディオソース名 (例: hw:2,0)
        • arecord -l コマンドによって確認できます。
      • BABYCAM_VIDEO_SOURCE: 配信用ビデオソース名 (例: /dev/video0)
        • v4l2-ctl --list-devices コマンドによって確認できます。
      • BABYCAM_VIDEO_SIZE: 配信用ビデオ解像度 (例: 640x360)
      • BABYCAM_STREAM_HOST: 配信先RTMPサーバーホスト名
    • /usr/local/src/baby-cam/camera/config/environment/babycam-level-sender
      • WEBSOCKET_HOST: アプリケーションサーバーのWebSocketホスト名 (例: ws://example.com:3000)
      • BABYCRY_AUDIO_SOURCE: 泣き状況判定用のUSBマイクデバイスID
        • 配信用オーディオソースとは別のデバイスを指定する必要があり、 arecord -l コマンドによって得られるIDとは異なります。
        • 以下のコマンドによって確認できます。(予め yarn install を実行しておく必要があります)
          $ cd /usr/local/src/baby-cam/camera/level-sender/src
          $ yarn devices
  6. インストールスクリプトを実行します。
    $ chmod +x /usr/local/src/baby-cam/camera/install.sh
    $ sudo /usr/local/src/baby-cam/camera/install.sh
  7. OSを再起動します。
  8. 各種デーモンが起動していることを確認します。
    $ sudo systemctl status babycam
    $ sudo systemctl status babycam-level-sender
    $ sudo systemctl status babycam-rebooter

RTMPサーバー / Webサーバー

※同一Dockerコンテナー内でRTMPサーバーとWebサーバーを同居させています。

  1. web をDockerビルドします。
    • ビルド引数に APP_HOST (アプリケーションサーバーのホスト名) を加えます。
  2. 環境変数の設定に以下を加えます。
    • REBOOTER_HOST (配信元マシン側で待ち受けるビデオストリーム配信障害発生時のリブート要求口)
    • REBOOTER_WARMUP (リブート要求後の待機時間秒数)
    • REBOOTER_TIMEOUT (ビデオストリーム配信を強制的にリセットさせるまでの配信停止時間秒数)
  3. 公開ポートの設定に 80 (HTTP) と 1935 (RTMP) を加えます。
  4. Dockerコンテナーを起動します。

アプリケーションサーバー

  1. app をDockerビルドします。
  2. 環境変数の設定に必要な値を加えます。
    • Docker-Composeを使用する場合は .env ファイルを作成します。
  3. 公開ポートの設定に 3000 (Node.js) を加えます。
  4. Dockerコンテナーを起動します。

Reference

  • ICOOON MONO
    • このリポジトリーで使用している Favicon の著作権は上記サイトの TopeconHeroes 様に帰属します。

Author

tissueMO