1/3
2/3
3/3
使用Python调用OpenHardwareMonitorLib.dll进行硬件信息读取(CPU/GPU温度)
我已经无处不在
编辑于 2024年05月25日 15:43
收录于文集
共3篇

        这个功能我不得不吐个槽,难度超过了我的预期......

        我原本的打算只是通过ChatGPT编写一个运行在WIN10下,能够自动进行循环获取本机CPU/GPU温度数据,将其通过ModBusTCP发送给下位机,从而控制我的机箱风扇(大功率)。

        我本身不是程序员,只学过一点C语言。

        结果可能是因为太偏门了,无论是ChatGPT还是Claude,都不能做到正确回答。所以只能自己动手了(大哭)。

        首先遇到的问题就是使用psutilwmi模块,这两个模块我不清楚究竟能不能在WIN10上运行,但是我查阅的众多资料显示都不能在WIN10环境下由Python运行,多数都指向Linux系统。

        然后目标明确为调用OpenHardwareMonitorLib.dll进行获取,这是软件OpenHardwareMonitor中提供的DLL文件。

这里使用的是最新版的0.9.6

        

OpenHardwareMonitor软件截图(PS:这是办公电脑)

        至于那些直接通过端口调用OpenHardwareMonitor信息的方法,都需要OpenHardwareMonitor软件在后台运行。

        再然后就会遇到一些诸如Hardware不存在,Computer不存在之类的错误。

头都要大了。

环境是Python3.9,直接上源码:

代码块
Python
自动换行
复制代码
import os
import clr

script_dir = os.path.dirname(os.path.abspath(__file__))
dll_path = os.path.join(script_dir, 'OpenHardwareMonitorLib.dll')

clr.AddReference(dll_path)

from OpenHardwareMonitor import Hardware

handle = Hardware.Computer()
handle.CPUEnabled = True
handle.GPUEnabled = True
handle.Open()
cpu_temperatures = []

for hardware in handle.Hardware:

    hardware_type = str(hardware.HardwareType)

    if 'CPU' in hardware_type.upper():

        hardware.Update()

        for sensor in hardware.Sensors:

            if sensor.SensorType == Hardware.SensorType.Temperature:

                print("CPU温度:", sensor.Value)
                cpu_temperatures.append(sensor.Value)

        if cpu_temperatures:

            max_cpu_temp = max(cpu_temperatures)
            print("CPU最高温度:", max_cpu_temp)
            
    elif 'GPU' in hardware_type.upper():

        hardware.Update()

        for sensor in hardware.Sensors:

            if sensor.SensorType == Hardware.SensorType.Temperature:

                print("GPU温度:", sensor.Value)
复制成功

        将OpenHardwareMonitorLib.dll和本文件放在同一个目录就能运行了。

        在网上找了两圈没找到OpenHardwareMonitorLib.dll的说明和接口,只能对照hardware提取到的列表和大模型AI互相学习。

        其中的clr.AddReference(dll_path)是初始化模块,没有这一行大概率报错。

        然后就是启用需要获取的功能并运行一次:

代码块
Python
自动换行
复制代码
Hard.CPUEnabled = True
Hard.GPUEnabled = True
Hard.MainboardEnabled = True
Hard.HDDEnabled = True
Hard.RAMEnabled = True
Hard.Open()
复制成功

        最后就是对hardware.HardwareType中的内容进行判断,看里面是否包含想要的字符,例如CPU/GPU/RAM等。

        例如hardware.HardwareType内含有GPU,接下来则寻找该列表内的Sensors(传感器)标签。找到了Sensors后,最终提取Sensors内部的Temperature(温度)标签中的内容并输出。即为提取到的CPU或GPU温度。

        要提取其他参数也是同理。

        由于CPU有多核心,所以有多个温度。程序内写了个提取温度最高值的语句,方便只取一个温度。

        最后加一个每秒循环执行一次即可实现目标。后续再添加一个CSV日志文件,加上时间戳。

        最后感谢GitHub上的开源程序以及网上提供思路的同学,资料查的太多我都忘了是从哪借鉴的了。

        记录自己的成长。


上当了,OpenHardwareMonitorLib.dll太老了,用不了得用LibreHardwareMonitor编写​