Python-Skript zur Steuerung von Neustart oder Shutdown per GPIO-Taster
Zweck:
Dieses Skript ermöglicht es, einen Raspberry Pi mit einem einfachen Taster herunterzufahren oder neu zu starten – abhängig davon, wie lange der Taster gedrückt wird.
1. Bibliotheken:gpiod: GPIO-Steuerung über das libgpiod-Interface (modernes GPIO-Handling).time: Für Zeitmessung und Verzögerung.subprocess: Führt Systembefehle wie reboot oder poweroff aus.
2. GPIO-Konfiguration:chip_name = "gpiochip0": Standardchip für GPIO beim Raspberry Pi.button_pin = 4: GPIO-Pin, an dem der Taster angeschlossen ist.
Der Pin wird mit gpiod.LINE_REQ_EV_FALLING_EDGE als Eingang mit Ereigniserkennung (bei fallender Flanke) konfiguriert.
3. Hauptfunktion – handle_button_press()
Beim Drücken des Tasters wird die Zeit gemessen, wie lange er gedrückt gehalten wird.
Je nach Dauer passiert Folgendes:
< 2 Sekunden: Der Pi wird neu gestartet (sudo reboot).
≥ 5 Sekunden: Der Pi wird heruntergefahren (sudo poweroff).
4. Hauptprogrammschleife:
Wartet in einer Endlosschleife auf einen Tastendruck (Ereignis).
Ruft beim Ereignis die Button-Handling-Funktion auf.
Mit time.sleep(0.1) wird die CPU-Last gering gehalten.
5. Beenden & Aufräumen:
Mit KeyboardInterrupt (Strg+C) wird das Programm beendet.
GPIO-Ressourcen werden freigegeben mit line.release().
⚠️ Hinweis: Das Skript benötigt Root-Rechte, da:
GPIO-Zugriff mit libgpiod i. d. R. Adminrechte verlangt,
und reboot / poweroff ohne sudo nicht funktionieren würden.
taster.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# GPIO-Taster für Neustart oder Shutdown – Raspberry Pi
# Copyright (C) 2023 Andre Zimmermann
#
# Dieses Programm ist freie Software: Sie können es weiterverbreiten und/oder
# modifizieren unter den Bedingungen der GNU General Public License, wie von
# der Free Software Foundation veröffentlicht – entweder Version 3 der Lizenz
# oder (nach Ihrer Wahl) jeder späteren Version.
#
# Dieses Programm wird in der Hoffnung verteilt, dass es nützlich ist,
# aber OHNE JEDE GEWÄHRLEISTUNG – sogar ohne die implizite Gewährleistung
# der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.
# Siehe die GNU General Public License für weitere Details.
#
# Eine Kopie der GNU General Public License sollte zusammen mit diesem Programm
# ausgehändigt worden sein. Falls nicht, siehe <https://www.gnu.org/licenses/>.
import gpiod
import time
import subprocess
# GPIO-Chip und Pin für den Taster
chip_name = "gpiochip0"
button_pin = 4 # Hier kannst du den gewünschten GPIO-Pin angeben
# GPIO-Chip und Linie für den Taster
chip = gpiod.Chip(chip_name)
line = chip.get_line(button_pin)
line.request(consumer="Button_Handler", type=gpiod.LINE_REQ_EV_FALLING_EDGE)
# Funktion zur Neustart- oder Shutdown-Steuerung
def handle_button_press():
start_time = time.time()
# Solange der Taster gedrückt wird, überwachen
while line.get_value() == 0:
pass
press_duration = time.time() - start_time
if press_duration < 2:
# Neustart
print("Neustart wird ausgeführt...")
subprocess.run(["sudo", "reboot"])
elif press_duration >= 5:
# Shutdown
print("Shutdown wird ausgeführt...")
subprocess.run(["sudo", "poweroff"])
try:
print("Warte auf Tastendruck...")
while True:
# Warte auf ein Ereignis (FALLING EDGE)
event = line.event_wait(sec=10) # Warte maximal 10 Sekunden, falls nötig
if event:
handle_button_press()
time.sleep(0.1) # Kleine Verzögerung, um CPU-Last zu vermeiden
except KeyboardInterrupt:
print("Programm beendet.")
finally:
# Linie freigeben
line.release()
