Raspberry Pi Shutdown-Script in Python

Den Raspberry Pi mit einem Hardware-Taster rebooten oder herunterfahren

Im Folgenden wird ein in Python geschriebenes Shutdownscript vorgestellt, mittels dessen sich ein Raspberry Pi auf einfache Weise mit einem Druckknopf herunterfahren oder neu starten lässt.

Funktionsweise

Wird ein Druckknopf am Raspberry Pi länger als eine Sekunde gehalten (LED leuchtet auf) und sofort wieder losgelassen, startet der Pi neu.

Lässt man den Knopf nicht wieder los, beginnt der Pi sich nach drei Sekunden herunterzufahren und die LED erlischt.

Beschreibung des Schaltplans

Die erforderliche Beschaltung am Raspberry Pi ist einfach:

Schaltplan zu shutdownscript

Der Python code

Das nachfolgende Script kann z.B. unter /usr/local/bin/shutdown.py abgelegt werden.

Das Shutdownscript muss mit superuser-Rechten gestartet werden, damit es auf den GPIO zugreifen darf: sudo python /usr/local/bin/shutdown.py

Um beim Booten des Raspberry Pis automatisch gestartet zu werden, genügt der Eintrag python /usr/local/bin/shutdown.py & in die Datei /etc/rc.local (vor 'exit 0'). Den Ampersand '&' nicht vergessen, sonst bleibt der Pi beim booten stehen.

Shutdownscript 'shutdown.py':

# shutdownscript shutdown.py by holzkischtle.de
# 20150714
# sdbuttonpin (GPIO-Pin) pulled low for
# - <1sec       : nothing happens
# - >1sec, <3sec: reboot
# - >3sec       : shutdown
# LED lights up after 1 sec

# hardware setup:
# - pushbutton + R470 between GND & sdbuttonpin
# - R10K as pullup between 3V3 & sdbuttonpin
#   (RPi has R1K8 pull-up resistors on GPIO Pins 2&3)
# - LED + R470 between GND & ledpin

# 2 possibilities to auto-run script at boot-time:
# 1: add line to /etc/rc.local:
#    'python /usr/local/bin/shutdown.py &'
# 2: add line to crontab of root via "sudo crontab -e":
#    '@reboot sudo python /usr/local/bin/shutdown.py'

# Tested on Raspberry Pi Model B+ & Raspberry Pi 2 Model B
# helpful resources:
# http://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/
# http://www.forum-raspberrypi.de/Thread-shutdown-reboot-script-python
# https://docs.python.org/3.4/tutorial/modules.html
# https://www.python.org/dev/peps/pep-0324/ (subprocess)
# http://legacy.python.org/dev/peps/pep-0008/ (style guide)
# http://wiki.ubuntuusers.de/pep8

import RPi.GPIO as GPIO
import subprocess
from time import sleep
from signal import pause

sdbuttonpin = 2
ledpin = 4
timestep = 0.1
# discrete testing 10 times / second if button is held down


def init_gpio():
    # use GPIO pin numbering
    GPIO.setmode(GPIO.BCM)

    # set sdbuttonpin as input
    #GPIO.setup(sdbuttonpin, GPIO.IN, pull_up_down = GPIO.PUD_UP)
    GPIO.setup(sdbuttonpin, GPIO.IN)

    # set ledpin as output
    GPIO.setup(ledpin, GPIO.OUT, initial=GPIO.LOW)


def led_on():
    GPIO.output(ledpin, 1)


def led_off():
    GPIO.output(ledpin, 0)


def shutdown():
    #print('shutdown')
    subprocess.call(["shutdown", "-h", "now"])


def reboot():
    #print('reboot')
    subprocess.call(["shutdown", "-r", "now"])


def check_periodically(channel):
    timecounter = 0
    while timecounter < 1:
        if GPIO.input(sdbuttonpin):
            # button pressed for <1sec
            return
        sleep(timestep)
        timecounter = timecounter + timestep

    led_on()
    while timecounter < 3:
        if GPIO.input(sdbuttonpin):
            # button pressed for <3sec
            led_off()
            reboot()
            return
        sleep(timestep)
        timecounter = timecounter + timestep

    # button pressed for >=3sec
    led_off()
    shutdown()


def init_and_listen():
    init_gpio()

    # sdbuttonpin as interrupt input
    GPIO.add_event_detect(sdbuttonpin, GPIO.FALLING,
                          callback=check_periodically, bouncetime=200)

    try:
        #keep script running
        pause()
    except (SystemExit, KeyboardInterrupt):
        GPIO.cleanup()


if __name__ == "__main__":
    init_and_listen()

Fragen?

Bei Fragen oder Anregungen erfreut sich Holzkischtle.de über jeden Kontakt.

Gewährleistung

Es wird keine Gewährleistung auf Funktionalität oder im schlimmsten Fall auftretende Schäden durch Verwendung dieser Anleitung und der zugehörigen Software gegeben. Die Verwendung der hier bereitgestellten Informationen geschieht auf eigene Gefahr. Alle GPIO Anschlüsse sind auf 3,3V ausgelegt. Höhere Spannungen oder das Kurzschliessen von Pins können den Pi zerstören.