Strom sparen

Unser Router steht im Keller und müsste daher eigentlich permanent eingeschaltet sein, denn wer will schon immer in den Keller rennen, wenn mal etwas im Internet nachzuschauen ist. Permanente Verfügbarkeit ist natürlich in Bezug auf den Stromverbrauch Unsinn. Daher muss eine vernünftige Energiesparmaßnahme her.

Um Energie zu sparen, könnte man eine Kiste verwenden, die eine geringe Leistungsaufnahme hat. Eine fritzBox wäre da wahrscheinlich nicht ganz verkehrt. Deren Funktionsumfang ist zwar phänomenal, aber wir wollen denn doch etwas mehr (s. Router Konfiguration). Daher muss also ein PC her, der von sich aus energiesparend ist. Das eigentliche Problem ist aber die Laufzeit: Wenn ich wenige Stunden am Tag online bin, würde in der restlichen Zeit sinnlos Energie verbrutzelt. Daher muss man also an dieser Schraube drehen und den Router nur dann einschalten, wenn man ihn braucht - und das aus der Ferne.

Die Lösung ist ein ASCOM Teleswitch!

Dieses Gerät gibt dann seine Stromsteckdose frei, wenn man es per Telefon anruft. Strom kann dann für eine vorgewählte Zeit fließen. Diese kann im Bereich von einer Minute bis zu einer Stunde relativ frei eingestellt werden. Der Router selbst wird durch die BIOS-Funktion Wake-on-serial-line ebenfalls durch das Telefonsignal aufgeweckt, welches durch ein Modem signalisiert wird.

Bleibt das Problem, dass man den Router natürlich nicht nur eine feste Zeitdauer eingeschaltet haben möchte, sondern so lange, wie man ihn braucht. Die Lösung des Problems: Der Router selbst ruft solange er benötigt wird, den Teleswitch immer wieder an und hält so seine eigene Stromversorgung permanent aufrecht - erinnert mich irgendwie immer an Münchhausen. (Auf diese Weise wird übrigens auch mein altes Modem weiterhin gebraucht, wenn auch nur, um immer wieder sich selbst anzurufen. Ist zwar vor dem Hintergrund dessen, was das Modem seinerzeit mal gekostet hat, schade, aber immer noch besser, als es zu verschrotten.)

Und woher "weiß" der Rechner nun, wie lange er benötigt wird? Auch das ist eigentlich bei einem Router trivial: Solange noch Netzwerkaktivitäten zu verzeichnen sind, wird er offenkundig noch benötigt.

Wie diese Grundidee bei uns konkret ausgeführt ist, beschreibe ich nachfolgend.

Schaltplanskizze

Der Aufbau des Systems sieht schematisch so aus:

Der ASCOM Teleswitch wird folglich in die Telefonleitung zwischen ISDN-Telefonanlage und Modem eingeschleift. Er registriert Aktivität auf der Leitung und bleibt jeweils eine Einschaltperiode eingeschaltet, liefert also so lange Strom. Jede weitere Aktivität auf der Telefonleitung verlängert die Stromlieferung um eine Einschaltperiode.

Programme

Es werden zwei Programme benötigt, um das oben skizzierte Verfahren zu realisieren: Ein Programm dient dazu, den Teleswitch regelmäßig anzurufen, und zwar so häufig, dass dieser immer noch während der Einschaltdauer angeklingelt wird. Dann liefert er wieder für eine weitere Einschaltperiode Strom.

Das zweite Programm dient zum Auswerten des Netzwerktraffics. Sollte nach einer gewissen Zeitspanne kein Traffic mehr zu verzeichnen sein, wird der Rechner heruntergefahren. Beide Programme sind als Shell-Scripte ausgeführt, die ich in die Startlogik des Routers eingebunden habe.

-rwxr-xr-x  1 root root 2246 2006-11-02 06:49 init.d/ASCOMkeepalive
-rwx------  1 root root 1676 2006-08-25 09:23 init.d/wnt
lrwxrwxrwx  1 root root   24 2006-06-15 22:39 rc2.d/S01ASCOMkeepalive -> ../init.d/ASCOMkeepalive
lrwxrwxrwx  1 root root   13 2006-06-15 22:39 rc2.d/S01wnt -> ../init.d/wnt
lrwxrwxrwx  1 root root   24 2006-06-15 22:39 rc3.d/S01ASCOMkeepalive -> ../init.d/ASCOMkeepalive
lrwxrwxrwx  1 root root   13 2006-06-15 22:39 rc3.d/S01wnt -> ../init.d/wnt
lrwxrwxrwx  1 root root   24 2006-06-15 22:39 rc5.d/S01ASCOMkeepalive -> ../init.d/ASCOMkeepalive
lrwxrwxrwx  1 root root   13 2006-06-15 22:39 rc5.d/S01wnt -> ../init.d/wnt

Der "Lebenserhalter" des Teleswitchs ASCOMkeepalive:

