From 6a331c1dff2a18d0ac30a444dfad632e31beed09 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 2 Feb 2019 21:57:21 +0100 Subject: [PATCH] My Changes so far. --- hddfancontrol/__init__.py | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/hddfancontrol/__init__.py b/hddfancontrol/__init__.py index ce41b16..1169fe8 100755 --- a/hddfancontrol/__init__.py +++ b/hddfancontrol/__init__.py @@ -130,6 +130,10 @@ class Drive: """ Return True if drive is in low power state, False otherwise. """ return (self.getState() in (Drive.DriveState.STANDBY, Drive.DriveState.SLEEPING)) + def isUnknown(self): + """ Return True if drive is in unknown state, False otherwise. """ + return self.getState() == Drive.DriveState.UNKNOWN + def getTemperature(self): """ Get drive temperature in Celcius using either hddtemp or hdparm. """ if not self.supports_hitachi_temp_query: @@ -156,7 +160,8 @@ class Drive: temp_unit = drive_data[4] if temp_unit != "C": raise RuntimeError("hddtemp daemon is not returning temp as Celsius") - temp = int(drive_data[3]) + else: + temp = int(drive_data[3]) found = True break if not found: @@ -342,12 +347,12 @@ class Fan: def setPwmValue(self, value): """ Set fan PWM value. """ assert(0 <= value <= 255) - with open(self.enable_filepath, "r+t") as enable_file: - enabled_val = int(enable_file.read().strip()) - if enabled_val != 1: - self.logger.warning("%s was %u, setting it to 1", self.enable_filepath, enabled_val) - enable_file.seek(0) - enable_file.write("1") +# with open(self.enable_filepath, "r+t") as enable_file: +# enabled_val = int(enable_file.read().strip()) +# if enabled_val != 1: +# self.logger.warning("%s was %u, setting it to 1", self.enable_filepath, enabled_val) +# enable_file.seek(0) +# enable_file.write("1") self.logger.debug("Setting PWM value to %u" % (value)) with open(self.pwm_filepath, "wt") as pwm_file: pwm_file.write("%u" % (value)) @@ -571,18 +576,28 @@ def main(drive_filepaths, fan_pwm_filepaths, fan_start_values, fan_stop_values, # calc max drive temperature temps = [] awakes = [] + unknowns= [] for drive in drives: awake = not drive.isSleeping() + unknown = drive.isUnknown() + awakes.append(awake) - if awake or drive.supports_hitachi_temp_query: - temps.append(drive.getTemperature()) - else: + unknowns.append(unknown) + if (awake and not unknown) or drive.supports_hitachi_temp_query: + try: + temps.append(drive.getTemperature()) + except Exception as e: + logger.error("Could not get Temperature: " + str(e)) + temps.append(35) + elif not awake: logger.debug("Drive %s is in low power state, unable to query temperature" % (drive)) + else: + logger.debug("Drive %s is in unknown state, unable to query temperature" % (drive)) if temps: temp = max(temps) logger.info("Maximum drive temperature: %u C" % (temp)) else: - assert(not any(awakes)) + #assert(not any(awakes)) logger.info("All drives are in low power state") if not any(awakes): @@ -592,6 +607,8 @@ def main(drive_filepaths, fan_pwm_filepaths, fan_start_values, fan_stop_values, if temps and (temp > min_temp): fan_speed_prct = 100 * (temp - min_temp) // (max_temp - min_temp) fan_speed_prct = int(min(fan_speed_prct, 100)) + elif any(unknowns): + fan_speed_prct = 6 else: fan_speed_prct = 0 fan_speed_prct = max(fan_speed_prct, min_fan_speed_prct)