Ein Power-Taster, zwei Funktionen gleichzeitig (suspend & shutdown)?

Hast Du Probleme mit Hardware, die durch die anderen Foren nicht abgedeckt werden? Schau auch in den "Tipps und Tricks"-Bereich.
Antworten
Benutzeravatar
hikaru
Moderator
Beiträge: 13585
Registriert: 09.04.2008 12:48:59

Ein Power-Taster, zwei Funktionen gleichzeitig (suspend & shutdown)?

Beitrag von hikaru » 25.12.2021 15:38:19

Hallo,

neben mir steht ein Asustor-NAS mit Bullseye/Mate, das über einen einzelnen Power-Taster verfügt. Diesen Taster kann ich in Mate so konfigurieren, dass er beim Drücken (nicht erst beim Loslassen) das System entweder in Suspend2RAM oder Shutdown schickt. Beides funktioniert, aber eben immer nur eines von beiden.
Kann ich Debian auch irgendwie (nicht über das GUI) so konfigurieren, dass der eine Taster beides macht, also z.B. bei Einfachklick Suspend und bei Doppelklick oder Halten Shutdown?

Wenn ich den Taster länger als 3 Sekunden halte, dann schaltet das BIOS das (meist bis dahin schon im Suspend angekommene) Gerät hart aus. Das will ich aber auch nicht, und im BIOS lässt es sich nicht umkonfigurieren, um z.B. ein ACPI-Event zum Shutdown zu senden. Die Unterscheidung der Aktion müsste also schon in Debian passieren.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Ein Power-Taster, zwei Funktionen gleichzeitig (suspend & shutdown)?

Beitrag von smutbert » 25.12.2021 18:10:13

In python hätte ich von meinem Projekt eine provisorische und unvollständige Lösung parat, die zwischen lang und kurz drücken unterscheidet, aber wahrscheinlich suchst du eher etwas gut funktionierendes fertiges :wink: und da würde ich mich als erstes bei den Hotkeydiensten umsehen, wie zB Debiantriggerhappy.
(Die Powertaste taucht ja normalerweise als eigene Tastatur auf und die Reaktion von mate, systemd,... auf diese Taste lässt sich deaktivieren.)

Benutzeravatar
hikaru
Moderator
Beiträge: 13585
Registriert: 09.04.2008 12:48:59

Re: Ein Power-Taster, zwei Funktionen gleichzeitig (suspend & shutdown)?

Beitrag von hikaru » 25.12.2021 21:25:12

smutbert hat geschrieben: ↑ zum Beitrag ↑
25.12.2021 18:10:13
In python hätte ich von meinem Projekt eine provisorische und unvollständige Lösung parat, die zwischen lang und kurz drücken unterscheidet, aber wahrscheinlich suchst du eher etwas gut funktionierendes fertiges :wink:
Über unvollständig ließe sich verhandeln, aber funktionierend sollte schon sein. ;)
smutbert hat geschrieben: ↑ zum Beitrag ↑
25.12.2021 18:10:13
(Die Powertaste taucht ja normalerweise als eigene Tastatur auf
Das wäre mir neu. xev zumindest gibt nichts beim Drücken aus.
smutbert hat geschrieben: ↑ zum Beitrag ↑
25.12.2021 18:10:13
und die Reaktion von mate, systemd,... auf diese Taste lässt sich deaktivieren.)
Ja. Ich hatte mich daran erinnert, dazu schon mal etwas in /etc/systemd/logind.conf gesehen zu haben. Das führte mich zu [1] und da steht offenbar genau das was ich suche:
HandlePowerKey=, HandlePowerKeyLongPress=, HandleRebootKey=, HandleRebootKeyLongPress=, HandleSuspendKey=, HandleSuspendKeyLongPress=, HandleHibernateKey=, HandleHibernateKeyLongPress=, HandleLidSwitch=, HandleLidSwitchExternalPower=, HandleLidSwitchDocked=

Controls how logind shall handle the system power, reboot and sleep keys and the lid switch to trigger actions such as system power-off, reboot or suspend. Can be one of "ignore", "poweroff", "reboot", "halt", "kexec", "suspend", "hibernate", "hybrid-sleep", "suspend-then-hibernate", "lock", and "factory-reset".
Demnach müsste ich wohl das setzen:

Code: Alles auswählen

HandlePowerKey=suspend
HandlePowerKeyLongPress=poweroff
Was aber (auch nach Reboot) keinen Effekt hat.

Als nächstes steht da:
PowerKeyIgnoreInhibited=, SuspendKeyIgnoreInhibited=, HibernateKeyIgnoreInhibited=, LidSwitchIgnoreInhibited=, RebootKeyIgnoreInhibited=

Controls whether actions that systemd-logind takes when the power, reboot and sleep keys and the lid switch are triggered are subject to high-level inhibitor locks ("shutdown", "reboot", "sleep", "idle"). Low level inhibitor locks ("handle-power-key", "handle-suspend-key", "handle-hibernate-key", "handle-lid-switch", "handle-reboot-key"), are always honored, irrespective of this setting.
Also sollte ich wohl auch das setzen, um auszuschließen, dass Mate dazwischenfunkt:

