【Raspberry Pi zero 2 W】motion 多重起動問題の対策

【Raspberry Pi zero 2 W】motion多重起動問題解決

結局、 motion が多重起動するのは防げないっぽいので、daemon モードで常駐させて、web_connect で start と pause の指令を motion に送って対応する事にした。

今までは、 motion の起動と終了で動体検知を管理してたけど、常駐した motion に start と pause の指令を送る事で、動体検知ON/OFFを管理するようにした。

MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep “Detection status” | /bin/sed -r ‘s/.*Detection status (.*).*/\1/’`

MOTION_STATUS に ACTIVE か PAUSE が入るので、その状態によって、start か pause かの指令を送る方式。

これで bluetooth ヘッドフォン接続したら、動体検知OFFになればいいけど、暫く様子見。

あと、昼頃に会社から車の rx7pi へ ssh 接続してると通信途絶する事があって、携帯電話のUSBテザリングが終了してる事がある問題がある。

これの対策は bluetooth テザリングとか試してみたけど、リブートしたら自動で再接続しない等問題がある。

あとはWiFiテザリング位しか残された道が無いけど、電力食うのは嫌なんだよなあ。

【Raspberry Pi zero 2 W】motion多重起動問題解決

【Raspberry Pi zero 2 W】motion多重起動問題

結局の所、ロックファイルがあれば起動しない処理だったけど、なぜか起動するという事はファイルが無くなっているという事。

プロセスを終了させて、ファイルを消している処理があるので、そこでプロセスが完全に終了するまで待つ事にした。

元は、kill -TERM `cat ${MOTION_PID}`て処理だったけど、それよりも先にファイル削除になって、PIDがkill に渡らないから生存しつづけて、多重起動になっとったんかなあ。

linux ってファイルを処理に渡したら、削除しても内容は消えずに渡ると思ってたが、あれは通常のファイルシステムの話で、RAM DISK上のファイルは違うのかねえ。

とりあえず、プロセス終了を待ってからファイル削除で多重起動しなくなったから、ま、いっか。

【皇紀2682年11月17日 追記】

今日、会社の帰りに車に乗ったら二重起動が発生。

もう、どこが悪いのか分かんね。

【/皇紀2682年11月17日 追記】

【Raspberry Pi zero 2 W】motion多重起動問題

車載のRaspberry Pi zero 2 W(以下rx7pi) で、bluetoothヘッドフォン接続時に、motion の動体検知録画を止め、切断時に動体検知録画ONになるようにしている。

だが、確認してみると、朝、車に乗る前に、bluetoothヘッドフォン接続したのに、通勤時の動画が一杯記録されてた。

VPN経由でrx7piへログインしてみたところ、

三重起動しとる……。

記録されとるのは、一番最後のプロセスIDなので、多重起動防止を突破しとるようだ。

あと、motion が二重起動してる事があって、何でだろうと考えたが、motion -n &でバックグラウンド起動してるので、process IDを出力する前に、ループで二週目の呼び出しで二重起動になってるんだろう。

という事で、process IDが出力する前に、touch でファイルを作成しておき、二重呼び出しにならないようにした。

情報源: raspberry pi – Yuji Noizumi’s blog

と、対策はしたのだが、なぜに多重起動する!?

9:29 と 9:34 に起動してるが、ドアの開閉でルームランプのLEDライトが点灯した時にLEDのノイズで接続が切れてるのかもしれんな。

しかし、それでも論理的に多重起動するのはあり得んのだが、状況を整理しよう。

  • /etc/default/motion でstart_motion_daemon=noとしてある
  • bluetoothヘッドフォン接続前は、motionのプロセスは1個のみ。
  • rx7piとbluetoothヘッドフォン接続して、車に乗り込んで発進。
  • 駅について、録画ファイルを確認すると、ドアを開けてルームランプが点灯してる動画から始まり、運転中のものが記録されている。

これはやっぱりLEDライト点灯による bluetooth 接続断がくさいが、もしかすると、motion の起動完了にすごく時間が掛かってて、sleep 1 のwaitでは足らないのかもしれない。

という事で、 恐らく、touch したファイルは、リダイレクト指定したら削除されて、ファイルが存在しないから多重呼び出し可能になってしまうのだろう。

そこで、リダイレクトのファイルが作成されるまで待つ処理を入れてみて、様子を見るとしよう。

【Raspberry Pi zero 2 W】スクリプト調整

【Raspberry Pi zero 2 W】gpsドングル追加

会社からVPN使ってRX-7搭載Raspberry Pi zero 2 W(以下ラズパイ)へログインして、状態を確認していた所、GPSからデータが一切流れて来ていない。

alarm_monito.sh をKILLして、スクリプト弄ってたら、通信途絶した。

帰宅してWiFi経由でログインしても、別に異常は無いし、何が原因かよく分からん。

とりあえず、GPSがハングアップした時の為に、timeout を入れるのと、応答を良くする為に、gpspipe のパラメータを弄った。

gpspipe は -n 4 指定で、TPVの行が出て、終了するので、多分、これが一番速い。

GPSがハングアップしてても、1秒でタイムアウトなので、警戒監視スクリプトでデッドロックする事もあるまい。

あと、motion が二重起動してる事があって、何でだろうと考えたが、motion -n &でバックグラウンド起動してるので、process IDを出力する前に、ループで二週目の呼び出しで二重起動になってるんだろう。

という事で、process IDが出力する前に、touch でファイルを作成しておき、二重呼び出しにならないようにした。

それと、GPSハングアップに備えて、GPSのデータ参照してる所は、空白データの時に処理しないFail safeを入れた。

まあ、GPSドングルが壊れてる可能性もあるので、TOPGNSSの11.11セールで売ってたものをポチっておいた。

情報源: Topgnss usb gps glonass受信機アンテナモジュールusb出力プロトコル、互換交換BU353S4|GPS レシーバー & アンテナ| – AliExpress

前に買った奴が結構いいので、再び購入したが、前が1,500円位だったのに、今はセールで2,200円になっとるから、円安は海外通販には痛いのう。

【Raspberry Pi zero 2 W】gpsドングル追加

今の車載Raspberry Pi zero 2 W は、車載警報装置のイヤホンマイクをGPIOに接続して、発報すると、イヤホンマイクスイッチがONになるので、それをトリガにメール&SMS送信するようになっている。

加えて、カメラを追加して、bluetooth ヘッドホンの Open Run Proが接続していないと、motion をスタートさせて、動体検知記録する。

つまり、車に乗って、bluetooth ヘッドホンを接続していれば、動体検知はOFFで、車から離れて、bluetooth接続が切れたら、動体検知ONになるようにしている。

今回やろうとしてるのは、動体検知ONの時に、GPSで現在位置を保存して、定期的に車の移動距離を測定し、車が100m移動してたらメールを飛ばそうというもの。

【rx7pi新スペック】

  • 車載警報装置 発報でガラケーのイヤホンマイクスイッチをONにしてくれるやつで、ラスタバナナのステレオ変換アダプタに接続して、GPIOに配線。
  • LTE回線 donedone ASUS zenfone max pro(m2)に挿して、USBテザリング
  • カメラOV5647
  • USB GPSドングルVK172

※写真貼るのが面倒なので、アフィリエイト利用

とりあえず、USBのGPSドングルが余っていたので、Raspberry Pi zero 2 Wへ接続。

VK172って、2019年に1,090円で買ったけど、円安のせいで値上がりしとるなあ。

gpsd をインストール。

既定の動作の設定

VPN経由で、FoxtrotGPSや、xgps、gpsmonが自端末で見れるようにListenStream=0.0.0.0:2947 にする。

設定ファイルの再読込と、サービスの再起動

ガレージを中心にそこそこの精度。

今回、新規作成した gpsd の出力から、緯度、経度を抜き出すプログラム。巷で出回ってるGPS出力から時間を抜くスクリプトの改造版(笑)

そして、2点の緯度経度から、距離を計算するプログラムだが、これは、次のページのpythonプログラムをシェルスクリプト用に書き直した。

情報源: Python で2点の緯度経度から距離を計測する方法 – GIS奮闘記

ありがとうございます。

distance.sh 緯度1,経度1 緯度2,経度2 で距離(m)を出力する。

元のページは km 単位で、最後に1,000で割ってたけど、わしが欲しいのはメートル単位なので、1,000では割ってない。

ただ、 bc で、平方根使うと、小数点以下20位まで有効になるので、最後に scale=2を指定して、1で割り算して、小数点以下2桁までにしている。

どうせ、GPSの測定誤差が数十メートル単位で出るので、メートルの小数点以下はほぼ無意味だけどね。 🙂

上の2つを新たに組み込んだ車載警報装置モニタプログラムがこちら。

そして、1m以上移動で異常にして、強引にメール送信させてみた。

google maps のURL付きにしたので、クリックすれば、車の位置がすぐ分かるようになっている。座標の方は、すり替えておいたのさ 🙂

【Raspberry Pi zero 2 W】動体検知とbluetooth連携

※商品画像貼るの面倒なので、アフィリエイト使用

結局、Amazonで調達したチルト機能付きカメラはこんな感じに設置した。

証拠というよりは、車に乗り込まれたかどうかを判定する程度。

結局の所、カメラケーブル50cmでは、自由な位置に取り付けができなかったのだ。

で、RX-7搭載のRaspberry Pi zero 2 Wは、わしの携帯電話のbluetoothに接続を試み、接続できた場合は、カメラの動体検知OFFで、運転中のノイズをカット。

駐車場に停めて、車から離れて、bluetooth接続が切れたら、動態検知ONというようにした。

車から離れたら動体検知ONになって欲しいのだが、わしの部屋から車庫までの距離だと、ギリギリbluetooth接続できてしまうので、動体検知がOFFになってしまう。

まあ、家では他に監視カメラがあるので、特に問題は無いけど、ゆくゆくは信号強度見て判断できるようになったらいいなとは思っている。

【機能】

  • 車載警報装置の発報で、GPIO26 が 0になるので、メールとSMSを送信。
  • わしの携帯のbluetoothとの接続が切れたら、カメラの動体検知ON、接続したら、動体検知OFF

車載Raspberry Pi zero 2 W の監視スクリプトも結構な長さになったなあ。

【Raspberry Pi zero 2 W】WiFi接続時のぐだぐだ解決

家に帰って、車のラズパイがWiFiに繋がった時に、WireGuard のネットワークとカチ合ってぐだぐだになる問題があって、dhcpcd の hook で何とかするとかやってたが、もっと簡単な方法があった。

WireGuard の接続設定で、AllowedIPs = 0.0.0.0/0 とやれば良かったのだ。

wg-quick up wg0 を手動でやってみたら、tcp forward ONにしたりしていたが、そうだよ! ルーターモードにしたら、192.168.30.254 から、WireGuard クライアントの 192.168.40.1に接続しても応答できるじゃん。何で気付かなかったんだろう。

ま、困った時には、「てきとーに握ってくれ」やね 🙂

【Raspberry Pi zero 2 W】SMS送信

車載警報装置が発報したら、メールで携帯電話に通知するようにしてあるが、メールだと、携帯電話の省電力機能のせいで、10分位遅れる事もある。

そこで、SMSも送信する事にした。
使うのは、twilio で、1通あたり、$0.08(約11.53円)。

ログインして、コンソールを見ると、チュートリアルで、簡単にSMSが送れるようになっている。

ステップ1で、twilio 番号(米国の電話番号)を取得して、linux で端末開いて、curl でサンプルコードを実行したら、携帯電話にSMSが届いた。

トライアルアカウントで、約2,000円位のお金がチャージされていて、使う事ができるので、これだけでイケるんじゃね? と思ったら、30日以上使用されていない場合に電話番号が削除される可能性があるそうな。

警報発報なんて、年に1回、あるかないかなので、無料で使い続けるのは難しそうで、アップグレード(最低2,000円〜)して正式なアカウントにしたら大丈夫のようだが、良いサービスなので、金払ってもいいな。

そして、RX-7に積んでいる Raspberry Pi zero 2 W のプログラムをSMS送信するように更新。

【Raspberry Pi zero 2 W】WiFi接続したらroute変更

VPNで、192.168.40.0/24 を使っているが、家のどのマシンからもRaspberry Pi zero 2 W(以下ラズパイ)に繋がるように、次の様なルーティングにしている。

しかし、家に帰ると、WiFiが繋がり、192.168.11.0/24 のルーティングが非常にマズい事になってしまうので、削除して、家のWiFiのルーティングを適用したい。

前まで、ネットワークに接続したら、/etc/network/if-up.d とかにスクリプト入れてたら動いていたのだが、Raspberry Pi の buster では、動かなくなっている。

色々探してみたけど、「ifup,ifdownは使えなくなった」という情報しか出てこず、ルーティングを自動変更する手段が分からない。

raspberry pi run script when connected to wifi」でググれカスしてみると、

https://raspberrypi.stackexchange.com/questions/120705/run-script-when-pi-connects-to-any-network

なるものがあり、参考にして、次の /lib/dhcpcd/dhcpcd-hooks/05-changeroute.sh を作成。

家のWiFi 接続時に、192.168.11.0/24 dev wg0 を削除して、wpa_supplicant がネットワークを設定し、WiFi が切れた時は、192.168.11.0/24 dev wg0 を設定するって感じで、うまく動いている。

WiFi に接続したらこんな感じ

しかし、英語情報に当たらないと分からないとは、困ったもんですなあ。 🙁

WireGuard

車に積んでいる Raspberry Pi zero 2 W(以下ラズパイ)にいつでもアクセスしたいと思った。

しかし、 donedone 128kbps で常時接続しているとは言え、接続IPアドレスが133.203.130.90と分かったとしても、こいつは携帯電話会社のファイヤーウォールだから、直接携帯電話へアクセスする事はできない。

そこで、VPNの WIreGuard の出番。
ラズパイ から、家のサーバーに VPN接続すれば、家からならVPN経由で ssh が可能になる。

接続方法は
情報源: 【Ubuntu】WireGuardで簡単VPN環境を構築 | VPS Life

こちらを参考にさせていただいた。感謝。

サーバー側ステータスを見てみると、

RX-7に搭載しているラズパイのクライアント側

これで、外部から車に搭載したRaspberry Pi へ指令が送れるようになった訳だが、電子工作と合わせると、車を始動不能にしたり、クラクションでSOS鳴らしたり、色々、可能性が広がって夢が広がりまくりんぐなわけですよ。 🙂

【皇紀2682年9月26日 追記】

いざ、ラズパイに接続しようとするもできない。

どうやら、ラズパイのUSB省電力機能が効いているのか、ラズパイ側からVPNのサーバーに ping を打たないと、サーバーからはアクセスできないっぽい。

ラズパイの cron で10分毎にVPNサーバーに ping 打つようにしてみるか。

【/皇紀2682年9月26日 追記】