Erklärung zum Python-Systemmonitor mit GPIO-LED-Anzeige
Dieser Python-Code ist ein einfacher Systemmonitor, der RAM- und CPU-Auslastung überwacht und den Zustand visuell mit drei LEDs anzeigt (Grün, Gelb, Rot).
Dies erfolgt über GPIO-Pins, z. B. auf einem Raspberry Pi mit einem unterstützten GPIO-Chip.
1. Bibliotheken:gpiod: Wird verwendet, um mit GPIO-Pins über das libgpiod-Interface zu kommunizieren.time: Für zeitgesteuerte Abläufe.psutil: Zum Auslesen der Systemressourcen wie RAM- und CPU-Auslastung.
2. Initialisierung:
Es wird der GPIO-Chip "gpiochip0" verwendet.
Drei GPIO-Pins werden definiert:
Grün: Pin 11 → Zustand „normal“
Gelb: Pin 26 → Zustand „warning“
Rot: Pin 12 → Zustand „error“
Die GPIO-Leitungen werden im Ausgangsmodus angefordert.
3. LED-Steuerung:
Die Funktion set_status_leds(state) steuert die LED-Anzeige:"normal" → Grün an"warning" → Gelb an"error" → Rot an
Nur jeweils eine LED ist aktiv, abhängig vom Zustand.
4. Systemüberwachung:
Die Funktion get_system_state() überprüft RAM- und CPU-Auslastung:ram_usage zeigt den prozentualen Verbrauch des Arbeitsspeichers.cpu_usage berechnet die durchschnittliche CPU-Auslastung.
Die Zustände werden wie folgt festgelegt:
normal: RAM < 70% und CPU < 50%
warning: RAM < 70%, aber CPU ≥ 50%
error: RAM ≥ 70% oder CPU ≥ 90%
5. Hauptprogrammschleife:
Zu Beginn wird der aktuelle Zustand festgestellt und LEDs entsprechend geschaltet.
In einer Endlosschleife wird regelmäßig geprüft, ob sich der Zustand geändert hat.
Bei Änderung wird die LED entsprechend aktualisiert.
Ausgabe im Terminal: RAM- und CPU-Auslastung + aktueller Zustand
Alle 2 Sekunden wird der Zustand neu geprüft.
6. Beenden:
Bei einem KeyboardInterrupt (z. B. Strg+C) wird das Programm beendet.
Die GPIO-Pins werden danach freigegeben.
Zweck:
Dieser Monitor eignet sich für kleine Geräte oder Server, um auf einfache Weise den Systemzustand
visuell mit LEDs anzuzeigen – nützlich z. B. für Home-Server, IoT-Geräte oder Statuspanels.
status_leds.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# System-Monitor mit LED-Anzeige
# Copyright (C) 2023 Andre Zimmermann
#
# Dieses Programm ist freie Software: Sie können es unter den Bedingungen
# der GNU General Public License, wie von der Free Software Foundation veröffentlicht,
# weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder
# (nach Ihrer Wahl) jeder späteren Version.
#
# Dieses Programm wird in der Hoffnung bereitgestellt, 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.
#
# Sie sollten eine Kopie der GNU General Public License zusammen mit diesem Programm erhalten haben.
# Falls nicht, siehe <https://www.gnu.org/licenses/>.
# -*- coding: utf-8 -*-
import gpiod
import time
import psutil
# GPIO-Chip und Pins
chip_name = "gpiochip0"
green_pin = 11
yellow_pin = 26
red_pin = 12
led_pins = [green_pin, yellow_pin, red_pin]
# Globale Variablen
ram_usage = 0
cpu_usage = 0
previous_state = "normal"
# GPIO-Chip und Linien anfordern
chip = gpiod.Chip(chip_name)
lines = chip.get_lines(led_pins)
lines.request(consumer="System_Monitor", type=gpiod.LINE_REQ_DIR_OUT)
# Funktion zur Steuerung der LEDs
def set_status_leds(state):
if state == "normal":
lines.set_values([1, 0, 0]) # Grün an, Gelb und Rot aus
elif state == "warning":
lines.set_values([0, 1, 0]) # Gelb an, Grün und Rot aus
elif state == "error":
lines.set_values([0, 0, 1]) # Rot an, Grün und Gelb aus
# Funktion zur Überwachung des Systems
def get_system_state():
global ram_usage, cpu_usage
ram_usage = psutil.virtual_memory().percent
cpu_usage = sum(psutil.cpu_percent(interval=1, percpu=True)) / psutil.cpu_count() # Durchschnittliche CPU-Auslastung
if ram_usage < 70 and cpu_usage < 50:
return "normal"
elif ram_usage < 70 and cpu_usage >= 50:
return "warning"
elif ram_usage >= 70 or cpu_usage >= 90:
return "error"
# Hauptprogramm
try:
print("System-Monitor gestartet...")
# LEDs auf den initialen Zustand setzen
initial_state = get_system_state()
set_status_leds(initial_state)
previous_state = initial_state
while True:
system_state = get_system_state()
# Wenn sich der Zustand ändert, LEDs anpassen
if system_state != previous_state:
set_status_leds(system_state)
previous_state = system_state
print(f"RAM-Auslastung: {ram_usage}%, CPU-Auslastung: {cpu_usage}% - Systemzustand: {system_state}")
time.sleep(2) # Wartezeit in Sekunden
except KeyboardInterrupt:
print("System-Monitor beendet.")
finally:
# GPIO-Pins freigeben
lines.release()
