2022年5月31日火曜日

最近気になっていることと言えば…

タイムラプス映像に結構頻繁に映り込んでいる火の玉っぽい何か。

いかんせんただのドットしかなく、ヒントは少ないのでパッと思い浮かぶのは流れ星とか衛星とか?

夜間に星空が撮影できれば最高なのですが、そこまで感度は良くないので、映り込むのは特定の明るく輝く星か、太陽系の惑星程度だと思います。

衛星だったとして大型かもしくは大きくて低軌道であれば映るかもなぁとは思います。

いままで、飛行機、流れ星はある程度検索したりリアルタイム情報をみてみたりと、調べてみましたが、該当しそうなものはありませんでした。

昨日は衛星という切り口で調べてみましたが、正直調べきれませんでした。ただ昨日は低軌道でも高度が3000km以上だということで雲のはるか上空なので雲の下に見えるはずがないという結論で終わっていたのですが、今調べてみると低軌道衛星で500kmぐらいで飛んでいるものがあるという検索結果にw

wiki(https://ja.wikipedia.org/wiki/%E4%BD%8E%E8%BB%8C%E9%81%93)を見てみると

地球低軌道では、日本の宇宙航空研究開発機構(JAXA)の超低高度衛星技術試験機「つばめ」が2019年、高度167.4 kmで軌道を7日間保持して、地球観測衛星の最も低い軌道高度としてギネス世界記録に認定された。

とのこと。ちなみに雲は高層でも地表から10km程度しかないので、結果として衛星軌道よりはるか下となります。

なので、雲の下に見えるということは…衛星でもないということなのか?

やっぱり結論は出ないかぁ…

motion: いつの間にビルトインの動画出力と外部パイプ出力が同時に行われるようになったのだろう?

色々とソースを見ていて気付いた点があります。

基本動作としてmotionは、カメラで撮影した映像内の動体検知を行って記録すること。

ここから派生して記録する形式として、静止画と動画の大きく分けて2つがあり、動画は実際の映像と、動体検知を行っている処理の映像という2つの映像が存在します。

また実際の映像は、ビルトインのエンコーダで処理することもできるし、pipeを使って外部処理でエンコードすることもできます。

この機能は当初から存在してはいましたが、処理速度やビルド環境、実行環境に大きく左右される機能なのですが、体験記憶としては静止画と動画の同時出力はできていた記憶はあるのですが、実際の映像と検知処理の映像はどちらかしか出力できなかったと記憶していました。

現在のソースを見ていると実際の映像と検知処理の映像の同時出力を行うように作られており、さらにextpipe(外部パイプ)出力も同時に行う形になっていました。自分の中ではビルトインか外部パイプどちらかしか出力されないと思い込んでいて、外部パイプ出力の処理が予想以上に重たく感じられていたのです。なので微調整を行う過程で結局最後はビルトインエンコーダを使用する形で落ち着いていました。

motionの出力
┣静止画(全て/特定のフレーム)
┗動画
┣ビルトインエンコーダの出力 実際の映像
┣外部パイプへの出力 実際の映像
┗ビルトインエンコーダの出力 動作検知処理の映像

これらが同時に出力可能と言うことに今更気づいたのかよwとかいうレベルですが、ビルトインエンコーダと外部パイプ出力が同時に行われるという仕様をまったく想定していなかったので今まで理解できなかった不可解な現象がようやく理解できました。

不可解な現象を列記すると、

・ごくまれに出力された動画ファイルが壊れていることがあった。

・ビルトインの出力と外部パイプの出力で動体検知の癖が変わる。

・出力された動画をffmpegで処理すると、エンコーダを通していないのにファイルサイズが変わった。

・外部パイプを使用しているときにイベントスクリプト内(on_movie_end)で処理するときにまだ動画ファイルがクローズされていない。

・スクリプトの引数で%fを使用するときにファイルの拡張子がある場合とない場合があった。

などなど…まだあると思いますがこの辺が結構不可解だったポイントです。

仕様として、動体検知映像はファイルの末尾に"m"を強制的につけられるのですが、ビルトインエンコーダのファイル名と、外部パイプのファイル名は拡張子があるかないかの差しかありませんでした。(今まで、とりあえず外部スクリプトで拡張子がない場合は処理を行わないようにしていました。)

で、問題的な動作として、ビルトインエンコーダの出力と外部パイプの出力が同じファイル名になっていて、処理はビルトインエンコーダの出力→外部パイプの出力という順番で処理されるので、結果的にどうなるのかと言えば…

ビルトインエンコーダの出力が行われ、直後に外部パイプの出力が行われることにより上書きされてゆく結果に。

Windowsでそれなりの実装を行っていれば、おそらく外部パイプのファイル出力エラーとなるはずなのですが、Linux(Raspberry pi)では平気で処理が通ってしまい、ファイルサイズはどちらか大きいサイズ。出力内容は書き込みバッファサイズに依存してどうなることやらといった感じでしょうか。(ファイルの排他制御はファイルシステムに依存しているはずなので、ファイルシステムを変えると動作が変わるかも?)

大抵の場合、ビルトインエンコーダの出力は大きく、固定ビットレートなので外部パイプ出力を上書きしてしまうようなことがなかったために、動画が見れていた感じです。ファイルとしては映像の後に無駄なパディングが書き込まれている状態になったために、ffmpegで処理を行うと、その無駄なパディングが排除され、ファイルサイズが小さくなった、と。

なんか今まで不可解だった不安定な動作が一気にすっきりしました。

動体検知の癖の差はエンコード処理が単純に多くなるのでレスポンス低下による影響だと考えられます。

なぜこの辺のソースを追っかけたかと言えば、想定している機能とちょっとソースを見た感じ実装がずれていたので足りない部分を追加しようとしていたのですが、よくよく見てみると想定している仕様が違うということに気づきました…。

git上のソースを3.10ぐらいまでは遡れるのですが、そのくらいからは同時出力できる感じがしました。なので、おそらく当初からそういう仕様だったのかもw

Windows: SDカードが何度かエラーになった

遡ることGW少し前から。(このアーティクルを書き始めたのは 2022/05/23 18:15)

SDカード上でテキストファイルを編集して使っていたのですが、どうも調子が悪い。
突然の書き込みエラーで始まり、SDカードへのアクセスが不安定に。

経験上SDカードへのアクセスエラーが始まってからアクセス不能になるまで残された時間はほとんどない。慌てて必要そうなファイルのバックアップ。

エラー発生時に編集中だったファイルは更新状態がわからないことになってしまいましたが、スキャンディスクを行うと使えるようになったので、様子を見ながら使っていると、また同様の現象が。2,3度繰り返し同じ状況になったので、外付けのカードリーダー経由で使用してみたところ問題なさそうなので、GW中はそれで使っていました。しばらくするとWindowsUpdateが、何回かかっていたので恐る恐る本体のSDカードスロットに戻しましたが問題は出なくなりました。

特に更新内容は確認していないのですが、問題はおそらく4月のWindowsUpdateが絡んでる感じがします。

2022年5月29日日曜日

今日は3つ流れた…

時間帯や流れる方向が違いますが、今日は火の玉が3つ流れてました…。

 




さすがに3つとなるとかなり気になります。

動画のコメントにも書きましたが、飛行機かもとちょっと調べてみました。結果から言えば、見えてたとしても逆方向とか両方向に流れてないといけない感じに。そもそも撮影方向で飛行機を確認したことはないので。

流れたのは、画面上部左から右へ。時間は動画の時間で3:04ぐらいから9秒程度の間。撮影時間では23:01:00ぐらいから23:25:00ぐらいにかけて。

飛行機の航路を見てみましたが

https://www.flightradar24.com/2022-05-28/14:01/12x/35.88,139.37/9

飛行機は無さそうでした。撮影場所は春日部から南西の方角。


 

ちなみに昨日の該当する時間の航路も見てみましたがそちらも何も飛んでなさそうでした。

2022年5月28日土曜日

火の玉?雷が光ってたのでコマ送りで見ていたら…

夜に雷が光ってたので、稲妻でも映り込んでないかな?とコマ送りで見てたのですが、



上中央から左下の方に流れる火の玉のようなものが…

落雷による火花かとおもったんですが、15秒間隔の撮影なので5枚に渡って映り込んでいるので流れている時間は最低でも1分15秒と、リアルタイムで見ていたら結構ゆっくりだと思います。時間は20:07:15。

Youtube クリップ 火の玉?

2022年5月19日木曜日

ffmpeg: h264_qsv hvec_qsv

raspberry pi 上でh265のハードウェアエンコードができないならWindowsで試してみるかと、試してみました。

ffmpegをダウンロードして様子を見てみると、intel系のチップで使えるハードウェアコーディックがありました。

quickなんちゃらと呼ばれているコーデックですが、ちゃんとエンコードもできそうなので早速エンコードしてみました。どうせならとソースはタイムラプスのmpgファイル…画像のソースは65%ぐらいなのでざらついていてノイジーな圧縮に不向きな状態だと思います。

試しの試でlibx265でエンコードしてみたところ、安価なネットブックなのでパワー不足なのは確かなのですが、1280x960で出だしから0.2倍速とか10FPS程度。
h265は設定にもよると思うのですが、後になるほどエンコード速度が落ちてゆくので、結構時間かかりそうなので[ctrl]+[c]を2回押して止めましたw

youtubeのアップロードでHDRにならなさそうなので動画のクリッピングをして720pでエンコードしてみようと思い、指定の仕方を調べていざスタート。(今だと720pは低画質に分類される気がしますが、まぁ2Kや4Kなんて環境はそろえる予定もないので…)

hevc_qsvで、エンコード速度は2.2ぐらいで始まって最終的に1.6~1.8倍(46FPS)程度でh264_qsvでは7~8倍で始まって、最終的に5.0倍(151FPS)程度でした。 

ただ、qsvは設定がハマってくれないのか、実際に出来上がったものを見たかぎりhevc_qsvのハードウェアエンコーダはあまり圧縮はできていないようで、h264_qsvとの差はあまりないような印象を受けました。(効果のあるオプションは -b:v -minrate -maxrate ぐらいしか見つけられませんでした。)libx265で驚くべきファイルサイズになったので感動したのですが、hevc_qsvは実装こそしてあるものの中身はh264なのでは?と疑いたくなるレベル。

hevcとh264のqsvはかなり似ていて、平均ビットレートの効果が強く、常に平均ビットレートに合わせる感じでした。変換中のビットレート表示を見る限りminrateとmaxrateはあまり効果がないようでした。出来上がったファイルサイズは、maxrateを上げた方が若干小さかったりとよくわからない結果も。


2022年5月17日火曜日

raspberry pi: ffmpeg ハードウェアエンコーダ(omx/v4l2m2m)かソフトウェアエンコーダ(libx264/libx265)か?

motionからの派生でffmpegも少しづつ触り始めて入るのですが、いかんせんよくわからないことだらけ。

知ってる知識は音や映像はかならずコーデックと呼ばれるデータ圧縮/伸張機能があって、処理としては、エンコード、デコードという手順を行うコーデックの事をエンコーダ、デコーダと呼ばれている。基本的にはコーデックは圧縮伸張機能を有しているが、実際には片側だけのものもある。この辺はオープンソースとか特許とか、いろいろしがらみがあるっぽい感じ。

まぁこのぐらいの薄っぺらな知識ぐらいしかない。

とは言え、実際に色々と扱ってはいるので、その範囲内なら癖はわかる。が、最近?かな?のh264とかh265の実情はあまりよくわからないまま、ちょっと触った感じだと、h265のエンコードって少し頑張ればリアルタイムでも使えるかも?と勘違いするぐらいしかmotionで使てみたぐらいです。

h264はDVDとかで見られる感じの基本的な感じ方はjpegっぽい感じが強い印象。データ量が足りなくなると途端ににじみやブロックノイズが激しくなる。

h265はごく短時間(数秒から数十秒)の動画の場合でもそれなりに圧縮率が高いのですが、動画時間が長くなればなるほど前処理に時間がかかり書き込み始めるまで時間がかかるように。さらに、ソフトウェアだと書き出しもかなり遅いです。試しにタイムラプスの雲動画の半分ぐらいの長さの物(1半分ぐらい?)をraspberry pi 3bでlibx265を使ってmpgから変換してみましたが、 1時間半ほどかかったうえ、後から温度グラフ見たこともない温度になってました…ファンついてるヒートシンクだけど、回してないのでw


ただ、圧縮がかなり効いていてmpgの単体のソースが107MBぐらいのものが5.6MBぐらいに…パラメータは-q 20ぐらいであとはそのまま。まぁ白いモヤモヤがモヤモヤしてるだけの動画で時間軸で圧縮が行われるとかなり圧縮できそうではありますが。ちなみにh264_v4l2m2mやh264_omxで圧縮すると、何をやっても固定ビットレートになってしまうようで参考になりませんが、libx264で同様のパラメータで出来上がったものは70MB程度と、なりました。圧縮時間はソフトウェアなので、1280x960のサイズの動画で10分程度かかってる感じでした。(グラフを見ると13時に大きな山がありますがこれがlibx265で処理している山で、70度まで上がってスロットリングが発生している気がします。その手前の山はlibx264で処理した状態だと思います。)

raspberry piの処理速度を考えると、motionで扱う場合、画像サイズは640x480程度で限界を超えていてフレームレートを落とす必要があったりします。ただ監視用途ではそこまでFPSが必要と言うわけではないので、あとは用途によってバランスを考える感じでしょうか。

4bではメモリーも増えて処理速度も上がってはいるのですが、その分排熱もかなり高く、単独で放置するのはちょっと気が引ける感じです。室内温度が上がる部屋だとちょっと危ない感じにはなりますが、その点3bplusぐらいまでならなんとか大丈夫かな?

で、結局こんなことを何でやったのかと言うと、raspberry piのハードウェアエンコーダでもうすこし綺麗でファイルサイズも小さくならないかな?と期待してみたのですが、先にも書きましたが、どうもハードウェアエンコードは固定ビットレートしか対応していないようで、どうも期待通りにパラメータが機能してくれませんでした。色々と見ると -passで2パスにするという手が使えるらしいのですが、手持ちの環境ではエラーではじかれてしまいました。

監視用に使っているのは640x480なのでもしかしたらh265でも行けそうな気はする。しかし、タイムラプスのファイルサイズを小さくするためにボード温度が危険域に入ってしまうのはとても危険と判断。昨日今日はたまたま涼しい感じになっているからこれで済んでいるが…

ちなみに、raspberry pi でh265のハードウェアエンコードは実装されていないようです。デコードはできそうな気がする。

youtubeにアップすると漏れなくブロックノイズが激しい…アップ前にもうちょっと何かしてあげないとだめなのかな?

2022年5月13日金曜日

motion: microlightswitch?

どこに需要があるかわからないmotionネタです…w

昨日から気になっていたほとんどまともに機能しないと思われるlightswitch関連。結論から言えば、処理速度があればあまり問題にならないのかもと思える結果となりました。

ここ数日の主なテスト環境はraspberry pi 3b plusで外部パイプを使ってffmpegでv4l2m2mのハードウェアコーデックを利用して動画を作成していました。

少なくても、この状態ではlightswitch関連の機能はほぼ絶望的な状態です。設定にもよりますが、ログを見てもmicrolightswitch!というログしか出てこなく、そのタイミングもかなり気まぐれな感じです。

そんな状況の中、githubでフォークさせてソースを直に変更してみました。(多分使い方が違うw)

気になるポイントとかも試しに書き換えたりデバッグ用のメッセージを入れたりと。

まずは設定項目を増やして、ついでに値の整合性を入力時に行えるように実装し直したりと少しづつ書き換えていると、ふと一つの疑問が。

「いつから機能しなくなったのだろう?」

と。しかし、私が知らなかっただけで、lightswitchの実装は結構古いらしく、ソースのヒストリーを見る限りこの辺りを変更した感じは無さそうでした。ソースの形式を大きく変えたのが4.3からの様でしたが、見ることのできる一番古い3.2でもlightswitch関連の実装がされているのを確認しました。

それだけ古くて誰も手を入れていないということは、全く使われていないか、設定によって動作が変わる?

と、ふと、一番特殊と思われる外部パイプの使用をやめてビルトインに任せてみました。

するとあら不思議。それなりに機能しているようなしてないような?そんな感じw(あんまり変わってない?w)

一番気に入らない点はlightswitch関連の機能を有効にすると録画される動画が不安定になることでした。が、ビルトインを使えばそんなことはなく、それなりに録画されました。

ってことは今度は外部パイプ周りを確認しなきゃかな?

ログを見る限りmicrolightswitchは普通に機能していない感じは強いかなぁ。

2022年5月11日水曜日

ffmpegの出力中にファイルを移動させると…

多分ファイルシステムが強固なwindowsなら、ファイル移動が失敗するのでしょうけど、linuxは簡単に移動できてしまう気がするのですが?

Windowsでも処理の実装方法によっては常にopenとcloseを繰り返している場合は処理中でも他からファイルを消したりすることはできるので、何とも言い難い部分だったり、そもそもそんな事するなと言うのが当たり前だったり。

まぁでもmotionだと内部からイベントの各タイミングで丁寧にフォークしてシェルコマンドが呼び出されてたりするので、かなり運用任せでいろいろできてしまうので表題のような処理になってしまいましたw

結論から言えば、運が良ければ動画ファイルとしては何とか通用するものとなりますが、ファイルフォーマット形式でいえば確実に破損状態となり、再生することもできなくなります。

motionで、ビルトインコーデックであれば外部イベント処理が呼び出される前に処理が完了している感じだったのですが、外部パイプでエンコーダ実行されている場合、エンコーダ自体もフォークされているっぽいので処理が終わってないことも。

試しに使ったlibx265とかだと、処理が重いためか確実に処理途中となってエラー処理になってしまっていました。ハードウェアが利用できると処理が軽くなるために今までは気になったことはないのですが、先ほど書いた記事にある通り、minimum_motion_framesを20とか頭の悪い設定していると、エンコード処理が間に合わずエラー処理へ。

で、そこからはエラー処理の話になるのですが、後からチェックできるようにエラーファイルはゴミも含めてフォルダに退避させているのですが…まだ出力中のファイルを移動することになって結局動画が死んでしまうというジレンマに。

そして結局取るべき措置としては、エンコードしている場合は処理を待ちましょうということ。

linuxではよくある話らしく、psとgrepを使ってプロセスを監視するのが当たり前の様で。

で、実装して処理を待つようにしました。ビルトインの場合はチェックができない…なのでまぁ外部パイプでエンコードしている場合のみですが回避できるように。

しかし、最初はそんなに大したことにはならないはずだったのに、結構色々詰め込んでしまった気がする。

motion: 引き続きlightswitchネタ


色々と調整しているとボケてしまっていたようで、lightswitchを有効にすると反応が鈍くなると感じたのminimum_motion_frames20になっていたのが原因かも。環境としては10FPSなので時間にして2秒間動かないと検知されない状態。そりゃ鈍いw

早速これを2フレームとかにすると反応は良くなりました。

いつ変えたのか正直記憶に無いわけでログを見直す気もないのでさっさと先に進むことに。

再度lightswitchを有効にして…様子を見ることに。

部屋を暗くしてライトをつけてもちゃんと防御してくれてるっぽい。ログにも
[1:ml1:D] [NTC] [ALL] [ 5月 11 20:22:14] mlp_actions: イベント11の終了
[1:ml1:D] [INF] [ALL] [ 5月 11 20:27:58] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [NTC] [ALL] [ 5月 11 20:40:53] motion_detected: モーションが検出されました. - イベント12を開始中

となっているのですが、ちょっと違和感…ログレベルを下げたのでdebugログが出てないかもしれないのでソースを確認しましたが…

MOTION_LOG(INF, TYPE_ALL, NO_ERRNO, _("Lightswitch detected"));

と言うのが先に来なきゃいけないような?INFレベルだし多分処理が通過すればログに残るよね?

なんで

MOTION_LOG(INF, TYPE_ALL, NO_ERRNO, _("micro-lightswitch!"));

が先に出てしまってるのだろう?

ま、様子を見つつも…もっと強烈なのが来ました。

[1:ml1:D] [NTC] [ALL] [ 5月 11 21:46:06] motion_detected: モーションが検出されました. - イベント15を開始中
[1:ml1:D] [INF] [EVT] [ 5月 11 21:46:06] event_ffmpeg_newfile: ソースFPS 6
[1:ml1:D] [INF] [ENC] [ 5月 11 21:46:06] ffmpeg_set_quality: libx264 コーデック vbr/crf /ビットレート: 30
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:46:06] event_newfile: 動画ファイルを出力中です: /home/motion/tmp/OrbitAF_2/20220511214605D-15.mp4
[1:ml1:D] [INF] [ENC] [ 5月 11 21:46:06] ffmpeg_set_quality: libx264 コーデック vbr/crf /ビットレート: 30
[1:ml1:D] [INF] [EVT] [ 5月 11 21:46:06] event_create_extpipe: ソースFPS 6
[1:ml1:D] [NTC] [ALL] [ 5月 11 21:46:06] mycreate_path: ディレクトリ /home/motion/tmp/OrbitAF_2を作成しています
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:46:06] event_create_extpipe: パイプ: ffmpeg -y -f rawvideo -pix_fmt yuv420p -video_size 640x480 -framerate 6 -i pipe:0 -vcodec h264_v4l2m2m -b:v 4000k -f mp4 /home/motion/tmp/OrbitAF_2/20220511214605D-15.mp4
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:46:06] event_create_extpipe: cnt-> moviefps:6
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:46:06] event_newfile: 動画ファイルを出力中です: /home/motion/tmp/OrbitAF_2/20220511214605D-15
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:08] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:12] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:14] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:16] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:23] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:25] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:27] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:29] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:32] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:37] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:39] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:40] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:41] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:43] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:52] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:55] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:09] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:11] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:12] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:20] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:22] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:46] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:48:19] event_newfile: 画像ファイルを出力中です: /home/motion/tmp/OrbitAF_2/20220511214725D-15-01.jpg
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:48:19] event_extpipe_end: クローズ中: extpipeファイルの説明 12、エラー状態 0
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:48:19] event_extpipe_end: pcloseリターン値: -1
[1:ml1:D] [NTC] [ALL] [ 5月 11 21:48:19] mlp_actions: イベント15の終了


