今日はCoke自販機の飲みたいものが売り切れだったので、モスにした。
最近、コーヒー飲んでも痒みが出ない。
そういや、今日は、西川貴教のかけっことびっこが流されまくってたな。

I know who Iam.
羽鳥氏はこの日午前、ドイツ代表が試合前の写真撮影の際に口を塞ぐポーズをとり、多様性などを訴える腕章の着用を禁じたFIFAに抗議したことを報じたニュースをリツイート。その際に「日本とドイツのサッカー協会の差を見せつけられちゃうし、日本代表は勝っちゃうしで、残念というほかない」と投稿した。
情報源: 日本勝利「残念」投稿の中野区議が一転謝罪「言動は間違いでした」 独戦大金星めぐる投稿で物議― スポニチ Sponichi Annex 芸能
まあ、共産党だしね。
日本死ねとか日本はもうダメだとか言って喜んじゃってるような連中なので、日本代表がドイツに勝ったのも、面白くないのだろうな。
どっちかと言えば、いい歳して、言っていい事と悪い事の区別がつなかないあんたのおつむが残念だよ 🙂
gpsdのサイトからソース取ってきて、野良ビルドして動かしてみた。
QZSSのみちびきPRN194〜196まで使ってて、昨日は見られなかったPRN300番台のGAってのが現れているが、これは欧州のGALILEOだな。
Raspberry Pi 4 の gpsd は 3.18 なので、早く新しくならんかのう。
USBのGPSレシーバーが aliexpress から届いた。
大体、1週間ちょっとで、最近、aliexpress はやけに到着が早くなってるな。
早速動作確認してみたが、ちゃんと動いている。
Ubuntu 20.04の gpsd-3.20-8ubuntu0.4 だと、衛星の種類まで出るんだな。
GPがGPSで、SBがSBAS(衛星航法補強システム)、QZがQZSS(準天頂衛星)、GLがGLONASSでロシアの衛星。
ウクライナに侵攻してるロシアだが、結構GPSでは世話になっとったんだなあ。
車に Raspberry Pi zero 2Wを設置して、GPSにより、車の移動を検知して、メールで警告をするようにしている。
前のGPSドングルのVK-172は、平和堂で、車を駐車場に停めてる時に、100m以上の誤差が出て、警告メールが飛んできた。
|
1 2 3 4 5 6 7 8 9 |
From: yuji@noizumi.org To: yuji@noizumi.org Subject: Car Security alert GPS Warning! 100.55m moved. Message-Id: <E1owZqP-0004Rc-A8@rx7pi> Date: Sun, 20 Nov 2022 11:14:05 +0900 XSRV-Filter: yuji@noizumi.org Car Security alarm was GPS Warning! 100.55m moved. at 2022/11/20 11:14:05 https://maps.google.com/maps?q=XX.065626526,XXX.026907982 |
北へ100.55m移動したと誤警報。
こういう誤差による誤検知でメールが飛ばないように、100m越えにしてるのだが、TOPGNSS803G は現状では大体誤差20m位に収まってるから、誤検知が出ないのに期待したい。
※画像貼るのが面倒なのでアフィリエイトを使っています。
折角、負荷端子付きのチャージコントローラーを買ったので、aliexpress で、2個 $1.57(220.34円)のCOBデイライトを買った。
設定は、ソーラーパネル入力消失後、6時間負荷ONにしたので、大体、午前0時位に電灯が消える。
どれくらいチャチなのかと言えば、カバーを外すと細っそい線が出てきて、商品紹介には、6Wと書かれていたので、こいつに12V 0.5A位流したら、火吹くんじゃね?位の細さ。
さすがにこのまま使う気がしないので、エーモンの線と付け替えた。

