2024-05-19 22:38:21 +08:00
|
|
|
|
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)
|
2025-12-02 17:47:51 +08:00
|
|
|
|
self.last_set_speed = None # 记录最后设置的风扇速度
|
|
|
|
|
|
self.is_auto_mode = False # 记录当前是否为自动模式
|
2024-05-19 22:38:21 +08:00
|
|
|
|
|
|
|
|
|
|
def set_fan_speed(self, speed: int):
|
2025-06-08 12:50:52 +08:00
|
|
|
|
logger.info(f'设置风扇速度: {speed}%')
|
2024-05-19 22:38:21 +08:00
|
|
|
|
self.ipmi.set_fan_speed(speed)
|
|
|
|
|
|
|
2025-12-02 17:47:51 +08:00
|
|
|
|
def get_required_fan_speed(self, temperature: int) -> int:
|
|
|
|
|
|
"""
|
|
|
|
|
|
根据温度确定所需的风扇转速
|
|
|
|
|
|
:param temperature: 当前最高温度
|
|
|
|
|
|
:return: 对应的风扇转速百分比,如果应该切换到自动模式则返回-1
|
|
|
|
|
|
"""
|
2024-06-22 13:23:15 +08:00
|
|
|
|
if 0 < temperature <= 50:
|
2025-12-02 17:47:51 +08:00
|
|
|
|
return 15
|
2024-06-22 13:23:15 +08:00
|
|
|
|
elif 50 < temperature <= 55:
|
2025-12-02 17:47:51 +08:00
|
|
|
|
return 20
|
2024-06-22 13:23:15 +08:00
|
|
|
|
elif 55 < temperature <= 60:
|
2025-12-02 17:47:51 +08:00
|
|
|
|
return 30
|
2024-06-22 13:23:15 +08:00
|
|
|
|
elif 60 < temperature <= 65:
|
2025-12-02 17:47:51 +08:00
|
|
|
|
return 40
|
2024-05-19 22:38:21 +08:00
|
|
|
|
else:
|
2025-12-02 17:47:51 +08:00
|
|
|
|
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}% 已符合要求,无需调整')
|