Kalender ueber EventKit, Orte nach dem Import, Fotos verkleinert, Signalsperre (2026.9.3.1-.3)

- Kalendertermine gehen nativ ueber EventKit statt ueber das Teilen-Blatt:
  Apples Kalender meldet sich beim System gar nicht als Teilen-Ziel an, ein
  anderes Dateiformat haette also nie geholfen (Abschnitt BS).
- Der Rueckblick stoesst jetzt selbst das Screening an, wenn er Fahrten
  angelegt hat - sonst blieb eine importierte Fahrt ohne Ort liegen, solange
  das Fahrzeug steht (Abschnitt BT).
- Fahrzeugfotos werden vor dem Upload im Browser auf 2000 px/WebP gebracht.
  Gemessen: 3.099.022 -> 325.994 Bytes. Damit ist die Nachrichtengrenze der
  WebSocket-Verbindung kein Thema mehr ("connection lost" auf der realen
  Instanz). Formate, die der Browser weder umwandeln noch anzeigen kann,
  werden mit klarer Meldung abgelehnt statt roh gespeichert.
- Zwei Wechsel des Fahrtsignals in derselben Sekunde kosteten eine ganze
  Fahrt: das "on" ueberholte den noch laufenden Beende-Vorgang und fiel durch
  beide Zweige. Neue asyncio-Sperre plus Regressionstest, der ohne sie
  nachweislich rot ist (Abschnitt BU).

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-03 01:59:32 +02:00
co-authored by Claude Opus 5
parent 8c95e50554
commit 6016053a92
18 changed files with 1072 additions and 78 deletions
@@ -41,6 +41,7 @@ import datetime
import logging
from typing import TYPE_CHECKING
from . import screening
from .batterie import SPANNUNG_MIN_V
from .fahrterkennung import leere_fahrt
from .tankerkennung import LITER_SCHWELLE, leerer_tankvorgang, schwelle_prozent
@@ -524,6 +525,23 @@ async def importieren(k: Koordinator, start: object, ende: object) -> None:
await k.tankvorgang_nachbereiten()
await k.batterieverlauf_veroeffentlichen()
# Der Rückblick trägt nur ein, was er aus dem Verlauf selbst ableiten kann.
# Ortsnamen, Verbrauchseichung und der Radzähler hängen dagegen am
# Screening - und das lief bis zum 03.09.2026 nur bei einem Wechsel des
# Kilometerstands, nach einem Neustart oder aus dem Nachfassen heraus.
# Steht das Fahrzeug, ist keines davon der Fall: eine frisch importierte
# Fahrt blieb ohne Ort liegen, obwohl beide Koordinaten dastanden und
# sogar im Zwischenspeicher schon aufgelöst waren (gemeldet vom
# Eigentümer). Dass es so gemeint war, sagt das Nachfassen selbst - sein
# Docstring nennt den Import als einen der zwei Fälle, für die es
# existiert; nur ausgelöst hat ihn nie jemand.
#
# Nur bei wirklich angelegten Fahrten: ein Import ohne Ergebnis (der
# Normalfall beim zweiten Lauf über denselben Zeitraum) soll keinen
# Durchlauf kosten.
if fahrten["angelegt"]:
await screening.durchfuehren(k)
ergebnis = {
"von": von.isoformat(),
"bis": bis.isoformat(),