Code: Alles auswählen

PowerKeyIgnoreInhibited=yes
Aber auch das hat keinen Effekt.
Edit: "kein Effekt" meint, dass das System genau das macht, was in Mate eingestellt ist. Ist dort "nichts machen" eingestellt, passiert auch nichts.


[1] https://www.freedesktop.org/software/sy ... .conf.html

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Ein Power-Taster, zwei Funktionen gleichzeitig (suspend & shutdown)?

Beitrag von smutbert » 25.12.2021 22:04:09

Hm, das klingt in der Tat etwas anders als ich es gewohnt bin. xev ist da aber vielleicht auch nicht das richtige, weil der Powertaster vermutlich vor X abgefangen wird.
Sieh vielleicht einmal mit evemu-record aus Debianevemu-tools ob es ein Eingabegerät für den Powertaster gibt und ob du dessen Events sehen kannst (dann sollte notfalls auch meine Lösung funktionieren ☺). evemu-record listet gleich nach dem Aufruf die Eingabegeräte auf und bei mir taucht da u. a.

Code: Alles auswählen

/dev/input/event7:	Power Button
auf.
hikaru hat geschrieben: ↑ zum Beitrag ↑
25.12.2021 21:25:12
[...]
Demnach müsste ich wohl das setzen:

Code: Alles auswählen

HandlePowerKey=suspend
HandlePowerKeyLongPress=poweroff
Was aber (auch nach Reboot) keinen Effekt hat.
[...]
Das gilt aber bei laufendem Mate oder Displaymanager?

Wie displaymanager/desktop und systemd zusammenarbeiten weiß ich nicht, aber von meinem Gnome kenne ich es so, dass bei laufendem Gnome/gdm egal ist, was ich in systemd konfiguriert habe – die Einstellungen von Gnome „überschreiben“ das Verhalten.
Also ohne Displaymanager/Desktop sollte es denke ich mit den obigen Einträgen oder alternativ triggerhappy oder meiner python-Lösung funktionieren. Bei laufendem Displaymanager/Desktop wird es denke ich halt mit systemd unabhängig von den Desktopeinstellungen nicht klappen.

Sowohl triggerhappy wie auch mein python-Programm haben allerdings soweit ich weiß (bei meinem bin ich mir sicher, bei triggerhappy vermute ich es nur) den Nachteil, dass beim langen Drücken sowohl zuerst der Event für einen kurzen Tastendruck wie auch danach der fürs lange Drücken erzeugt werden – da fehlt noch das Warten auf das Loslassen um zu entscheiden ob es jetzt ein langer oder kurzer Tastendruck war.
(Das wollte ich in meinem Programm schon einbauen, habe es aber noch nicht zufriedenstellend lösen können...)

Ein zweites Problem sehe ich noch darin, dass ein langer Druck auf den Powertaster das System ja möglicherweise hart abschaltet – typischerweise bei einem 4s langen Tastendruck.
Ob dann für den Fall, dass man dieses harte Abschalten im BIOS nicht deaktiveren kann, eine software-Funktion für der Powertaster z.B. 2 Sekunden lang gedrückt werden muss nicht zu gefährlich ist?

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Ein Power-Taster, zwei Funktionen gleichzeitig (suspend & shutdown)?

Beitrag von JTH » 25.12.2021 22:33:30

hikaru hat geschrieben: ↑ zum Beitrag ↑
25.12.2021 21:25:12
Ja. Ich hatte mich daran erinnert, dazu schon mal etwas in /etc/systemd/logind.conf gesehen zu haben. Das führte mich zu [1] und da steht offenbar genau das was ich suche:
HandlePowerKey=, HandlePowerKeyLongPress=, HandleRebootKey=, HandleRebootKeyLongPress=, HandleSuspendKey=, HandleSuspendKeyLongPress=, HandleHibernateKey=, HandleHibernateKeyLongPress=, HandleLidSwitch=, HandleLidSwitchExternalPower=, HandleLidSwitchDocked=
An die Optionen hatte ich vorhin auch kurz gedacht, als ich dein Thema gesehen hab. War auch schonmal über die gestolpert. Die Optionen gibts aber leider erst ab systemd-Version 250 – von vorgestern. Und die ist gerade erst in Experimental verfügbar.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
hikaru
Moderator
Beiträge: 13585
Registriert: 09.04.2008 12:48:59

Re: Ein Power-Taster, zwei Funktionen gleichzeitig (suspend & shutdown)?

Beitrag von hikaru » 27.12.2021 16:17:51

smutbert hat geschrieben: ↑ zum Beitrag ↑
25.12.2021 22:04:09
Sieh vielleicht einmal mit evemu-record aus Debianevemu-tools ob es ein Eingabegerät für den Powertaster gibt und ob du dessen Events sehen kannst (dann sollte notfalls auch meine Lösung funktionieren ☺).
Ich sehe nach einem Doppelklick diese Events:

