【Raspberry Pi Zero 2 W】Rasbian GNU/Linux 10 → 11 へ更新

RX7に車載している raspberry pi zero2 W(以下rx7pi)だが、通信にUSB接続の携帯電話を使っている。

携帯電話のセキュリティ上、必ずロック画面を解除してからでないとUSB接続してくれないので、時折ふと忘れる事があって、車載警報が鳴ったとしてもメール通知できない状態の時がある(笑)

そこで、通信カードに変えようと思った。

EM7430通信カード

これなら、rx7pi 電源投入時に自動で通信を確立できるはず。

ところが、dhcpcd で通信カードを使った設定例が探しても無い。

そこで、NetworkManager のモバイルブロードバンドで設定しようと、rx7piに NetworkManager をインストールしてみた所、dhcpcd とバッティングしてるのか、wi-fi接続毎にIPアドレスが変わって大層やりにくい。

ネットには、raspi-config で、dhcpcd か NetworkManagerのどちらを使うのか切り替えられるという記述を見たが、10 の buster のraspi-config にはそんな項目は無い。

とりあえず、NetworkManager の設定の為に、GUIを復活させてみたが、起動途上の画面は見えても最終的に GUIでも CUIでも「HDMI信号なし」となる。

つまり、rx7piにキーボードとマウスとモニタ繋いで操作ができず、ネットワーク接続できなくなったら、一切何もできなくなるから、迂闊に dhcpcdをアンインストールできない。

これは詰んだな。

後で気付いたが、raspi-config でGUI bootかCUI bootか選べるようになっていて、素人が知ってるLinuxの知識で、

とかやっちゃうと、多分、raspberry pi の設定と食い違いが出て不具合が出るのだろう。

という訳で、raspberry pi OS 11 の最新版を入れる事にする。 🙁

まずは、万が一の為に sdカードのバックアップ

32GBだから長いんだこれが 🙁

そしてバックアップが取れたら、今使ってる Ubuntu にSDカードを焼く環境を作る。

To install on Raspberry Pi OS, type
sudo apt install rpi-imager
in a Terminal window.

情報源: Raspberry Pi OS – Raspberry Pi

とあるので、その通りにする。

SD カード32GBをバックアップしてる間に、Raspberry Pi OS with desktopのイメージをダウンロードしていたので、次の様にして解凍して、OSのタブでカスタムイメージで設定。

しかし、OSのタブ見たら、ダウンロードも自動でしてくれるみたいで、別にダウンロードしなくても良かったが、その分、時間は節約できたから、まあヨシ。

ギアのボタン押したら、SDカードに焼く前に中身をカスタマイズできるようになっていて、今まで業者から買った時に付いてくるSDカードをそのまま使用していたから知らんかった。

pi ユーザー作らないし、結構便利だな。 🙂

焼き上がったので、早速 rx7pi にセットして起動……。
GUIで起動したけど、やたら重いなと思ったら、こいつメモリ500MBしか無かったんだった orz

お、あるね。という事で、NetworkManager を有効化して、デスクトップのWi-Fiアイコンを右クリックして、モバイルブロードバンドを設定……。

うーん、Ubuntu とかだと、「日本」とか選択できるんだが、選択肢が空だし、APN記入してても設定ファイルに記録されないし、完成度が低いぞ?

通信カードテストの為、Windows11 仮想マシンで色々やったが、donedone は接続できても、povo2.0 のSIMは「圏外」となって接続できない。

同じ KDDIの MVNOなのに、povo はダメってのがよく分からんが、楽天モバイルでも、古い携帯電話で使えないってのがあったし、EM7430って結構古いから、ダメなのかもしれんね。

という訳で、通信カード計画は断念 🙁

あと、 CUI起動にして、NetworkManager は、Wi-Fi の設定ファイルで、permissions=user:noizumi;: とかになってると、わしがログインするまでネットワーク接続されないので、permissions= と空にしてやった。

カメラはソケットが壊れたので、motion は入れてないけど、車が移動したら通知する為に、gpsd はインストール。ver.3.22 だったので、野良ビルドしなくて済んだ。 🙂

