feat(station): Panel und CLI auf Englisch, IP-Zeile im Off-Bild

Die deutschen Texte sahen auf dem 2,13"-Panel merkwuerdig aus - jetzt sind
alle Texte, die der Bediener am Geraet oder auf der Konsole sieht, englisch:
Modus-, Phasen-, Bildsatz- und Abschlussbeschriftungen in render.py, die
Bedientexte des Tasterdienstes und saemtliche Ausgaben von ninlight-station
inklusive des Hilfetexts. Die Testbeschreibungen der Suiten bleiben deutsch -
die liest nur, wer die Tests laufen laesst.

Neu im Off-Bild: die Adresse, unter der der Pi gerade erreichbar ist. Ist die
Station aus, ist der Pi ein gewoehnlicher Rechner im Heimnetz, und die
einzige Auskunft, die man dann am Panel braucht, ist die fuer SSH. Die
Adresse kommt aus einem UDP-Socket, der nur verbunden und nie benutzt wird
(kein Datenverkehr, kein DNS, kein Unterprozess in einer 5-s-Schleife) und
liefert genau die Adresse der Standardroute. Ohne Netz sagt die Zeile
ausdruecklich "no network": eine fehlende Zeile wuerde offen lassen, warum
SSH gerade scheitert.

Die Zeile gibt es NUR im Off-Bild - im Betrieb traegt wlan0 die Adresse des
Zugangspunkts, die ohnehin auf jedem Statusbild steht.
This commit is contained in:
Michael Sauer
2026-09-20 00:28:33 +02:00
parent 71a579c0f9
commit 021089a68b
7 changed files with 373 additions and 274 deletions
+36 -1
View File
@@ -237,6 +237,35 @@ def _read_imageset(imageset_path: Path, conf: dict[str, str]) -> tuple[str, bool
return name, False
def local_ip() -> str:
"""Die Adresse, unter der der Pi im Heimnetz erreichbar ist, oder "" wenn keine da ist.
Ueber einen UDP-Socket, der nur verbunden und nie benutzt wird: das erzeugt keinen
Datenverkehr und fragt kein DNS, liefert aber genau die Adresse, die der Kernel fuer
die Standardroute waehlen wuerde - also die, ueber die der Bediener tatsaechlich per
SSH hereinkommt. Ein Aufruf von "hostname -I" waere die naheliegende Alternative,
listet aber ALLE Adressen (inklusive der des Zugangspunkts und IPv6) und braucht einen
Unterprozess in einer Schleife, die alle 5 s laeuft.
Wirft nie: ohne Netz gibt es keine Route, dann liefert der Aufruf "" und die Anzeige
sagt das - eine Ausnahme aus der Adressermittlung darf das Panel nicht aufhalten."""
import socket
sock = None
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Die Adresse wird nie angesprochen; sie waehlt nur die Route aus. Bewusst eine
# dokumentierte Testadresse (RFC 5737) statt eines echten Ziels wie 8.8.8.8 -
# es soll auch dann nichts Fremdes anklingen, wenn jemand mitliest.
sock.connect(("192.0.2.1", 9))
return str(sock.getsockname()[0])
except OSError:
return ""
finally:
if sock is not None:
sock.close()
def build_state(run_dir: Path = RUN_DIR, conf_path: Path = CONF_PATH,
service_name: str = SERVICE_NAME,
imageset_path: Path = IMAGESET_FILE) -> dict:
@@ -262,7 +291,13 @@ def build_state(run_dir: Path = RUN_DIR, conf_path: Path = CONF_PATH,
imageset, imageset_ok = _read_imageset(imageset_path, conf)
if not _service_active(service_name):
return {"mode": "off", "imageset": imageset, "imageset_ok": imageset_ok}
# Die IP-Zeile gibt es NUR hier: ist die Station aus, ist der Pi ein gewoehnlicher
# Rechner im Heimnetz, und die einzige Auskunft, die man dann am Panel braucht,
# ist die Adresse, unter der man per SSH drankommt. Im Betrieb waere sie sinnlos
# (wlan0 traegt dann 192.168.8.1, das steht ohnehin auf jedem Statusbild) und
# wuerde den knappen Platz fuer Betriebsauskuenfte wegnehmen.
return {"mode": "off", "imageset": imageset, "imageset_ok": imageset_ok,
"ip": local_ip()}
mode = _read_mode_file(run_dir)
status = _read_json(run_dir / "status.json")