撮影された動画を見ると映像が出てこないw

ほかのも見てみると動画出力中にこの「マイクロライトスイッチ!」のログが混じっている場合はなんか動画が乱れて終わっていました。

なんだかコードの前後でthreshold_tuneとかnoise_tuneとか私は使ってないけど有望そうなパラメータも死んでそう…ま、置いといてw

やっぱりこの辺おかしくなってる感じですねぇ。


あとlightswtich関連の実装部分でやたらと範囲チェックして補正欠けてたりするんですが、ハッキング対策を考えるとありっちゃありだと思うんですが、理想論としてはやはり設定値を読み込んだり、外部から設定されるタイミングで範囲チェックして、補正するなら強制的に補正して取り込んで、処理中に設定値の範囲チェックなんてやってる場合じゃないと思うんですが。デバッグしてると疑心暗鬼になって不安に駆られて入れたくなるのは理解できるのですが。

ffmpeg : -c:v copy で 小さくなる?

motionで外部パイプの外出しffmpegで動画を作成させるのは色々と無駄な感じがするものの、motionのビルドや実行環境の整合性などを考えると安定感はあるのかなとちょいちょい使ってみてはいるのですが、ffmpegの癖なのかドライバの癖なのか意外と一筋縄ではいかなかったり。

そんな右往左往しているときに少しづつ調整しても圧縮されすぎて出来上がった動画がブロックノイズと言うよりもモザイク状態になってしまい仕方なしに固定ビットレートで結構大きめに指定することでようやくまともな動画に。

