Du bist hier:Start»Linux»Raspberry Pi»Stromsparen

Energiesparen beim Raspberry Pi 2

09.04.2017

Energie

Der Mini-Computer Raspberry Pi verbraucht deutlich weniger Strom als ein Desktop-Computer, kann aber viele Aufgaben eines Desktop-Computers ähnlich gut erledigen. Aus ökologischer Sicht ist er zum Beispiel für einen Dauerbetrieb als Server besser geeignet als ein Desktop-Computer. Im Leerlauf (Idle) mit WLAN-Stick verbraucht der Raspberry aber trotzdem noch 2,5 Watt. In folgendem Artikel zeige ich eine Möglichkeit, den Raspberry Pi per Software in eine Art Bereitschafts-Modus (Suspend) zu versetzen und damit auf nahezu 0 Watt zu bringen.

Stromverbrauch

Ein Vergleich des Stromverbrauchs eines Raspberry Pi mit einem Desktop-Computer oder Laptop zeigt, dass der Raspberry Pi deutlich weniger Energie benötigt.

Gerät Stromverbrauch
Desktop Computer (ohne Monitor) 100 Watt
Laptop mit Display 30 Watt
Raspberry Pi 2, Idle mit WLAN-USB-Stick 2,5 Watt
Raspberry Pi 2 mit ausgeschalteten USB Ports 0 Watt

Der Stromverbauch kann natürlich je nach Ausstattung des Computers und nach der Benutzung variieren (z.B. stromverschwendende Grafikkarte, CPU Vollast oder Leerlauf). Ich habe in der oberen Tabelle meine Messungen mit dem Energiekostenmessgerät EKM 265 von Conrad mit verschiedenen Computern im Idle-Modus eingetragen. Diese Werte dienen hauptsächlich als Richtwert, um ein Gefühl für die Größenordnung des Stromverbauchs der Geräte zu bekommen. Durch das Abschalten der USB-Schnittstellen am Raspberry Pi 2 sinkt der Stromverbrauch des Raspberry auf annährend 0 Watt.

Software

Mit den folgenden Software-Befehlen lassen sich alle USB-Anschlüsse des Raspberry Pi auf einmal an- bzw. abschalten und somit der Stromverbrauch auf 0 Watt senken. Die beschriebenen System-Pfade sind von der Hardware-Version des Raspberry Pi und des Betriebssystems abhängig:

# disable USB at Raspberry Pi 1 and 2 on Raspbian Wheezy
echo 0 > /sys/devices/platform/bcm2708_usb/buspower

# disable USB at Raspberry Pi 1 on Raspbian Jessie
echo 0 > /sys/devices/platform/soc/20980000.usb/buspower

# disable USB at Raspberry Pi 2 on Raspbian Jessie
echo 0 > /sys/devices/platform/soc/3f980000.usb/buspower

# to enable USB use the same line as above with "echo 1"
echo 1 > /sys/devices/platform/... (see above)


# general: find the system path for the USB power in Raspbian Jessie:
find /sys/devices/ -name `dmesg -t | grep dwc_otg | grep "DWC OTG Controller" | awk '{print $2}' | cut -d ":" -f1`

Beim Raspberry Pi 3 läßt sich durch das Onboard-WLAN die Netzwerkverbindung zum Pi noch halten, wenn USB ausgeschaltet wird. Das Problem beim Raspberry Pi 1 und 2 ist allerdings, dass die LAN-Schnittstelle zusammen mit USB abgeschaltet wird und die Verbindung zum Pi verloren geht. Durch ein Shell-Skript läßt sich das Problem der LAN-Schnittstelle aber umgehen, indem die USB-LAN-Schnittstelle jede Minute wieder eingeschaltet wird und dann per Internet geprüft wird, ob der Raspberry Pi die USB-LAN-Schnittstelle dauerhaft eingeschaltet lassen soll.

Das Konzept

