支持通过环境变量配置温控档位

This commit is contained in:
2026-05-06 10:04:15 +08:00
parent 929652bc00
commit eabc8d8bd2
6 changed files with 158 additions and 15 deletions
+61 -11
View File
@@ -3,19 +3,74 @@ from controller.logger import logger
from controller.ipmi import IpmiTool
DEFAULT_FAN_SPEED_STEPS = (
(50, 20),
(55, 25),
(60, 30),
(65, 40),
)
# 风扇控制器:根据iDRAC温度传感器结果自动切换风扇模式和转速
class FanController:
# 初始化控制器并记录iDRAC连接信息
def __init__(self, host: str, username: str, password: str):
def __init__(self, host: str, username: str, password: str, fan_speed_steps: str = None):
self.host = host
self.username = username
self.password = password
self.ipmi = IpmiTool(self.host, self.username, self.password)
self.fan_speed_steps = self.parse_fan_speed_steps(fan_speed_steps)
self.last_set_speed = None # 记录最后设置的风扇速度
self.is_auto_mode = False # 记录当前是否为自动模式
# 解析温控规则配置,格式为 "50:20,55:25,60:30,65:40"
def parse_fan_speed_steps(self, steps: str) -> tuple:
"""
解析环境变量中的温控规则
:param steps: 温度阈值和风扇转速配置
:return: 按温度升序排列的规则元组
"""
if steps is None:
return DEFAULT_FAN_SPEED_STEPS
if not steps.strip():
raise ValueError('FAN_SPEED_STEPS 至少需要包含一条温控规则')
parsed_rules = []
for item in steps.split(','):
item = item.strip()
if not item:
continue
try:
temperature_text, speed_text = item.split(':', 1)
temperature = int(temperature_text.strip())
speed = int(speed_text.strip())
except ValueError as exc:
raise ValueError(
f'FAN_SPEED_STEPS 格式错误: {steps},正确示例: 50:20,55:25,60:30,65:40'
) from exc
if temperature <= 0:
raise ValueError('FAN_SPEED_STEPS 温度阈值必须大于0')
if speed < 10 or speed > 100:
raise ValueError('FAN_SPEED_STEPS 风扇转速必须在10到100之间')
parsed_rules.append((temperature, speed))
if not parsed_rules:
raise ValueError('FAN_SPEED_STEPS 至少需要包含一条温控规则')
parsed_rules.sort(key=lambda rule: rule[0])
temperatures = [rule[0] for rule in parsed_rules]
if len(temperatures) != len(set(temperatures)):
raise ValueError('FAN_SPEED_STEPS 不能包含重复的温度阈值')
return tuple(parsed_rules)
# 设置手动风扇速度
def set_fan_speed(self, speed: int):
logger.info(f'设置风扇速度: {speed}%')
@@ -28,16 +83,11 @@ class FanController:
:param temperature: 当前最高温度
:return: 对应的风扇转速百分比,如果应该切换到自动模式则返回-1
"""
if 0 < temperature <= 50:
return 20
elif 50 < temperature <= 55:
return 25
elif 55 < temperature <= 60:
return 30
elif 60 < temperature <= 65:
return 40
else:
return -1 # 表示应切换到自动模式
for threshold, speed in self.fan_speed_steps:
if 0 < temperature <= threshold:
return speed
return -1 # 表示应切换到自动模式
# 执行一次完整的温度读取和风扇控制周期
def run(self):