fix(station): Anzeigedienst bleibt ueber on/off hinweg durchgehend an
'off' stoppte bisher den Anzeigedienst und leerte das Panel, aber kein 'on'-Pfad hat ihn je wieder gestartet - ab dem zweiten Ein/Aus blieb das Panel bis zum naechsten Pi-Neustart dunkel. Die Begruendung dafuer trug nicht: der Anzeigedienst erkennt den ausgeschalteten Zustand selbst (systemctl is-active ninlight-station) und zeichnet von sich aus "Station aus". 'off' fasst den Anzeigedienst jetzt nicht mehr an; er laeuft durchgehend (wie seit dem Booten ohnehin) und zeigt den jeweils aktuellen Zustand. display_off() bleibt fuer den expliziten Diagnosebefehl 'ninlight-station display off' erhalten. Enthaelt zusaetzlich die schon im Arbeitsbaum liegende PHASE_LABELS-Korrektur in render.py (HORCHT -> LISTEN).
This commit is contained in:
@@ -608,16 +608,36 @@ display_handover() {
|
||||
return "$_rc"
|
||||
}
|
||||
|
||||
# Nimmt die Anzeige mit aus. Reihenfolge: erst den Dienst stoppen, dann das Panel leeren -
|
||||
# umgekehrt zeichnet der noch laufende Daemon binnen 5 s sein altes Bild wieder darauf.
|
||||
# Stoppt den Anzeigedienst dauerhaft und leert danach das Panel. Reihenfolge: erst der
|
||||
# Dienst, dann das Leeren - umgekehrt zeichnet der noch laufende Daemon binnen 5 s sein
|
||||
# altes Bild wieder darauf.
|
||||
#
|
||||
# Warum leeren und nicht "Station aus" stehen lassen: der Anzeigedienst erkennt den
|
||||
# ausgeschalteten Zustand zwar selbst (systemctl is-active), aber ein laufender
|
||||
# Anzeigedienst nach "off" bedeutet, dass "off" eben NICHT alles abgeschaltet hat. Ein
|
||||
# leeres Panel behauptet dagegen gar nichts - und das ist bei einer Station, die Lampen
|
||||
# ungefragt Firmware unterschieben kann, die einzig ungefaehrliche Richtung: ein
|
||||
# stehengebliebenes "MIGRATION"-Bild wuerde einen Betriebszustand behaupten, den es nicht
|
||||
# mehr gibt, waehrend ein leeres Panel hoechstens nach "aus" aussieht - was es ist.
|
||||
# Frueher hing diese Funktion auch in full_off() (also in jedem "off") und stuetzte das
|
||||
# auf die Annahme, ein weiterlaufender Anzeigedienst wuerde nach "off" ein stehen-
|
||||
# gebliebenes "MIGRATION"-Bild zeigen, das einen Betriebszustand behauptet, den es nicht
|
||||
# mehr gibt - ein leeres Panel sei da die einzig ungefaehrliche Richtung. Die Praemisse
|
||||
# stimmt nicht: der Anzeigedienst erkennt den ausgeschalteten Zustand selbst
|
||||
# (_service_active() in display.py fragt "systemctl is-active ninlight-station") und
|
||||
# zeichnet dann von sich aus "Station aus" - am Geraet so bestaetigt. Es gab also nie ein
|
||||
# stehenbleibendes Bild, gegen das zu schuetzen waere. Der tatsaechliche Effekt war ein
|
||||
# anderer, ungewollter: der Dienst blieb nach dem ersten "off" gestoppt, und KEIN "on"-Pfad
|
||||
# (recovery_on/migrate_on/die Kurzform "on") hat ihn je wieder gestartet - ab dem zweiten
|
||||
# Durchgang blieb das Panel bis zum naechsten Neustart des Pi dunkel, obwohl die Station
|
||||
# wieder lief.
|
||||
#
|
||||
# Jetzt laesst full_off() den Anzeigedienst laufen (er startet ohnehin beim Booten und
|
||||
# zeichnet den jeweils aktuellen Zustand selbst) - symmetrisch, ohne dass "on" ihn eigens
|
||||
# wiederanfahren muesste, und ohne dass "off" ihn extra stoppen muesste. Diese Funktion
|
||||
# bleibt nur fuer den EXPLIZITEN Diagnosebefehl 'ninlight-station display off' erhalten,
|
||||
# mit dem man den Dienst bewusst und dauerhaft stilllegen kann (z.B. um das Panel zu
|
||||
# schonen) - dafuer braucht es weiterhin Stop+Leeren in dieser Reihenfolge.
|
||||
#
|
||||
# Preis der Entscheidung, den Dienst durchlaufen zu lassen: er ruft alle
|
||||
# POLL_INTERVAL_S=5s (display.py) 'systemctl is-active' auf - dauerhaft, auch waehrend die
|
||||
# Station aus ist, nicht nur waehrend sie an ist wie bisher. Das ist ein einzelner lokaler
|
||||
# D-Bus-Aufruf ohne Netzwerk; auf einem Pi Zero W (ARMv6, ein Kern) kostet ein Fork+Exec
|
||||
# davon alle 5 s spuerbar, aber nicht ernsthaft etwas - derselbe Takt laeuft schon waehrend
|
||||
# jedes "an"-Zustands, und ein ansonsten untaetiger Kern hat davon reichlich Luft. Vertretbar.
|
||||
display_off() {
|
||||
sudo systemctl stop ninlight-display 2>/dev/null || true
|
||||
# Kein Abbruch, wenn das Panel fehlt: display.py beendet sich dann selbst mit 0, und
|
||||
@@ -633,14 +653,11 @@ full_off() {
|
||||
# stehenlaesst.
|
||||
autooff_clear
|
||||
sudo systemctl stop ninlight-station 2>/dev/null || true
|
||||
# VOR ap_switch, nicht danach: ap_switch "" bricht bei einem haengenden
|
||||
# NetworkManager mit Fehler ab, und unter "set -e" kaeme danach nichts mehr. Genau
|
||||
# dann - Zugangspunkt laesst sich nicht abschalten - waere die Anzeige sonst der
|
||||
# letzte Rest von "off", der nie ausgefuehrt wird: Daemon laeuft weiter, Panel zeigt
|
||||
# unveraendert "MIGRATION". Ein leeres Panel behauptet dagegen nichts; die Wahrheit
|
||||
# ueber den noch offenen Zugangspunkt steht in ap_switch's Fehlermeldung, wo man sie
|
||||
# liest, statt auf einem Panel, das man auch fuer aktuell halten koennte.
|
||||
display_off
|
||||
# Am Anzeigedienst wird hier bewusst NICHTS getan (siehe display_off()'s Kommentar):
|
||||
# er laeuft weiter und zeichnet "Station aus" von selbst, sobald sein naechster Poll
|
||||
# (spaetestens 5 s) "systemctl is-active ninlight-station" als inaktiv sieht. Das
|
||||
# macht "off" unabhaengig vom Anzeigedienst - ob der installiert, aktiv oder gerade
|
||||
# gescheitert ist, hat auf das Abschalten der Station keinen Einfluss.
|
||||
ap_switch ""
|
||||
if nmcli -t -f NAME con show | grep -Fqx "$HOME_CONNECTION"; then
|
||||
if sudo nmcli con up "$HOME_CONNECTION" >/dev/null; then
|
||||
@@ -901,7 +918,9 @@ usage() {
|
||||
echo " Ein laufender Anzeigedienst wird dafuer kurz gestoppt und" >&2
|
||||
echo " danach wieder gestartet (er haelt sonst die GPIO-Leitungen)." >&2
|
||||
echo " display clear Panel leeren (ebenfalls mit kurzer Unterbrechung des Dienstes)." >&2
|
||||
echo " display off Anzeigedienst stoppen und das Panel leeren (macht 'off' mit)." >&2
|
||||
echo " display off Anzeigedienst dauerhaft stoppen und das Panel leeren. 'on'/'off'" >&2
|
||||
echo " der Station brauchen das nicht - der Anzeigedienst laeuft" >&2
|
||||
echo " unabhaengig davon durch und zeichnet den Zustand selbst." >&2
|
||||
}
|
||||
|
||||
_cmd=${1:-}
|
||||
|
||||
Reference in New Issue
Block a user