feat(station): Abschlussbild beim Herunterfahren und beim Neustart

E-Paper behaelt sein Bild dauerhaft, auch stromlos. Faehrt der Pi
herunter, wird der Anzeigedienst mit abgeraeumt und das zuletzt
gezeichnete Bild bleibt fuer immer stehen - bei der Abnahme stand dort
die Rueckfrage des Tastermenues, und der ausgeschaltete Pi sah aus, als
warte er noch auf eine Eingabe.

Zwei neue Units, ninlight-poweroff.service (WantedBy=poweroff.target)
und ninlight-reboot.service (WantedBy=reboot.target). Sie haengen am
System, nicht am Tasterdienst: so greifen sie bei jedem Herunterfahren -
Menue, "poweroff" per SSH, "reboot" - und nicht nur auf einem von drei
Wegen. Zwei Units statt einer Fallunterscheidung, weil systemd einem
ExecStart nicht sagt, wohin die Reise geht.

Die Texte unterscheiden sich: "AUSGESCHALTET / Strom kann getrennt
werden" gegen "NEUSTART / Strom NICHT trennen!" samt Hinweis auf die
rund zwei Minuten, die der Zero W bis zum Anzeigedienst braucht. An
diesem Pi hat ein Stromzug in genau dieser Wartezeit schon eine
SD-Karte gekostet.

Reihenfolge: die Units ordnen sich per After=ninlight-display.service
hinter dessen Stop ein, und "ninlight-station display final <kind>"
wartet zusaetzlich, bis systemctl is-active nicht mehr anschlaegt -
dasselbe Muster wie display_handover(), nur ohne Wiederanfahren. Gibt
der Dienst die Leitungen nicht frei, wird nicht gezeichnet (GPIO busy),
sondern gewarnt: ein Anzeigefehler haelt das Herunterfahren nie auf.

Nebenbei behoben: display_run() reichte nur "$1" an display.py weiter
und haette "--final poweroff" halbiert.
This commit is contained in:
Michael Sauer
2026-09-15 03:02:21 +02:00
parent 300edafc3e
commit 4e1a965cbb
12 changed files with 572 additions and 4 deletions
+30
View File
@@ -0,0 +1,30 @@
[Unit]
Description=ninlight-Station: "Neustart"-Bild aufs E-Paper
Documentation=file:/opt/ninlight-station/README.md
# Das Gegenstueck zu ninlight-poweroff.service, mit einem ANDEREN Text - und das ist hier
# kein Schoenheitsfehler, sondern der Zweck der zweiten Unit:
#
# Herunterfahren -> "AUSGESCHALTET / Strom kann getrennt werden"
# Neustart -> "NEUSTART / Strom NICHT trennen!"
#
# Ein Raspberry Pi Zero W braucht gut anderthalb Minuten, bis der Anzeigedienst wieder
# zeichnet. Stuende dort waehrenddessen "Strom kann getrennt werden", waere das eine
# Aufforderung zu genau dem Griff, der an diesem Pi schon eine SD-Karte gekostet hat.
#
# Zwei Units statt einer mit Fallunterscheidung: systemd sagt einem ExecStop/ExecStart
# nicht, wohin die Reise geht - man muesste "systemctl list-jobs" nach "reboot.target"
# durchsuchen. Ueber WantedBy= ist es dagegen der Abschalt-Zieleinheit selbst entnommen
# und damit nicht zu verwechseln.
DefaultDependencies=no
# Reihenfolge und Begruendung wie in ninlight-poweroff.service (GPIO-Uebergabe, und noch
# vor umount.target zeichnen).
After=ninlight-display.service ninlight-button.service
Before=umount.target shutdown.target final.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/ninlight-station display final reboot
TimeoutStartSec=30
[Install]
WantedBy=reboot.target