From ca23ce94186214b7a6249b1a71ed15b539ff4ed4 Mon Sep 17 00:00:00 2001 From: Giovanni Harting <539@idlegandalf.com> Date: Sun, 15 Nov 2020 17:50:22 +0100 Subject: [PATCH] added support for multiple temperature sources, highest wins --- config-example.yaml | 9 +++++++-- pyfan.py | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/config-example.yaml b/config-example.yaml index d88b67c..d068ff3 100644 --- a/config-example.yaml +++ b/config-example.yaml @@ -11,11 +11,14 @@ interval: 1 thermalzones: - name: GPU+SYSTEM + # This is your source temperature. source: amdgpu/temp1_input + # This is most likely 1000 for your temp sensor as well. - # If not, check what you sensor is outputing if you try to read from it. + # If not, check what you sensor is outputting if you try to read from it. factor: 1000 + # Define all fans that this thermal zone is going to control. # There is no limit to how many fans one thermal zone can control. # You can have different limitations on your fans, for example: @@ -27,10 +30,12 @@ thermalzones: fan: - it8686/pwm2 - amdgpu/pwm1: 170 + # This is your target temperature. This is one of the main control knobs. Set this to a comfortable temperature for # your equipment. Don't set this as high as its max temperature allowance, since pid is gonna allow some overshooting. target: 60 - # For understanding PID please have a look at https://en.wikipedia.org/wiki/PID_controller. The forementioned page + + # For understanding PID please have a look at https://en.wikipedia.org/wiki/PID_controller. The aforementioned page # also explains what p, i and d stand for and what they do in detail. These are the second main control knobs. # Simplified you can view them as: # p = how heavy should pid weight difference in temperature diff --git a/pyfan.py b/pyfan.py index 68a20dc..c54578b 100644 --- a/pyfan.py +++ b/pyfan.py @@ -73,10 +73,18 @@ class ThermalZone: d=int(d))) def get_temp(self): - if self.read_sysfs(self.temp_source): - return float(self.read_sysfs(self.temp_source)) * self.factor + if type(self.temp_source) is list: + max_temp = -1.0 + for fan in self.temp_source: + if self.read_sysfs(fan): + max_temp = max(float(self.read_sysfs(fan)) * self.factor, max_temp) + + return max_temp else: - return None + if self.read_sysfs(self.temp_source): + return float(self.read_sysfs(self.temp_source)) * self.factor + else: + return None def restore(self): self.setup_pwm(2) @@ -88,7 +96,7 @@ class ThermalZone: self.set_pwm_mode(list(target_fan.keys())[0], value) else: self.set_pwm_mode(target_fan, value) - except FileNotFoundError as err: + except FileNotFoundError: logging.getLogger("pyfan").warning("[%s] pwm not found." " Try reloading hwmon map..." % self.name) self.hwmap = self.pyfan.hwmap