Fahrt beenden auf Knopfdruck, Schieberegler, Zuendungspause (2026.9.3.5-.7)

Vier Themen aus einer Sitzung.

1. Die Fahrt endet wieder bei uns statt im Dongle (Abschnitt BW). Der
   Ignition-OFF-Timeout des FMM003 (900 s) und sein Schlaf-Timeout (ebenfalls
   900 s) starten beide beim Zuendungs-Aus und fallen in derselben Sekunde -
   am 02.09. zweimal beobachtet, einmal ging das Trip-Ende verloren, einmal kam
   es eine Sekunde vor dem Schlaf an. Ausloeser ist jetzt die Zuendung, die
   Wartezeit laeuft in Home Assistant. ZUENDUNG_NACHLAUF_S = 180 wird in beiden
   Wegen abgezogen (ueber das Trip-Signal 1080 s, weil dessen Ende selbst an der
   verzoegerten Zuendung haengt).

2. Schieberegler, neu in beiden Codebasen. Schrittweite 5 Minuten; der Daumen
   war im Tagmodus weiss auf weiss und traegt jetzt einen Ring aus
   --line-strong - ein Token, das genau dort sichtbar ist, wo es gebraucht wird.

3. Knopf "Fahrt beenden" in der Zuletzt-Kachel (Abschnitt BX). Schliesst auf
   das letzte Lebenszeichen, nicht auf "jetzt", und kennzeichnet das Ende als
   vorlaeufig. Ein spaet eintreffendes Zuendungs-Aus zieht es nach - innerhalb
   von sechs Stunden, nur nach vorn, und nur bei einer vorlaeufigen Fahrt.
   ts_end wandert bewusst NICHT in edited_fields, sonst blockierte der Schutz
   fuer Handeingaben genau diese Korrektur.

4. Das OTA-Buendel kann auf dem Mac gar nicht entstehen (Abschnitt BV):
   npm run ota ist eine Windows-PowerShell-Datei, ios-signieren.sh baut ein
   frisches dist/ und fasst das Buendel nie an. Ausgeliefert war deshalb eine
   Oberflaeche ohne den Versionshinweis unter richtiger Nummer.

Verifiziert: Backend 27/27 (5 Signalwechsel, 14 Zuendungspause, 8 Fahrtende),
companion-app tsc sauber und 179/179, Panel als Modul geparst, audi_ha_test auf
2026.9.3.7 sauber gestartet. Live am laufenden Panel und ohne Rueckstand
belegt: Wartezeit samt Abbruch, die 180-s-Rechnung, der Regler im Tagmodus und
der Knopf von der laufenden Fahrt bis zum verworfenen Kurzvorgang - Fahrten
vorher 16, nachher 16.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-03 15:00:38 +02:00
parent d30bb0e9f0
commit 5ccbfec92d
29 changed files with 1444 additions and 51 deletions
@@ -798,6 +798,75 @@ img.carfix.klein { aspect-ratio: auto; height: auto; }
.switch input:checked + .track { background: var(--fg); border-color: var(--fg); }
.switch input:checked + .track::before { transform: translateX(19px); background: var(--canvas); }
/* Schieberegler - Zwilling von .ads-schieber im Design-System.
Ein echtes input[type=range], damit Tastatur und Vorlesefunktion ohne
Zutun stimmen; gemalt wird selbst, sonst saehe er im Panel wie Chrome und
in der App wie WebKit aus. Der gefuellte Teil kommt aus --fuell, weil ein
Range-Feld seinen Wert nicht ans Stylesheet weitergibt und accent-color
entfaellt, sobald man die Spur selbst gestaltet (gesetzt beim Rendern und
im input-Zweig der Ereignisse).
Die beiden Spur-Regeln lassen sich NICHT zusammenfassen: einen unbekannten
Selektor verwirft der Browser samt der ganzen Regel. */
.schieber { display: flex; align-items: center; gap: 16px; min-width: 0; }
/* 28 px hoch bei 4 px Spur: das ist die Trefferflaeche des Daumens. */
.schieber input[type=range] {
-webkit-appearance: none; appearance: none;
flex: 1 1 auto; min-width: 0; height: 28px;
margin: 0; padding: 0; background: transparent; cursor: pointer;
}
.schieber input[type=range]::-webkit-slider-runnable-track {
height: 4px; border-radius: var(--r-pill);
background: linear-gradient(to right, var(--fg) var(--fuell, 0%), var(--ios-fill) var(--fuell, 0%));
}
.schieber input[type=range]::-moz-range-track {
height: 4px; border-radius: var(--r-pill);
background: linear-gradient(to right, var(--fg) var(--fuell, 0%), var(--ios-fill) var(--fuell, 0%));
}
/* margin-top zentriert den Daumen auf der Spur: (4 - 28) / 2 = -12. */
.schieber input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none; appearance: none; box-sizing: border-box;
width: 28px; height: 28px; margin-top: -12px; border-radius: 50%;
/* Der Ring ist der Trick fuer den Tagmodus: --line-strong ist dort
rgba(0,0,0,.22) und zeichnet den weissen Daumen gegen die helle Kachel
ab, im Nachtmodus rgba(255,255,255,.20) - auf Weiss also unsichtbar, wo
er nicht gebraucht wird. Ein Token, zwei Themen. */
border: 1px solid var(--line-strong);
background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.22), 0 4px 10px rgba(0,0,0,.16);
}
.schieber input[type=range]::-moz-range-thumb {
box-sizing: border-box; width: 28px; height: 28px; border-radius: 50%;
border: 1px solid var(--line-strong);
background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.22), 0 4px 10px rgba(0,0,0,.16);
}
.schieber input[type=range]:focus-visible { outline: none; }
.schieber input[type=range]:focus-visible::-webkit-slider-thumb {
box-shadow: 0 0 0 3px var(--line-strong), 0 3px 8px rgba(0,0,0,.16);
}
/* Feste Mindestbreite und Ziffern gleicher Laufweite: sonst ruckelt der
Regler seitlich, sobald der Wert von 9 auf 10 springt. */
/* Knopf in einer Listenzeile - heute nur "Fahrt beenden" in der
Zuletzt-Kachel. 36 px sichtbar, 44 px Trefferhoehe ueber das
Pseudoelement, damit die Zeile nicht hoeher wird als ihre Nachbarin. */
.zeilenknopf {
position: relative; flex: 0 0 auto;
font-family: inherit; font-size: 13px; letter-spacing: .01em;
color: var(--fg); background: none; border: 1px solid var(--line-strong);
border-radius: var(--r-pill); padding: 8px 15px; min-height: 36px; cursor: pointer;
}
.zeilenknopf:hover { background: var(--shade); }
.zeilenknopf:active { opacity: .55; }
.zeilenknopf::before { content: ""; position: absolute; inset: -4px 0; }
/* Gruen wie der Sicherheits-Haken: es laeuft gerade etwas. */
.leaf .k small.laeuft { color: var(--ok); }
.leaf .v small.vorlaeufig { color: var(--fg3); }
.schieber output {
flex: 0 0 auto; min-width: 62px; text-align: right;
font-size: 13px; font-variant-numeric: tabular-nums; color: var(--fg2);
}
/* C3: gemischt geschrieben, 15 px, 48 px hoch. .primaer ist gefüllt,
.aktion allein bleibt die Umriss-Sekundäraktion. */
.aktion {