[2022/02/18]
bullseyeでハマった方は、Raspberry Pi OS/Debian bullseyeにZoneMinderをインストールへ。
手持ちのRaspberry Pi 2 Model BやRaspberry Pi 3 Model B+、OS、OSとしてRaspberry Pi OS(Raspbian) Busterに主に複数台のカメラに対応する防犯カメラを意図している模様も見守りカメラ、ライブカメラなどにも使えそうな市販品にも勝るとも劣らない超高機能と言われるフリーでオープンソースのZoneMinderをインストール、USBカメラ映像を表示させてみた話。
SoftEther/OpenVPN互換プロトコルでVPNするに当たり、サーバとして使っていたRaspberry Pi 2Bでは荷が重く(と思いましたが、topコマンドの使い方を知らなかっただけで、なんとかいけそう)、デスクトップ周辺機器でラズパイパソコン化していたRaspberry Pi 3B+をサーバにしてVPNを使い、GUIを考えるとサブパソコン用途にはちょっと厳しい2Bが余る、さてどうしたものかと思ってる中での試行。
数年前からIoTに興味を持ってArduinoやESP8266/ESP32でいろいろ作っている中、Raspberry Piでは、ESP8266/ESP32の自作ガジェットの操作含む、スマートスピーカーしか作っておらず、ラズパイを使うほどのもので強いているかなと思うものは、見守りカメラ、監視カメラ、ライブカメラくらいかなと薄らぼんやりイメージはしていました。
が、なんちゃらカメラはどうしても必要とまでは思っていないこと、これまで作ったもので半ば、満足してしまっていたことから、IoTやホームオートメーションへのモチベーションもいまいち上がらない日々が続いたのですが、ラズパイが余ったことで徐々にやる気が。
ちょっとタイムラグありすぎだよねと思いつつ、以前使ったことがあるmotionを景気づけに改めて実行してみると印象通りで実用にならず、何かないかなと探している中、2008年の古い記事LinuxでWebカメラを楽しむ5つの方法で、なんと2002年からあったというZoneMinderの存在を知るに至った次第。
ブラウザに表示できてみれば、映像だけに、そこそこリソースは要するものの、motionの後だからか、速い、めちゃめちゃ速い、これは実用的でしょということで、近い内に、なんちゃらカメラを作ろうというところまで気分あげあげ。
無線ドングルを追加することも想定して、できれば、Raspberry Pi 2 Model Bでできればと思っていますが、今回は、成り行きでRaspberry Pi 3 Model B+で試しました(後述しますが、ラズパイ2Bでも試してみたら厳しそうでした)。
インストールについては、初版リリースから時が経っていて仕様や実装変更があるのか、情報によって様々な中、WikiHelpful user contributed resources => Debian => Debian 10 Buster with Zoneminder 1.34.x from ZM Repoを基本に、補完的にInstallation Guide => Debian => Easy Way: Debian Busterを参照しました。
mysql_secure_installationは予想以上に対話する必要がありましたが、良きに計らいました(適当にえいやー!でやりました)。
尚、apt-transport-https gnupgはインストール済み、zoneminderは登録が必要でしたが、rewrite/cgiの2つのApacheモジュールも既に入っているよ状態でした。
また、php.iniのタイムゾーンの設定については、メインウィンドウ起動時、[Options] => [System] => [TIMEZONE]で変更するのもありなようですが、アルファベット順など規則的な並びではないのでphp.iniを編集した方が楽かもしれません。
後になってWikiにSingle Board Computersがあることを知りましたが、結果、Debian用で大丈夫でした。
インストールが完了すると自端末なら[http://localhost/zm]、LAN内の他の端末のブラウザで[http://machine_ip/zm](IPアドレスのほかホスト名.local等でも可)とすることでGetting Startedにあるようなメイン画面が表示されます。
ただし、ZoneMinderの初回起動時は、まず、使用許諾書のようなものが表示されるので、[ACCEPT][DECLINE](辞退)か[ACCEPT](許諾)を選択し、[APPLY]をクリックすることで先のメイン画面が表示されます。
メイン画面からカメラを追加、正常に追加された場合、当該業の[NAME]部などをクリックすると映像が表示されます。
自身は、IPカメラ・ネットワークカメラ、CCTVカメラなどではなく、USBカメラを登録したかったこともあり、zoneminderへUSBウェブカメラを登録する方法を参照させて頂くことで無事カメラを登録でき、映像表示させることができました。
ちなみに使ったUSBカメラは、マイク内蔵、UVC対応で中華製の数百円と超チープなものです。
zoneminderを入れたラズパイに接続してあるUSBカメラなので[General]で[Local]を[Enabled]、[Source]で[Device Path]に[/dev/video0]の他、Defining Monitorsにある機能選択、[v4l2-ctl --list-devices]で得られる情報を登録。
特に自身の場合、カメラ性能の制約からか、解像度は640x480しか選べない模様でしたが、解像度が違うだけでも映像表示できなくなるので要注意です。
None | モニター無効。 表示可能なストリームや生成されるイベントなし。 何も録画されない。 |
Monitor | モニタは、ライブストリーミングのみ可能。 生成されるアラームやイベントがない為、実行されるイメージ解析はない、また、何も録画されない。 |
Modect | MOtion DEteCTtion(動体検知)。 キャプチャ中のイメージは全て解析され、動きが検知された場合にビデオ録画付きでイベントが生成される。 |
Record | モニタは常時録画される。 固定長のイベントは、動きに応じて生成され、これは、よくあるタイムラプスビデオ録画に似ている。 このモードでは、動体検知は実行されない。 |
Mocord | モニタは常時録画される。 イベント内でハイライトされている任意の動き付きで。 |
Nodect | No DEteCTtion(動体検知なし)。 外部トリガーで使われることを想定して設計された特別なモード。 Nodectにおいては、動体検知は実行されないが、要求する外部トリガーがある場合、イベントは記録される。 |
機能というか動作モードは、こんな感じらしい。
いろいろ試した後、今は、Monitorにして何の目的もなく、ただただLIVEストリーミングさせてるだけですが、何か思いついたら改めて。
ちなみに翻訳率は低いながら[OPTION]、[System]、[LANG_DEFAULT]を[ja_jp]に変更することも(なんならファイルを編集して翻訳を自分ですることも)できますが、そのままだと文字化けするので/usr/share/zoneminder/www/lang/ja_jp.phpファイル内の[header("Content-Type: ... charaset=)]行の右辺をShift_JISからUTF-8に変更、ja_jp.phpのファイルエンコーディングをiconvコマンドなどでUTF-8へ置換・上書きしてからの方が吉。
クアッドコア(CPUx4)のRaspberry Pi 3 B+においてtopコマンドで[top] => [1] => [I]とし、使用率/CPUコア数としてみると1コアあたり、47〜69%くらい...、カメラの性能上か、解像度は640x480から変えられず、[Color Mode]を8bitにして39〜62%、24bitでこの中間くらい、極々稀にこの範囲を超えることもあり、そこそこ負荷が高い。
更に[U]として[www-data]ユーザーに絞ると関連プロセスのCPU使用率は限りなくゼロに近く、気にする必要はないにしてもRAM使用率はメインのzmaが15%程度、他は数%ずつながら見えてるだけでもザッと26%で40%超、専用に使って、まずまず、同じくクアッドコアCPU、RAM1GBながら、CPU使用率から見るにRaspberry Pi 2Bだと厳しそうな印象。
あれ?topコマンド実行していてもCPU使用率5〜7%で安定することもありますね...なんだろ、この違い。
ラズパイ3B+を起動、topコマンドを実行したまま、LAN内の他端末から映像を表示させていると映像が落ち、ラズパイを確認するとtop内の数値は動くのですが、キーボードやマウスの入力を受け付けなくなり、操作が一切効かなくなる現象が...。
topコマンドを実行しなければ、フリーズしないのでtopコマンドに起因する可能性もゼロではないものの、topコマンドを併用できないほどリソースがギリギリなのかもしれません。
他方、初めて気づいたのですが、ラズパイを、しばらく放置しているとスリープなのか、モニタ表示も消え、やはり、キーボードやマウスの入力を受け付けず、強制的に電源を落として改めて起動するしかない現象にも遭遇しました。
ネット検索するとラズパイにはありがちな話のようでウォッチドックタイマーもソフトウェアだけでは不十分でハードウェアで対処しているという情報も...。
5年ほど運用しているラズパイ2Bサーバも常時起動ではないので気づきませんでしたが、全モデルそうなのでしょうか?
それとも症状が似ているだけにzoneminder+topコマンドに起因している?
3B+を使った前回、USBカメラは、解像度は640x480のみしか正常に機能しないものの、カラーは3通り全ていけたチープで無名な中華製でした。
一方、今回、試しにラズパイ2BにZoneMinderをインストール、USBカメラにELECOM UCAM-C0220FEWHを使ったところ、[Capture Palette]は、[Auto]で、[Capture Resolution (pixels)]は、[320x240]や[640x480]などでもいけましたが、[Target colorspace]は、[32bit colour]のみ有効、また、なぜか、[v4l2-ctl --list-devices]では認識されつつ、[v4l2-ctl -d /dev/video0 –all]の出力が何も得られませんでした...。
また、ラズパイ2Bには、もしくは、各種サーバとして使っているため、ZoneMinderを加えるには、荷が重いのか、topコマンドを起動しても負荷には表れないものの、モニタ設定パネルで[Save]してもなかなかパネルが消えず、映像が表示されても、すぐに落ち、静止画になってしまったりと、かなり不安定...。
もしかしたら、ラズパイ2BでもZoneMinder専用ならいけるかもしれませんが、少なくとも、この環境では厳しい模様...。
ラズパイ3B+や4B、1から揃えるとなると3B+本体、ケース、ファンやヒートシンク、電源、USBメモリ、USBカメラ、TB級の大容量HDD+HDDケースとなるとラズパイ一式をAliexpressで調達したとして安く見積もってもザッと15000円前後にはなりそう、4BだとRAM容量に応じて1GBあたり1000円前後、更にアップってことになるんですかね。
室内から屋外というのはありにしても屋外用や電源とって別途、光センサ+赤外線LED回路を作る手もあるにしても暗視は考えないとして録画なしの定点カメラとか、見守りカメラ、小さいカメラなど工夫してドアカメラ(これやるならM5CameraやESP32-CAMか)などなら、ライブのみでよいわけでHDDも要らないから10000円未満、数千円でいけそうですね。
USBカメラだと可動範囲は限られるのでカメラ1台分、状況によっては、特定箇所から向きを変えて2〜3台というのもありか...と思ったら、4BならRAM容量によってはいけるのかな?ノートPCならいけましたが、少なくともラズパイ3B+だと、そもそもUSBカメラ2台を機能させるのは無理があるっぽい、1つがラズパイ専用カメラならいけるのか?、何れにせよラズパイ3B+:USBカメラは1:1、追加するならIPカメラですかね。
映像は、ブラウザを使えば、パソコンならWindows、macOS、*BSD/PC-UNIX/Linux、スマホ、タブレットならAndroidやiOSなどOSに関わらず、なんでも見ることができ、VPN越しなら外からとか、他の場所からスマホでも見られるわけで全て自前、ローカルで完結、録画が必要ならHDD容量や使用量や外からモバイルネットワークからのVPNだと通信容量を気にする必要はありますが、何れにせよ、クラウドじゃない自己完結の安心感が得られるならありかな。
クラウドでも日本製で安定したもの、海外製ならクラウドじゃない、クラウドを使わずに済む、パソコンやスマホなど映像確認用端末に制約がないIPカメラ/ネットワークカメラって探すと、あんまりなさそうですし、今尚、1万円以下のラインナップは限られ、1〜2万円超えの方が遥かに品揃え多いっぽいし。
ふと、IP固定しない場合、スマホ(mDNSを素直に使えないAndroid)からVPN越しに(VPN越しだと、これまた、mDNSで素直にアクセスできない中)、どうやってZoneMinder入れた(VPNサーバが載っているものとは別の)ラズパイ見つけよう...と思ったら、なんのことはない、VPNサーバにしてるラズパイにssh接続してnmapやarpを使えば、ベンダーとしてRaspberry Piとか、ノーマル2B(5E:BF:38)、2B v1.2/3B/3B+ならMACアドレス(B8:27:EBで始まる)らしく、これらが表示され、判別できるので良いですね。
なぜか、arp -aしてもどっちのラズパイも出てこないのですが、nmap -sP ネットワークセグメントなら両方とも見つかりました。
VPNがコケた時の対策としては、systemdサービスにRestart=on-failureを入れておけば良さげですし、仮にZoneMinderがコケてたら、見つけたIPでsshしてsystemctl restartすれば良いですしね。
VPN越しにっていうか、映像って短時間でも通信容量食いらしく...いってもせいぜい1分程度だったかと思いますが、420MBほど消費したっぽい。
VPNの使用は、フリーWiFiではなく、場所を選ばないモバイルネットワークからを想定しているのですが、ZoneMinderについては、するにしても録画に留め、基本、VPN越しに映像確認はしない方向にすればよいかな。