Libre Hardware MonitorでPCの情報を取得する

 ニキシー管を使ったガジェットのためにCPU温度など情報をarduinoにシリアル通信で送る方法です。

 PCのハードウェアの情報を送る流れは、

1. LibreHardwareMonitorというソフトで情報をローカルネットワークにJSON形式で出力
2. JSON形式のデータから必要な情報を読み取ってシリアル通信でarduinoに送信するPythonコードを実行

となっています。

関連記事はこちら
・ニキシー管について
・ニキシー管でいろいろなものを表示するものを作った【ハードウェア編】
・ニキシー管でいろいろなものを表示するものを作った【ソフトウェア編】

Libre Hardware Monitorの実行

Libre Haedware Monitorはハードウェアの情報をモニタリングすることができるソフトです。
Git Hubページからダウンロードできます。

Libre Hardware Monitor
https://github.com/LibreHardwareMonitor/LibreHardwareMonitor

導入方法などはこちらのページに詳しく書いてありました。

しぐにゃもブログ「LibreHardwareMonitorでPC情報をJSON出力する方法」
https://signyamo.blog/lhm_json/

「here」の部分からダウンロードできます。
ダウンロードしたファイルの「LibreHardwareMonitor.exe」を実行します。

Options→Remote Web Server→Run
のところにチェックを入れます。

同じところにある「Interface/Port」のところを確認します。

赤く囲われた部分のURLを控えておきます。隠していますが「http://192.・・・」のような感じです。

Arduinoポートの確認

使いたいArduinoのポートを確認します。
ArduinoIDEを起動します。

認識しているボードのポート名 COM3 (環境によって数字は変わる)を控えておきます。

データの読み取り・送信のPythonコードを実行

メインであるPythonコードを実行します。

import requests
import time
import serial

# Arduino の COM ポート
ser = serial.Serial("COM**", 115200, timeout=1)

url = "http://192.***.*.*:8085/data.json"

response = requests.get(url)   # サーバにアクセス
response.raise_for_status()    # エラーがあれば例外を出す
data = response.json()         # JSONをPythonのdictとして取得

def find_value(node, target):
    """
    JSONツリーを再帰的に探索して、Text が target の Value を返す
    """
    if isinstance(node, dict):
        if node.get("Text") == target:
            return node.get("Value")
        for child in node.get("Children", []):
            result = find_value(child, target)
            if result is not None:
                return result
    elif isinstance(node, list):
        for item in node:
            result = find_value(item, target)
            if result is not None:
                return result
    return None

# 欲しい値を取得
cpu_temp = find_value(data, "Core Average")
cpu_usage = find_value(data, "CPU Total")
mem_usage = find_value(data, "Memory")

print("CPU温度:", cpu_temp)
print("CPU使用率:", cpu_usage)
print("メモリ使用率:", mem_usage)

while True:
    try:
        # サーバからJSONを取得
        response = requests.get(url, timeout=5)
        response.raise_for_status()
        data = response.json()

        # 必要な値を抽出
        cpu_temp = find_value(data, "Core Average")
        cpu_usage = find_value(data, "CPU Total")
        mem_usage = find_value(data, "Memory")

        print("CPU温度:", cpu_temp, " CPU使用率:", cpu_usage, " メモリ使用率:", mem_usage)
        
        # 単位記号を削除
        def clean(val):
            if val is None:
                return ""
            return val.replace("°C", "").replace("%", "").replace(" ", "")
        
        cpu_temp = clean(cpu_temp)
        cpu_usage = clean(cpu_usage)
        mem_usage = clean(mem_usage)
        
        # CSV形式で出力 (例: 37.0,23.2,57.4)
        line = f"{cpu_temp},{cpu_usage},{mem_usage}"
        print(line)   # ← この出力をシリアルでArduinoに送れる
        
        ser.write((line + "\n").encode("utf-8"))

    except Exception as e:
        print("エラー:", e)

    time.sleep(1)  # 1秒ごとに更新

コードの中を環境に応じたものに書き換えます。

# Arduino の COM ポート
ser = serial.Serial("COM**", 115200, timeout=1)

url = "http://192.***.*.*:8085/data.json"

この部分に先ほど控えたポートとURLを書き込みます。

# 必要な値を抽出
        cpu_temp = find_value(data, "Core Average")
        cpu_usage = find_value(data, "CPU Total")
        mem_usage = find_value(data, "Memory")

この部分でほしいデータを読み込んでいます。
変えたい場合はLibre HardwareMonitorの欲しいデータの名前に変更します。

書き換えたコードをメモ帳などで「send_pc_status.py」などの名前で保存します。名前は何でもいいです。

このコードをPython環境で実行します。私の場合はAnacondaを使っています。
このページにAnacondaの導入方法が解説してあります・

maasは瞑想中「Anacondaのインストールと基本設定 – 初心者でも簡単にできるデータサイエンス環境構築」
https://maahsachi.com/2025/03/08/ca46c1b9/

スタートメニューにある「Anaconda Prompt」でコードを実行します。

Anaconda Promptでコードを保存したディレクトリに移動して
「python send_pc_status.py」(先ほど保存したコードの名前)
と打ち込んで実行します。

ライブラリがインストールされていない場合、インストールしてください。
Anacondaの場合「conda install pyserial」と打ち込めばインストールされます。

コードを実行すると数値がシリアル通信で送られます。
コードを使うときは変数名などを適宜変更してください。

関連記事はこちら
・ニキシー管について
・ニキシー管でいろいろなものを表示するものを作った【ハードウェア編】
・ニキシー管でいろいろなものを表示するものを作った【ソフトウェア編】

タイトルとURLをコピーしました