動作を見ていると出来上がったmp4ファイルは2M程度の大きさだったはずが、音声とマージして出来上がったのが800kとかやたらと小さくなっている現象を目の当たりにしました。

早速VLCのメディア情報の統計を見比べてみるとビットレート自体は変わってない感じただ、ブロック数とフレーム数の数が一致していなかった。ただ音声を結合させているのでこの辺の数字は何ともな感じ。なので、処理途中のファイルを抜き出して同様の処理を通してみることに。

pi@rasp3bprs:~ $ ffmpeg -i /home/motion/tmp/OrbitAF_2/20220511102817D-03.mp4 -c:v copy ./out.mp4

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1b3ecd0] st: 0 edit list: 1 Missing key frame while searching for timestamp: 0
[h264 @ 0x1b40120] no frame!
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/motion/tmp/OrbitAF_2/20220511102817D-03.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.45.100
  Duration: 00:00:32.40, start: 0.000000, bitrate: 633 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480, 165 kb/s, 5.03 fps, 5 tbr, 10240 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Output #0, mp4, to './out.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.45.100
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480, q=2-31, 165 kb/s, 5.03 fps, 5 tbr, 10240 tbn, 10240 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame=  162 fps=0.0 q=-1.0 Lsize=     657kB time=00:00:32.20 bitrate= 167.2kbits/s speed=3.52e+03x
video:656kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.218411%


