ベッドに寝かせた赤ちゃんを遠隔監視するためのソリューションです。
映像によるリアルタイム配信に加え、部屋の気温・湿度や赤ちゃんが泣いているかどうかを可視化できます。
以下のデーモンプロセスを起動します。
- ビデオストリーム配信用プロセス (FFmpeg)
- ボリュームレベル配信用プロセス (Node.js)
- ビデオストリーム配信障害発生時のリブート要求待ち受け用サーバープロセス (Node.js)
ビデオストリームの配信が停止する障害は原因不明。→カメラデバイスの相性の問題であることが判明。別のカメラに変更したところ解決済み。
配信元マシンから受け取ったビデオストリームをRTMPで配信します。
バックグラウンドでビデオストリーム配信障害監視用のデーモンプロセスを走らせ、配信が停止されると配信元に対しリブート要求を投げます。
サイト表示用の静的コンテンツとHLSによるビデオストリームを提供します。
WebSocketサーバーとして以下の役割を担います。
- (From 配信元マシン) マイクから入力されたボリュームレベルを受信
- 一定時間のボリュームレベルを分析し、赤ちゃんが泣いているかどうかを判定します。
- (To Webブラウザー) ボリュームレベル/気温/湿度を配信
- 気温と湿度はSwitchBotのAPI経由で取得します。
また、SlackのWebhook経由で通知を行います。
- 一定時間赤ちゃんが泣いていることを検知した時
- 気温と湿度が閾値を超えた時
- Raspberry Pi 3 Model B+
- Raspberry Pi OS (32 bit)
- Bash
- systemd
- FFmpeg
- Alsa
- V4L2 (Video for Linux 2)
- Raspberry Pi OS (32 bit)
- Docker
- Nginx
- SwitchBot Meter
- WebSocket
- Node.js
- Slack
本リポジトリーからクローンして実際に動かすまでの手順を示します。
- Raspberry Pi OS (32bit) をインストールします。
- 必要に応じてIPアドレス固定化の設定等を行います。
- USBカメラとUSBマイクを接続します。
- Node.js (16-) と Yarn をインストールします。
- 本リポジトリーを
/usr/local/src/
にクローンします。 - 必要な設定値を埋め込みます。
- /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
- 配信用オーディオソースとは別のデバイスを指定する必要があり、
- /usr/local/src/baby-cam/camera/config/environment/babycam
- インストールスクリプトを実行します。
$ chmod +x /usr/local/src/baby-cam/camera/install.sh $ sudo /usr/local/src/baby-cam/camera/install.sh
- OSを再起動します。
- 各種デーモンが起動していることを確認します。
$ sudo systemctl status babycam $ sudo systemctl status babycam-level-sender $ sudo systemctl status babycam-rebooter
※同一Dockerコンテナー内でRTMPサーバーとWebサーバーを同居させています。
- web をDockerビルドします。
- ビルド引数に
APP_HOST
(アプリケーションサーバーのホスト名) を加えます。
- ビルド引数に
- 環境変数の設定に以下を加えます。
REBOOTER_HOST
(配信元マシン側で待ち受けるビデオストリーム配信障害発生時のリブート要求口)REBOOTER_WARMUP
(リブート要求後の待機時間秒数)REBOOTER_TIMEOUT
(ビデオストリーム配信を強制的にリセットさせるまでの配信停止時間秒数)
- 公開ポートの設定に
80
(HTTP) と1935
(RTMP) を加えます。 - Dockerコンテナーを起動します。
- app をDockerビルドします。
- 環境変数の設定に必要な値を加えます。
- Docker-Composeを使用する場合は .env ファイルを作成します。
- 公開ポートの設定に
3000
(Node.js) を加えます。 - Dockerコンテナーを起動します。
- ICOOON MONO
- このリポジトリーで使用している Favicon の著作権は上記サイトの TopeconHeroes 様に帰属します。