Die oben beschriebenen Software-Befehle funktionieren - schön und gut. Allerdings läßt sich allein mit den Befehlen noch nicht sinnvoll Strom sparen. Es fehlen ein Konzept und ein paar Programme beziehungsweise Skripte, die das An- und Abschalten der USB-Schnittstellen im Alltag komfortabel nutzbar machen. Ein mögliches Szenario sieht zum Beispiel so aus, dass ich meinen Raspberry Pi tagsüber von Arbeit aus erreichen können möchte. Strom verbrauchen soll er jedoch nur, wenn ich ihn wirklich von unterwegs aus nutze. Damit der Raspberry Pi weiß, wann er benötigt wird, fragt er regelmäßig bei einem Webserver nach - zum Beispiel alle 60 Sekunden. Den Raspberry Pi kann ich dann mit meinem Smartphone von unterwegs über den Webserver aus- und einschalten. Das folgende Sequenzdiagramm stellt das Szenario dar:

Raspberry Pi über einen Server steuern

Raspberry Pi über einen Server steuern (zum Vergrößern klicken)

Der Raspberry Pi holt sich die Information seines Zustands von einem Server. Dieser Zustand ist entweder "on", "off" oder eine Zahl in Sekunden, wie lang er bis zur nächsten Serverabfrage warten soll. "off" bedeutet dabei nicht komplett aus, sondern eine voreingestellte Zeit in Sekunden bis zur nächsten Serverabfrage (zum Beispiel 120 Sekunden). Während der Wartezeit bis zur nächsten Serverabfrage schaltet der Raspberry seine USB- und LAN-Schnittstelle aus und verbraucht dadurch nahezu 0 Watt. Spätestens wenn der Raspberry den Zustand "on" empfängt, soll er zusätzlich seine IP-Adresse übertragen, damit er übers Internet gefunden werden kann.

Nach Hause telefonieren

Damit aus dem Internet der Raspberry Pi mit Namen gefunden werden kann, gibt es die Möglichkeit einer dynamischen Namensauflösung in eine IP-Adresse (DynDNS). Mit Stand 2016 habe ich zwei kostenlose Dienste ausprobiert, die bisher problemlos für die Namensauflösung funktionieren.

1. Namensauflösung mit SPDNS.de

Die Anmeldung bei SPDNS.de ist kostenlos und datensparsam. Es sind nur eine E-Mail-Adresse und ein Passwort nötig. Nach der Anmeldung gibt es einen Bestätigungslink per HTML-Mail. Danach kann ein Name für den Raspberry Pi als Subdomain gewählt werden - zum Beispiel "raspberry.spdns.de". Um diesem Namen eine IP-Adresse zuzuordnen, sollte ein Token generiert werden, das später als Passwort dient. Über eine spezielle URL kann der Raspberry seine IP-Adresse bei SPDNS aktualisieren.

2. Namensauflösung mit goip.de

Eine Alternative für DynDNS-Dienste ist goip.de. Die Anmeldung bei goip.de ist ebenfalls kostenlos und datensparsam. Über eine spezielle URL kann der Raspberry seine IP-Adresse bei goip aktualisieren. Das Angebot wird von einer Privatperson betrieben, so dass für eine bessere Verfügbarkeit zwei DynDNS-Dienste benutzt werden sollten.

Sicherheit

Da der Raspberry Pi am Internet hängt, kann er theoretisch aus dem Internet angegriffen werden. Um die Angriffsfläche zu verringern, helfen Firewall-Regeln, die das Einloggen auf einen bestimmten IP-Adress-Bereich beschränken. Die folgenden Befehle zeigen, wie die Linux-Firewall iptables einzurichten ist, damit nur IP-Adressen aus dem Bereich 1.2.3.1 bis 1.2.3.254 zugelassen werden (als Beispiel).

# edit the boot file rc.local
vi /etc/rc.local

iptables -F

iptables -A INPUT -i lo -p tcp -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT

iptables -A INPUT -p tcp -m tcp --dport  80 --tcp-flags FIN,SYN,RST,ACK SYN -m iprange --src-range 1.2.3.1-1.2.3.254 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m iprange --src-range 1.2.3.1-1.2.3.254 -j ACCEPT
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -p udp -m udp --sport 123 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT

iptables -A INPUT -p udp -m udp --sport 53 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --sport 53 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT

iptables -A INPUT -j DROP
iptables -A INPUT -p ipv6 -j DROP

Durch Eintragen der Befehle in die Datei /etc/rc.local werden die Befehle automatisch beim Starten des Raspberry Pi ausgeführt.

Der kostenlose Server