Code: Alles auswählen

/dev/input/event2:	Power Button
[..]
################################
#      Waiting for events      #
################################
E: 0.000001 0001 0074 0001	# EV_KEY / KEY_POWER            1
E: 0.000001 0000 0000 0000	# ------------ SYN_REPORT (0) ---------- +0ms
E: 0.000071 0001 0074 0000	# EV_KEY / KEY_POWER            0
E: 0.000071 0000 0000 0000	# ------------ SYN_REPORT (0) ---------- +0ms
E: 0.589078 0001 0074 0001	# EV_KEY / KEY_POWER            1
E: 0.589078 0000 0000 0000	# ------------ SYN_REPORT (0) ---------- +589ms
E: 0.589138 0001 0074 0000	# EV_KEY / KEY_POWER            0
E: 0.589138 0000 0000 0000	# ------------ SYN_REPORT (0) ---------- +0ms
################################
Wobei der erste und dritte Record offenbar die Press- und der zweite und vierte Record die Release-Events sind.
smutbert hat geschrieben: ↑ zum Beitrag ↑
25.12.2021 22:04:09
hikaru hat geschrieben: ↑ zum Beitrag ↑
25.12.2021 21:25:12
[...]
Demnach müsste ich wohl das setzen:

Code: Alles auswählen

HandlePowerKey=suspend
HandlePowerKeyLongPress=poweroff
Was aber (auch nach Reboot) keinen Effekt hat.
[...]
Das gilt aber bei laufendem Mate oder Displaymanager?
Ja, Mate auf Lightdm.
smutbert hat geschrieben: ↑ zum Beitrag ↑
25.12.2021 22:04:09
Bei laufendem Displaymanager/Desktop wird es denke ich halt mit systemd unabhängig von den Desktopeinstellungen nicht klappen.
Ich hätte gedacht, genau dazu wäre "PowerKeyIgnoreInhibited=yes" gut. :?
smutbert hat geschrieben: ↑ zum Beitrag ↑
25.12.2021 22:04:09
Sowohl triggerhappy wie auch mein python-Programm haben allerdings soweit ich weiß (bei meinem bin ich mir sicher, bei triggerhappy vermute ich es nur) den Nachteil, dass beim langen Drücken sowohl zuerst der Event für einen kurzen Tastendruck wie auch danach der fürs lange Drücken erzeugt werden – da fehlt noch das Warten auf das Loslassen um zu entscheiden ob es jetzt ein langer oder kurzer Tastendruck war.
Eben wegen dieser Gefahr wäre mir ein Doppelklick zum Herunterfahren eh lieber. Mir ist nur nicht klar, wie ich diese Events abfrage. Polling (was wohl Debiantriggerhappy macht) finde ich eher hässlich.

JTH hat geschrieben: ↑ zum Beitrag ↑
25.12.2021 22:33:30
An die Optionen hatte ich vorhin auch kurz gedacht, als ich dein Thema gesehen hab. War auch schonmal über die gestolpert. Die Optionen gibts aber leider erst ab systemd-Version 250 – von vorgestern. Und die ist gerade erst in Experimental verfügbar.
Ich habe gestern mal probiert einen Bullseye-Backport aus den Experimental-Quellen zu bauen, scheiterte dann aber in der Testsuite.
Unabhängig davon hätte ja der einfache kurze Klick "HandlePowerKey=suspend" schon unter Bullseye funktionieren müssen, wenn das im Prinzip funktionieren würde.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Ein Power-Taster, zwei Funktionen gleichzeitig (suspend & shutdown)?

Beitrag von smutbert » 27.12.2021 23:16:09

Ich bin mir eigentlich sicher, dass der einfache Klick ohne Displaymanager/Desktop funktioniert hätte – ich nutze ähnliche Einträge auf einem Raspberry Pi und einem headless laufenden PC.

Meine Lösung in python mit Debianpython3-evdev kann ich in etwas vereinfachter Form glaube ich direkt hier posten, weil es nur ein paar Zeilen sind.
Das sind jetzt allerdings noch die passenden Werte für die Entertaste (code=28 und type=EV_KEY), weil ich nicht riskieren wollte, dass mein System unbeabsichtigt herunterfährt...

Code: Alles auswählen

#!/usr/bin/env python3

from evdev import InputDevice, categorize, ecodes

device = InputDevice('/dev/input/event0')
# Oeffnet das Eingabegerät exklusiv
#device.grab()

time = 0
for event in device.read_loop():
	if event.type == ecodes.EV_KEY:
		if event.code == 28 and event.value == 1:
			# Powertaster gedrueckt
			time = event.timestamp()
		elif event.value == 0 and event.value == 0:
			# Powertaster losgelassen
			duration = event.timestamp() - time
			if time != 0 and duration < 1:
				print("Powertaster kurz gedrueckt,")
			elif time != 0 and duration >= 1:
				print("Powertaster lange gedrueckt.")	

Antworten