Raspberry PI – GPIO Reboot / Shutdown

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()

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen