Files
dell-fans-controller-docker/controller/client.py
lkddi 4f2042cbb4 修复温度和风扇转速读取问题
- 修复温度读取功能,使用正确的正则表达式从IPMI传感器输出中提取温度值
- 通过实验校准确定20%设置对应4800 RPM,实现准确的RPM到百分比转换
- 修改sensor()方法使用ipmitool sdr命令获取更准确的传感器数据
- 添加重试机制和错误处理
- 优化风扇控制逻辑,增加模式切换和状态跟踪
2025-12-02 17:47:51 +08:00

79 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from controller.logger import logger
from controller.ipmi import IpmiTool
class FanController:
def __init__(self, host: str, username: str, password: str):
self.host = host
self.username = username
self.password = password
self.ipmi = IpmiTool(self.host, self.username, self.password)
self.last_set_speed = None # 记录最后设置的风扇速度
self.is_auto_mode = False # 记录当前是否为自动模式
def set_fan_speed(self, speed: int):
logger.info(f'设置风扇速度: {speed}%')
self.ipmi.set_fan_speed(speed)
def get_required_fan_speed(self, temperature: int) -> int:
"""
根据温度确定所需的风扇转速
:param temperature: 当前最高温度
:return: 对应的风扇转速百分比,如果应该切换到自动模式则返回-1
"""
if 0 < temperature <= 50:
return 15
elif 50 < temperature <= 55:
return 20
elif 55 < temperature <= 60:
return 30
elif 60 < temperature <= 65:
return 40
else:
return -1 # 表示应切换到自动模式
def run(self):
temperature: int = max(self.ipmi.temperature())
logger.info(f'当前最高温度: {temperature}')
required_speed = self.get_required_fan_speed(temperature)
if required_speed == -1:
# 需要切换到自动模式
if not self.is_auto_mode:
logger.info(f'切换风扇为自动模式')
self.ipmi.switch_fan_mode(auto=True)
self.is_auto_mode = True
self.last_set_speed = None # 重置手动设置的速度
else:
logger.info(f'当前已是自动模式,无需操作')
else:
# 需要设置手动风扇速度
if self.is_auto_mode:
# 如果当前是自动模式,需要先切换到手动模式
logger.info(f'从自动模式切换到手动模式')
self.ipmi.switch_fan_mode(auto=False)
self.is_auto_mode = False
# 获取当前风扇转速
current_speed = self.ipmi.get_fan_duty_cycle()
# 只有在当前转速与所需转速不同时才调整
# 如果无法获取当前转速(返回-1则检查是否已记录之前设置的速度
if current_speed == -1:
# 如果无法获取当前转速,但上次设置的速度与所需速度不同,则更新
if self.last_set_speed != required_speed:
logger.info(f'无法获取当前风扇转速,但上次设置({self.last_set_speed}%)与需要({required_speed}%)不同,进行设置')
self.set_fan_speed(required_speed)
self.last_set_speed = required_speed
else:
logger.info(f'无法获取当前风扇转速,且未改变设置,无需操作')
elif current_speed != required_speed:
logger.info(f'当前风扇转速: {current_speed}%, 需要转速: {required_speed}%')
self.set_fan_speed(required_speed)
self.last_set_speed = required_speed
else:
logger.info(f'当前风扇转速: {current_speed}% 已符合要求,无需调整')