予測というよりは「当てずっぽう」とか「サバ読み」かもw
少し前に出来上がった室温センサと測定システムであるが、少し気に入らないことがあった。電源をonにした直後は しばらく温度が低いのだ。直感同様、温度センサ(サーミスタ)が「温まる」までは、出力する温度が低いのだ。低いと言っても高々0.25℃程度なのだが、(本物の)温湿度計と差が出るので気になってしまう。しかも、僕は起きたら室温などを日記に記録しており、なおかつ起きた時にPCをスリープから復帰させるため、その時にセンサがonになるから、結果的に記録する室温が常に実際より低いのはどうも許せない。
であれば、朝イチに日記に書くのは(本物の)温湿度計の温度にすれば済むが、なんか負けた気がするのでw、何とかしようとした。
それで、どのくらい差があるか調べたところ、温度値(ADCで取れる値, サーミスタの電圧に比例)が1大きい(= 約0.25℃(周囲温度が27℃前後の場合。以下同)低い)ことが多かった(なぜか、差が出ないこともある)。そこで、(電子体温計にインスパイアされて)以下のような回避策が浮かんだ。
センサの電源onからしばらくは冷えていて温度が低く出るため、低い分を割り増した温度を出す。
とっても原始的な予測測温、まあサバ読みである。基本処理は上の1行なので作るのは簡単そうだったが、いつものように、ちゃんと動くようになるまでには なかなか手こずった。
以下のような問題があった。
- 前回の電源offから時間を経ずにonした場合はセンサが温かいから、予測は不要。
- どのくらいで冷えるかは、周囲の温度に影響される。
- 電源on直後にセンサがどのくらい冷えているのか、実際のところは不明。
- センサが冷えていても、「正しい温度」が出ることがある。
- 冷えたセンサの出力が、たまたまADCのステップの区切りに近い場合と推測している。
- センサが冷えていても、「正しい温度」が出ることがある。
- センサが温まるまでの時間が不明。
- 周囲の温度に影響されそうだが、そうでもないかも知れない。
電源on時のセンサの真の温度は分からないので、前回の電源offからの経過時間で冷えたかどうか判定し、予測が必要か決めることにした。今は10分にしているが、寒い場合は短くなるだろうし、暑い場合は長くなるだろうから、要調整である(というか、調整できるか不明・・・)。
ただ、「冷える」と言っても、センサの温度が本当に低くなるのでなく、室温と同じでも冷えている状態だと考えられる(逆に、安定状態では室温より わずかに高いはず)から、それほど周囲の温度に影響されない可能性もある。
それから、センサの電源がoffになるのはPCのスリープ以外に再起動もあるので、それによるoff間隔も可能な限り取得して反映するようにした。
ちなみに、PCがスリープしたことは、前回の処理からの経過時間で、スリープから復帰した時刻はログ(/var/log/syslog: pm-suspend.logでも可能だが、復帰が完了しないと記録されないようなのでsyslogにした)から、シャットダウン時刻(最後にセンサの電源がonだったであろう時刻)はlastコマンド(last --time-format iso -x -n 1 shutdown)で取得している。
センサの冷えによる温度差は通常は約0.25℃のようだが、センサが冷えていても差が出ないこともある。そこで、「間を取って」約0.25℃の75%の約0.19℃とした。仮にセンサの出力に差がない場合でも、0.2℃くらい高いだけなら、まあ許せそうな気がする(実際には気になるが・・・)。
センサが温まるまでの時間は試行錯誤で決めようとしたが、寒い場合(冬)は長くなることも予想される。そこで、予測温を使う最長の時間を長目にしておき、それまでにセンサの温度が予測温に近くなったら、実際の温度を使うことにした。今は最長10分とし、センサの出力する温度が予測温の99.5%以内(25℃の場合、約0.13℃)か予測温を超えた場合に実際の温度を使うことにしている。
この辺りは、センサが温まるまでの短時間では室温が一定であることを想定している(良く、数学や物理でやっているねw)ので、予測温を使っている時に暖房などで室温が上がったら、そこで切り替わってしまう。
数字を見ると本来の精度以上に(無駄に)細かい気がするが、実際に気になるので仕方ない。「ベストエフォート」で実際の室温に近い値を出したいのである。
なかなか苦労して どうにか出来た。ただ、基本的に この予測温は当てずっぽうなので、パネルに表示する時に、(シビアな場合や疑義のある場合はw、「本物」を参照できるように※)予測温の場合は最後に"*"を付けて区別できるようにした。以下に表示例を示す。
- 温度センサが冷えている時は予測温を表示 (“Rm ℃”の下。”*”は予測温のマーク)
- 実際の温度を表示している場合
※と書きつつも、本物は少し離れたところにあって机とは温度が異なることが多くて、やっぱり当てにならないというオチがあるw ただ、起床直後で室内の温度分布が「静か」な状態では同じことが多い。
↓
(9/10 8:16) その後、パネルに室温を表示するのに使ったプラグインGeneric Monitor(xfce4-genmon-plugin)の隠し機能(Mintの資料では分からなかったが、検索して見付かったGitHubに書いてあった)が見付かって、なかなか使えるものであることが分かった。それまで「できればなあ」と思って居たPangoのマークアップでフォント指定ができたり、バーやツールチップが出せたり、クリックでコマンドを実行することができるのだ。
それを活用して、今までは(Generic Monitorではタイトルと本体でフォントサイズが変えられないため、)別のプラグインで表示していたタイトルを表示したり、温度表示をクリックすると(これは上のGitHubの説明にも書いてなかった)温度がクリップボードにコピーされるようにした。また、マウスオーバーでツールチップに(およその)測定時刻を出すようにした。 (→ 図) 更に、予測温を出している場合にはツールチップに実際の(予測でない)温度も出すようにした。
- ツールチップに測定時刻を出すようにした。
- xfce4-genmon-pluginでCPU温度の棒グラフを表示するようにした。ツールチップに温度の数値を出す。
また、室温には関係ないが、Generic Monitorを使ってCPU温度を棒グラフ(正確には棒メーター?)で表示するようにした。元々のSensor pluginにも機能はあるのだが、なぜかちゃんと表示できない(バーが動かない)ので数値にしていたのを ようやく直せた。 (→ 図) ここで、前回見付けたものの見送った"🌡"を使ったw
おまけ: 近頃の室温変化のグラフ
Muninの過去1か月のYL-40のセンサの値のグラフを以下に示す。室温は一番上の水色で、他と一緒に描いている関係で変化が小さく見えるものの、結構下がっている(約28→26℃)ことが分かる。空調を効かせている室温でこれなので、(当然ながら)外気温はもっと下がっている。※
※外気温のグラフも描きたいが、労力に比べて興味・自己満足以外の実益は少ないw
コメントを書く / Write a comment