えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

PythonでCPU温度を取得したいけどKeyErrorが出ちゃう場合の対策方法(仮)

私は前々からrclsharkについて開発を続けていましたが、結構(CPU環境)移植時に困ったことがありました。

それは、CPU温度を取得したときの辞書型のKeyがCPUで違うことです。 例えば、Intel系なら"coretemp"、Raspberry Piなら"cpu_thermal"…という感じ。

いままでは2種類しか発見していなかったのでtry-exceptでなんとかしてきました。

しかし、RyzenのCPU判別が"k10temp"になっていたのです。

これにはさすがに怒りを覚えました。Pythonは多くのOSで互換性があるから使っていたのに、温度は全然違うだとーーーーー????

おそらくCPUやマザーボードが原因でKeyが変わっているんだろうとは思っていますが、いちいち不明な文字列が出現するたびに埋め合わせするのは辛いのでなんとかこれを回避する方法を探すことにしました。

結論から

これで解決です(解決しておりません!)

>>> import psutil
>>> psutil.sensors_temperatures()[next(iter(psutil.sensors_temperatures()))][0][1]
37.5

簡単な解説

psutil.sensors_temperatures()を実行すると次の結果が出ます。

f:id:Ray_ar:20210908225553p:plain

これは、プラットフォームによってまちまちで、高性能なものだとめっちゃ項目があるのですが、Raspberry Piやなにも(温度センサ付きのパーツを)載せていないPCだとほとんど項目が出現しません。それに、搭載機器によって項目名が変わってしまいます。

そのため、Keyは搭載機器ごとにカスタマイズするのが最もよいのですが、もともとRaspberry Piを想定していたので、1番目の要素の温度の項目さえ手に入れば良いと考えました。(あと、ある程度熱は他のパーツにも伝播するので)


1番目だけのKeyを取得するPythonスクリプトがこちらになります。

>>> next(iter(psutil.sensors_temperatures()))
nvme

…この時点でm.2 SSDだと分かるので不適切なのは分かるのですが、Raspberry PiだとそれがCPU温度を指していた(と思う)ので、そのまま進めちゃいます!

'nvme': [shwtemp(label='Composite', current=37.85, high=83.85, critical=84.85), shwtemp(label='Sensor 1', current=37.85, high=65261.85, critical=65261.85), shwtemp(label='Sensor 2', current=34.85, high=65261.85, critical=65261.85)],

残りの項目については、一番最初の項目を取り出すために、[0]を指定してshwtemp(label='Composite', current=37.85, high=83.85, critical=84.85),を取り出して、ほしいのは現在の温度だったので[1]を指定して取り出します。

あとがき

久しぶりにこんなに適当な記事を書いた気がしますが、書いているうちに「特定の文字が出現したら、それを弾いて次のKeyに移ればいいのかなーー?」とか思ってきました。

ただ、基本はマザーボードなどの性能に寄りそうな気がするので、プログラムへの引数やrosparamを使って最初からKey valueを決めちゃうのが無難な気がしますね。

この記事を書くまでにわかったことは、(現時点では)温度は目視でKeyを確認しとけ!ということですね。

他のいい方法があればいいのになーーー。