見守り・防犯カメラ自作の一環としてRaspberry Piとステッピングモータ28BYJ-48 5V、ステッピングモータードライバULN2003、Python WebサーバフレームワークFlask、WebSocket、ラズパイGPIOピン操作アプリRPi.GPIO(raspberry-gpio-python)でUSBカメラの遠隔パン調整機能を作ってみた話。
一貫してPython 3系を使えるように、Python 2系依存で開発を終えているWebIOPi+RPi.GPIOならそのままで希望通りな挙動をしてくれるWebiopi with steppermotorのdanjperronさんのプログラム一式(pythonスクリプト+css/javascript込みのhtml)によるRaspberry Pi/WebIOPi/RPI.GPIO/28BYJ-48のプログラムとFlaskとwebsocketを使った簡易的なチャットを開発するのプログラムをミックスさせてもらってFlask+RPi.GPIO版にしてみた次第。
気づけば、ボタンが逆になっている...HTMLをちょこっと編集するだけですけど。
FlaskやPython WSGI HTTPサーバ gunicorn、WebSocketサーバ関連のインストールについては、前述、後者のリンク先の通りで、こんな感じ。
gunicornでwebsocketといえば、gevent-websocketらしく、今やgevent-websocketからの派生gunicorn-websocket(ver 0.03)もあるようですが、初期も初期なのでgevent-websocketを。
script.pyは、こんな感じ。
基本、前掲リンク2件のがっちゃんこでほぼ完成ですが、WebIOPiからFlaskへの移植に伴い、相応に編集しました。
どうやらthreadの時代は過ぎようとしているっぽいですが、元プログラムで使っていたまま、踏襲しました。
コメントアウトの一部は、値の確認などに使えるかと。
camera.jsは、こんな感じ。
WebIOPiからFlaskへの移植に伴い、それなりに編集しました。
オリジナルソースだとid=Current0のinput type=textタグの内容は、美しくもボタン押下ごとにカウントダウン/カウントアップします。
が、そこ端折った、このロジックだとid=Current0のinput type=textタグは、id=Tartget0のそれと同じなので不要ですが残しました。
一部の関数や#ws-status行など使っていない部分、オリジナルにはないHTMLファイルに残したid=return0のinput type=textタグ用DOMなどコメントアウトしつつ、場合によっては使うかなという部分も。
camera.cssは、こんな感じ。
CSSに関しては、外部ファイルとして分離とcamera.js編集に伴い不要となった#response-container部を削除しただけで参照元そのままです。
index.htmlは、こんな感じ。
ほか、中身は少し編集しました。
尚、せっかくなのでCSS読み込みのhref属性値、JavaScript読み込みのsrc属性値は、Flaskが依存するJinjaテンプレートに沿った記述としました。
このままなら、sudo apt install -y ustreamer後、端末からustreamer --host=0.0.0.0 &、python script.py &(python2系と共存ならpython3)し、スマホなど同一ネットワーク上にあるリモートホストのブラウザで192.168.0.22:1234/templatesにアクセスするとカメラ映像と2つのボタンから成る操作パネルが表示されます。
あえてHTMLソース内においたCSS設定でdisplay:blockを有効にすれば、値の確認もできます。
AvahiやBonjourを使える環境なら、mDNSでhostname.localでも良いですが、自身は、mDNSに対応していないAndroidスマホからの操作もする予定なのでIPアドレスを使用、これにあたり、DHCPで振り直されることがないようIPを固定する必要があります。
既存の操作パネルも同様にブラウザ版スマートホームパネル操作のようにPCとAndroidデバイスでは、mDNSとIPを分けて運用しています。
通常のZoneMinder管理画面のカメラ一覧や個別カメラ映像とは別に、カメラパン調整画面も、この操作パネルから、また、Julius/Open JTalkスマートスピーカーからIPカメラの映像を表示同様、音声操作でも表示できるようにする予定です。
赤外線投光器の自作や通話機能はともかく、既に動作確認できているZoneMinderで複数カメラ増設対応、VPNで外からも操作・視聴可。