GNSS-Rollen vorbereitet, "Geparkt seit" von der Zuendung (2026.9.1.5/.6)

GNSS-STRECKENROLLEN, NOCH OHNE VERBRAUCHER

11806 steht seit dem 01.09. auf GNSS. Zwei neue Sensorrollen angelegt, damit
nach der ersten echten Fahrt nur noch gemessen und nicht mehr zugeordnet
werden muss: GNSS_KM_SENSOR (total_calculated_mileage, der robustere fuer eine
Fahrtstrecke - ein verlorener Datensatz verfaelscht die Differenz nicht) und
GNSS_TEILSTRECKE_SENSOR (segment_mileage, zeigt WO Strecke fehlt, taugt als
Gegenprobe). Kein Code liest sie; die Zuordnung aendert nichts.

KM_SENSOR bleibt der Anker - er ist der Tacho des Fahrzeugs und driftet nicht.
Der alte Warnhinweis dort zeigt jetzt auf die neue Rolle statt ins Leere.

"GEPARKT SEIT" KOMMT VON DER ZUENDUNG

Die Anzeige rechnete "jetzt minus ts_end der juengsten Fahrt". Das ist keine
Aussage ueber das Parken, sondern ueber die Fahrterkennung: am 01.09. stand
dort "Geparkt seit 2 Tg. 16 Std.", waehrend am Vorabend 7 km gefahren wurden -
die Fahrt fehlte im Bestand, weil trip_status festhing.

Der Koordinator merkt sich jetzt den Zeitpunkt, zu dem die Zuendung zuletzt
ausging, in der Zeit des Geraets. Er liegt im Laufzeit-Store neben
fahrt_start_ts und ueberlebt einen Neustart. Kein Rueckfall auf die
Fahrtenliste: null heisst unbekannt und wird auch so angezeigt - ausdrueckliche
Ansage des Eigentuemers, eine falsche Zahl ist schlechter als keine.

Beim Ausliefern fiel derselbe Neustart-Fehler auf wie bei der Phantomfahrt:
der Zuhoerer las die Registrierung der Entitaet als Wechsel und stempelte den
Parkbeginn bei jedem Neustart neu. if alt is None: return behebt es. Merkposten
fuer dieses Projekt: jeder neue Zustandszuhoerer braucht diese Pruefung.

VERIFIZIERT in audi_ha_test: Neustart laesst 09:34:15 unveraendert; Zuendung an
-> null; Zuendung aus mit Geraetezeit von vor 40 Minuten -> 09:04:57 statt
jetzt. Companion-App gleichgezogen, tsc --noEmit sauber, 165/165 Tests gruen.

