egregius.be

Urban Exploration, PHP and others…

Synology Diskstation auto-shutdown

Ik gebruikte al jaren ‘advanced power management’ op de Synology Nas zodat die automatisch zou uitschakelen, als er niks te doen is tenminste.
Sinds de installatie van DSM6.0 Beta werkte die plugin niet meer en bleef de nas dus 24/7 online.
Uiteindelijk maar zelf aan de slag gegaan, wou eigenlijk toch al een tijd dat het uitschakelen enkel gebeurde wanneer we niet thuis zijn of aan het slapen zijn. Dit dankzij de aanwezige schakelaar ‘Weg’ en ‘Slapen’ in Domoticz.

Op zich hoeven er slechts 3 variabelen ingesteld te worden: disk, network en period.
Disk bepaalt hoeveel blocken er maximaal mogen gelezen of geschreven zijn per seconde, network hoeveel bytes ontvangen/verzonden. Period voorkomt dan weer dat het script meerdere keren zou uitgevoerd kunnen worden.

Voor de koppeling met Domoticz creëerde ik een aparte ‘kamer’ met enkel de schakelaars die ik nodig heb, op deze manier is het verkeer naar Domoticz minimaal en gaat het parsen van de JSON reply bijzonder snel.

Hieronder het resultaat (uit te voeren door Syno’s taakplanner):

#!/usr/bin/bash
DISK=1
NETWORK=10000
PERIOD=550

NOW=$(date +%s)
NOWTIME=$(date +"%Y/%m/%d %H:%M:%S")
LAST=`cat /tmp/domcheck`
RXBYTESLAST=`cat /tmp/RXBYTESLAST`
TXBYTESLAST=`cat /tmp/TXBYTESLAST`
RBLOCKSLAST=`cat /tmp/RBLOCKSLAST`
WBLOCKSLAST=`cat /tmp/WBLOCKSLAST`
if [[ $RXBYTELAST == '' ]]; then echo 0 > /tmp/RXBYTESLAST; RXBYTELAST=0; fi
if [[ $TXBYTELAST == '' ]]; then echo 0 > /tmp/TXBYTESLAST; TXBYTELAST=0; fi
if [[ $RBLOCKSLAST == '' ]]; then echo 0 > /tmp/RBLOCKSLAST; RBLOCKSLAST=0; fi
if [[ $WBLOCKSLAST == '' ]]; then echo 0 > /tmp/WBLOCKSLAST; WBLOCKSLAST=0; fi
if [[ $LAST == '' ]] ; then echo $NOW > /tmp/domcheck; LAST=$NOW; fi
TLAST=$(expr $NOW - $LAST)
if [[ $TLAST -gt $PERIOD ]];then
	RXBYTES=`ifconfig bond0 | grep "RX bytes" | cut -d: -f2 | awk '{ print $1 }'`
	TXBYTES=`ifconfig bond0 | grep "TX bytes" | cut -d: -f3 | awk '{ print $1 }'`
	RX=$(expr $RXBYTES - $RXBYTESLAST)
	TX=$(expr $TXBYTES - $TXBYTESLAST)
	TOTAL=$(expr $RX + $TX)
	PERTIME=$(expr $TOTAL / $TLAST)
	RBLOCKS=`cat /sys/block/sda/stat | tr -s ' ' | cut -d ' ' -f 2`
	WBLOCKS=`cat /sys/block/sda/stat | tr -s ' ' | cut -d ' ' -f 7`
	READ=$(expr $RBLOCKS - $RBLOCKSLAST)
	WRITE=$(expr $WBLOCKS - $WBLOCKSLAST)
	TOTALBLOCKS=$(expr $READ + $WRITE)
	BLOCKSPERTIME=$(expr $TOTALBLOCKS / $TLAST)
	echo $RXBYTES > /tmp/RXBYTESLAST
	echo $TXBYTES > /tmp/TXBYTESLAST
	echo $RBLOCKS > /tmp/RBLOCKSLAST
	echo $WBLOCKS > /tmp/WBLOCKSLAST
	echo $NOWTIME : Period=$TLAST : Disk=$BLOCKSPERTIME/$DISK : Net=$PERTIME/$NETWORK >> /tmp/TRX.txt
	echo $NOW > /tmp/domcheck
	#sudo ping -q -c1 192.168.0.20 ; echo $?
	if [[ $PERTIME -lt $NETWORK ]] && [[ $BLOCKSPERTIME -lt $DISK ]];then
		DOMOTICZ=`curl -s "http://192.168.0.8:8080/json.htm?type=devices&used=true&plan=6"`
		SLAPEN=`echo $DOMOTICZ | jq -r '.result[0].Status'`
		WEG=`echo $DOMOTICZ | jq -r '.result[1].Status'`
		if [ $SLAPEN = "On" ] || [ $WEG = "On" ]; then
			curl -s "http://192.168.0.8:8080/json.htm?type=command&param=switchlight&idx=269&switchcmd=Off&level=0&passcode="
			echo $NOWTIME : Shutting down now >> /tmp/TRX.txt
			sudo shutdown -P now >> /tmp/TRX.txt
		fi
	fi
fi
exit

Het ‘wakker’ maken van de Nas gebeurt ofwel door mijn iMac, ofwel door Domoticz. Dit stukje script schakelt ook de schakelaar uit in Domoticz als de Nas in slaapstand staat.

if($Sdiskstation=='On'&&$STdiskstation<$vijfmin) {
	$status = pingDomain('192.168.0.10', 5000);
	if(is_int($status)) {
		sleep(5);
		$status2 = pingDomain('192.168.0.10', 5000);
		if(is_int($status2)) Schakel($SIdiskstation, 'Off','diskstation');
	}
} else if($Sdiskstation=='Off' &&($Sbureeltobi=='On'||$Skodi=='On')) shell_exec('wakeonlan 00:11:32:2b:d1:1a');

Het schakelen van de schakelaar in Domoticz bij opstarten van de nas is een eenvoudige curl:

#!/usr/bin/env ash
curl -s "http://192.168.0.8:8080/json.htm?type=command&param=switchlight&idx=269&switchcmd=On&level=0&passcode="

Reacties zijn gesloten.