👵

ネットなしの高齢家族をどう守るか 24H監視カメラシステムの自作

2023/09/11に公開

私には90歳の祖母がおり、私が住む家から数百メートルほどの家に一人暮らしをしています。一人暮らしをすることで、ある程度運動や認知機能の維持が期待できるかなと思っていましたが、今年の猛暑から一時体調を崩したあと、祖母には時折衰えが見えるようになりました。

普段の買い物や炊事については2日に一度のヘルパーさんと私の家族でカバーすることができていましたが、困ったのはモノの管理や契約、押し売りなどへの対処です。モノを押し売られた挙げ句、祖母の財布から勝手にお金を引き抜いて帰るといった事象が発生し、対策が必要になりました。

単純に考えれば、Amazon等で監視カメラを仕入れてくるのが一番簡単でしょうが、祖母の家は固定回線が利用できないため、録画まで祖母の家で完結する必要があります。ネットワークを介さずローカルで録画を行うシステムは業務利用を想定しており値段も高価なためすぐに購入できるものではありません。

また、ローカルで完結したい一方で、たまには祖母の様子を伺うためにリモートで確認したいことが今後出てくる可能性があり、難しい状況でした。

そこで、家に余っているPCとHDD、Webカメラを使い監視カメラシステムを自作してみたところ、概ねうまく動作しましたのでこれを紹介したいと思います。市販のネットワークカメラやアプリを利用せず、ネットワーク監視カメラを安価で作成したい方には参考になるかもしれません。

システムの箱詰め

まず初めに、こちらが完成したシステムです。(もう少し丁寧に写真を取るべきでした...。)
適当なツールボックスに穴を開け、ケースとして利用しています。2014年発売のローエンドNUCと8TBのHDDを組み合わせ、通信のためにIIJmioのギガプラン(1GB)が挿入されたモバイルルーターを合わせて利用しています。

Webカメラは2台用意し、より広範囲を確認できるようにしてあります。

また、試用期間の間に排熱の面が心配になったため、後ほど空冷用のファンを増設しました。

NUCと3.5インチHDDを利用しているので、全体的に窮屈かつ体積が大きくなってしまいましたが、これを例えばRaspberry PiとUSBメモリで代替するとより省スペース化できるのではないかと思います。

OSと録画スクリプト

OSにはArch Linuxを選択しました。私が使い慣れていること、2014年のローエンドNUCでスペック的に不安があったことから軽量なLinuxディストリビューションを選択しました。環境や利用するOSによって大きく異なるため、今回の記事ではシステムのインストールに関わることは記載しません。

録画には ffmpeg を利用します。シンプルなBashスクリプトを用いて、失敗の検知と動画の区切りが行えるように工夫します。

#!/bin/bash

send_error_mail() {
  echo "Subject: Camera Recording Failed" | msmtp kznrluk@example.com
  sleep 3600
}

# 例外発生時にメールを送信
trap 'send_error_mail' ERR

while true; do
  TIMESTAMP=$(date +"%Y%m%d/%H%M%S")
  DIR="/mnt/disk0/${TIMESTAMP:0:8}"

  # ディレクトリが存在しない場合は作成
  mkdir -p $DIR

  # video0を録画 (video2を録画するスクリプトも別に書く)
  ffmpeg -f v4l2 -t 3600 -i /dev/video0 -preset ultrafast "$DIR/${TIMESTAMP:9}-cam0.mp4"
done

一時間ごとに録画ファイルを区切り、日別のディレクトリに格納します。特定日時を探しやすくしたり、録画ファイルが破損することを避けることを狙っています。

そして、スクリプトが自動的に起動するようにSystemdを用いて設定します。

# /etc/systemd/system/camera_recording0.service
[Unit]
Description=24 Hour Camera Recording - 0
After=network.target

[Service]
ExecStart=/usr/local/bin/record_camera0.sh
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl enable --now camera_recording0.service
sudo systemctl enable --now camera_recording1.service # デバイス違い