あと、メール飛ばすのに exim4 入れて、

「スマートホストでメール送信: ローカルメールなし」で設定。

設定した内容は次のファイルに記録される。

そして passwd.client にプロバイダのサーバーの認証情報を記述。

VPNの wireguard は、家のサーバーとのみ接続してたけど、家帰ってきて、家のLANに繋がると、VPNが応答しなくなるので、Kagoya VPSのサーバーをメインとして、家のサーバーと rx7pi はクライアントにした。

これでも、同じ家のLANに接続してるクライアント同士は通信できないのだが、少なくとも、Kagoya VPS経由でやり取り可能だから、一切rx7piと接続できない自体は減るはず。

いやあ、夏季休暇を満喫してるなあ 🙂

【Kagoya VPS】Ubuntu 20.04 LTS → 22.04 LTSへアップグレード

Kagoya VPSで、OSのテンプレートにUbuntu 22.04LTSが追加されているので、新しくインスタンスを起こして、セットアップする事も考えたが、新しいインスタンスだと、IPアドレス変わるだろうし、面倒臭いので、OSアップグレードにした。

sshで入って、次のコマンドを実行。

$ sudo do-release-upgrade

大体、30分も掛からずに\(^o^)/オワタ

しかし、postfix が cron-apt インストール時のおまけでインストールされていた為、アップグレード時に削除されてしまったので、再インストール

【作業記録】cron-aptインストール、postfix設定

これを参考にした。

irc.noizumi.org → プロバイダのメールサーバー でメール投げるので、例によって、サテライトシステム。

まあ、これはそのままで。

リレーホストはプロバイダのサーバーとポートを指定。

普通に、irc.noizumi.org でメールサーバー運用してもいいけど、他のサーバーの運営の経験上、ポート25番や587番を開けておくと、パスワード破りが頻繁にやってくるようになるので、外部からのメールを一切受け付けないって方式の方が楽。

sshにしても、VPN接続してない場合は、publicキー認証だけ有効にしているので、パスワード破りはできないようになっているが、それでも接続してくる奴が多い。

fail2ban で頻繁に認証失敗する奴を ban するようにしたら、1時間に1〜2回に減ったが、それまでは1分に1回とか、それはもうウザい数の接続が来ていた。

・postfixの設定編集

Xサーバーのホスト名だけど、TLS認証する場合、SSL証明書のホスト名じゃないとエラーになるので、noizumi.org では無く、sv13449.xserver.jp という正式名称を指定する。

プロバイダのメールアカウントの認証を通す為に末尾に設定を追加。

・中間証明書の取得

TLS接続に中間証明書が無いとエラーになる事があるので、例によって、goddadyから頂いて /etc/postfix/cert ディレクトリに設置する。

・パスワード認証ファイルの用意

postmap を実行すると、/etc/postfix/smtp_sasl_password.db ができる。

・postfixの再起動

・テストメール送信

ちゃんと届いた。

・TLS用SSL証明書指定

別に外部からメール投げる訳でも無いので、この設定は要らんのだけど、irc.noizumi.org はSSLの証明書を取ってるので、指定だけはしておく。

今の所、ircサーバーも、softether-vpnserver も fail2ban も問題なく動いているようである。

Kagoya VPSは、1 Core、 1GBメモリ、25GB SSDで、550円/月だけど、IRCとVPN動かすなら、これで充分なスペックだな。

NTT docomoから抜ける為に、mopera U からびわこインターネットへ鞍替えしようと考えているが、IPv6が使えるクロスパスの場合、ユーザーに割り当てられるのがグローバルIPじゃないので、外から家のマシンに直接繋げない。

SoftEther で Kagoya VPSに仮想HUBを接続してるので、クロスパスにした場合でも、Kagoya VPSの仮想HUBに繋いだら、家のマシンへプライベートアドレスで繋げるようになるから、契約しといて良かったな 🙂