# dieses kleine Programm sorgt dafuer, dass der ASCOM Teleswitch
# eine Verbindung vorgegaukelt bekommt. Solange dies der Fall ist,
# schaltet er nicht ab und verlaengert sein Abschalt-Delay. Der
# Rechner kann daher mit Bordmitteln sauber ausgeschaltet werden
# wir brauchen ein Modem am ersten seriellen Port:
MODEM=/dev/modem
# Verzeichnis, in dem die benötigten Daten liegen
VARRUN=/var/run/ASCOMkeepalive
# Nummern, die ueber das Modem angerufen werden koennen (alles fakes!)
NLIST="17"
case "$1" in
        start)
                if [ ! -d $VARRUN ]; then
                        mkdir $VARRUN
                fi
                if [ -f $VARRUN/modem.out ]; then
                        mv $VARRUN/modem.out $VARRUN/modem.out.previous
                fi
                >$VARRUN/prog.pid
                stty -F $MODEM sane
                stty -F $MODEM -inlcr
                stty -F $MODEM ispeed 38400
                stty -F $MODEM ospeed 38400
                # Werte zurücksetzen
                echo "at&f" >$MODEM
                sleep 1
                # Init-String wie minicom ihn macht
                echo "at s0=2 s7=10 l0 m0 v1 &c1 e0 q0 *w" >$MODEM
                sleep 1
                (while [ '1' -eq '1' ]; do
                        for NUM in $NLIST; do
                                echo "atx1dt$NUM" >$MODEM
                                sleep 15
                                echo "ath" >$MODEM
                                # die Verzoegerung muss zur Ausschaltverzoegerung
                                # am ASCOM Teleswitch passen, außerdem muss
                                # sie größer 30 s (Wahlsperre) sein
                                sleep 90
                        done
                done ) &
                echo $! >$VARRUN/prog.pid
                # Ausgaben vom Modem vernichten:
                cat >$VARRUN/modem.out <$MODEM &
                echo $! >$VARRUN/cat.pid
                ;;
       stop)
                if [ -f $VARRUN/prog.pid ]; then
                        PID=`head -1 $VARRUN/prog.pid`
                        ps -ef | grep $PID | grep ASCOM && kill $PID
                        rm $VARRUN/prog.pid
                fi
                if [ -f $VARRUN/cat.pid ]; then
                        PID=`head -1 $VARRUN/cat.pid`
                        ps -ef | grep $PID | grep cat && kill $PID
                        rm $VARRUN/cat.pid
                fi
                ;;
        status)
                if [ -f $VARRUN/prog.pid ]; then
                        echo "`basename $0` is running with PID `cat $VARRUN/prog.pid`."
                else
                        echo "`basename $0` is not running"
                fi
                ;;
esac

Das Programm legt ein Verzeichnis /var/run/ASCOMkeepalive an, in dem es die Ausgaben des Modems (modem.out) und Statusinformationen ablegt. Wichtig ist, dass die Zeitdauer, innerhalb derer jeweils ein neuer Anruf erfolgt,
> als die Wahlsperrenzeit des Modems und
< als die Einschaltdauer das ASCOM Teleswitches
sein muss!

Das zweite Programm wird benötigt, um den Netzverkehr zu protokollieren und den Rechner schlafen zu legen, wenn keine Aktivitäten mehr zu verzeichnen sind. Es nennt sich wnt (watch network traffic):

#
# watch network traffic
#
# Wenn fuer einen definierten Zeitraum kein Netzwerktraffic bemerkt wird,
# wird das System heruntergefahren.
#
# die Zeit, innerhalb der Netzwerkverkehr beobachtet werden muss, damit
# das System _nicht_ heruntergefahren wird:
WATCHTIME=1200
WATCHINTV=300
# die Netzwerkinterfaces, die beobachtet werden sollen
WATCHEDIF="eth0 eth1 ath0"
# das Kommando zum Runterfahren
SHUTDOWNCMD="shutdown -h +2"
# meine Merkdateien
MYBASEDIR=/var/run/wnt
DATAFILE=$MYBASEDIR/data
PREVDATA=$MYBASEDIR/data.prev
PIDFILE=$MYBASEDIR/pid
DOWNFILE=$MYBASEDIR/down
DATALOG=/var/log/wnt.log
case "$1" in
        start)
                if [ ! -d $MYBASEDIR ]; then
                        mkdir $MYBASEDIR
                fi
                >$PIDFILE
                >$PREVDATA
                CNT=0
                (while [ '1' -eq '1' ]; do
                        >$DATAFILE
                        for if in $WATCHEDIF; do
                                ifconfig $if | grep "RX packets" >>$DATAFILE
                        done
                        cmp -s $DATAFILE $PREVDATA
                        if [ $? -eq 0 ]; then
                                CNT=`expr $CNT + 1`
                        else
                                CNT=0
                        fi
                        REMAIN=`expr $CNT \* $WATCHINTV`
                        REMAIN=`expr $WATCHTIME - $REMAIN`
                        echo $REMAIN >$DOWNFILE
                        if [ $CNT -ge `expr $WATCHTIME / $WATCHINTV` ]; then
                                echo "`date`: no network traffic for $WATCHTIME s: halt-ing system.">>$DATALOG
                                $SHUTDOWNCMD
                        fi
                        sleep $WATCHINTV
                        cp $DATAFILE $PREVDATA
                done) &
                echo $! >$PIDFILE
                ;;
        stop)
                if [ -f $PIDFILE ]; then
                        PID=`head -1 $PIDFILE`
                        ps -ef | grep $PID | grep wnt && kill $PID
                        rm $PIDFILE
                fi
                ;;
        status)
              if [ -f $PIDFILE ]; then
                        echo "`basename $0` is running with PID `cat $PIDFILE`."
                        echo "The system may be halted in `cat $DOWNFILE`s."
                else
                        echo "`basename $0` is not running"
                fi
                ;;