もとのファイル

2,565,577 バイト
325ブロック
463フレーム

出来上がったファイル

673,137 バイト
325ブロック
463フレーム

ブロック数とフレーム数は一致。ただ、出来上がったファイルサイズはかなり違う。

32秒の動画で、motionから作成しているときのffmpegのパラメータは-b:v 1000kとしている。
bpsなので1秒当たりのビット数。細かい数字は置いておいて(差が2割ぐらい出そうですが)、ざっくりした数字は 8で割った数が1秒間のバイト数 125k程度と言うことかな?

それの32倍 4000kバイト…なんか出来上がったファイルも想定より全然小さいのだが…。

fpsと総フレーム数が合ってなさそうなのでmotionのログを見てみると、

[1:ml1:D] [NTC] [ALL] [ 5月 11 10:28:21] motion_detected: モーションが検出されました. - イベント3を開始中
[1:ml1:D] [INF] [EVT] [ 5月 11 10:28:21] event_ffmpeg_newfile: ソースFPS 5
[1:ml1:D] [NTC] [ENC] [ 5月 11 10:28:21] ffmpeg_set_codec: fpsが低いため, 5フレームを10フレームコンテナに変換しています
[1:ml1:D] [INF] [ENC] [ 5月 11 10:28:21] ffmpeg_set_quality: libx264 コーデック vbr/crf /ビットレート: 30
[1:ml1:D] [NTC] [EVT] [ 5月 11 10:28:21] event_newfile: 動画ファイルを出力中です: /home/motion/tmp/OrbitAF_2/20220511102817D-03.mp4

コンテナ的には10フレームにしているように見えるが、libx264とか出てる時点で動作検知動画の方を指しているような気もしないでもなく。

フレーム数から考えても実際の動画の記録時間と一致しない。

思考停止…

動画の中身を見てみると、表示されている時間は 10:28:17で始まって10:29:00で終わっている。なので、時間軸は43秒ほど。よくよく見ていると間に何度か飛んでいる状態になっているので、再生時間と一致はしてないけど、処理としては全てのフレームは出力している形になっているのかな?なんか考えるだけおかしくなりそうな動画。

そもそもraspberry piで動いているmotionは無理してる感が強いので気にしてはいなかったのですが、なかなか難儀な現状なのだと実感。

まぁこの辺のことは一旦保留。

現状、omxとかv4l2m2mとかのハードウェアでエンコードしようとするとどうも思い通りにならず、予想よりはるかに劣化した動画になっているのが大問題。

パイプで外部プログラムでエンコードするとビルトインのエンコードと違って遅延もそれなりに発生しているのでイベント処理で結構面倒なことになってたり。

エンコードで固定ビットレートを理論値よりかなり大きくしないと思った通りの動画にならず、その上出来上がった動画をcopyしているだけのはずが、ファイルサイズが小さくなるという。