NOTIERT, NICHT GEBAUT: der GNSS-Zaehler driftet im Stand. Die 0,034 km waren
GPS-Rauschen, nicht Aufloesung - der Dongle lag unbewegt. Die GNSS-Zuwaechse
brauchen deshalb ein Bewegungstor, bevor sie summiert werden duerfen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-01 11:52:05 +02:00
parent cef11b26f3
commit 553e128066
9 changed files with 227 additions and 18 deletions
+84 -1
View File
@@ -1,6 +1,8 @@
# AGENTS.md — Project state, review findings, open items, and working rules
**Last updated: 2026-09-01** (Fahrtende ohne den 900-s-Nachlauf des Geräts, Manifest `2026.9.1.4`,
**Last updated: 2026-09-01** („Geparkt seit" kommt von der Zündung, Manifest `2026.9.1.6`,
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`,
siehe Abschnitt AZ. Davor am selben Tag: Fahrtbeginn und -ende kommen vom Gerät (`MELDEZEIT_SENSOR`),
Manifest `2026.9.1.3`, siehe Abschnitt AY: dazu die Trennung von
Trip- und Zündungsrolle und die Gerätezeit für Tankvorgänge. Davor am selben Tag: Phantomfahrten beim Neustart abgestellt, Tankstand auf `wert_bei()`
@@ -6567,6 +6569,87 @@ Verifiziert in `audi_ha_test`:
Testfahrt anschließend über `fahrt_loeschen` entfernt; Bestand unverändert 11 Fahrten.
## BA. Zwei Rollen für die GNSS-Strecke, vorbereitet ohne Verbraucher (2026.9.1.5)
`11806` steht seit dem 01.09.2026 auf **GNSS**, und der Zähler liefert sofort, was er soll:
`total_calculated_mileage = 0.034` kurz nach dem Zurücksetzen — **Meterauflösung**, gegenüber
147 Schritten von exakt 1,0 km beim CAN-Wert über die gesamte Aufzeichnung.
Zwei neue Sensorrollen, **beide noch ohne Verbraucher**:
- `GNSS_KM_SENSOR``total_calculated_mileage`. Der robustere der beiden für eine
Fahrtstrecke: ein verlorener Datensatz verfälscht die Differenz nicht, der Zähler läuft weiter.
- `GNSS_TEILSTRECKE_SENSOR``segment_mileage` (Strecke seit dem letzten Datensatz,
`11802 = Between records`). Taugt für eine Summe nur, wenn kein Satz fehlt — zeigt dafür, **wo**
Strecke verloren ging, und ist damit die bessere Gegenprobe.
**Warum leer und ohne Wirkung:** die Rechnung soll gegen echte GNSS-Daten entstehen, nicht gegen
erfundene Reihen. Die Rollen sind angelegt und im Testcontainer bereits zugeordnet, damit nach der
ersten echten Fahrt sofort gemessen werden kann. Solange kein Code sie liest, ändert die Zuordnung
nichts.
**Die Absicht dahinter, damit sie nicht verlorengeht:** `KM_SENSOR` bleibt der Anker — er ist der
Tacho des Fahrzeugs und driftet nicht. Der GNSS-Zähler liefert die Nachkommastelle dazwischen und
verliert Strecke, wo kein Empfang ist. Beides zusammen ergibt eine Strecke auf 100 m genau, die
trotzdem am Fahrzeugwert hängt. Der alte Warnhinweis bei `KM_SENSOR` („niemals
`total_calculated_mileage` zuordnen") gilt unverändert — er zeigt jetzt auf die neue Rolle.
**Vor dem Zuordnen prüfen:** steht `11802` auf `Continuous` statt `Between records`, zählt
`segment_mileage` die laufende Fahrt statt der Teilstrecke und die zweite Rolle ist unbrauchbar.
Geprüft: 27 FELDER-Einträge, 27 Dataclass-Felder, keine Abweichung in beide Richtungen; Zuordnung
über den echten Dienst geschrieben, alle 27 Einträge stehen.
## BB. „Geparkt seit" kommt von der Zündung, nicht aus der Fahrtenliste (2026.9.1.6)
Die Anzeige rechnete `jetzt ts_end` der jüngsten Fahrt. Das ist keine Aussage über das Parken,
sondern über die **Fahrterkennung** — und die kann daneben liegen: am 01.09.2026 stand dort
„Geparkt seit 2 Tg. 16 Std.", während am Vorabend nachweislich 7 km gefahren wurden. Die Fahrt
fehlte im Bestand, weil `trip_status` seit 18:39 festhing.
Neu: der Koordinator merkt sich den Zeitpunkt, zu dem die Zündung zuletzt auf „aus" ging — **in
der Zeit des Geräts** (`verlauf.geraetezeit()`), nicht in der Ankunftszeit. Er liegt im
Laufzeit-Store neben `fahrt_start_ts` und überlebt einen Neustart; `veroeffentlichung` gibt ihn
als `geparkt_seit` heraus.
**Kein Rückfall auf die Fahrtenliste.** Ist der Wert `null`, zeigen beide Oberflächen „Fahrzeug
steht, Parkdauer unbekannt". Ausdrückliche Ansage des Eigentümers: eine falsche Zahl ist schlechter
als keine.
### Derselbe Neustart-Fehler, zum zweiten Mal
Beim Ausliefern fiel im Protokoll auf: `Zündung aus - geparkt seit …` **bei jedem Neustart**. Der
Zuhörer las die Registrierung der Entität als Wechsel — exakt die Phantomfahrt aus Abschnitt AX, nur
an anderer Stelle. `if alt is None: return` behebt es; der gespeicherte Wert überlebt den Neustart
ohnehin. **Merkposten:** jeder neue Zustandszuhörer in diesem Projekt braucht diese Prüfung.
Live nachgewiesen: Neustart lässt `09:34:15` unverändert · Zündung an → `null` · Zündung aus mit
einer Gerätezeit von vor 40 Minuten → `09:04:57` statt `jetzt`.
Companion-App gleichgezogen (Paritätsregel): `profilAdapter` um `geparktSeit` erweitert,
`standortZustand()` braucht die Fahrtenliste nicht mehr. `tsc --noEmit` sauber, 165/165 Tests grün.
### Genauigkeit hängt am Operanden des Geräts
Der Zeitpunkt ist nur so genau, wie das Gerät ihn meldet. Stand der Operand des
Zündungselements auf **Monitoring** (3), erzeugte ein Wechsel keinen eigenen Datensatz und der
Zeitstempel wäre der des nächsten — beim Abstellen also bis zu 900 s zu spät. Der Eigentümer hat
Ignition und Movement am 01.09.2026 auf **On Change** gestellt; damit ist der Zeitpunkt exakt.
Priorität bleibt Low, es kostet also keine zusätzliche Funkverbindung, nur einen Datensatz mehr in
der Warteschlange.
### Wichtig für die noch offene Streckenrechnung: der GNSS-Zähler driftet im Stand
Die 0,034 km, die `total_calculated_mileage` kurz nach dem Zurücksetzen zeigte, waren **kein
Beleg für Auflösung, sondern GPS-Drift** — der Dongle lag unbewegt auf dem Schreibtisch (Angabe des
Eigentümers, 01.09.2026). Static Navigation ist eingeschaltet (`106 = 1`, Quelle `112 = Movement`)
und friert die Position ein, offenbar aber nicht den Kilometerzähler.
**Folge für Abschnitt BA:** die GNSS-Zuwächse dürfen nicht ungefiltert summiert werden. Sie brauchen
ein Tor — nur zählen, wenn Bewegung gemeldet ist. Dass `Movement` jetzt auf On Change steht, macht
genau dieses Tor erst möglich. Vor der ersten echten Fahrt ist die Größenordnung der Drift unbekannt;
sie ist als Erstes zu messen.
## Working conventions (observed — keep them)
- German is the project language: identifiers, comments, commits, UI texts. Exceptions: