


这个功能我不得不吐个槽,难度超过了我的预期......
我原本的打算只是通过ChatGPT编写一个运行在WIN10下,能够自动进行循环获取本机CPU/GPU温度数据,将其通过ModBusTCP发送给下位机,从而控制我的机箱风扇(大功率)。
我本身不是程序员,只学过一点C语言。
结果可能是因为太偏门了,无论是ChatGPT还是Claude,都不能做到正确回答。所以只能自己动手了(大哭)。
首先遇到的问题就是使用psutil和wmi模块,这两个模块我不清楚究竟能不能在WIN10上运行,但是我查阅的众多资料显示都不能在WIN10环境下由Python运行,多数都指向Linux系统。
然后目标明确为调用OpenHardwareMonitorLib.dll进行获取,这是软件OpenHardwareMonitor中提供的DLL文件。

这里使用的是最新版的0.9.6

OpenHardwareMonitor软件截图(PS:这是办公电脑)
至于那些直接通过端口调用OpenHardwareMonitor信息的方法,都需要OpenHardwareMonitor软件在后台运行。
再然后就会遇到一些诸如Hardware不存在,Computer不存在之类的错误。
头都要大了。
环境是Python3.9,直接上源码:
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)是初始化模块,没有这一行大概率报错。
然后就是启用需要获取的功能并运行一次:
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编写。