これで、システムの起動時にSystemdによってスクリプトが起動し、FFMPEGが1時間区切りの録画を残し続けてくれます。

インターネット接続とSSH

ローカルでの録画は完結していますが、ディスクストレージの容量の確認やクリーンアップなど、簡単な管理のためにSSHを利用できるようにします。

ホストマシンからインターネットへの接続は、IIJmioのギガプラン(1GB)で行っています。4G回線でもSSH接続を受け付けること自体はできますが、IPアドレスが動的に変更されるため最新のアドレスをどこかに知らせ続ける必要があります。

これを実現する既存の技術としてDDNSやCloudflared等のトンネリングが利用できますが、今回はできる限りシンプルかつ簡単に済ませたかったため、メールでIPアドレスを定期的に送信することにしました。

#!/bin/bash

# IPアドレスとディスク使用状況
ip_info=$(ip ad)
disk_info=$(df -h | grep "/mnt/disk0")

# メール本文を組み立て
email_body="--- IP Information ---\n${ip_info}\n\n--- Disk Usage ---\n${disk_info}\n\n--- Service Status ---\n${service_info}"

# メール送信
echo -e "$email_body" | msmtp kznrluk@example.com

上記のスクリプトを保存し、Systemdに登録します。

# /etc/systemd/system/report-status.service 
[Unit]
Description=Report Status via Email

[Service]
ExecStart=/usr/local/bin/report-status.sh

SystemdのTimer機能を利用し、一時間に一度このスクリプトを起動するようにします。 cron を使わなくていいのは楽ですね。

# /etc/systemd/system/report-status.timer
[Unit]
Description=Run report-status.service

[Timer]
OnCalendar=hourly
OnBootSec=60sec
Persistent=true

[Install]
WantedBy=timers.target

私はこのコマンドで送信されたメールで通知されるIPv6アドレスを利用して接続を行っています。 sshd の構築やルーターでのポート開放については既存のドキュメントを参考にしてください。

ssh kznrluk@2001:0db8:85a3:0000:0000:8a2e:0370:7334

回線の容量に不安がない場合は、下記のような代替手段が利用できるはずです。こちらも合わせて検討してみてください。

  • WireGuard等による常時VPN接続
  • ポート開放 & DDNS
  • Cloudflaredによるトンネリング

リアルタイムでの動画視聴

この段階で録画とインターネットからの接続ができるようになりました。すると一度試してみたくなるのがリアルタイムでの動画視聴です。録画で利用したコマンドを少し工夫することで、ローカルでの視聴が可能になります。

ffmpeg をクライアントマシンにインストール後、下記コマンドを入力すると ffplay で動画が再生されるはずです。

ssh kznrluk@2001:0db8:85a3:0000:0000:8a2e:0370:7334 'sudo ffmpeg -s 427x240 -f video4linux2 -i /dev/video2 -f mpeg1video -b 100k -' | ffplay -

# `/dev/video0: Device or resource busy` 等と表示された場合は他に録画プロセスが動作していないか確認する

SSHとパイプ越しでのffplayのスクリーンショット

夜の撮影なので真っ暗ですが、リアルタイムでカメラを確認することができました。画質を調節することで、利用する帯域を削減することができます。明るさや動きによって違いはありますが、工夫次第で2MB/分程度でもストリーミングを行うことができます。

まとめ

Linuxと簡単なスクリプト、Webカメラを用いて24時間録画を実現するアイディアをまとめました。今回はできる限りローコストで行える方法を取りましたが、組み合わせる技術によっては動体検知を行ったり、来客を検知したりすることができそうです。

既製品を利用する方法が最も簡単で手っ取り早い選択肢ではありますが、今回のようにインターネット環境に制限がある場合や長い間の録画を保持しておきたい場合など、既製品では細かいニーズに対応できない場合があります。そういった場合に自作のシステムは有用に利用できますので、必要なときに思い出していただければと思います。

Discussion