diff --git a/AGENTS.md b/AGENTS.md index 6c3b32c..04bb121 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,7 @@ # AGENTS.md — Project state, review findings, open items, and working rules -**Last updated: 2026-09-01** („Geparkt seit" kommt von der Zündung und wird nach einem Neustart +**Last updated: 2026-09-01** („502" beim Neustart entschärft, OTA-Bündel auf `2026.9.1.8` +nachgezogen, Abschnitt BC. Davor: „Geparkt seit" kommt von der Zündung und wird nach einem Neustart aus der Aufzeichnung nachgeholt, Manifest `2026.9.1.7`, Abschnitt BB. Davor: GNSS-Streckenrollen vorbereitet, `2026.9.1.5`, Abschnitt BA. Davor: Fahrtende ohne den 900-s-Nachlauf des Geräts, Manifest `2026.9.1.4`, @@ -6669,6 +6670,46 @@ ein Tor — nur zählen, wenn Bewegung gemeldet ist. Dass `Movement` jetzt auf O genau dieses Tor erst möglich. Vor der ersten echten Fahrt ist die Größenordnung der Drift unbekannt; sie ist als Erstes zu messen. +## BC. „502" beim Neustart, und das OTA-Bündel hing sieben Versionen zurück (2026.9.1.8) + +### Die App meldete einen Fehler, wo keiner war + +Nach „Jetzt neu starten" sprang der Knopf zurück und darunter stand **502** — während Home +Assistant ordnungsgemäß hochfuhr. Der Nutzer musste annehmen, der Neustart sei gescheitert, und +drückte erneut. Vom Eigentümer gemeldet am 2026-09-01, und schon in der Fassung vom 31.08. der +zweite Teil desselben Berichts. + +Ursache: `updateNeustartAusloesen()` behandelte **jeden** Fehlschlag als Fehler. Über einen +Vorschaltserver kommt beim Neustart aber kein Verbindungsabbruch zurück, sondern eine saubere +502/503/504 — der Proxy antwortet, Home Assistant noch nicht. Genau der Fall, für den +`ApiFehler.istVoruebergehend` seit dem 31.08. existiert; er wurde hier nur nicht gefragt. + +Jetzt: `if (fehler instanceof ApiFehler && fehler.istVoruebergehend) return` — der Bildschirm +bleibt auf „Home Assistant startet neu …", und der bestehende Effekt räumt ihn ab, sobald die +Verbindung wieder steht. Dieselbe Einstufung wie im `DatenKontext`, damit Anzeige und +Wiederverbindung denselben Fall gleich bewerten. + +**Im Panel war es kein Fehler, aber die Lücke war dieselbe.** Es ruft über die WebSocket-Verbindung +(`HASS.callService`), da bricht die Leitung ab statt 502 zu liefern — der Kommentar dort sagte das +sogar. „Normalerweise" ist aber keine Garantie, sobald ein Vorschaltserver dazwischen steht. +Dieselbe Toleranz deshalb auch dort, damit beide Oberflächen denselben Fall gleich bewerten. + +### Das OTA-Bündel stand noch auf 2026.8.31.5 + +Der Eigentümer meldete: Kopfzeile „App ist älter als der Server", Kachel „App ist aktuell 31.5", +Integration steht auf 1.7, und „Update prüfen" findet nichts. **Kein Fehler — die Anzeige sagte die +Wahrheit.** Sieben Versionen lang wurde nur die Integration ausgeliefert; `npm run ota` lief seit +dem 31.08. um 20:03 nicht mehr. + +**Merkposten, der in VERSIONIERUNG.md fehlt:** eine Änderung an `companion-app/src` ist erst dann +beim Nutzer, wenn das Bündel neu gebaut wurde. Das Erhöhen der Manifest-Version allein reicht +nicht — sie beschreibt dann eine App, die es nicht gibt. Bei jeder Änderung an der App gehört +`npm run ota` dazu, nicht nur der Versionssprung. + +Nachgewiesen: Manifest, `bundle.json` und die ausgelieferte Zip tragen alle `2026.9.1.8` und +denselben SHA-256 `c2f9192e…`; `tsc --noEmit` sauber, 165/165 Tests grün, Panel als **Modul** +geparst (Abschnitt AQ), `audi_ha_test` fehlerfrei gestartet. + ## Working conventions (observed — keep them) - German is the project language: identifiers, comments, commits, UI texts. Exceptions: diff --git a/companion-app/src/screens/Einstellungen.tsx b/companion-app/src/screens/Einstellungen.tsx index 0cd351d..a974ce8 100644 --- a/companion-app/src/screens/Einstellungen.tsx +++ b/companion-app/src/screens/Einstellungen.tsx @@ -8,7 +8,7 @@ import { useEffect, useRef, useState } from "react" import { ActionButton, Feld, Seg, Sheet, Switch, Tile } from "@audi-dash/ui" -import { DIENST_DOMAIN, zugangLesen, zugangVerwerfen } from "../api" +import { ApiFehler, DIENST_DOMAIN, zugangLesen, zugangVerwerfen } from "../api" import type { Profil } from "../api" import { eigeneVersion } from "../daten/appVersion" import { Datumsfeld } from "./Datumsfeld" @@ -147,6 +147,19 @@ export function Einstellungen({ try { await api.homeAssistantNeuStarten() } catch (fehler) { + // Waehrend Home Assistant neu startet, ist ein Fehlschlag der Normalfall + // und kein Fehler: der Vorschaltserver antwortet mit 502/503/504, oder + // die Verbindung bricht ganz ab. Beides als Fehlerzeile zu zeigen war + // irrefuehrend - der Knopf sprang zurueck auf "Jetzt neu starten" und + // darunter stand "502", waehrend Home Assistant ordnungsgemaess hochfuhr. + // Der Nutzer musste annehmen, der Neustart sei gescheitert, und drueckte + // erneut (gemeldet vom Eigentuemer am 2026-09-01). + // + // Der Bildschirm bleibt deshalb auf "Home Assistant startet neu ..."; + // der Effekt darunter raeumt ihn ab, sobald die Verbindung wieder steht. + // Dieselbe Einstufung wie im DatenKontext, damit Anzeige und + // Wiederverbindung denselben Fall gleich bewerten. + if (fehler instanceof ApiFehler && fehler.istVoruebergehend) return setzeUpdateAktionFehler( fehler instanceof Error ? fehler.message diff --git a/custom_components/audi_dashboard/frontend/app/bundle.json b/custom_components/audi_dashboard/frontend/app/bundle.json index 608f94b..b1e8282 100644 --- a/custom_components/audi_dashboard/frontend/app/bundle.json +++ b/custom_components/audi_dashboard/frontend/app/bundle.json @@ -1 +1 @@ -{"version":"2026.8.31.5","sha256":"3f297e72a5b215e54d1eb17d134d6d66ef65d1d29a5793220ff2456b6c6cc5c8","bytes":265697,"gebaut":"2026-08-31T18:03:21Z"} \ No newline at end of file +{"version":"2026.9.1.8","sha256":"c2f9192ecc9a32542a9f1dd23ec10c05bcbcb7fffbfd80a09b2a5cf907e437a9","bytes":265705,"gebaut":"2026-09-01T10:18:03Z"} \ No newline at end of file diff --git a/custom_components/audi_dashboard/frontend/app/bundle.zip b/custom_components/audi_dashboard/frontend/app/bundle.zip index b3e1659..cd34986 100644 Binary files a/custom_components/audi_dashboard/frontend/app/bundle.zip and b/custom_components/audi_dashboard/frontend/app/bundle.zip differ diff --git a/custom_components/audi_dashboard/frontend/audi-dashboard-app.js b/custom_components/audi_dashboard/frontend/audi-dashboard-app.js index ba29334..a4a04d5 100644 --- a/custom_components/audi_dashboard/frontend/audi-dashboard-app.js +++ b/custom_components/audi_dashboard/frontend/audi-dashboard-app.js @@ -5552,7 +5552,16 @@ function ereignisseVerdrahten() { // Bricht die Verbindung normalerweise durch den Neustart selbst ab, // bevor diese Zeile überhaupt liefe - nur ein echter Fehlschlag // (Dienst abgelehnt, o.ä.) kommt hier tatsächlich an. - hinweis("Neustart fehlgeschlagen", err && err.message ? err.message : "Home Assistant konnte nicht neu gestartet werden."); + // + // "Normalerweise" ist aber keine Garantie: geht der Ruf ueber einen + // Vorschaltserver, kommt statt eines Abbruchs eine 502/503/504 + // zurueck, und die ist waehrend eines Neustarts kein Fehlschlag, + // sondern der erwartete Zustand. Die App hat genau daran gelitten + // (siehe Einstellungen.tsx, 2026-09-01); hier dieselbe Einstufung, + // damit beide Oberflaechen denselben Fall gleich bewerten. + const txt = err && err.message ? String(err.message) : ""; + if (/(502|503|504)/.test(txt) || /fetch|network|Failed to fetch/i.test(txt)) return; + hinweis("Neustart fehlgeschlagen", txt || "Home Assistant konnte nicht neu gestartet werden."); INTEGRATION_UPDATE_LAEUFT = null; render(); }); } diff --git a/custom_components/audi_dashboard/manifest.json b/custom_components/audi_dashboard/manifest.json index 4a7e788..87d1699 100644 --- a/custom_components/audi_dashboard/manifest.json +++ b/custom_components/audi_dashboard/manifest.json @@ -1,7 +1,7 @@ { "domain": "audi_dashboard", "name": "Audi Dashboard", - "version": "2026.9.1.7", + "version": "2026.9.1.8", "documentation": "https://gitea.nothaft.cloud/paul/audi-app/src/branch/main/README.md", "issue_tracker": "https://gitea.nothaft.cloud/paul/audi-app/issues", "codeowners": ["@paul"],