Hallo zusammen!
In diesem Beitrag zeige ich euch, wie ihr den Raspberry Pi sehr einfach um einen Ausschalter (shutdown button) erweitern könnt.
Motivation
Bei einem meiner Raspberry Pis ist vor ein paar Tagen der SSH-Server ausgefallen, vermutlich ist der entsprechende Daemon einfach „abgestürzt“. Da ich diesen Pi als Server betreibe und keinen Bildschirm und Tastatur angeschlossen habe war es mir somit nicht mehr möglich, diesen ordnungsgemäß herunterzufahren. Dabei dachte ich, dass es sehr praktisch wäre, wenn man einen Ausschalter am Raspberry Pi hätte, um diesen in einem solchen Fall richtig runterzufahren.
Benötigte Hardware
Die benötigte Hardware hält sich für dieses Projekt natürlich sehr in Grenzen. Mein Aufbau besteht aus folgenden Teilen:
- Einen Push-Button
Ich verwende hierzu diese Billig-Knöpfe, die man beim Chinesen oder im deutschen Fachhandel sehr günstig (oft in größerer Stückzahl) bekommt. Zwar nicht schön, aber funktional. - Zwei Jumper-Kabel
Diese entweder in der Ausführung „female-female“ (wenn man ohne Breadboard arbeitet) oder „female-male“, wenn man wie ich ein Breadboard einsetzt (ist bei mir wegen anderer Dinge sowieso am Raspberry, daher diese Lösung) - Optional: Ein Breadboard
Kann wie oben erwähnt auch weggelassen werden, wenn gerade nicht zur Hand - Einen Raspberry Pi
Alternativ natürlich auch einen anderen Einplatinencomputer, dann kann die Ansteuerung und Nummerierung der GPIOs natürlich abweichen.
Die Verkabelung
Dieses mal sehr simpel, da ihr nur 2 Kabel und einen Schalter richtig stecken müsst. Eine Seite des Buttons wird mit GPIO3 verbunden, die andere mit GND. GPIO3 besitzt einen Pull-Up-Widerstand, sodass ihr euch hier einen externen Widerstand sparen könnt.
Hier noch ein Schaltplan dazu:
[Update 27.11.2014] Peter hat in den Kommentaren angemerkt, dass man statt des Buttons auch einfach einen Jumper verwenden kann. Da ich diese Lösung auf Grund der Einfachheit sehr interessant finde, hier der dazugehörige Aufbau mit Jumper:
Die gelbe Verbindung stellt hier den Jumper dar. Ein Jumper (zu Deutsch eine „Steckbrücke“) ist einfach eine leitende Verbindung. Ist auch häufig auf PC-Mainboards, um einen BIOS-Reset durchzuführen etc. Das Bauteil sieht so aus:
Zur Verwendung: Ihr könnt den Jumper auf dem Pi lassen, allerdings nur mit einem Pin verbunden, z.B. nur mit GPIO3. Im Bedarfsfall steckt ihr ihn einfach um, dass GPIO3 und GND verbunden werden und der Pi damit herunterfährt. Dazu braucht ihr natürlich nach wie vor das unten aufgeführte Script. Ist der Pi aus, solltet ihr den Jumper wieder umstecken (also nur mit GPIO3 verbinden) und den Pi vom Strom trennen und wieder anschließen, damit er wieder hochfährt.
Die Software
Hierzu habe ich ein kleines Python-Script erstellt, welches für das Auslösen des Ausschaltbefehls beim Drücken des Tasters verantwortlich ist. Erstellt also mit einem Editor eurer Wahl ein neues Dokument namens „shutdown_button.py“ mit folgendem Inhalt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #! /usr/bin/env python import os import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) # GPIO3 (pin 5) set up as input. It is pulled up to stop false signals GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP) try: while True: # wait for the pin to be sorted with GND and, if so, halt the system GPIO.wait_for_edge(3, GPIO.FALLING) # shut down the rpi os.system("/sbin/shutdown -h now") except: GPIO.cleanup() |
Ihr könnt die Funktion jetzt mal testen, indem ihr alles verkabelt und das Script via sudo python shutdown_button.py aufruft. Sobald der Button gedrückt wird, sollte der Pi herunterfahren.
Hat das geklappt, legen wir uns noch einen crontab-Eintrag an, damit das Script automatisch beim Start des Raspberry Pi gestartet wird und somit immer einsatzbereit ist.. Hierzu editieren wir folgende Datei: sudo nano /etc/crontab
Ganz unten fügen wir folgende Zeile hinzu:
1 | @reboot root /usr/bin/python /pfad/zum/script/shutdown_button.py |
Wobei ihr natürlich den letzten Pfad anpassen müsst. Achtet dabei darauf, dass ihr den vollständigen Pfad benutzt, da cron hier mit dem Benutzer „root“ arbeitet, der ein anderes Home-Verzeichnis hat, als der Standardnutzer pi.
Das war es auch schon wieder. Damit solltet ihr einen funktionstüchtigen Ausschalter für euren Raspberry Pi haben.
Bei Fragen, Anregungen, Fehlern etc. könnt ihr wie immer die Kommentarfunktion nutzen.
Interessantes Projekt! Wie siehts eigentlich mit dem Ressourcenverbrauch aus, wenn das Script die ganze Zeit läuft?
Hi,
das ist eigentlich komplett vernachlässigbar. Ich erkenne bei meinem Pi nicht die geringste Änderung bei der CPU-Belastung, wenn das Script läuft.
Hallo!
Statt dem Button kann man auch ganz einfach einen Jumper verwenden – nur so als Anregung ;)
Damit wird der Aufbau noch simpler.
Hi,
interessanter Vorschlag! Das ist natürlich eine sehr simple Lösung, die auch funktioniert.
Hallo,
kurz und knackig, Klasse!
Gibt’s auch einen ähnlich einfach gestrickten Einschalter?
Hi Wolf,
Einschalter geht auch. Dazu muss man nur die P6-Pins miteinander verbinden, wenn der Pi runtergefahren wurde. Diese liegen neben der HDMI-Buchse und bei ihnen ist standardmäßig keine Pin-Leiste angebracht. Wenn man die Pins verbindet, wird ein Hardreset des BCM2835 ausgelöst und der Pi startet (bzw. wenn man die Pins im laufenden Betrieb verbindet resettet der Pi und startet neu).
Hier eine schön bebilderte Anleitung, wie man einen Button daran befestigen kann. Habe ich selbst noch nicht gemacht, sollte aber machbar sein. Durchführung wie immer auf eigene Gefahr ;)
Hi,
man kann auch ein und Ausschalter auf einem Taster realisieren:
http://www.forum-raspberrypi.de/Thread-tutorial-hoch-und-runterfahren-mittels-taster-incl-status-led
Hi Alex,
finde auch die Möglichkeit praktisch den Hardware-Watchdog zu nutzen, wenn der ssh-Prozess nicht mehr läuft:
http://www.gieseke-buch.de/raspberrypi/eingebauten-hardware-watchdog-zur-ueberwachung-nutzen
Viele Grüße,
Michael
Hallo Michael,
danke für den Tipp! Das hat mir zufällig vor kurzem wer auch bzgl. eines anderen Themas empfohlen. Werde ich mir auf jeden Fall demnächst mal anschauen. Bisher ist der ssh-Prozess seitdem aber glücklicherweise nicht mehr abgestürzt :)
Hallo Alexander! Da du ja auch viel über den Banana Pi bloggst wollte ich mal fragen, ob man den Schalter auch problemlos damit umsetzen kann (habe leider noch keinen Banana). Danke!
Hallo Leon,
der Banana Pi hat ja bereits einen Schalter zum Ausschalten. In Bananian ist dieser allerdings standardmäßig noch nicht aktiviert, das soll aber in einer der folgenden Versionen geschehen (Quelle). Bis dahin kann der Button auch auf dem Weg, der in der verlinkten Seite beschrieben wird, aktiviert werden.
Hallo Alexander,
vielen Dank für Dein Tutorial. Es war für mich Neuling sehr hilfreich.
Ich fahre meinen Raspi herunter, wenn die angeschlossenen Geräte spannungslos sind (Relais-Öffner verbindet GPIO3 mit GND). Besonders praktisch ist, wenn GPIO3 nicht mehr auf Masse liegt, fährt der Raspi wieder hoch. Erspart mir eine zusätzliche Start-Schaltung.
Viele Grüße
Gernot
Hallo Gernot,
freut mich, dass das Tutorial hilfreich war :)
Viel Erfolg mit deinen Projekten!
Hi wenn ich das Script ausführe bekomme ich folgende Fehlermeldung:
sudo python shutdown.py
shutdown.py:6: RuntimeWarning: A physical pull up resistor is fitted on this channel!
GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
Jemand eine Idee?
Hi Dominik,
das ist eine neuere Warnung der verwendeten GPIO-Library, die hier ignoriert werden kann. Das Script sollte trotzdem problemlos funktionieren.
Falls dich die Meldung stört, kannst du via
GPIO.setwarnings(False)
derartige Meldungen abstellen (nicht wirklich empfehlenswert).
Ich habe bei meinen RasPi 2B auf den GPIO-Pins bereits andere Verbindungen. Daher würde ich mir gerne einen anderen GPIO-Pin aussuchen. Möglichst einen, wo ich auch per Jumper den Neustart auslösen kann.
Kann ich den Code auch so modifizieren, dass ich die GPIO-Stifte ganz rechts (7 CSL und GND) nutzen kann? Oder habe ich dann hier Probleme, da im Beitrag davon gesprochen wird, dass GPIO3 einen Pull-Up-Wiederstand hat.
Hallo Herr.Vorragend,
ja – dieser Pin sollte sich auch dafür verwenden lassen, Pull-UP-Widerstände sollten sich für alle Pins setzen lassen.
Für einen Neustart muss im Script noch der shutdown-Befehl angepasst werden, ansonsten sehe ich da keine Probleme.
Hi,
ich bin Raspberry-Einsteiger, und verwende Openelec.
Wo muss ich diese „shutdown_button.py“ hin kopieren auf der SD-Karte.
Oder muss ich vorher noch irgendetwas installieren?
Vielen Dank
Hallo Thomas,
leider habe ich kein OpenElec im Einsatz. Wichtig für das Script wäre, dass RPi.GPIO installiert ist sowie cron. Sollte beides auf OpenElec laufen, dürfte das Script auch dort funktionsfähig sein.
Danke!! Einfache und praktische Lösung! Lauft auch sauber von der Kommandozeile, allerdings mit der oben bereits erwähnten „shutdown.py:6: RuntimeWarning“, die man aber ignorieren kann.
Nur, als Cronjob kriege ich das py nicht zum laufen. Die Pfade werde ich wohl richtig eingegeben haben: ‚mein‘ Script liegt in /home/pi, also „@reboot root /usr/bin/python /home/pi/shutdown_button.py“
Könnte es sein, dass o.a. „Warning“ das Laden des Scripts über Cron verhindert?
„sudo GPIO.setwarnings(False)“ hilft auch nicht („unexpected token“)… oder muss das in das Script rein (sorry für die dumme Frage)?
Nachtrag:
Warum auch immer: J’mein‘ essie kann mit dem absoluten Pfad zu Python anscheinend nix anfangen!?
Bei mir funktioniert folgender Cronjob-Eintrag:
@reboot root python /home/pi/shutdown_button.py
Hallo Peter,
danke für den Nachtrag!
Merkwürdig – allerdings nutze ich noch kein Jessie auf meinen Raspberrys. Eventuell hat sich der Pfad zu Python geändert. Wenn du im Terminal als root-User „which python“ eingibst, sollte er dir den vollständigen Pfad deiner Standard-Pythoninstallation ausgeben.
Hallo Alex, leider klappt es bei mir nicht und ich bräuchte Hilfe :-( … Ich habe das Python-Script geschrieben, bekomme aber folgende Meldung:
OpenELEC:~ # cd /storage/.kodi/userdata
OpenELEC:~/.kodi/userdata # ls
Database guisettings.xml profiles.xml
RssFeeds.xml keymaps shutdown_button.py
Thumbnails library sources.xml
addon_data peripheral_data
advancedsettings.xml playlists
OpenELEC:~/.kodi/userdata # python shutdown_button.py
Traceback (most recent call last):
File „shutdown_button.py“, line 3, in
import RPi.GPIO as GPIO
ImportError: No module named RPi.GPIO
OpenELEC:~/.kodi/userdata #
Kannst Du mir helfen ?
Gruß
Thomas
===========================
Hallo, hat sich erledigt, es läuft ! Danke für das Tut hier !
Gruß
Thomas
Hi Thomas,
schön, dass es geklappt hat :)
Hi Thomas,
ich habe das gleiche Problem wie du. Wie konntest du das Skript bei dir zum laufen bringen?
Danke und Gruß
Matthias
Ziemlich schrecklich, da nicht erklärt wird wie man das Script wirklich installiert.
Hallo zusammen!
Ich bin auch absoluter Neuling und versuche mich fürs Requisiten bauen an verschieden Sachen. Elementar der Ausschalter! :-)
Wenn ich das Script testen möchte gibt er mit immer einen Fehler bzgl. der neunten Zeile.
try:
^
ich weiß ehrlich gesagt nicht weiter.
Und selbst dann DAS dann klappt, binning. It nicht sicher wo bzw. Wie ich das ausführen im crontab einfügen soll/darf.
Ganz schön aufregend alles :-)
Hallo Chrischkula,
kannst du mal die komplette Fehlermeldung posten?
Oh Je…Ich sehe JETZT erst was die Autokorrektur mich da in´s Forum hat stellen lassen :-D Möchte mich definitiv dafür und für die späte Rückmeldung entschuldigen.
Ich warte noch auf ein MicroSD Kabel um diese zugänglich zu machen. Muss ansonsten ständig das Gehäuse aufschrauben um mein RetroPi erneut zu installieren.
Bei meinem ersten Versuch machen sich nämlich einige Fehler bemerkbar.
(ROMs ließen sich nicht mehr löschen, Bilder verschwanden…)
Ich versuche die Schritte erneut auszuführen.
Muss erst erneut wieder schauen wie ich überhaupt Python „installiere“ etc.
Aber Danke für die Antwort! ;)
Hallo
Wie bekomme ich das mit Jessie zum laufen.
Geht nur wenn ich „sudo python shutdown_button.py“ von Hand eingebe aber nicht automatisch nach dem Neustart.
Mit Wheezy gehts.
Gruß Ralf
Danke für das Skript.
@Ralf: bei mir läuft es unter Jessie wie folgt als crontab
@reboot sudo python /home/pi/shutdown.py
mache mir gerade gedanken mit welchem Programme , Linux Ordnestrukturen besichtigt und bearbeitet werden können
so, nun habe ich versucht mit totalcomander die Geschicht zu vollenden, doch auch damit habe ich kein erfolg. deshalb bitte ich euch innigst mir zu erklären wie ich das hin bekomen kann!
das file habe ich geschrieben doch leider habe ich keine Ahnung wie ich dies auf den Rasberry bekommen soll mit Retropie am rennen. danke für eure Unterstützung
Für alle, die den RPi als Überwachungskamerasystem mit motionEyeOS verwenden:
1. Per default ist das Dateisystem schreibgeschützt. Um das Skript überhaupt speichern bzw. den Cronjob ergänzen zu können muß es erst als read/write eingehängt werden (sudo entfällt, da man automatisch root ist, sobald man sich als admin oder root via ssh eingeloggt hat):
mount -o remount,rw /
mount -o remount,rw /boot
2. Das OS kennt den Befehl shutdown nicht. Stattdessen verwendet man poweroff (Zeile 12 im Python-Skript):
os.system(„/sbin/poweroff“)
Vielen Dank für dieses Tutorial! <3
Nachtrag: Bei motionEyeOS läßt sich das Skript (warum auch immer) nicht via Cronjob ausführen, deshalb erstellt man die Datei
/data/etc/userinit.sh
welche nur die folgende Zeile enthält:
/usr/bin/python /pfad/zum/script/shutdown_button.py &
(Das & am Ende ist wichtig.)
Hallo zusammen! Eine einfach zu benutzende Möglichkeit zum sicheren Ein- und Ausschalten des Raspberries ist der PowerBlock (https://blog.petrockblock.com/powerblock-raspberry-pi-power-switch/). Einfach Schalter und Status-LED anstecken, fertig. Die Installation ist auch ganz einfach.
Gerade drauf gestoßen und muss sagen gute Idee flansche jetzt einfach ne Powerbank in die zuleitung und verbinde die Netzteil noch mit nem Relais das schaltet dann dann das relais und hälr solange den button offen bis der strom weg geht dann kann der PI in ruhe über die powerbank Runterfahren wenn stromausfall ist.
Hallo Alexander,
Ich habe den Aufruf für die shutdown_button.py in der Autostart verpackt, da ich mit den Pfaden nicht klar gekommen bin.
Das Skript dazu habe ich vom PhotoBooth Projekt von jackbarker.com.au abgewandelt.
sudo nano /etc/xdg/autostart/autostart_shutdown.desktop
Populate the file with the following content:
[Desktop Entry]
Type=Application
Name=shutdown_button.py
Comment=Raspberry Pi Ausschalter
NoDisplay=false
Exec=sudo python /home/pi/shutdown/shutdown_button.py
NotShowIn=GNOME;KDE;XFCE;
Name[en_US]= shutdown_button.py
Save and exit the file (Ctrl + X).
Des Weiteren kann man den Pi mit dem Schalter wieder einschalten wenn er korrekt runtergefahren wurde und nur noch die rote LED leuchtet.
Hallo Gemeinde,
ich bin Pet und ein totaler Neuling. Jetzt habe ich mit dem Taster zum herunterfahren ein kleines Problem. Ich betreibe den raspi 3b mit Strompi V3 und Battery-HAT.
Der raspi fährt nach betätigen des Taster runter, aber der Strompi nicht. Trenne ich jetzt den Strompi vom Netz, bleibt der an bis die Batterie ausgelutscht wurde. Der Lüfter vom Raspi läuft auch bis Batterie leer. Hat jemand die zündende Idee wie das klappt das auch der Strompi aus geht?
Jedesmal die Befehle eintippen
sudo screen /dev/serial0 38400
startstrompiconsole
poweroff
ist total lästig.
Bitte bitte helft mir da weiter. Vielen Dank im vorraus.
Bei mir gab es bereits einen Ordner scripts im /home/pi/ Verzeichnis, ich habe mein Skript dort abgelegt.
Nach langer Suche bemerkte ich das script und scripts einen wesentlichen Unterschied haben –> und zwar ein „s“