Stand 23.09.2026: pi@192.168.39.177, Debian 12 (bookworm), ARM64 (aarch64,
64 Bit), angemeldete Desktop-Sitzung mit labwc und Xwayland (DISPLAY=:0).
Deploy- und Arbeitsverzeichnis: /home/pi/PoolControl.
Es wird ein Release-Paket für linux-arm64 mit integrierter .NET-Laufzeit
verwendet. Das System benötigt weiterhin die nativen Grafikbibliotheken,
Schriften und Geräteberechtigungen. pi hat auf dem geprüften Gerät unter
anderem Zugriff über die Gruppen gpio und i2c. Ein Build für ARM32 wäre
für dieses Gerät falsch.
Auf dem verwendeten Windows-Rechner liegt der Schlüssel unter
$env:USERPROFILE\.ssh\id_ed25519_poolcontrol; der öffentliche Teil endet auf
.pub. Der Schlüssel wurde bereits eingerichtet. Private Schlüssel gehören
nicht ins Repository. Die initiale Anmeldung zum Hinterlegen des öffentlichen
Schlüssels benötigt einen bereits funktionierenden Zugang zum Pi.
# Nur bei erstmaliger Einrichtung, vorhandenen Schlüssel nicht überschreiben:
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\id_ed25519_poolcontrol" -C poolcontrol-deploy
Get-Content "$env:USERPROFILE\.ssh\id_ed25519_poolcontrol.pub" | ssh pi@192.168.39.177 'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys; chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys'
# Passwortfreien Zugang und Zielarchitektur prüfen:
ssh -i "$env:USERPROFILE\.ssh\id_ed25519_poolcontrol" -o IdentitiesOnly=yes -o BatchMode=yes pi@192.168.39.177 'uname -m; getconf LONG_BIT; id'Den Hostschlüssel beim ersten Verbinden anhand einer vertrauenswürdigen Quelle prüfen; ein unerwartet geänderter Hostschlüssel muss geklärt werden.
appsettings.json: MQTT, Logging und Persistenzpfad. Vor einem Update auf Übereinstimmung mit dem Ziel prüfen. Diese Datei kommt aus dem Buildpaket./home/pi/poolcontrolviewmodel.json: ursprüngliche, vom Betreiber bereitgestellte Anlagenkonfiguration. Nur beim Erstdeployment als Quelle verwenden./home/pi/PoolControl/poolcontrolviewmodel.json: aktuelle Anlagenkonfiguration; bei Updates beibehalten, da UI/MQTT und periodisches Speichern sie ändern.winpoolcontrolviewmodel.json: lokale Windows-Konfiguration; kein Ersatz für die Linux-Anlagendatei.- UI-Präferenzen:
Environment.SpecialFolder.LocalApplicationData/PoolControl/ui.json, auf diesem Linux-Typ üblicherweise/home/pi/.local/share/PoolControl/ui.json.
Beim Erstdeployment wurde die Originaldatei zusätzlich als
/home/pi/poolcontrolviewmodel.json.predeploy-20260923 gesichert, unverändert in
das Deploy-Verzeichnis kopiert und vor dem Start mit cmp verglichen. Erst
danach wurde das für Messmodelle ungültige Distance.IntervalInSec = 0 auf
ausdrücklichen Betreiberwunsch in der Deploy-Datei auf 60 gesetzt. Die Datei
unter /home/pi wurde dabei nicht angepasst.
Im Repository auf Windows mit installiertem .NET-10-SDK:
dotnet publish PoolControl.csproj -c Release -r linux-arm64 --self-contained true -p:PublishTrimmed=false -p:UsedAvaloniaProducts= -o artifacts/deploy/linux-arm64
if ($LASTEXITCODE -ne 0) { throw 'Publish fehlgeschlagen' }
tar -czf artifacts/deploy/poolcontrol-linux-arm64.tar.gz -C artifacts/deploy/linux-arm64 .
if ($LASTEXITCODE -ne 0) { throw 'Archivierung fehlgeschlagen' }
scp -i "$env:USERPROFILE\.ssh\id_ed25519_poolcontrol" -o IdentitiesOnly=yes artifacts/deploy/poolcontrol-linux-arm64.tar.gz pi@192.168.39.177:/home/pi/
if ($LASTEXITCODE -ne 0) { throw 'Übertragung fehlgeschlagen' }UsedAvaloniaProducts= unterdrückt die Buildstatistik für eingeschränkte
Buildumgebungen. Trimming ist für dieses Deployment explizit ausgeschaltet.
Die Linux-Anlagenkonfiguration wird vom Projekt nicht ins Publish-Verzeichnis kopiert.
Zuerst die laufende Anwendung über die Oberfläche regulär beenden. Ein offenes
klassisches Konfigurationsfenster muss zuvor geschlossen werden. Den Abschluss
abwarten (Application shutdown completed im Log). So werden aktuelle Werte
gespeichert und Relais/GPIO geordnet geschlossen. Nicht über laufende Dateien
extrahieren. systemctl stop/SIGTERM ist kein zugesicherter Ersatz für den
Fenster-Schließpfad dieser Version.
Danach auf dem Pi, als Benutzer pi:
set -eu
if pgrep -x PoolControl >/dev/null; then
echo 'PoolControl zuerst regulär beenden' >&2
exit 1
fi
backup="/home/pi/PoolControl.before-$(date +%Y%m%d-%H%M%S)"
test ! -e "$backup"
cp -a /home/pi/PoolControl "$backup"
tar -xzf /home/pi/poolcontrol-linux-arm64.tar.gz -C /home/pi/PoolControl
chmod +x /home/pi/PoolControl/PoolControl
cmp "$backup/poolcontrolviewmodel.json" /home/pi/PoolControl/poolcontrolviewmodel.json
python3 -m json.tool /home/pi/PoolControl/poolcontrolviewmodel.json >/dev/null
echo "Backup: $backup"Beim Erstdeployment stattdessen ein neues Verzeichnis anlegen, das Paket extrahieren und vor dem ersten Start die Betreiberdatei kopieren:
cp -p /home/pi/poolcontrolviewmodel.json /home/pi/PoolControl/poolcontrolviewmodel.jsonNicht bei späteren Updates erneut aus der Originaldatei kopieren: Das würde zwischenzeitlich gespeicherte Einstellungen verlieren.
Der bisher verwendete Start ist eine transiente systemd-Benutzereinheit. Er nutzt die Umgebung der angemeldeten Desktop-Sitzung und das richtige Arbeitsverzeichnis:
systemctl --user show-environment
systemd-run --user --unit=poolcontrol --property=WorkingDirectory=/home/pi/PoolControl /home/pi/PoolControl/PoolControl
systemctl --user show poolcontrol -p ActiveState -p SubState -p MainPID -p ExecMainStatus
DISPLAY=:0 xwininfo -root -tree | grep PoolControl
sudo journalctl _SYSTEMD_USER_UNIT=poolcontrol.service --since '2 minutes ago' --no-pagerFalls die Einheit von einem Fehlstart noch existiert, zuerst Ursache und
Protokoll prüfen; anschließend systemctl --user reset-failed poolcontrol vor
dem erneuten Start. Keine zweite Steuerungsinstanz parallel starten.
Mindestens den Startabschluss und einen vollständigen Messzyklus abwarten. Prüfen: JSON geladen, Fenster vorhanden, Prozess weiter aktiv, MQTT verbunden, keine Startvalidierungsfehler, erwartete Sensorantworten. Messfehler dürfen nicht allein wegen eines aktiven Prozesses als behoben gelten.
Bekannte Beobachtungen und Grenzen stehen im
Checkpoint. Die User-Journalabfrage lieferte auf dem
Gerät ohne sudo keine Einträge; das Anwendungslog im Arbeitsverzeichnis ist
eine zusätzliche Quelle.
Kein Autostart nach Neustart eingerichtet. systemd-run erzeugt keine
dauerhaft installierte oder aktivierte Service-Datei. Ein solcher Autostart
ist ein separater nächster Schritt und braucht die passende Desktop-Umgebung.
Anwendung regulär beenden und Stillstand prüfen. Den gewünschten Backup-Pfad
aus dem vorherigen Deployment ausdrücklich auswählen. Das aktuelle
Deploy-Verzeichnis zunächst unter einem neuen Namen aufbewahren, dann das
Backup nach /home/pi/PoolControl zurückkopieren. Nicht blind über eine
laufende Installation schreiben. Entscheiden, ob die aktuelle Konfiguration
beibehalten oder ebenfalls auf den Backup-Stand zurückgesetzt werden soll;
beide Versionen vorher sichern. Danach denselben Start- und Prüfablauf verwenden.
Im Laufe dieser Sitzung wurden Backups unter
/home/pi/PoolControl.backup-*-20260923 erstellt. Das zuletzt vor diesem
Checkpoint installierte Paket enthält die erweiterten Sensor-Textfelder;
das Backup unmittelbar davor heißt PoolControl.backup-sensor-settings-20260923.