ま、あれか?ファイルサイズが小さくなるというのは単純に処理上領域確保してデータを書き込んで、閉じて、追記でまたファイルを開いて領域を確保してデータを書き込んで…を繰り返した結果、余計なパディングが発生しているってことでいいのかな? -c:v copyの場合はそのパディングが無くなっただけなのかな?

バイナリチェックしないと何とも言えんな…

なんかあまりバイナリ比較がまともに行えなかったものの、テキストとして強制的に比較した結果、所々の違いはあったものの、元のファイルは末尾にゴミが付いていただけの様子。

予想ではフレームとフレームやブロックとブロックの間にパディングされているものだと思ったのだが。

motion: lightswitch

イベント周りの実装がかなり気になってきたので、少しソースを眺めていました。

気になっていたのは、動作検知して、検知状態に移ってから、解除されるまでの流れがきれいに出来上がっていて、その流れをうまくコントロールできるかどうか知りたかったからなのですが…。そもそもイベントループ中の無駄なループを排除したいという思惑はGW前からあったのですが、どのくらい処理が無駄になっているのかを比較したかったのですが、休み中は全く別の事で手一杯にw

その中で気になる逃げの実装になっている一つがlightswitch関連の設定値。

イベント関連の実装の手直しが結構最近行われていてこのような実装になっているのだと思います。現状では画像の差異の量を、lightswitchの条件下で強制的に0にしているのですが、このようなことを行うと後々痛い目を見そうな感じ。

実際にこの設定を使うと、結構色々なところで誤検知されているのを回避できるので便利そうなのですが、現状だと動作検知がかなり鈍くなっている気がします。

ついでに、昔は起動時や再起動時は普通に開始できたのですが、lightswitchの設定が無効の状態だと必ず最初に動作検知状態に突入し、処理が行われてしまいます。

停止と開始を切り分けず、再始動させれば発生しない感じではあるのですが、設定値をガンガンいじっている現状ではこの動作もかなり目につきます。

なので、この辺ちょっとテコ入れしたいかな…


あと、気づいてなかっただけかもしれませんが、昔は動作検知の出力と実際のカメラ画像はどちらかしか出力できなかったと思うのですが、現状では同時に出力させることができるというとても便利な機能に仕上がってたりして、検知反応を簡単に見れるようになっているのでそっちもテコ入れしたかったりw

まぁでもそこまで触れるかなぁ…

ffmpegのパラメータ周りも、codecの指定もできるようになっていて便利そうだったりするのですが、イマイチうまくいかなかったり、motionプロセス保護のためにblacklistまで用意して、特定のcodecのガードをかけていたり。ガードはすぐ外せるようになってるのですが、ガードがかかってないcodecを指定すると出力がまともにできなかったりするのでそっちも気になります。

2022年5月9日月曜日

C270 白飛びはもしかして…

C270は2つあって、どちらが古いのか若干怪しいのですが、新しいとしてもアマゾンの履歴を見る限り2016/3/28となっているので6年以上前の物となります。

なので暗い夜空の中に見える白い点はカメラセンサの不良か劣化だと思っていたのですが、もしかすると単に動作通知ランプの映り込みかも。

今までここまで暗い中でガラス越しに撮影した経験がないためはっきりとは分からないのですが…

時間ができたら撮影を一旦止めて通知ランプを確認したほうがいいのかもしれません。あと埃もw



2022年5月7日土曜日

C505

アマゾンでWebCamを見ているとC310nなるものを発見。したのは3日ほど前w

勢いでカートに入れたものの、どうせ買うならもう少しいいものが欲しいかもと1日悩んで結局購入したのはC505でした。

用途的に解像度は必要がなく、そこそこ撮影の設定ができればと最近のモデルが欲しいかなと。nシリーズとしてC270nもあり、最初はどちらがいいか悩みつつ。

後から気づいたのが、C270nとC310nの機能的な違いとしては画角が5度ほど違っているようでした。手持ちのC270を購入した時は画角なんて気にもしなかったのですが、用途的には広角の方がよいのですが。

C270から比べれば上位機種っぽいC505ですが、実際にどのくらい違うのか手元に届くまで期待と不安が募ります。

手元に届き早速開封して接続してみました。そしてv4l2-ctl -L で設定パラメータを見てみると…

                     brightness 0x00980900 (int)    : min=0 max=255 step=1 default=128 value=128
                       contrast 0x00980901 (int)    : min=0 max=255 step=1 default=32 value=32
                     saturation 0x00980902 (int)    : min=0 max=255 step=1 default=32 value=32
 white_balance_temperature_auto 0x0098090c (bool)   : default=1 value=1
                           gain 0x00980913 (int)    : min=0 max=255 step=1 default=64 value=131
           power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=2 value=2
                                0: Disabled
                                1: 50 Hz
                                2: 60 Hz
      white_balance_temperature 0x0098091a (int)    : min=0 max=10000 step=10 default=4000 value=7530 flags=inactive
                      sharpness 0x0098091b (int)    : min=0 max=255 step=1 default=24 value=24
         backlight_compensation 0x0098091c (int)    : min=0 max=1 step=1 default=0 value=0
                  exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=3
                                1: Manual Mode
                                3: Aperture Priority Mode
              exposure_absolute 0x009a0902 (int)    : min=1 max=10000 step=1 default=166 value=665 flags=inactive
         exposure_auto_priority 0x009a0903 (bool)   : default=0 value=1

あんまりC270と変わりませんでしたw

外も少し暗くなってきたので、実際にどのぐらい撮影できるのか確認してみることに。

部屋の中で撮影してみると、全体的に鮮明で反応速度もいい感じ。照明を落としてみるとディスプレイの明かりだけで特に何もしなくてもそれなりに撮影できました。

ただ、ここで気になるところが。動作状態ランプが結構眩しい。

さらに暗いシーンだと、画像のランプ側にその光が干渉している感じ。C505の本体はC270の作りとほとんど変わりがなく、正面のカバーを外すとネジ3本でケースを開けることができました。LEDを物理的に外してもいいのですが、とりあえず光を拡散させるための半透明のプラスチック部分をアルミホイルで覆ってテープで固定してみました。変な接触が怖いので絶縁のためにただのテープでくるんでみました。元に戻して様子を見てみると外に漏れている光はほとんどないのですが、画像の干渉はあまり変化がありません。もしやと思い、レンズ部分を指で覆ってみると…

どうも内部でレンズユニット部分にLEDの光が干渉してしまっているようです。

仕方がないので、梱包に使われていた紙テープが厚そうだったので粘着剤が剥離している部分を使って仕切りを作ってみました。これでなんとか干渉がほとんどなくなったような感じに。

窓から外を撮影してみると、それなり。しかし、暗いベランダのある窓の下に置いて見上げる形で撮影してみたのですが、夜空は撮影できそうになかった。まぁ仕方ないかwパラメータを操作して雲が撮影できる感じにして少し放置してみました。motionの設定をしつつ、様子を見ていたのですが、少し経つとなぜか画像が真っ黒に。この状態になってからパラメータを操作してほとんど効果がなく仕方がないのでとりあえず初期値に戻してから設定し直してみると、何となく撮影できそうだったので放置しているとまたまた真っ黒に。

