Front Switch des Thomas-Krenn Edge 4L per Software unter Linux steuern
Der Thomas-Krenn Edge 4L hat neben dem Power-Button einen weiteren Front Switch. Im Werkszustand schaltet er das System in den Ruhezustand. Dieser Schalter ist aber mit dem Toolset acpid[1] unter Linux steuerbar. Es können Betriebszustände, Dienste und Alarme definiert werden. Dieser Artikel ist eine kurze Anleitung zur Einrichtung von acpid und zur Steuerung des Front Switches.

Vorbereitung des Systems
Für diese Anleitung wird das folgende System verwendet:
- Thomas-Krenn Edge 4L
- Ubuntu 24.04 LTS mit Kernel Version 6.8.0-41-generic
Einrichtung der Umgebung
Zunächst muss der Sleep Button im BIOS passend eingerichtet werden. Danach wird das Betriebssystem vorbereitet. Als letzter Schritt der Vorbereitung muss dann noch das Toolset acpid installiert werden.
BIOS
Führen Sie folgende Schritte durch:
-
Wechseln Sie ins Menü Hardware und dann zu SW Button Configuration
-
Wählen Sie Sleep Button aus und speichern Sie anschließend die Konfiguration
Jetzt ist das BIOS vorbereitet.
Betriebssystem
Im Werkszustand schaltete der Front Switch das System in den Suspend Mode, also in den Ruhezustand. Um den Schalter neu belegen zu können, muss im Betriebssystem erst der Suspend Mode abgeschaltet werden. Führen Sie dafür folgende Schritte durch:
- Öffnen Sie die Datei
logind.confmit einem Editor Ihrer Wahl:
nano /etc/systemd/logind.conf
- Ändern Sie den Wert der Zeile:
HandleSuspendKey=suspend
- und geben ihr den folgenden Wert:
HandleSuspendKey=ignore
Starten Sie danach das System neu. Das Betriebssystem ist jetzt vorbereitet.
acpid installieren
Das Toolset acpid ist zum Ansteuern des Switches erforderlich. Es wird wie folgt installiert:
$ sudo apt install acpid
Nach Installation von acpid kann der Schalter nun neu belegt werden.
Prüfung der Einstellungen
Wenn alle vorherigen Schritte richtig durchgeführt wurden, wird acpid alle Events des Schalters ab jetzt in ein Event Log schreiben. Zur Prüfung kann das Event Log aufgerufen werden:
# acpi_listen
Folgende Ausgabe ist bei richtiger Einrichtung zu erwarten:
Eventsteuerung
Das Auslösen des Sleep Buttons wird vom Handler richtig (aber hier nicht passend) mehrfach registriert. Dies kann zu unerwünschten Effekten führen, da das System das Ereignis möglicherweise mehrfach verarbeitet.
Um das richtig zu verarbeiten gilt es eine Eventsteuerung zu bauen:
- Öffnen Sie die Datei usrdefbtn mit einem Editor Ihrer Wahl:
nano /etc/acpi/events/usrdefbtn
- Fügen Sie den folgenden Code ein:
event=button/sleep.*
action=/etc/acpi/usrdefbtn.sh
- Starten Sie den acpid Daemon neu, um die Regel anzuwenden:
systemctl restart acpid
systemctl status acpid
In der Status-Meldung des Toolsets können Sie jetzt außerdem prüfen, ob die Regel übernommen wurde:
In der rot umrandeten Status-Zeile ist zu erkennen, dass die Regel übernommen wurde. Es wurde 1 Regel geladen (1 rule loaded).
Ergebnisse filtern
Nun muss das Ereignis gefiltert werden um sicherzustellen, dass nur eine Instanz davon bearbeitet wird. Es wird auch geprüft ob im acpid-Event-Handler-Skript das Skript bereits läuft, bevor eine erneute Ausführung startet. So ist die Möglichkeit gegeben, sicherzustellen, dass nur ein (!) Ereignis bearbeitet wird, selbst wenn das System mehrere Ereignisse registriert.
Zur Erstellung des Eventscripts öffnen Sie mit einem Editor ihrer Wahl die Datei userdefbtn.sh:
nano /etc/acpi/usrdefbtn.sh
Codebeispiel
Das folgende Codebeispiel definiert den Event-Handler so, dass bei drücken des Schalters die aktuelle Zeit in einem Log gespeichert wird:
#!/bin/bash
## Thomas Krenn Edge4l / ReadOut SleepButton / Front
## by W.Seifert 29-08-2024 /V1.1
## Counter für Logging
event_count_file="/tmp/sleep_event_count"
last_event_file="/tmp/sleep_last_event"
current_time=$(date +%s)
if [ -f "$last_event_file" ]; then
last_event_time=$(cat "$last_event_file")
else
last_event_time=0
fi
if [ -f "$event_count_file" ]; then
event_count=$(cat "$event_count_file")
else
event_count=0
fi
if (( current_time - last_event_time > 2 )); then
event_count=0
fi
event_count=$((event_count + 1))
## Aktion soll nur (!) beim ersten Ereignis ausgeführt werden
if [ "$event_count" -eq 1 ]; then
###################################################################
### Hier kann jetzt die eigentliche Aktion eingetragen werden ##
###################################################################
echo "Button gedrückt $current_time" >> /tmp/sleep_button.log
###################################################################
fi
### Zähler/Zeit speichern logging
echo "$event_count" > "$event_count_file"
echo "$current_time" > "$last_event_file"
Das Skript muss dann noch ausführbar gemacht werden.
chmod +x /etc/acpi/usrdefbtn.sh
ReadOut des Buttons
Wird der Button gedrückt, dann wird nur dieses Ereignis mit Zeitstempel registriert und als Beispiel temporär abgelegt. Dann wird die eigentliche Beispielaktion (siehe Code) mit UnixTimeStamp in das /tmp Verzeichnis geschrieben.
Über den Code oben können jetzt beliebige Aktionen bei Drücken des Buttons programmiert werden.
Weitere Informationen
- Wiki-Eintrag zu acpid (wiki.archlinux.org, 26.11.2024)
- acpid2 Sourceforge Seite (sourceforge.net, 26.11.2024)
- Ubuntu Seite zu acpid2 (manpages.ubuntu.com, 26.11.2024)
Einzelnachweise
|
Autor: Wilfried Seifert Wilfried Seifert, tätig in der Abteilung Systems Engineering bei Thomas-Krenn, ist in seinem Arbeitsbereich für die System-/Prototypenentwicklung sowie Softwaredeployment / Rollout zuständig. LPIC 3 zertifiziert, beschäftigt sich u.a. mit Aufbau / Programmierung Embedded Systemen.
|

