Bei uns zu Hause läuft seit geraumer Zeit ein TV-/MySQL-/Fileserver unter Ubuntu 14.04, der drei OpenELEC-Clients sowie diverse mobile Geräte mit Live-TV und Filmen/Serien/Musik versorgt.
Dank recht energiesparender Hardwareauswahl liegt der Verbrauch zwar nur bei knapp 25 Watt im idle (wenn alle HDD's schlafen), trotzdem summiert sich der Verbrauch aufs Jahr gerechnet dennoch. Dazu kurz folgende Überschlagsrechnung: 0,2625 €/kWh * 0,025 kW Verbrauch * 24 Stunden * 365 Tage = ca. 60€/Jahr.
Das ist sicherlich nicht wahnsinnig viel, bietet aber dennoch Raum für Einsparungen - gerade nachts und mittags wird bei uns oft weder ferngesehen noch aufgenommen.
Das wiki auf ubuntuusers.de bietet dafür allerlei vorbereitete Skripte, u.a. dieses, dieses und dieses. Alles diese Skripte haben gemein, dass sie natürlich keine Abfrage für Tvheadend über aktive Verbindungen/Streams zu den Clients sowie anstehende Aufnahmen beinhalten und keine Timer setzen.
Einiges in den oben verlinkten Skripten war mir schlicht zu hoch, weshalb ich mir per copy/paste ein eigenes Skript erstellt habe, das ich auch verstehe und an meine Ansprüche anpassen kann.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# This script uses curl. Install curl on ubuntu/debian using the command "sudo apt-get install curl" | |
#Replace "yes" with "no" to deactivate auto suspend | |
AUTO_SUSPEND=yes | |
if [ "$AUTO_SUSPEND" = "no" ] | |
then | |
echo "Automatic suspend deactivated" | |
exit | |
fi | |
#Set time in seconds to prevent this script from running during boot | |
sleep 60s | |
#Check for users logged in | |
echo "Checking logged in users" | |
USERCOUNT=`who | wc -l` | |
if [ "$USERCOUNT" -gt 0 ] | |
then | |
echo $USERCOUNT user/users logged in | |
echo "Stay Awake" | |
exit | |
else | |
echo "No users logged in" | |
fi | |
echo "Checking online Clients" | |
#Check 192.168.1.5 | |
if ping -c 1 -w 1 192.168.1.5 > /dev/null | |
then | |
echo "192.168.1.5 is online" | |
echo "Stay Awake" | |
exit | |
else | |
echo "192.168.1.5 is offline" | |
fi | |
#Check 192.168.1.6 | |
if ping -c 1 -w 1 192.168.1.6 > /dev/null | |
then | |
echo "192.168.1.6 is online" | |
echo "Stay Awake" | |
exit | |
else | |
echo "192.168.1.6 is offline" | |
fi | |
#Check 192.168.1.7 | |
if ping -c 1 -w 1 192.168.1.7 > /dev/null | |
then | |
echo "192.168.1.7 is online" | |
echo "Stay Awake" | |
exit | |
else | |
echo "192.168.1.7 is offline" | |
fi | |
echo "No clients online" | |
#Query Tvheadend for subsciptions | |
echo "Checking subcriptions" | |
SUBS="`curl -s --user USER:PASSWORD http://127.0.0.1:9981/status.xml | grep "subscriptions" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}'`" | |
#Checking subscriptions | |
if [ "$SUBS" -gt 0 ] | |
then | |
echo "$SUBS subscriptions" | |
echo "Stay awake" | |
exit | |
elif [ "$SUBS" -eq 0 ] | |
then | |
echo "No subscriptions" | |
fi | |
#Query Tvheadend for next recording | |
echo "Checking recordings" | |
RECN="`curl -s --user USER:PASSWORD 127.0.0.1:9981/status.xml | grep "next" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}'`" | |
echo Next recording starts in $RECN minutes | |
#Convert $RECN to seconds | |
RECNS=$(($RECN * 60)) | |
echo Next recording starts in $RECNS seconds | |
#Query Unix time | |
DATE=`date +%s` | |
echo Unix Time is $DATE | |
#Check pending recordings and set wakup timer | |
if [ -z "$RECN" ] | |
then | |
echo "No recordings scheduled" | |
echo "Going to sleep" | |
WAKEUP2DAYS=$(($DATE + 172800)) | |
echo 0 > /sys/class/rtc/rtc0/wakealarm | |
echo Setting $WAKEUP2DAYS in /sys/class/rtc/rtc0/wakealarm | |
echo $WAKEUP2DAYS > /sys/class/rtc/rtc0/wakealarm | |
sleep 5 | |
/usr/sbin/pm-suspend | |
elif [ "$RECN" -lt 15 ] | |
then | |
echo "Next recording in less than 15 minutes" | |
echo "Stay awake" | |
exit | |
else | |
echo "Next recording in more than 15 minutes" | |
echo "Going to sleep" | |
WAKEUPTIMER=$(($DATE + $RECNS - 60)) | |
echo 0 > /sys/class/rtc/rtc0/wakealarm | |
echo Setting $WAKEUPTIMER in /sys/class/rtc/rtc0/wakealarm | |
echo $WAKEUPTIMER > /sys/class/rtc/rtc0/wakealarm | |
sleep 5 | |
/usr/sbin/pm-suspend | |
exit | |
fi |
Das Skript prüft, ob
- "no" in Zeile 7 gesetzt wurde
- User eingeloggt sind (bspw. per ssh)
- die PC's mit den IP's 192.168.1.[5,6,7] online sind
- Tvheadend gerade streamt oder aufnimmt
- Innerhalb der nächsten 15 Minuten eine Aufnahme beginnt
Sollte keine der Bedingungen erfüllt sein, schreibt es entweder den passenden RTC-Timer für die nächste Aufnahme (abzüglich 60 Sekunden Vorlauf zum Hochfahren) oder - wenn keine Aufnahme programmiert wurde - einen Timer in 2 Tagen zur EPG Aktualisierung und schickt den Server dann in den Standby.
Das Skript benötigt das Paket curl, zu installieren per "sudo apt-get install curl".
Angepasst werden müssen zwingend noch "USER" und "PW" in den Zeilen 72 und 89. Ersetzt diese durch euren Benutzernamen nebst Passwort , das ihr auch im Tvheadend Webinterface benutzt.
Ausgeführt wird es alle 5 Minuten per Eintrag in /etc/crontab:
*/5 * * * * Benutzer /Pfad/zum/Skript/tvhsuspend.sh > /dev/null 2>&1
Man könnte das Skript sicher noch etwas verschönern, bspw. durch eine separate Konfigurations-Datei. Anmerkungen und Verbesserungen sind daher herzlich willkommen!
Vielen Dank für diesen hilfreichen Artikel!
AntwortenLöschenIch habe auf Basis dieses und des bestehenden Ubuntu-Autosuspend-Skriptes eine Variante mit separater Konfigurationsatei erstellt, zu finden unter https://github.com/git-developer/autosuspend
Ein Traum, großartige Arbeit!
AntwortenLöschenPerfekte Grundlage zur Umsetzung in Openhab. Werd ich mich mal dran versuchen, da ich eine Wetek als PVR einsetze und diese vom Strom trenne, wenn sie runtergefahren ist. :-)