意味が解らないので、とりあえずタイムラプスを撮影しているC270の窓に置いて撮影してみることに。ここで色々と設定を変えてパラメータの様子を見てみると、どうもexposure_absoluteの値がC270より反応が強い感じ。しかも、マニュアルモードになっているはずなのに、設定後にさらに補正されて数秒で画像の明るさが変動しました。操作していると真っ暗になってしまう原因の一つにexposure_absoluteの値を限界値に設定するとしばらくしてから真っ暗になってしまうようなので値を6000程度にすると真っ暗になりませんでした。

強制的な自動補正がどの程度効いているのか夜間の空を撮影しながら放置して朝見てみると画面は真っ白。さすがにそこまでは強制補正は行われないようです。

C505の販売日は2020/11/19とのこと。定価は¥3,300。今回購入した金額は¥2,500程度。この値段でこれだけ映れば悪くはないんじゃないかな。ただ、現状のままだと、暗い部屋での撮影は内部のLED干渉があるので、この点はコストカットで干渉部分の保護パーツが外されたのか、LEDの輝度が上がったための干渉なのかわかりませんが何とかしてほしいところ。人によってはクレーム出そうですが、ググってみましたがその手の話題今のところ痕跡は見つかりませんでした。

C270をv4l2-ctlでパラメータを操作していて

発売開始時期は知らないが、10以上前なのは確実だと思う。ちょっと調べてみるか…

同じ名前で何度かリニューアルされている感じがするが、最近ではC270nとなってほかのモデルも~nとなってリニューアルされている。C310もC310nとなっていた。

C270はhttp://www.macotakara.jp/blog/accessories/entry-9235.htmlを見ると、2010/08/27となっていた。初代はもっと古かった気もするが、このぐらいなのかもしれない。アマゾンで見ると発売日が2010/8/20となっていたがC310も同じ日付になっていたので、正しい日付はおそらく27日。アマゾンの情報を信頼するなら、定価はC270は¥4,980、C310は¥5,800の模様。記憶ではC270の実売価格は¥3,200~¥1,350ぐらいだったと思う。リニューアルは実売価格に対する販売価格調整だと思う。

夜空を直接撮影していて気付いたパラメータ設定に癖があったのでメモ書き。

明るい場所の撮影は自動調整でほぼ問題なくそれなりに撮影できる。反応速度も実用範囲内だと思う。

pi@rasp3b:~ $ v4l2-ctl -d /dev/video1 -L
                     brightness 0x00980900 (int)    : min=0 max=255 step=1 default=128 value=128
                       contrast 0x00980901 (int)    : min=0 max=255 step=1 default=32 value=32
                     saturation 0x00980902 (int)    : min=0 max=255 step=1 default=32 value=32
 white_balance_temperature_auto 0x0098090c (bool)   : default=1 value=1
                           gain 0x00980913 (int)    : min=0 max=255 step=1 default=64 value=192
           power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=2 value=0
                                0: Disabled
                                1: 50 Hz
                                2: 60 Hz
      white_balance_temperature 0x0098091a (int)    : min=0 max=10000 step=10 default=4000 value=6760 flags=inactive
                      sharpness 0x0098091b (int)    : min=0 max=255 step=1 default=24 value=24
         backlight_compensation 0x0098091c (int)    : min=0 max=1 step=1 default=0 value=0
                  exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=3
                                1: Manual Mode
                                3: Aperture Priority Mode
              exposure_absolute 0x009a0902 (int)    : min=1 max=10000 step=1 default=166 value=5 flags=inactive
         exposure_auto_priority 0x009a0903 (bool)   : default=0 value=1

これは屋内撮影を想定した使用を想定しているため、暗い場所での撮影は自動ではうまく撮影できない。限界まで感度を得ようとすると露光とゲインを上げて撮影する。そのために

v4l2-ctl -c gain=255,exposure_auto=1,exposure_absolute=10000

というように1回実行し、-Lでパラメータを確認するとちゃんとパラメータが反映されているように見えるのだが、実際の得られる画像がまだ暗い。もう一度実行すると、明るくなる。どうも設定値と実際にデバイスが動作している値とズレがある。C270のファームウェアのバグか、ハード的なバグか、v4l2-ctl側のバグかは不明。だが、どうもおかしい。

一気に設定しているので順番を入れ替えてみるが、変化なし。2回設定を実行する必要がある。

設定値を一つ一つバラバラに実行してみると、状況が若干変わる。

gainを設定して、exposure_autoを設定して、exposure_absoluteを設定しても一気に設定した状態と変わらないが、さらにgainを設定すると、画像が明るくなった。

次に順序を変えてみる。

exposure_auto=3ではexposure_absoluteをセットしても無視されるので最初にexposure_auto=1を実行するのは必須。そのあとexposure_absoluteをセットする。その後gainを上げると…あら不思議、ちゃんと動いた。

結論として、マニュアルでexposure_absoluteをセットすると、C270内部のgainが強制的に書き換えらえれいるように見える。よって、exposure_absoluteを設定した後はgainを設定する必要がある。

余談として、逆にexposure_autoをマニュアル(1)から自動(3)にして結果としてexposure_absoluteが変化してもgainは変化していないように見えた。

2022年5月6日金曜日

raspberry pi 4b: w1_master_driver w1_bus_master1: Family 0 for 00.400000000000.46 is not registered.

GW最初に寝かせていたraspberry piをmotionだけ一時的に使いたかったので電源を入れてみたところ、SDカードが不調になったので別のSDカードにインストールして動かしていたのですが、syslogを今まで見かけたことのないエラーが繰り返し表示されていた。

そのログは起動時は問題ないが、起動後にエラーが繰り返している様子。

May  4 13:30:34 rasp4b4g kernel: [    7.687656] w1_master_driver w1_bus_master1: w1_search: max_slave_count 64 reached, will continue next search.