【Raspberry Pi Zero 2 W】gpsd-3.24入れた。

GPS補足状況を確認しようと思ったので、取り敢えず、2ウインドウ表示して比較。

右がRaspberry Pi Zero 2 W(以下rx7pi)のGPSで、左が、ホームサーバーのRaspberry Pi 4のGPS。

GPSは、TOPGNSS GN803Gという製品で、2つ共同じなのだが、車載のrx7pi の方は、PRN194〜196のQZSSと、PRN300番台のGALILEOが表示されてない。

Ubuntu 20.04の gpsd-3.21 だと、QZSSが表示されているのは確認できているので、rasbian の gpsd-3.17だと対応していない疑惑。

Raspberry Pi 4の方は野良ビルドで、gpsd-3.24 を入れてあるので、rx7pi の方にも入れてやろう。

Building GPSD from source」を参考にして、

If ‘scons’ fails, it is possible that your target system has moved to Python 3 and removed the program ‘python’. Python.org says that if you have an installed Python, there should be a program in your path called ‘python’. This is specified in PEP 394. This rule is not always followed. You can work around this by linking python3 to python like this

python3 のシンボリックリンクを作成しろとの事だが、要はPATHが通ってる所なら良いので次のようにする。

なぜか、 ln -s /usr/bin/python3 /home/noizumi/bin/python で作成できなかったので、ちょっとまだるっこしい事をやっている。

必要な開発用パッケージを入れるけど、gtk3 とか入れるとアホみたいにパッケージが入っちゃうし、gpsd と gpsmon、 cgps のテキストベースで使えれば良いので、次のものを入れた。

python のライブラリのPATHは存在しないので、シンボリックリンクを張っておく。

そしてインストール

gpsd のビルドのページには、sudo scons udev-install とやれって書いてあるけど、既に gpsd-3.17のパッケージ入ってるし、そのままにしたいので、 install にしている。

一応、念の為、ちゃんと入ってるか確認。

既定は prefix=/usr/local なので、全てそこにインストールされている。

ExecStartのPATHを変更。

GALILEOは補足できてないけど、QZSSが補足できるようになった。

やっぱ、gpsd-3.17はQZSSに対応してなかったんだな。

【Raspberry Pi Zero 2 W】プログラム変更

どうも、/dev/shm をRAM DISKとして使用すると、ファイルが勝手に消されてしまうようで、そのせいで、lock file したつもりだったが、それが消されてしまい、motion が多重起動してしまっていたようだ。

そこで、明示的にRAM DISKを作成する事にした。

/ramdisk に tmpfs をマウントするようにした。
motion の動画もRAM DISKに作成するようにし、micro SDカードにやさしい運用に 🙂

一応、donedone エントリープラン 128kbps でネットワーク回線が繋がっていて、動画作成後にすぐに家のサーバーに転送するようにしてるので、RAM DISKのパンクは無い想定。

motion の設定で、on_movie_end で実行するコマンドを指定できるので、それでVPN経由でのファイル転送をやっている。

rsync の –remove-source-files で転送元ファイルを削除するので、RAM DISKにはファイルが貯まらない(はず)。

RAM DISK作成に伴い、車載監視プログラムも /ramdisk を使用するように変更。

追加してる処理は、AB Shutter3 用 triggerhappy 再起動で、AB Shutter3 が接続してない状態だと、/dev/input/event* が作られておらず、triggerhappy が起動しても、監視対象デバイスが無い状態。

接続後は、デバイスファイルが作成されるので、その時点で triggerhappyを再起動すれば、設定通り動くようになる。

ちなみに、AB Shutter3 用の設定は次の通り。

わしの買った AB Shutter3 は長押しのキーコードが出なかったので、上と下だけ。

triggerhappy は root 権限で動いてるので、sudo は要らんけど、まあ、念の為、付けておいた。

他には、gpsd の出力で、”TPV” の行に、lat と lon が存在しない場合があって、緯度、経度が正しく出力されていない事があったので、その対策をした。

【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 の監視スクリプトも結構な長さになったなあ。