Da ich ohnehin einen Webserver bezahle, kann ich diesen Server auch als Vermittler zwischen Raspberry Pi und Smartphone benutzen, wie im oberen Konzept-Bild zu sehen. Natürlich hat nicht jede/r einen Webserver. Deshalb habe ich mich auf die Suche nach kostenlosen Servern gemacht. Schließlich soll das Stromsparen am Raspberry keine zusätzlichen Kosten zum Bezahlen eines Servers verursachen. Folgende Anforderungen sollte der Server erfüllen:

  1. kostenlos
  2. zuverlässig (eine gute Uptime / Erreichbarkeit)
  3. soll eine Datei für den Zustand des Raspberry Pi speichern können
  4. soll eine Weboberfläche zum Verändern dieser Datei anbieten
  5. nice to have: möglichst langfristig verfügbar (einige Jahre)
  6. nice to have: soll halbwegs anonym sein

Die naheliegendsten Server für diese Anforderungen sind kostenlose Webserver. Die meisten kostenlosen Webserver können Dateien speichern und bieten die serverseitige Programmiersprache PHP an, mit der sich Dateien auf dem Server bearbeiten lassen. Zum Test hatte ich mir einige kostenlose Hostingangebote angesehen: unter anderem 000webhost.com, awardspace.com und einige Server, die bei freewebspace.net und freehostsfinder.com gelistet waren. Um die Geschichte abzukürzen: die kostenlosen Hostingangebote waren allesamt nicht zu gebrauchen. Diese Hostingangebote erfüllen vor allem die Anforderungen 2 und 5 bezüglich der Verfügbarkeit und Uptime nicht. So war der kostenlose Server bei 000webhost.com bereits einen Tag nach meiner Anmeldung nicht mehr verfügbar und somit für den Einsatzzweck unbrauchbar. Die meisten dieser kostenlosen Angebote zielen darauf ab, den Kunden in einen kostenpflichtigen Vertrag zu drängen und gestalten deshalb das kostenlose Angebot so unbrauchbar wie möglich. Bei vielen Hostingangeboten fehlt außerdem ein Impressum, so dass unklar ist, wer eigentlich hinter dem Angebot steckt.

häufige Meldung bei kostenlosen Hostingangeboten: Server nicht gefunden

häufige Meldung bei kostenlosen Hostingangeboten: Server nicht gefunden

Fazit: Finger weg von kostenlosen Webhostingangeboten !!!
Wie geht's jetzt weiter ? Gibt es Alternativen ? Ja ! Für kostenlose und zuverlässige Server gibt es trotzdem einige Möglichkeiten. Dafür habe ich mich an den großen Anbietern orientiert, die bereits einige Jahre am Markt sind und stabil und zuverlässig laufen.

GitHub

Aktuell (2016) ist Github aus meiner Sicht einer der zuverlässigsten kostenlosen Server. Github ist bereits seit 2008 am Markt und eigentlich ein Onlinespeicher für Software-Projekte. Allerdings läßt sich GitHub auch benutzen, um Webseiten oder Text-Dateien zu speichern. Diese Dateien können über die Weboberfläche von GitHub bearbeitet werden. Somit erfüllt GitHub die Anforderungen 1. bis 5., die ich weiter oben auf der Seite an einen kostenlosen Server stelle. Einzig den Punkt 6 zur Anonymität gibt es beim kostenlosen Angebot von GitHub nicht. Die Dateien auf GitHub und auch ältere Versionen der Datei sind öffentlich sichtbar. Anhand der Versionsgeschichte könnten Fremde sehen, wann der Raspberry Pi ein- und ausgeschaltet wurde. Die Git-History kann zwar gelöscht werden. Allerdings speichert Github die Anzahl der "contributions" pro Tag. Hier muss jede/r für sich entscheiden, ob diese öffentlichen Informationen problematisch sind. Alternativen wären zum Beispiel GitLab oder Bitbucket. Diese Dienste bieten auch private Dateien an, die Fremde nicht einsehen können. Allerdings habe ich diese Dienste nicht getestet.

Warnung

Eine kleine Warnung hinterher. Der Anbieter sourceforge.net ist ebenfalls ein Onlinespeicher für Software-Projekte. Früher war die Website hervorragend geeignet, um dort kleine Projekte zu speichern. Als Sourceforge im Jahr 2012 von der Firma "Dice Holdings, Inc." gekauft wurde, wurde Sourceforge zur Datenkrake und zum Verteiler von Schadsoftware umfunktioniert. Bei GitHub sehe ich das Problem im Augenblick nicht. Aber auch hier gilt: ab und zu mal über die Betreiber der Plattform GitHub informieren.