May  4 13:40:25 rasp4b4g kernel: [   58.337671] w1_master_driver w1_bus_master1: Attaching one wire slave 00.800000000000 crc 8c
May  4 13:40:25 rasp4b4g kernel: [   58.346399] w1_master_driver w1_bus_master1: Family 0 for 00.800000000000.8c is not registered.
May  4 13:41:28 rasp4b4g kernel: [  121.919916] w1_master_driver w1_bus_master1: Attaching one wire slave 00.400000000000 crc 46
May  4 13:41:28 rasp4b4g kernel: [  121.928212] w1_master_driver w1_bus_master1: Family 0 for 00.400000000000.46 is not registered.
May  4 13:42:19 rasp4b4g kernel: [  172.702498] w1_master_driver w1_bus_master1: Attaching one wire slave 00.c00000000000 crc ca
May  4 13:42:19 rasp4b4g kernel: [  172.710612] w1_master_driver w1_bus_master1: Family 0 for 00.c00000000000.ca is not registered.
May  4 13:43:35 rasp4b4g kernel: [  249.143787] w1_master_driver w1_bus_master1: Attaching one wire slave 00.200000000000 crc 23
May  4 13:43:35 rasp4b4g kernel: [  249.149572] w1_master_driver w1_bus_master1: Family 0 for 00.200000000000.23 is not registered.
May  4 13:40:25 rasp4b4g kernel: [   58.337671] w1_master_driver w1_bus_master1: Attaching one wire slave 00.800000000000 crc 8c
May  4 13:40:25 rasp4b4g kernel: [   58.346399] w1_master_driver w1_bus_master1: Family 0 for 00.800000000000.8c is not registered.
May  4 13:41:28 rasp4b4g kernel: [  121.919916] w1_master_driver w1_bus_master1: Attaching one wire slave 00.400000000000 crc 46
May  4 13:41:28 rasp4b4g kernel: [  121.928212] w1_master_driver w1_bus_master1: Family 0 for 00.400000000000.46 is not registered.
May  4 13:42:19 rasp4b4g kernel: [  172.702498] w1_master_driver w1_bus_master1: Attaching one wire slave 00.c00000000000 crc ca
May  4 13:42:19 rasp4b4g kernel: [  172.710612] w1_master_driver w1_bus_master1: Family 0 for 00.c00000000000.ca is not registered.
May  4 13:43:35 rasp4b4g kernel: [  249.143787] w1_master_driver w1_bus_master1: Attaching one wire slave 00.200000000000 crc 23
May  4 13:43:35 rasp4b4g kernel: [  249.149572] w1_master_driver w1_bus_master1: Family 0 for 00.200000000000.23 is not registered.
May  4 13:44:39 rasp4b4g kernel: [  312.726603] w1_master_driver w1_bus_master1: Attaching one wire slave 00.a00000000000 crc af
May  4 13:44:39 rasp4b4g kernel: [  312.736281] w1_master_driver w1_bus_master1: Family 0 for 00.a00000000000.af is not registered.
May  4 13:45:17 rasp4b4g kernel: [  350.645643] w1_master_driver w1_bus_master1: Attaching one wire slave 00.600000000000 crc 65
May  4 13:45:17 rasp4b4g kernel: [  350.656778] w1_master_driver w1_bus_master1: Family 0 for 00.600000000000.65 is not registered.
May  4 13:45:57 rasp4b4g kernel: [  391.145835] w1_master_driver w1_bus_master1: Attaching one wire slave 00.e00000000000 crc e9
May  4 13:45:57 rasp4b4g kernel: [  391.154513] w1_master_driver w1_bus_master1: Family 0 for 00.e00000000000.e9 is not registered.
May  4 13:47:00 rasp4b4g kernel: [  454.127072] w1_master_driver w1_bus_master1: Attaching one wire slave 00.100000000000 crc 9d
May  4 13:47:00 rasp4b4g kernel: [  454.135840] w1_master_driver w1_bus_master1: Family 0 for 00.100000000000.9d is not registered.
May  4 13:47:40 rasp4b4g kernel: [  493.277022] w1_master_driver w1_bus_master1: Attaching one wire slave 00.900000000000 crc 11
May  4 13:47:40 rasp4b4g kernel: [  493.284808] w1_master_driver w1_bus_master1: Family 0 for 00.900000000000.11 is not registered.
May  4 13:48:55 rasp4b4g kernel: [  568.486570] w1_master_driver w1_bus_master1: Attaching one wire slave 00.500000000000 crc db
May  4 13:48:55 rasp4b4g kernel: [  568.494303] w1_master_driver w1_bus_master1: Family 0 for 00.500000000000.db is not registered.
May  4 13:49:47 rasp4b4g kernel: [  620.475808] w1_master_driver w1_bus_master1: Attaching one wire slave 00.d00000000000 crc 57
May  4 13:49:47 rasp4b4g kernel: [  620.484518] w1_master_driver w1_bus_master1: Family 0 for 00.d00000000000.57 is not registered.
May  4 13:50:13 rasp4b4g kernel: [  646.925677] w1_master_driver w1_bus_master1: Attaching one wire slave 00.300000000000 crc be
May  4 13:50:13 rasp4b4g kernel: [  646.933426] w1_master_driver w1_bus_master1: Family 0 for 00.300000000000.be is not registered.
May  4 13:51:03 rasp4b4g kernel: [  696.325929] w1_master_driver w1_bus_master1: Attaching one wire slave 00.b00000000000 crc 32
May  4 13:51:03 rasp4b4g kernel: [  696.335037] w1_master_driver w1_bus_master1: Family 0 for 00.b00000000000.32 is not registered.
May  4 13:51:42 rasp4b4g kernel: [  735.565958] w1_master_driver w1_bus_master1: Attaching one wire slave 00.700000000000 crc f8
May  4 13:51:42 rasp4b4g kernel: [  735.574970] w1_master_driver w1_bus_master1: Family 0 for 00.700000000000.f8 is not registered.
May  4 13:52:34 rasp4b4g kernel: [  787.545977] w1_master_driver w1_bus_master1: Attaching one wire slave 00.f00000000000 crc 74
May  4 13:52:34 rasp4b4g kernel: [  787.553953] w1_master_driver w1_bus_master1: Family 0 for 00.f00000000000.74 is not registered.
May  4 13:53:36 rasp4b4g kernel: [  850.006573] w1_master_driver w1_bus_master1: Attaching one wire slave 00.080000000000 crc c2
May  4 13:53:36 rasp4b4g kernel: [  850.014503] w1_master_driver w1_bus_master1: Family 0 for 00.080000000000.c2 is not registered.
May  4 13:54:30 rasp4b4g kernel: [  903.266685] w1_master_driver w1_bus_master1: Attaching one wire slave 00.880000000000 crc 4e
May  4 13:54:30 rasp4b4g kernel: [  903.274555] w1_master_driver w1_bus_master1: Family 0 for 00.880000000000.4e is not registered.
May  4 13:55:07 rasp4b4g kernel: [  941.107598] w1_master_driver w1_bus_master1: Attaching one wire slave 00.480000000000 crc 84
May  4 13:55:07 rasp4b4g kernel: [  941.116282] w1_master_driver w1_bus_master1: Family 0 for 00.480000000000.84 is not registered.
May  4 13:55:58 rasp4b4g kernel: [  991.797850] w1_master_driver w1_bus_master1: Attaching one wire slave 00.c80000000000 crc 08
May  4 13:55:58 rasp4b4g kernel: [  991.805829] w1_master_driver w1_bus_master1: Family 0 for 00.c80000000000.08 is not registered.
May  4 13:57:15 rasp4b4g kernel: [ 1068.479304] w1_master_driver w1_bus_master1: Attaching one wire slave 00.280000000000 crc e1
May  4 13:57:15 rasp4b4g kernel: [ 1068.488104] w1_master_driver w1_bus_master1: Family 0 for 00.280000000000.e1 is not registered.
May  4 13:58:18 rasp4b4g kernel: [ 1131.990488] w1_master_driver w1_bus_master1: Attaching one wire slave 00.a80000000000 crc 6d
May  4 13:58:18 rasp4b4g kernel: [ 1131.999217] w1_master_driver w1_bus_master1: Family 0 for 00.a80000000000.6d is not registered.
May  4 13:59:22 rasp4b4g kernel: [ 1195.491899] w1_master_driver w1_bus_master1: Attaching one wire slave 00.680000000000 crc a7
May  4 13:59:22 rasp4b4g kernel: [ 1195.500845] w1_master_driver w1_bus_master1: Family 0 for 00.680000000000.a7 is not registered.
May  4 14:00:02 rasp4b4g kernel: [ 1235.942504] w1_master_driver w1_bus_master1: Attaching one wire slave 00.e80000000000 crc 2b
May  4 14:00:02 rasp4b4g kernel: [ 1235.951466] w1_master_driver w1_bus_master1: Family 0 for 00.e80000000000.2b is not registered.
May  4 14:01:05 rasp4b4g kernel: [ 1299.103551] w1_master_driver w1_bus_master1: Attaching one wire slave 00.180000000000 crc 5f
May  4 14:01:05 rasp4b4g kernel: [ 1299.112035] w1_master_driver w1_bus_master1: Family 0 for 00.180000000000.5f is not registered.
May  4 14:01:45 rasp4b4g kernel: [ 1338.304235] w1_master_driver w1_bus_master1: Attaching one wire slave 00.980000000000 crc d3
May  4 14:01:45 rasp4b4g kernel: [ 1338.312876] w1_master_driver w1_bus_master1: Family 0 for 00.980000000000.d3 is not registered.
May  4 14:02:34 rasp4b4g kernel: [ 1387.584971] w1_master_driver w1_bus_master1: Attaching one wire slave 00.580000000000 crc 19
May  4 14:02:34 rasp4b4g kernel: [ 1387.594343] w1_master_driver w1_bus_master1: Family 0 for 00.580000000000.19 is not registered.

