From ee7d1bdb8e763301b9b0b36339000542303743da Mon Sep 17 00:00:00 2001 From: lkddi Date: Wed, 6 May 2026 09:05:53 +0800 Subject: [PATCH] =?UTF-8?q?=E9=99=8D=E4=BD=8EIPMI=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E6=97=B6=E7=9A=84=E6=8E=A7=E5=88=B6=E5=99=A8?= =?UTF-8?q?=E5=8E=8B=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/client.py | 15 +++++---------- controller/ipmi.py | 16 +++++++++------- start.py | 6 ++++-- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/controller/client.py b/controller/client.py index 8239355..a970387 100644 --- a/controller/client.py +++ b/controller/client.py @@ -36,7 +36,8 @@ class FanController: return -1 # 表示应切换到自动模式 def run(self): - temperature: int = max(self.ipmi.temperature()) + sensor_data = self.ipmi.sensor() + temperature: int = max(self.ipmi.temperature(sensor_data)) logger.info(f'当前最高温度: {temperature}') required_speed = self.get_required_fan_speed(temperature) @@ -59,21 +60,15 @@ class FanController: self.is_auto_mode = False # 获取当前风扇转速 - current_speed = self.ipmi.get_fan_duty_cycle() + current_speed = self.ipmi.get_fan_duty_cycle(sensor_data) # 只有在当前转速与所需转速不同时才调整 # 如果无法获取当前转速(返回-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'无法获取当前风扇转速,且未改变设置,无需操作') + logger.warning('无法获取当前风扇转速,为避免IPMI会话不稳定时盲目写入,本轮跳过设置') 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}% 已符合要求,无需调整') \ No newline at end of file + logger.info(f'当前风扇转速: {current_speed}% 已符合要求,无需调整') diff --git a/controller/ipmi.py b/controller/ipmi.py index fc1dcc9..7572238 100644 --- a/controller/ipmi.py +++ b/controller/ipmi.py @@ -61,12 +61,14 @@ class IpmiTool: """ return self.run_cmd(cmd='sdr') - def temperature(self) -> list: + def temperature(self, data: str = None) -> list: """ - get current temperature + 获取当前温度传感器列表 :return: """ - data = self.sensor() + if data is None: + data = self.sensor() + temperatures = [] import re @@ -108,9 +110,9 @@ class IpmiTool: continue return fan_speeds - def get_fan_duty_cycle(self) -> int: + def get_fan_duty_cycle(self, sensor_data: str = None) -> int: """ - get current fan duty cycle/percentage + 获取当前风扇占空比/百分比 :return: current fan duty cycle in percentage """ try: @@ -134,7 +136,7 @@ class IpmiTool: # If raw command fails or returns 0, get fan speeds from sensor data and convert to approximate percentage try: - data = self.sensor() + data = sensor_data if sensor_data is not None else self.sensor() fan_rpm_values = [] import re @@ -198,4 +200,4 @@ class IpmiTool: self.switch_fan_mode(auto=False) base_cmd = 'raw 0x30 0x30 0x02 0xff' - return self.run_cmd(cmd=f'{base_cmd} {hex(speed)}') \ No newline at end of file + return self.run_cmd(cmd=f'{base_cmd} {hex(speed)}') diff --git a/start.py b/start.py index de5fad2..949bed8 100644 --- a/start.py +++ b/start.py @@ -19,12 +19,14 @@ if __name__ == '__main__': if not password: raise RuntimeError('未设置 PASSWORD 环境变量') + client = FanController(host=host, username=username, password=password) + while True: try: - client = FanController(host=host, username=username, password=password) client.run() time.sleep(60) except Exception as err: logger.error( f'运行控制器失败 {err}. {traceback.format_exc()}' - ) \ No newline at end of file + ) + time.sleep(60)