本文目录导读:

获取电源效率通常需要测量输入功率(从电网取电)和输出功率(提供给电脑硬件),然后计算:效率 = 输出功率 / 输入功率 × 100%。
普通电脑通过软件脚本无法直接、准确地测量硬件级的实际输入功率,原因如下:
- 电源本身不输出效率数据:PC电源没有像温度、电压那样的“效率传感器”。
- 输入功率的测量需要硬件:需要电流钳、功率计等设备在电源线处测量。
脚本只能做近似估算或获取理论值,无法得到真实效率。 以下是几种不同场景下的方法:
纯软件估算(最常用,但误差较大)
这种方法通过读取硬件功耗(输出功率),然后根据电源铭牌上的转换效率(通常只有几个点)进行反推。
步骤:
- 获取输出功率:使用脚本调用硬件监控工具(如
OpenHardwareMonitor、LibreHardwareMonitor或HWiNFOSDK),读取CPU、GPU等组件的功耗总和。 - 查找效率曲线:查询你的电源型号在【80 PLUS认证】网站或评测数据库(如 Tom‘s Hardware、Cybenetics)中的效率数据(在 50%负载时效率为 90%)。
- 计算输入功率:
输入功率 ≈ 输出功率 / 效率百分比。 - 得到效率(反推):如果你已经知道输入功率(例如通过智能插头),效率就是
输出/输入。
示例脚本(Python,使用 librehardwaremonitor 的 WMI 接口):
import wmi
import psutil
def get_total_power():
"""尝试通过WMI获取系统总功耗(需要管理员权限且依赖特定硬件支持)"""
try:
c = wmi.WMI(namespace="root\OpenHardwareMonitor")
sensors = c.Sensor()
total_power = 0
# 注意:OpenHardwareMonitor不总是提供"Total"或"Package"功率,需遍历
for sensor in sensors:
if sensor.SensorType == 'Power':
# 过滤掉最低级的子传感器,只取大的(如CPU Package, GPU Total, DRAM, VRM)
# 实际应用中需要更精确的过滤逻辑
if 'Package' in sensor.Name or 'Total' in sensor.Name or 'System' in sensor.Name:
total_power += float(sensor.Value)
return total_power
except Exception as e:
print(f"无法获取功率数据:{e}")
return None
if __name__ == "__main__":
output_power_watts = get_total_power()
if output_power_watts:
efficiency_percent = 0.90 # 假设电源平均效率90%
input_power = output_power_watts / efficiency_percent
print(f"估计输出功率: {output_power_watts:.1f}W")
print(f"假设效率90%,估计输入功率: {input_power:.1f}W")
print(f"效率: {efficiency_percent * 100:.1f}% (这是假设值,非实测)")
else:
print("无法获取输出功率。")
缺点:误差在 10%-30% 以上,且效率是你手动输入的固定值,不是动态测量值。
使用智能插头/功率计 + 脚本(推荐)
这是最有意义的方法,通过硬件(智能插头或USB功率计)获取真实的输入功率。
硬件准备:
- WiFi智能插头:如 TP-Link Kasa HS110/HS300、Sonoff S31 (可刷ESPHome/Tasmota)、Gosund 等,具有实时功率测量功能。
- USB功率计:如 Power-Z 系列(适合笔记本电脑,但精度有限)。
脚本实现(以TP-Link Kasa HS110为例):
- 安装库:
pip install python-kasa - 脚本:读取插头的实时功率(即输入功率),同时用
librehardwaremonitor读组件功率(输出功率)。
import asyncio
from kasa import Discover
import wmi
async def get_input_power():
"""从智能插头获取输入功率"""
devices = await Discover.discover()
for ip, dev in devices.items():
await dev.update()
if hasattr(dev, 'emeter'):
emeter = dev.emeter
# 实时功率(瓦特)
power = emeter.power # kW -> 乘以1000转为W
return power * 1000 if power < 100 else power # 防止单位混淆
return None
def get_output_power():
"""从OpenHardwareMonitor获取总输出功率"""
try:
c = wmi.WMI(namespace="root\OpenHardwareMonitor")
sensors = c.Sensor()
total_power = 0
for sensor in sensors:
if sensor.SensorType == 'Power' and 'Package' in sensor.Name:
total_power += float(sensor.Value)
# 或者简单一点:读取CPU + GPU + 其他主板功耗(需要知道传感器名称)
return total_power
except:
return None
if __name__ == "__main__":
input_watts = asyncio.run(get_input_power())
output_watts = get_output_power()
if input_watts and output_watts:
efficiency = (output_watts / input_watts) * 100
print(f"输入功率: {input_watts:.2f} W")
print(f"输出功率: {output_watts:.2f} W")
print(f"电源效率: {efficiency:.2f} %")
else:
print("无法同时获取输入/输出功率。")
优点:接近真实值(误差在1-3%内)。 缺点:需要额外硬件。
通过IPMI/BMC获取服务器电源效率(仅限企业级服务器)
在服务器环境(如 Dell iDRAC、HP iLO、Supermicro IPMI)中,电源本身自带监控芯片。
使用 ipmitool 脚本(Linux):
# 安装: sudo apt-get install ipmitool
# 获取电源实时功率(W)
sudo ipmitool sensor get "System Level" | grep "Current" | awk '{print $3}'
# 或获取特定PSU的输入/输出功率(取决于厂商OEM命令)
sudo ipmitool raw 0x2e 0xc8 0x57 0x01 0x00 0x01 # (示例, 需要查阅具体手册)
很多服务器电源通过IPMI直接提供 Input Power 和 Output Power,这时脚本可以精确计算效率。
你应该用哪种方法?
| 场景 | 推荐方法 | 精度 | 成本 |
|---|---|---|---|
| 个人DIY电脑 | 智能插头 + 脚本 | ±2% | 约60-200元 |
| 只是想大概看看 | 软件估算 | ±30% | 免费 |
| 服务器机房 | IPMI/BMC脚本 | ±1% | 无需额外硬件 |
| 开发测试(笔记本) | USB功率计(如Power-Z) + 脚本 | ±5% | 约100-500元 |
如果你只是想写一个“能运行的脚本”而不关心准确性,用方法一就够了,如果你想真正测量效率,请购买一个智能功率插头并使用方法二。