ある程度抜き出してみたが、w1と言われて心当たりがありそうなのはone wire絡みなのか?と言うところ。初期設定でインタフェースは有効にした記憶があるが、まだプログラムは動かしていない。物理的につながっているのはI2Cと、ただのIOポートにぶら下がっている温度計だけのはず。なんにしても今までこんなエラーの記憶は全くない。なので検索してみるとraspberry pi 公式のアーティクルがヒットした。

w1_master_driver w1_bus_master1: Family 0 for 00.200000000000.23 is not registered. - Raspberry Pi Forums

細かいt頃が全く分からないものの、、最終的にはraspi-configで1wireインターフェースをオフにするということ。フォーラム内ではなぜか直接/boot/configを修正する感じになっていた。

インタフェースをオフにしてデバイスが使えなくても今は問題がないので、早速インタフェースをオフに。そして再起動。

ログを見る限りエラーは出なくなった。4bだとone wireが使えないのか接続すればエラーが無くなるのかはよくわからない、

2022年5月3日火曜日

PHPから読み込むiniファイルでハマる

色々とテコ入れしているので影響範囲が大きかったりします。

各環境で仕様で吸収できない部分を仕方なしにiniファイルを使って設定しています。

できる限り最小限にすべく、一つのiniにしています。

iniにしている理由はPHPでiniファイルがそのまま扱えたというのが経緯だったりするのですが、PHP7.0以降なんか条件が無駄に厳しくなっていって変な方向に行っているので捨ててもいいのかも。

ローカル仕様なら仕様を単純にすることができるので、外的仕様による余計な時間を取られなくなるので。そもそもiniファイルにそんな難しい仕様を盛り込むべきじゃない。

と、今回ハマったのは、テコ入れしてていつの間にか温度ログを表示しているグラフがモノクロ表示になってしまったことが始まりでした。

最初はLinuxバージョンを上げた影響か、メモリ不足が原因かと思ってたのですが、どうも原因がはっきりせず、もしくはaptでインストールされているパッケージ特有のバグかとも思ったのですが、よくわからず。パッケージもインストールされているし、不足してそうなライブラリもなかった。そもそも作業前はちゃんとカラーになってたし。

気を取り直してapatchのログを見てみると、errorログ内に大量にphpのエラー表示が。

エラーは特定の一つの行でPHP Notice:  Undefined indexというメッセージ。

ソースを見てもエラーとなりそうじゃないので、早速デバッグ用にスクリプトを入れてターミナルから直接実行してみると、該当の配列が見事に空っぽ。へ?w

何度か実行し一番最初に見かけないエラーがあるのに気づきました。

PHP Warning:  syntax error, unexpected '=' in /etc/xxxxxxx.ini on line 41
 in /home/htdocs/graph_temperature.php on line 117 

iniファイルに無効な=が…ってありますよ。確かに。文法的にはエラーだろうけど、iniファイル的にはオッケーなんじゃないかな…普通…

仕方がないので、ダブルコーテーションで括ってやり過ごしましたが、実際使う側でも不要な処理が増えてしまいました。

無事グラフも元通りに。つ、つかれた…。

改行コードでハマる

ついこの前も改行コードでハマってたんですが、今日も思いっきりハマりました。

GW直前からメモ帳で開きっぱなしのソースがあるため、各デバイスにソースを入れ込むのにターミナルからホームディレクトリにファイル転送させて必要な手順でスクリプトを配置していて結構問題になる改行コード。

最近だと見た目にあまり影響がなくなっている(windowsの文字コードがansiからほとんどUNICODEベースに変わりメモ帳でもUTFが扱えるようになった)ので気づきにくいのですが、改行コードだけはいまだに CR+LF。

MacもUnixベースになったとはいえ、もうこの辺は宗教的な何かとなっているのでお互いに歩み寄ろうという気配は全くありません。

愚痴ネタなので止まらなくなりそうですが、ここでやめて本題へ…w

今回ハマったのは主にbashスクリプトでこの辺のトラブルを避けるために基本的に、私は必ずどこかのサーバーに投げてそこからwgetで受けて、インストールスクリプトで配置する方法をとることでポカミスを減らしています。が、今回はこれを行わずにテスト的にやっているので思いっきりハマってしまいました。

そもそもbashだとどこで改行コード問題が発生するかと言えば、結構たくさんあります。

一番目立つのは各コマンドを実行するステートメントがあったとして、いくつかのパラメータがあった場合に問題が発生します。

改行コードが\nではなく\r\nとなっていた場合、見た目テキにどちらも変わらないわけですが、

command param\r

となっていた場合、param自体の意味合いが重要な場合、顕著に発生します。

commandプログラムがparamを参照したときに、param\rとして見えてしまうため、単純に比較している場合、paramとして認識できなくなるわけです。

パラメータが無ければ影響は減ると思いますが、bashスクリプトでパラメータのない行なんておそらくないんじゃないかとw

pythonではかなりこの辺の処理が避けられるようになっていたりしてつい忘れがちですが、argparseでもしっかりと\r付きでパラメータを拾ってくる形になっていました。

linux上のpythonのソーススクリプトでCR+LFであってもほぼ動いたりするのですが、稀にドはまりすることがあるので、改行コードはしっかり扱っておいた方が無難です。マルチプラットフォームで一元管理したい場合は、面倒でも配布と設置は別プロセスとして分けて必要なコード変換は各環境で行うことをお勧めいたします。