mirror of
https://github.com/lkddi/dell-fans-controller-docker.git
synced 2026-05-18 21:57:29 +08:00
支持通过环境变量配置温控档位
This commit is contained in:
+61
-11
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user