Standort-Kachel: Live-Fahrzeugposition auf der Übersicht

Neue Kachel oberhalb von "Zuletzt" mit echter Leaflet-Mini-Karte,
öffnet per Klick eine Vollbild-Standortansicht (Kartendarstellung
wählen, auf Fahrzeug/User zentrieren, beide zeigen) mit einem
ausziehbaren myAudi-Stil-Menü: Distanz zum Gerät, Adresse (Reverse-
Geocoding via Nominatim), fährt/steht/Letzter-Parkplatz-Status,
Tankfüllstand/Reichweite, Route- und Teilen-Aktionen.

Backend: STANDORT_TRACKER-Einstellung (device_tracker-Entity) plus
_standort()-Veröffentlichung, bewusst leer gelassen bis eine echte
GPS-Quelle (FMM003/flespi) angebunden ist - Kachel zeigt bis dahin
"kein GPS-Signal". Verifiziert in audi_ha_test mit einer manuell
gesetzten Test-Position.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 11:07:49 +02:00
parent b98d624359
commit dc4c1ff0bf
6 changed files with 487 additions and 1 deletions
@@ -100,6 +100,14 @@ OELWECHSEL_STRECKE_SENSOR = "sensor.audi_rs_4_avant_oil_change_distance"
NAECHSTE_INSPEKTION_SENSOR = "sensor.audi_rs_4_avant_inspection_due"
INSPEKTION_STRECKE_SENSOR = "sensor.audi_rs_4_avant_inspection_distance"
# Live-GPS-Position des Fahrzeugs (Übersicht -> Standort-Kachel). Erwartet
# eine device_tracker.*-Entity mit "latitude"/"longitude"-Attributen (HA-
# Konvention, siehe _standort() in frontend_veroeffentlichung.py) - bleibt
# leer, solange keine Quelle angebunden ist (siehe AGENTS.md Abschnitt B,
# FMM003/flespi offen); die Oberfläche zeigt dann "kein GPS-Signal" statt
# eines falschen Werts, genau wie bei BATTERIE_SENSOR oben.
STANDORT_TRACKER = ""
# Update-Funktion (Einstellungen -> "Update suchen", siehe
# updateverwaltung.py): Git-Repository, in das dieses Projekt gepflegt wird -
# z. B. ein privates GitHub-Repo, genau wie für die HACS-Integration bereits
@@ -77,6 +77,40 @@ def _abs_zahl(wert):
return None if zahl is None else abs(zahl)
def _standort():
"""Live-GPS-Position des Fahrzeugs (Übersicht -> Standort-Kachel) - liest
latitude/longitude/gps_accuracy von der in STANDORT_TRACKER hinterlegten
device_tracker-Entity (HA-Konvention). Fehlt die Entity-ID oder ist sie
(noch) nicht verfügbar, liefert diese Funktion durchgehend None statt
eines geratenen Werts - genau das zustand_oder_none()-Muster von oben,
hier als eigene Funktion, weil zusätzlich zum Zustand noch Attribute und
der Aktualisierungszeitpunkt gebraucht werden: state.get() liefert dafür
ein StateVal (str-Unterklasse) mit .last_updated als datetime-Attribut -
kein eigenständiges state.last_updated(), das gibt es in pyscript nicht."""
entity_id = einstellungen.STANDORT_TRACKER
leer = {"lat": None, "lon": None, "genauigkeit_m": None, "zeit": None}
if not entity_id:
return leer
try:
wert = state.get(entity_id)
attribute = state.getattr(entity_id)
except NameError:
return leer
if not attribute or attribute.get("latitude") is None:
return leer
zeit = None
try:
zeit = wert.last_updated.isoformat()
except AttributeError:
pass
return {
"lat": _zu_zahl(attribute.get("latitude")),
"lon": _zu_zahl(attribute.get("longitude")),
"genauigkeit_m": _zu_zahl(attribute.get("gps_accuracy")),
"zeit": zeit,
}
POSITIONEN = ["vorne links", "vorne rechts", "hinten links", "hinten rechts"]
@@ -125,6 +159,8 @@ def fahrzeugstatus_veroeffentlichen():
else:
gesichert = all([e["ok"] for e in sicherheitscheck])
standort = _standort()
daten = {
"km": _zu_zahl(km),
"tankprozent": _zu_zahl(tankprozent),
@@ -132,6 +168,10 @@ def fahrzeugstatus_veroeffentlichen():
"batteriespannung": _zu_zahl(batteriespannung),
"gesichert": gesichert,
"sicherheitscheck": sicherheitscheck,
"standort_lat": standort["lat"],
"standort_lon": standort["lon"],
"standort_genauigkeit_m": standort["genauigkeit_m"],
"standort_zeit": standort["zeit"],
# Vom Fahrzeug selbst gemeldete Service-Fälligkeit (ergänzt die
# App-eigene Servicebuch-Berechnung, siehe fahrzeugMeldung() im
# Frontend) - die Streckensensoren liefern negative Restkilometer-