Power management of HDD EON chassis?

Hi
Has anyone had any experience with the best way to manage any HDD plugged into the EON chassis yet?
I’m running a stock Pi 64 Bit LT with OMV, CUPS, PI-VPN and TVheadend all running well with each other, but when it comes to the power management side of OMV no luck!
Have tried a number of combination within OMV and they all seem to lead to the same result of the HDD stay running except for 1 that seems to constantly cycle its power in a controlled way that is, disable the PM and everything works well.
I am very much a newb to this so don’t bombard me with very technical answer as won’t fully understand.
Cheers

Only issue to doing that is lose the capability of cooling the HD when needed!

You are absolutely right.
BUT, at least in my case, I´d much rather have the HDD spindown rather than check their temp and wake them up. I have 4 x 2.5 hdds (and an external one, 2.5 as well) but they are idle most of the time. I want to save power and most importantly, lower background noise at home. I only have media and some personal files on the EON. HDDs temps are usually lower than 30ºC with no active cooling and, when used, they usually do not spin up all at the same time.
Guess the final solution would be finding something to check the HDDs temps without spinning them up.

PS: and from what I´ve seen the current Argon config would also power on the EON fan if an external HDD (not inside the EON case) reaches the configured temps…

Unfortunately Argon’s Python code that drives the OLED isn’t very well made.
Instead of completely disabling the OLED-functionality I added a decorator/extra function to my Argon script (/etc/argon/argonsysinfo.py) that checks if the disk is spun down. If the disk is currently in standby, it uses the last known value; if the disk is active, it updates the last known value with the current one.

It also prevents any consecutive active checks for ~30min, to avoid the disk from showing as constantly active so hd-idle can identify the disk as idle and spin it down.

Simply insert the following code in the Python file and add @no_spinup above the following functions

  • argonsysinfo_gethddtemp
  • argonsysinfo_listhddusage
  • argonsysinfo_listraid

It should look like this then:

@no_spinup
def argonsysinfo_listraid():
    ...

Code – simply insert on top of /etc/argon/argonsysinfo.py

# Set the amount of minutes an active check is allowed to be performed when disks are active;
# this ensures hd-idle can identify the disks as idle and spin them down after a certain time
SPINUP_ACTIVE_CHECK_MINUTES = 30
_spinup_cache = {}

def no_spinup(f):
	""" Prevents disks from spinning back up for Argon's checks by acting as a ghetto-cache """
	from datetime import datetime, timedelta
	global _spinup_cache
	def _hdds_up() -> bool:
		command = 'hdparm -C /dev/sd*'
		try: 
			status = os.popen(command).read()
			status = status.split('\n')
		except IOError: return False
		except Exception: return True
		hdds_status = [s for s in status if s and 'drive state is' in s]
		return not any(hdd_status for hdd_status in hdds_status if 'standby' in hdd_status)

	def func(*args, **kwargs):
		fname = f.__name__
		if not _hdds_up():  # at least one HDD is currently idle
			if 'gethddtemp' in fname:  # ensure fan does not spin up when idle
				return {'/dev/sda': 0.00}
			return _spinup_cache.get(fname, {})
		if _spinup_cache.get('last_result') and \
			datetime.now() - timedelta(minutes=SPINUP_ACTIVE_CHECK_MINUTES) > _signup_cache['last_result']:
			return _spinup_cache.get(fname, {})
		result = f(*args, **kwargs)
		_spinup_cache[fname] = result
		_spinup_cache['last_result'] = datetime.now()
		return result
	return func

This can all simply be fixed by Argon, by checking if a disk is inactive before querying it. But I doubt we’ll live to witness that.

Hope it helps someone stumbling above this thread.

1 Like

It was exactly what I was looking for.
How will it handle if only one of the four disks is active at the time of the check? Will it update only those that are active and will it keep the last temperature of the others?
Thanks

@alfonsrv Thaks for your addition to argonsysinfo.py
I have one remark only. In the original file available on github is **argonsysinfo_gethddtemp** missing so did you modify any other file with the same name?