朝、8時半頃、何となくスピードテストをやってみた。
これ、NTT西日本のフレッツ光ネクスト隼+Mopera Uで、ipv6ではなく、ipv4のPPPoEでこの300Mbpsオーバーのスピードが出とる。
Mopera Uってのは、NTT Docomoの携帯電話契約していると入れるプロバイダだが、今ならドコモ光とか入っちゃう人が多いから、どんどん人が少なくなって、どんどんスピードが上がっとる訳だ(笑)。

I know who Iam.
車に50Wのソーラーパネルをバッテリー直結にしたが、過充電が心配で、何とか電圧監視する仕組みを導入できないか考えていた。
過充電が心配なら、ソーラーチャージコントローラーを噛ませばいいじゃないかという話だが、如何せんソーラーパネルのパワーが低いので、充電するよりもソーラーチャージコントローラーの待機電力の方が大きければ、太陽光発電をしない方がマシというのは本末転倒だ。
正攻法なら、INA226のセンサーで車のバッテリー電圧を計って、ネットワークで確認して、14.4Vを越えていなければOKという判断もできるが、待てよ……
家にソーラーパネル100W買った時におまけでついてきたチャージコントローラーがあるので、とりあえず待機電力には目を瞑って、それを噛ませて過充電の心配を無くす。
そして、車載のRaspberry Pi Zero 2 Wは車内監視カメラがあるので、ソーラーチャージコントローラーには電圧表示があるから、それを写せばいいんじゃね?
車内の動画だと、128kbps の通信速度で送れるように低解像度にしてあるから、電圧が読み取れません><
そうだ raspistill ならフル解像度で撮影できるなと気付き、カメラデバイスを専有している motion 停めて撮影してみた。
さすがに 2560×1920ピクセルともなると、ちゃんと、12.5V って読めるな。
ちょっと手間掛かるけど、これで日中に駐車場でどんな充電状況なのかが一応分かるな。
将来的には、低消費電力の電菱のSolar Amp B に替えたいな。
携帯電話のbluetooth テザリングにより車載のRaspberry Pi Zero 2 W(以下rx7pi)の通信を賄っていて、カメラの動態検知やGPS測定による位置移動、警報装置発報をメール通知するようにしている。
しかし、時折、一切の通信不能になる時があって、恐らく、bluetooth のチップがハングアップして通信機能が失われているのだろう。
で、以前、携帯電話のUSBテザリングを使用していて、これはRF回路を使わないから、電力喰わないので良いのだが、携帯電話のロックを解除しないと接続してくれないので、時折ロック解除を忘れて、まる一日通信不能の事があった。
ふと、設定で画面ロックを使わないようにしたらどーなんの?とやってみた所、rx7pi が起動したら、即携帯電話にUSB接続した。これで bluetooth がハングアップしようが通信に問題が無くなったな 🙂
楽天にRチャンネルというのがあるけど、中身はCSの番組の再配信みたいなやつで、これを楽天IDでログインして視聴すると、1時間に1ポイント貰える。
そして、2ヶ月連続視聴すると、貰えるポイントが倍になって、12月は10月分のポイント 1,176ポイント貰った。
ブラウザで開きっぱなしにしておけば、ポイントを山ほど稼げるんじゃね? と思いきや、3時間操作が無いと以後ポイント加算されない事になっていて、そう甘くはない。
わしの場合は、PC起動したらRチャンネルのページが開くので、以後、気付いた時にチャンネルを替えて、この制限を逃れている。
ただ、寝ている間はどうしようもないので、それを何とかできないかと考えた。
|
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 |
<!DOCTYPE html> <!-- Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license Click nbfs://nbhost/SystemFileSystem/Templates/Other/html.html to edit this template --> <html> <head> <title>定期リロード</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script> <script> var wrch = null; var ct = 0; var id = 0; function int_proc(){ // ウインドウIDがあれば初回以外の呼び出し if(wrch != null){ wrch.close(); } // ウインドウオープン wrch = window.open($('[name="url"]').val(),'rch','popup'); // 時刻文字列生成と表示 let nowTime = new Date(); // 現在日時を得る let nowHour = ('00'+nowTime.getHours()).slice(-2); // 時間を抜き出す let nowMin = ('00'+nowTime.getMinutes()).slice(-2); // 分数を抜き出す let nowSec = ('00'+nowTime.getSeconds()).slice(-2); // 秒数を抜き出す let msg = "前回起動時刻:" + nowHour + ":" + nowMin + ":" + nowSec; $('#disp-time').text(msg); // インターバルIDが設定されていた場合、キャンセルして、新たなインターバルを登録 if(id != 0){ clearInterval(id); id = setInterval(int_proc, $('[name="int_time"]').val()); } } $(function(){ int_proc(); id = setInterval(int_proc, $('[name="int_time"]').val()); }) </script> </head> <body style="line-height:2em;"> <div>指定ページを定期的にリロードするよ</div> <div id="disp-time"></div> <input type="url" name="url" value="https://channel.rakuten.co.jp/" style="width:330px;"><br /> 再起動間隔マイクロ秒数:<input type="number" name="int_time" value="10800000"> <button type="button" onclick="int_proc();">再起動</button> </body> </html> |
そこで、3時間毎にリロードするプログラムを書いた。
最近のブラウザは、裏タブにすると、動きを止めてメモリ解放してしまうので、このソースのウインドウとRチャンネルのウインドウは裏へ回らないようにしておかないと、継続動作しない可能性があるので要注意。
これで寝てる間もポイント稼いでくれたらいいけど、単にウインドウを開き直すだけで、チャンネルは変更しないので、もしかすると、ダメかもしれん。
Raspberry Pi Zero 2 W+GPS+Zenfone Max Pro[m2] を繋いでテスト。
DE-C41-30000BKを満充電の後、26時間連続稼働で残りゲージ2つ(50%以下)くらいなので、48時間くらいイケそうだな。
最近、RX-7のバッテリがよく低電圧に陥り、カーポートソーラーに2日ほど接続していたが、夕方エンジン掛けようとするも掛からず、ジャンプスタータで始動した。
RX-7のバッテリがもうそろそろダメなのかもしれん。
|
|
車載Raspberry Pi Zero 2 W(以下rx7pi)を稼働させるのに、バッテリが低電圧になるのを解決すべく、ポータブルバッテリをこうにう。
エレコムは 自社、Amazon、楽天市場のショップで同一価格なので、ポイント4倍の楽天で買うのが一番お得。
リチウムイオン電池じゃなく、ハイブリットカーのバッテリにも使用されているリン酸鉄リチウムイオン電池なので、高温になりがちな車載でも安心。
以前、ガラケーをFOMA 補助充電アダプタ03に繋ぎ、それに4.5Wソーラーパネルに接続して電力を賄っていたが、スマートフォン+GPS+rx7pi を車のバッテリに繋ぐと電圧低下で、エンジン始動できなくなる。
そこで、以前みたいに、今回買ったDE-C41-30000BKへ rx7pi 一式を接続して、入力に18Wソーラーパネルを接続して、車の電力系から独立させてみようと思った。
ソーラーパワーのみで賄えるようになったらうれしいな 🙂
まあ、できなくても、週末のみモバイルバッテリー充電すればOKの体制にはしたいなあ。
10月9日夜、車のセキュリティのリモコンが鳴って、何だろう?と思って車を確認。
セキュリティOFFにしようにもOFFにならない。
どうも、バッテリ低電圧の警告でリモコンが鳴ってた模様。
何度かやってる内になんとかセキュリティOFFにはなった。
18Wソーラーパネルを接続してはいたが、天気が悪く小雨が降ってて、全然陽に当たってなかった。
カーポートソーラーの常夜灯も、22時頃に消灯してしまったので、やっぱり日照が全然足りてなかったのだろう。
車載のRaspberry Pi Zero 2 W(以下rx7pi)の電源は落としていたが、USBポートに繋いでいた携帯電話とGPSは通電したまんま。
それらの電源を遮断して、とりあえず、ジャンプスターターでエンジンを掛けて、30分ほど放置。
翌朝、エンジンは掛かり、会社へ行って、家に帰ったらrx7pi系統を電源遮断していたが、今日、会社帰りにエンジンオートスターターでエンジン始動させようとするもエンジン始動せず。
一応、電気の食う携帯電話は、車のエンジンが掛かってる間だけ電力供給するようにしていたのだが、GPSモジュールをデータ取得間隔1000ms→100msで動かしてたから、やっぱり電気食うんだろうなあ。
セキュリティOFFとドア解錠はできたので、そのままキーでエンジン始動させると、セルの回りが悪いながらもエンジンは始動。
携帯電話は、エンジン掛かってる間だけ充電しても100%にならんので、とりあえず家で充電。
GPSのデータ取得間隔を1000msに戻したけど、現状は、日々、バッテリが消耗していくばかりなので、バッテリ回復するまで、rx7pi は稼働させない方が良さそうだ。
|
1 2 3 4 5 6 7 8 9 |
noizumi@greyhound:~$ ping -w 5 192.168.11.19 PING 192.168.11.19 (192.168.11.19) 56(84) バイトのデータ 64 バイト応答 送信元 192.168.11.19: icmp_seq=2 ttl=64 時間=204 ミリ秒 64 バイト応答 送信元 192.168.11.19: icmp_seq=3 ttl=64 時間=1.62ミリ秒 64 バイト応答 送信元 192.168.11.19: icmp_seq=4 ttl=64 時間=333 ミリ秒 --- 192.168.11.19 ping 統計 --- 送信パケット数 5, 受信パケット数 3, パケット損失 40%, 時間 4027ミリ秒 rtt 最小/平均/最大/mdev = 1.615/179.474/332.910/136.348ミリ秒 |
RX-7車載の Raspberry Pi Zero 2 W(以降rx7pi) だが、家の Wi-Fi に繋ぐと、謎のパケットロスが発生する。
rx7pi はプログラムで次の機能を持たせている。
これらの機能のプログラムを走らせると、Wi-Fiのパケットロスが発生する。
GPIOの信号線半田付けする時に、チップ抵抗まで盛ってしまい、ショートさせたので、まだショート箇所が残ってるのかと半田吸い取り線をヨドバシから買って、信号線の付け直しをしてみたが症状変わらず。
GPIO監視だけのテストプログラムを動かしたら発生しないので、GPIOでは無いようだ。
端末から監視プログラムを動かすと、
|
1 2 3 4 |
noizumi@rx7pi:~/bin $ alarm_monitor.sh & [1] 5150 noizumi@rx7pi:~/bin $ エラー: 接続のアクティベーションに失敗しました: (44) Bluetooth 接続が失敗またはタイムアウトしました. エラー: 接続のアクティベーションに失敗しました: (44) Bluetooth 接続が失敗またはタイムアウトしました. |
携帯電話へ bluetooth テザリングで接続してなかったらするようにしてるが、家なので、携帯電話は有効にしていない。
ちょっと気になるので、bluetooth テザリング接続部をコメントアウトすると、パケットロスが無くなった。
|
1 |
sudo nmcli dev connect ${BTPAN} |
この部分でパケットロスが発生しとるようで、bluetooth と Wi-Fiは同一チップで制御しとるから、大方、bluetooth の制御コマンドを送ると、Wi-Fi の回路の処理が停止して影響が出とるのかな?
安物の Wi-Fiチップだと、回路共通部分での競合ってありそうで、嫌だのう。
今まではUSBテザリングを使っていたが、スマートフォンの画面ロックを解除しないと、通信が確立しないので、朝、システムを起動して、画面ロック解除を忘れて、その後、通信不可ってのが嫌で、bluetooth テザリングにしたんだよなあ。
車載機としては、bluetooth テザリングが通信の生命線なので、接続断の場合は、何度もリトライを繰り返す処理にしてるけど、Wi-Fi 接続時はキャンセルする例外を入れんといかんかな?
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
function bt_tethering_check(){ # Wi-Fi繋がってたら何もしない。 WIFI=`ifconfig|grep wlan` if [ "${WIFI}" != "" ]; then return 0 fi # bluetooth 接続状態確認 PATTERN="[\s\S]*?${BTPAN}" if [[ ! $CONNECTED =~ $PATTERN ]]; then sudo nmcli dev connect ${BTPAN} else # 接続中に携帯電話の応答が無い場合、 # bluetooth死亡の可能性大なので再起動 if [ -e $FILE_TE_DEAD ]; then sudo reboot fi fi } |
Wi-Fi繋がってたら、bluetooth テザリング接続をしないようにした。
これで謎のパケットロスは解消した。 🙂
前は、tenki.jp を元にさせていただいていたが、地震が発生しても ircbot で表示されない事があり、ircbot の workファイルを見ると、1バイトのファイルが作成されている事があり、この原因がよく分からない。
そこで、Yahoo! の地震情報から RSSを生成する事にする 🙂
|
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 |
<?php header('Content-Type: text/xml;charset=UTF-8'); $url = 'https://typhoon.yahoo.co.jp/weather/jp/earthquake/list/'; $count = 10; do { $html = file_get_contents($url); $count--; } while (empty($html) && $count>0); $http_header = get_headers($url, 1); $base_url = 'https://typhoon.yahoo.co.jp'; // ヘッダから時間を取得 $now = new DateTime($http_header['Date']); $now->setTimezone(new DateTimeZone('Asia/Tokyo')); $now_rfc2822 = $now->format(DateTimeInterface::RFC2822); $now_PermaLink = $now->format('A') . ' Asia/Tokyo+9 ' . $now->format('D M y'); // RSS ヘッダ $RSS = <<< EOD <rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"> <channel> <title>地震情報 - Yahoo!天気・災害</title> <link>${url}</link> <language>ja</language> <lastBuildDate>${now_rfc2822}</lastBuildDate> <pubDate>${now_rfc2822}</pubDate> <guid isPermaLink="false">${now_PermaLink}</guid> EOD; # テーブルの抜き出し if (preg_match('/<table .*class="yjw_table yjSt boderset">[\s\S]*?<\/table>/m', $html, $matches)) { $earth_quake_table = $matches[0]; } else { $earth_quake_table = ''; } // row の抜き出し if (preg_match_all('/<tr.*>([\s\S]*?)<\/tr>/m', $earth_quake_table, $matches)) { $trs = $matches[1]; $trmax = count($trs); for ($tr = 1; $tr < $trmax; $tr++) { // カラムの抜き出し if (preg_match_all('/<td.*?>([\s\S]*?)<\/td>/m', $trs[$tr], $matches)) { $tds = $matches[1]; if(preg_match('/<a href="([^"]*)">(.*)<\/a>/', $tds[0],$matches)){ $link = $base_url . $matches[1]; $datetime = $matches[2]; } $center = $tds[1]; $magnitude = $tds[2]; $max_level = $tds[3]; // 震度3以上 if($max_level<3){ continue; } sscanf($datetime, '%d年%d月%d日%d時%d分ごろ', $y, $m, $d, $h, $i); $ocdate = new DateTime("$y-$m-$d $h:$i"); $ocdate->setTimezone(new DateTimeZone('Asia/Tokyo')); $occurrence_date = $ocdate->format(DateTimeInterface::RFC2822); $RSS .= <<< EOD <item> <title>[震源地] ${center} [最大震度] 震度${max_level} M${magnitude}(${datetime}発生) - Yahoo</title> <link>${link}</link> <description/> <pubDate>${occurrence_date}</pubDate> </item> EOD; } } $RSS .= <<< EOD </channel> </rss> EOD; $sl = strlen($RSS); header('Content-Length: '.$sl); print $RSS; } ?> |
震度1〜2は出てもウザいので、震度3以上を表示するようにしている。
「goo天気」をご利用くださいまして、ありがとうございます。
誠に勝手ながら「goo天気」のサービスは2023年9月27日をもちまして、終了させて頂くことになりました。
長年にわたり「goo天気」をご愛顧いただきましたお客様に、心より感謝申し上げるとともに、ご迷惑をおかけして誠に申し訳ございません。
今後とも引き続きgooのサービスをご利用いただけますと幸いです。
情報源: goo天気の終了について – goo天気
とうとう地震のRSS配信してる所が無くなってしまう。
うーん…。
|
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 |
<?php header('Content-Type: text/xml;charset=UTF-8'); $html = file_get_contents('https://earthquake.tenki.jp/bousai/earthquake/entries/level-3/'); $base_url = 'https://earthquake.tenki.jp'; $now = new DateTime(); $now_rfc2822 = $now->format(DateTimeInterface::RFC822); $now_PermaLink = $now->format('A').' Asia/Tokyo+9 '.$now->format('D M y'); // RSS ヘッダ $RSS =<<< EOD <rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"> <channel> <title>過去の地震情報 震度3以上(日付の新しい順) - 日本気象協会 tenki.jp</title> <link>https://earthquake.tenki.jp/bousai/earthquake/entries/level-3/</link> <language>ja</language> <lastBuildDate>${now_rfc2822}</lastBuildDate> <pubDate>${now_rfc2822}</pubDate> <guid isPermaLink="false">${now_PermaLink}</guid> EOD; # テーブルの抜き出し if(preg_match('/<table class="earthquake\-entries\-table">[\s\S]*?<\/table>/m',$html, $matches)){ $earth_quake_table = $matches[0]; }else{ $earth_quake_table = ''; } if(preg_match_all('/<tr>([\s\S]*?)<\/tr>/m',$earth_quake_table, $matches)){ $trs = $matches[1]; for($tr=1; $tr<count($trs); $tr++){ if(preg_match('/datetime"><a href="([^"]*)" class="text-link">/', $trs[$tr], $matches)){ $link = $base_url.$matches[1]; } if(preg_match('/datetime">.*class="text-link">(.*)<\/a>/', $trs[$tr], $matches)){ $datetime = $matches[1]; // 欠則時は恐らく<span class="grey">が入る if(preg_match('/<span class="grey">(.*)<\/span>/', $datetime, $matches)){ $datetime = $matches[1]; } } if(preg_match('/center">(.*)<\/td>/',$trs[$tr],$matches)){ $center = $matches[1]; // 欠則時は恐らく<span class="grey">が入る if(preg_match('/<span class="grey">(.*)<\/span>/', $center, $matches)){ $center = $matches[1]; } } if(preg_match('/magnitude">(.*)<\/td>/',$trs[$tr],$matches)){ $magnitude = $matches[1]; // 欠則時は恐らく<span class="grey">が入る if(preg_match('/<span class="grey">(.*)<\/span>/', $magnitude, $matches)){ $magnitude = $matches[1]; } } if(preg_match('/max\-level">.*alt="(.*?)"/',$trs[$tr],$matches)){ $max_level = $matches[1]; // 欠則時は恐らく<span class="grey">が入る if(preg_match('/<span class="grey">(.*)<\/span>/', $max_level, $matches)){ $max_level = $matches[1]; } } sscanf($datetime,'%d年%0d月%0d日%0d時%0d分',$y,$m,$d,$h,$i); $ocdate = new DateTime("$y-$m-$d $h:$i"); $occurrence_date = $ocdate->format(DateTimeInterface::RFC822); $RSS .=<<< EOD <item> <title>[震源地] ${center} [最大震度] 震度${max_level} ${magnitude}(${datetime}発生) - tenki.jp</title> <link>${link}</link> <description/> <pubDate>${occurrence_date}</pubDate> </item> EOD; } $RSS .=<<< EOD </channel> </rss> EOD; print $RSS; } ?> |
という事で作った 🙂
IRCのbotで、RSSを出力するものがあるのでそいつに食わせる。