Das Skript zur Automatisierung

Nach der Anmeldung bei einem kostenlosen DNS-Dienst wie SPDNS und bei einem kostenlosen Datei-Server wie GitHub fehlt jetzt nur noch ein Skript zur Automatisierung, das auf dem Raspberry Pi läuft und die USB-Schnittstellen ein- beziehungsweise ausschaltet. Damit das Skript funktioniert, müssen einige Dateien auf dem Raspberry Pi vorbereitet werden. Das ist nicht ganz trivial, aber mit den folgenden Schritten sollte es funktionieren.

# prepare .netrc for automatic login to github
echo "machine github.com" >> ~/.netrc
echo "  login github_username" >> ~/.netrc
echo "  password github_password" >> ~/.netrc

# prepare .gitconfig for automatic git upload and download
echo "[user]" >> ~/.gitconfig
echo "  email = name@email.com" >> ~/.gitconfig
echo "  name = github_username" >> ~/.gitconfig

echo "[http]" >> ~/.gitconfig
echo "  lowSpeedLimit = 1000" >> ~/.gitconfig
echo "  lowSpeedTime = 20" >> ~/.gitconfig


# install git and wget as user "root"
sudo bash
apt-get install git wget

# prepare sudo
vi /etc/sudoers
pi ALL=(ALL) NOPASSWD: /bin/date
pi ALL=(ALL) NOPASSWD: /bin/chmod 666 /sys/devices/platform/soc/3f980000.usb/buspower

# use the red LED of the Raspberry Pi 2 to indicate USB on and off
vi /etc/rc.local
echo none > /sys/class/leds/led1/trigger
chmod 666 /sys/class/leds/led1/brightness

exit

# as user "pi" check out your github repository:

mkdir /home/pi/github
cd /home/pi/github
git clone https://github.com/git_username/my_raspberry

mkdir /home/pi/tools
cd /home/pi/tools

# download the scripts to save energy
wget http://torsten-traenkner.de/linux/raspberry/save_energy.tgz

# extract the archive
tar xzvf save_energy.tgz

# automatically start the script
cd save_energy
cp remote_state.desktop /home/pi/.config/autostart/

# edit the configuration file(s):
vi free_server/pi_configuration.txt

# change: GITHUB_REPOSITORY, GITHUB_DIRECTORY

vi free_server/set_dns.sh
# change: spdyn_dns_host, spdyn_dns_token
# change: goip_username, goip_password, goip_dns_host

# if you have your own web server instead of github edit:
vi webserver_with_php/pi_configuration.txt
# change: STATE_URL and so on

vi webserver_with_php/redirect_to_raspberry.php
# change "123.45" to your remote IP address or remove the check

# copy webserver_with_php/*php to your web server

Die Konfigurationsdatei "free_server/pi_configuration.txt" enthält die URL, wo in Github die Zustandsdatei gespeichert ist. Wenn der Benutzername bei Github "git_username" ist und das Repository "my_raspberry", dann sieht die URL so aus:
https://github.com/git_username/my_raspberry/blob/master/state

Die Datei state kann über die Weboberfläche von Github angelegt werden. Alternativ geht es auch vom Raspberry Pi aus:

# change the name of the user (git_username) and
# the repository (my_raspberry) to your needs

mkdir -p /home/pi/github/my_raspberry
cd /home/pi/github/my_raspberry
echo on > state
git init
git add .
git commit -m "Initial commit"
git remote add origin "https://github.com/git_username/my_raspberry"

# upload to github
git push -u --force origin master

Zum komfortablen Bearbeiten der State-Datei über die Weboberfläche von Github.com habe ich ein kleines User-Style-Skript geschrieben: github.css

Probier die Skriptsammlung save_energy.tgz einfach mal aus. In den Konfigurationsdateien sind nur wenige Parameter anzupassen und die Shell-Skripte sind nicht so schwer zu verstehen.

Weiterführende Links: einzelne USB Geräte am Raspberry Pi ein- und ausschalten

Falls du Fragen hast, dann kannst du die Kommentar-Funktion benutzen.

Kommentar schreiben