前は、光センサースイッチで、スタンドにはめた電球を光らせていたけど、今回はチャージコントローラーで、ソーラー入力消失で負荷ONにする機能があるから、それを使った。
あと、スタンドが経年劣化の錆で朽ちて、車の天井に落下する恐れがあるので、もっと軽量なものにした訳だな。
結局、 motion が多重起動するのは防げないっぽいので、daemon モードで常駐させて、web_connect で start と pause の指令を motion に送って対応する事にした。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
#!/bin/bash export PATH=/home/noizumi/bin:$PATH GPIO=26 GPIO_DIR=/sys/class/gpio MOTION_PID=/dev/shm/motion.pid MOTION_STOP=/dev/shm/motion.stop GPS_BASE=/dev/shm/gps_base GPS_LATLON=/home/noizumi/bin/gpslatlon.sh # bluetooth 接続による動体検知OFF用 #BTMAC=XX:XX:XX:XX:XX:XX # OPPO Reno3 A BTMAC=XX:XX:XX:XX:XX:XX # OpenRun Pro by Shokz initialize(){ # GPIO26を有効化。プルアップ抵抗ON echo $GPIO >${GPIO_DIR}/export sleep 0.1 echo in >${GPIO_DIR}/gpio${GPIO}/direction sleep 0.1 echo high >${GPIO_DIR}/gpio${GPIO}/direction } shutdown_handler(){ # GPIOクリーンアップ echo $GPIO >$GPIO_DIR/unexport motion_stop exit 0 } mail_send(){ cat << _EOD_|/usr/sbin/sendmail -t -f yuji@noizumi.org From: yuji@noizumi.org To: yuji@noizumi.org Subject: Car Security alert $1 Car Security alarm was $1 at `date +"%Y/%m/%d %H:%M:%S"` $2 _EOD_ } sms_send(){ DATEMES=`date +"%Y/%m/%d %H:%M:%S"` curl -X POST https://api.twilio.com/2010-04-01/Accounts/[twilioアカウント]/Messages.json \ --data-urlencode "Body=Car Security alarm was $1 at $DATEMES" \ --data-urlencode "From=[twilio電話番号]" \ --data-urlencode "To=[わしの携帯電話番号]" \ -u [twilioアカウント]:[twilioパスワード] -o /home/noizumi/logs/twilio.log } button_pushed(){ motion_start mail_send activated sms_send activated # ボタンが押されている間、ループ while [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; do sleep 1 done mail_send stopped sms_send stopped } motion_start(){ MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep "Detection status" | /bin/sed -r 's/.*Detection status (.*).*/\1/'` if [ "${MOTION_STATUS}" != "ACTIVE" ]; then curl -s http://localhost:8080/0/detection/start >/dev/null 2>&1 fi if [ ! -e ${GPS_BASE} ]; then GPS_NOW=`${GPS_LATLON}` if [ "${GPS_NOW}" != "" ]; then echo "${GPS_NOW}" > ${GPS_BASE} fi fi } motion_stop(){ MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep "Detection status" | /bin/sed -r 's/.*Detection status (.*).*/\1/'` if [ "${MOTION_STATUS}" = "ACTIVE" ]; then curl -s http://localhost:8080/0/detection/pause >/dev/null 2>&1 fi if [ -e ${GPS_BASE} ]; then rm -f ${GPS_BASE} || true fi } bluetooth_connect(){ # 接続状態確認 CONNECTED=`cat << _EOD_|bluetoothctl|grep "Connected: yes" power on info ${BTMAC} quit _EOD_ ` # bluetooth 接続状態確認 if [ "${CONNECTED}" != "" ] || [ -e ${MOTION_STOP} ]; then # 接続してたら、動体検知止める motion_stop else # 接続してなかったら、動体検知スタート motion_start fi } initialize trap shutdown_handler 1 2 3 15 # motion を daemon モードで起動 if [ ! -e ${MOTION_PID} ]; then motion -b fi while :; do # pulseaudo 起動確認 if [ "`ps ux|grep -e \"${USER}.*pulseaudio\"|grep -v grep`" = "" ]; then pulseaudio --start sudo systemctl restart bluetooth.service fi # イヤホンマイクボタンが押された時 if [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; then button_pushed fi bluetooth_connect if [ -e ${GPS_BASE} ]; then GPS_SAVE=`cat ${GPS_BASE}` GPS_NOW=`${GPS_LATLON}` if [ "${GPS_NOW}" != "" ] && [ "${GPS_BASE}" != "" ]; then DISTANCE=`distance.sh ${GPS_SAVE} ${GPS_NOW}` if [ "`echo \"${DISTANCE}>100\"|bc`" = "1" ]; then mail_send "GPS Warning! ${DISTANCE}m moved." "https://maps.google.com/maps?q=${GPS_NOW}" echo "${GPS_NOW}" > ${GPS_BASE} fi fi fi sleep 1 done |
今までは、 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テザリング位しか残された道が無いけど、電力食うのは嫌なんだよなあ。
結局の所、ロックファイルがあれば起動しない処理だったけど、なぜか起動するという事はファイルが無くなっているという事。
プロセスを終了させて、ファイルを消している処理があるので、そこでプロセスが完全に終了するまで待つ事にした。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
motion_start(){ if [ ! -e ${MOTION_PID} ]; then motion -n & echo $! >${MOTION_PID} # ファイルが作成されるまで待つ while [ ! -e ${MOTION_PID} ]; do sleep 0.1 done fi if [ ! -e ${GPS_BASE} ]; then GPS_NOW=`${GPS_LATLON}` if [ "${GPS_NOW}" != "" ]; then echo "${GPS_NOW}" > ${GPS_BASE} fi fi } motion_stop(){ if [ -e ${MOTION_PID} ]; then PID=`cat ${MOTION_PID}` kill -TERM ${PID} # プロセスが完全に終了するまで待つ while [ "`ps h p ${PID}`" != "" ]; do sleep 0.1 done rm -f ${MOTION_PID} || true rm -f ${GPS_BASE} || true fi } |
元は、kill -TERM `cat ${MOTION_PID}`て処理だったけど、それよりも先にファイル削除になって、PIDがkill に渡らないから生存しつづけて、多重起動になっとったんかなあ。
linux ってファイルを処理に渡したら、削除しても内容は消えずに渡ると思ってたが、あれは通常のファイルシステムの話で、RAM DISK上のファイルは違うのかねえ。
とりあえず、プロセス終了を待ってからファイル削除で多重起動しなくなったから、ま、いっか。
【皇紀2682年11月17日 追記】
今日、会社の帰りに車に乗ったら二重起動が発生。
もう、どこが悪いのか分かんね。
【/皇紀2682年11月17日 追記】
車載のRaspberry Pi zero 2 W(以下rx7pi) で、bluetoothヘッドフォン接続時に、motion の動体検知録画を止め、切断時に動体検知録画ONになるようにしている。
だが、確認してみると、朝、車に乗る前に、bluetoothヘッドフォン接続したのに、通勤時の動画が一杯記録されてた。
VPN経由でrx7piへログインしてみたところ、
|
1 2 3 4 |
noizumi@rx7pi:~ $ ps auxw|grep motion|grep -v grep noizumi 5374 1.4 9.1 206036 34324 ? SLl 11月14 11:56 motion -n noizumi 20643 0.8 7.5 171496 28364 ? SLl 09:29 0:16 motion -n noizumi 23656 0.8 7.5 171496 28112 ? SLl 09:34 0:14 motion -n |
三重起動しとる……。
|
1 2 |
noizumi@rx7pi:~ $ cat /dev/shm/motion.pid 23656 |
記録されとるのは、一番最後のプロセスIDなので、多重起動防止を突破しとるようだ。
あと、motion が二重起動してる事があって、何でだろうと考えたが、motion -n &でバックグラウンド起動してるので、process IDを出力する前に、ループで二週目の呼び出しで二重起動になってるんだろう。
1234567891011121314 motion_start(){if [ ! -e ${MOTION_PID} ]; thentouch ${MOTION_PID}motion -n &echo $! >${MOTION_PID}fiif [ ! -e ${GPS_BASE} ]; thenGPS_NOW=`gpslatlon.sh`if [ "${GPS_NOW}" != "" ]; thenecho "${GPS_NOW}" > ${GPS_BASE}fifi}という事で、process IDが出力する前に、touch でファイルを作成しておき、二重呼び出しにならないようにした。
情報源: raspberry pi – Yuji Noizumi’s blog
と、対策はしたのだが、なぜに多重起動する!?
9:29 と 9:34 に起動してるが、ドアの開閉でルームランプのLEDライトが点灯した時にLEDのノイズで接続が切れてるのかもしれんな。
しかし、それでも論理的に多重起動するのはあり得んのだが、状況を整理しよう。
これはやっぱりLEDライト点灯による bluetooth 接続断がくさいが、もしかすると、motion の起動完了にすごく時間が掛かってて、sleep 1 のwaitでは足らないのかもしれない。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
motion_start(){ if [ ! -e ${MOTION_PID} ]; then motion -n & echo $! >${MOTION_PID} while [ ! -e ${MOTION_PID} ]; do sleep 0.1 done fi if [ ! -e ${GPS_BASE} ]; then GPS_NOW=`gpslatlon.sh` if [ "${GPS_NOW}" != "" ]; then echo "${GPS_NOW}" > ${GPS_BASE} fi fi } |
という事で、 恐らく、touch したファイルは、リダイレクト指定したら削除されて、ファイルが存在しないから多重呼び出し可能になってしまうのだろう。
そこで、リダイレクトのファイルが作成されるまで待つ処理を入れてみて、様子を見るとしよう。
会社からVPN使ってRX-7搭載Raspberry Pi zero 2 W(以下ラズパイ)へログインして、状態を確認していた所、GPSからデータが一切流れて来ていない。
alarm_monito.sh をKILLして、スクリプト弄ってたら、通信途絶した。
帰宅してWiFi経由でログインしても、別に異常は無いし、何が原因かよく分からん。
とりあえず、GPSがハングアップした時の為に、timeout を入れるのと、応答を良くする為に、gpspipe のパラメータを弄った。
|
1 2 3 |
#!/bin/sh timeout 1 /usr/bin/gpspipe -w -n 4| /bin/grep TPV | /bin/sed -r 's/.*"lat":([^"]*),"lon":([^"]*),.*/\1,\2/' | /usr/bin/head -1 |
gpspipe は -n 4 指定で、TPVの行が出て、終了するので、多分、これが一番速い。
GPSがハングアップしてても、1秒でタイムアウトなので、警戒監視スクリプトでデッドロックする事もあるまい。
あと、motion が二重起動してる事があって、何でだろうと考えたが、motion -n &でバックグラウンド起動してるので、process IDを出力する前に、ループで二週目の呼び出しで二重起動になってるんだろう。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
motion_start(){ if [ ! -e ${MOTION_PID} ]; then touch ${MOTION_PID} motion -n & echo $! >${MOTION_PID} fi if [ ! -e ${GPS_BASE} ]; then GPS_NOW=`gpslatlon.sh` if [ "${GPS_NOW}" != "" ]; then echo "${GPS_NOW}" > ${GPS_BASE} fi fi } |
という事で、process IDが出力する前に、touch でファイルを作成しておき、二重呼び出しにならないようにした。
それと、GPSハングアップに備えて、GPSのデータ参照してる所は、空白データの時に処理しないFail safeを入れた。
まあ、GPSドングルが壊れてる可能性もあるので、TOPGNSSの11.11セールで売ってたものをポチっておいた。
情報源: Topgnss usb gps glonass受信機アンテナモジュールusb出力プロトコル、互換交換BU353S4|GPS レシーバー & アンテナ| – AliExpress
前に買った奴が結構いいので、再び購入したが、前が1,500円位だったのに、今はセールで2,200円になっとるから、円安は海外通販には痛いのう。