ラズパイのCPU温度は結構重要ですよね。
負荷が大きい処理をさせようと思うと、温度制限に掛からないか?
掛かってしまうとCPUクロック制限されてしまい、思った動作をしづらくなります。
そこで、今回はCPU温度を監視してログ作成する方法をご紹介したいと思います。
やること
・ラズパイのCPU温度を取得
・jsonファイルとしてログ出力
それでは順に見ていきましょう!
やること
ラズパイのCPU温度を取得
まずはここからですよね。
温度を取得するには、ターミナルで次のコマンドを使用します。
vcgencmd measure_temp
「temp=54.5℃」のようなレスポンスが返ってきます。
これをpythonプログラムで実行するには、subprocessモジュールを使います。
import subprocess
def measure_cpu_temperature():
result = subprocess.run(['vcgencmd', 'measure_temp'], capture_output=True, text=True)
output = result.stdout.strip()
temperature = float(output[output.index('=') + 1:output.index("'")])
return temperature
これでコマンド・アンド・レスポンス的にラズパイのCPU温度を取得できるようになりました。
jsonファイルとしてログ出力
ログ出力する際のファイル形式は色々あります。
txt形式、csv形式、xml形式、json形式だったり。
今回はjsonファイル形式でログ出力してみたいと思います。
先ほどのtemperatureデータに、タイムスタンプを加えてログにします。
import json
import time
# タイムスタンプ取得
timestamp = int(time.time())
# CPU温度取得
temperature = measure_cpu_temperature()
# jsonにするデータを作成
temperature_data.append({"timestamp": timestamp, "temperature": temperature})
# jsonファイルに出力
with open("temperature_data.json", "w") as json_file:
json.dump(temperature_data, json_file, indent = 4)
jsonはpython標準のモジュールのため、特に追加インストールは必要ありません。
この記述を繰り返し処理にすると、例えば10秒ごとのログ出力ができます。
サンプルコード
これらを合体したものがこちらです。
import json
import time
import subprocess
def measure_cpu_temperature():
result = subprocess.run(['vcgencmd', 'measure_temp'], capture_output=True, text=True)
output = result.stdout.strip()
temperature = float(output[output.index('=') + 1:output.index("'")])
return temperature
def record_temperature_to_json():
temperature_data = []
while True:
timestamp = int(time.time())
temperature = measure_cpu_temperature()
print(f"timesamp={timestamp}, temperature = {temperature}")
temperature_data.append({"timestamp": timestamp, "temperature": temperature})
with open("temperature_data.json", "w") as json_file:
json.dump(temperature_data, json_file, indent = 4)
time.sleep(10) # 60 seconds interval
record_temperature_to_json()
実行結果として、「temperature_data.json」をファイル出力します。
ログの中身は次のようになります。
[
{
"timestamp": 1690065906,
"temperature": 54.0
},
{
"timestamp": 1690065916,
"temperature": 51.1
},
{
"timestamp": 1690065926,
"temperature": 52.5
}
]
おまけ
今回のタイムスタンプは、後処理で経過時間を求めやすい形式にしています。
差分をとるだけですね。
もし、ログとしての可読性を求めるなら、例えばタイムスタンプ部分を次のように置き換えてください。
from datetime import datetime
current_date = datetime.now()
timestamp = current_date.strftime('%Y-%m-%d %H:%M:%S')
「2023-07-23 08:00:00」といった形式になります。
とても読みやすいですね。
その代わり、経過時間を求めたい場合は後処理が必要になります。
from datetime import datetime
# 2つのタイムスタンプデータを定義
timestamp1_str = '2023-07-23 08:00:00'
timestamp2_str = '2023-07-23 09:30:15'
# タイムスタンプデータをdatetimeオブジェクトに変換
timestamp1 = datetime.strptime(timestamp1_str, '%Y-%m-%d %H:%M:%S')
timestamp2 = datetime.strptime(timestamp2_str, '%Y-%m-%d %H:%M:%S')
# 経過時間を計算
time_difference = timestamp2 - timestamp1
# 経過時間を秒単位で取得
elapsed_seconds = time_difference.total_seconds()
print("経過時間(秒):", elapsed_seconds)
一度datettimeオブジェクトに戻す処理が入ります。
見やすさをとるか、後処理の簡単さをとるかはシーンに依ると思います。
以上、ご参考でした。
今回は以上となります。
この記事が少しでもお役に立てれば幸いです。
それでは、読んで頂きありがとうございました!