esac

Das Script schaut einfach alle WATCHINTV s nach, was ifconfig für die lokalen Netzwerkinterfaces (also nicht den Internetanschluss) ausgibt. Dies wird mit den vorhergenden Daten per cmp verglichen. Wenn sich WATCHTIME s nach einem bestimmten ifconfig-Ergebnis nichts geändert hat, liegt keine Netzwerkaktivität mehr vor und der Rechner wird heruntergefahren. Seine Daten legt das Script übrigens in /var/run/wnt ab.

Mit den oben gewählten Einstellungen bleibt der Router also jedenfalls mindestens 20 Minuten an. Wenn in dieser Zeit niemand etwas von ihm will, fährt er herunter. Muss er dagegen Antworten übers Netzwerk geben, bleibt er weiter eingeschaltet. Der ASCOM Teleswitch bleibt nach dem Herunterfahren des Routers noch maximal eine Einschaltperiode an, dann schaltet er sich ab, da keine Anrufe mehr eintreffen. Ob dabei der Router von wnt heruntergefahren wurde oder anderweitig, ist herzlich egal. Daher kann man ihn auch "manuell" herunterfahren, wenn klar ist, dass er nicht mehr benötigt wird - wieder ein wenig zur CO2 Reduktion beigetragen.

Die Trennung der beiden Scripte ist übrigens bewusst gemacht worden. Auf diese Weise kann man wnt auch für andere Konfigurationen einsetzen. Ich verwende es z.B. auch beim Printserver.

Optimierung der Einschaltdauer am Teleswitch

Es gibt zwei gegensätzliche Pole bei der Bewertung, welche Einschaltdauer am Teleswitch zu wählen ist:

a) Sie sollte möglichst kurz sein, damit nach dem Abschalten des Routers ein erneuter Anruf eines Benutzers die Kiste wieder einschaltet. (Der Scenic reagiert erst dann wieder auf das "Modem-Ring", wenn er zuvor vom Netz getrennt war, also der Teleswitch abgeschaltet hatte - ich vermute eine etwas eigenwillige Interpretation des ACPI Standards durch die Siemens Entwickler...) Hier liegt also eine gewisse Totzeit vor, innerhalb derer das System nicht wieder zum Starten zu bewegen ist. Das Ganze wird übrigens dadurch zusätzlich lästig, dass wiederholte Anrufer des Benutzers während der Totzeit zwar den ASCOM angeschaltet lassen, den Scenic aber nicht zu wecken vermögen. Die Totzeit wird damit wieder um die Einschaltzeit verlängert. Das Ganze wäre mit einem Rechner, der sich immer durch die serielle Leitung wecken ließe, zu entschärfen. Für meine Konfiguration gilt jedoch: Die Einschaltdauer des Teleswitches sollte möglichst kurz sein!

b) Die Einschaltdauer sollte allerdings ausreichend lang sein, damit der Router Zeit zum Booten hat. Das Maß der Dinge ist dabei der Zeitpunkt, wann das Script ASCOMkeepalive seine Arbeit aufnehmen kann. Wenn zuvor ein Filesystem-Check abläuft, kann das schon mal recht lange dauern. Ich habe es daher so eingerichtet, dass nur die Betriebssystem-Platte vor diesem Script eingebunden wird (und damit geprüft werden kann). Die große Datenplatte wird erst danach gemountet (beides wird durch eine geeignete Kommentierung in /etc/fstab erreicht, welche der normale mount-Vorgang ignoriert, ein spezielles "Spät-mount-Script" aber auswertet.)

Die Erfahrung hat gezeigt, dass wir mit einer Einschaltdauer des Teleswitches von 5 Min gut zurecht kommen. Die gelegentlich mal zu verzeichnende Totzeit (s. a) wird selten genug beobachtet, sodass sie verschmerzbar ist.

Komponenten, die über den Teleswitch versorgt werden

Alle Netzwerk- und Routerkomponenten, die nur dann einen Zweck haben, wenn der Router läuft, werden gleichfalls durch den ASCOM mit Strom versorgt: Neben dem Router selbst sind dies der Switch, das analoge (Lebenserhaltungs-) Modem und das DSL-Modem. Die Telefonanlage hingegen ist natürlich permanent eingeschaltet. (Bilder der Gesamtanlage sind unter den Punkten Router und Netzwerk abgelegt.)