【Raspberry pi】【Python】CPU温度を監視してjsonログにする方法

ラズパイの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オブジェクトに戻す処理が入ります。
見やすさをとるか、後処理の簡単さをとるかはシーンに依ると思います。
以上、ご参考でした。

今回は以上となります。
この記事が少しでもお役に立てれば幸いです。
それでは、読んで頂きありがとうございました!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次