Setup-Menü für Sensor-Zuordnung + Umstellung von WLAN/VAG-Integration auf FMM003

Setup-Menü (Einstellungen -> Fahrzeug einrichten -> Setup): ordnet alle von
der App genutzten Sensor-Rollen echten HA-Entitäten zu, statt sie in
einstellungen.py von Hand einzutragen - durchsuchbares Dropdown je Feld,
Vorauswahl aus vorhandenen Entitäten, Schalter für "nur passende Sensoren".
Neues Modul entitaeten.py (Katalog + JSON-Override, zur Laufzeit über
setattr() auf einstellungen angewendet, kein Neustart nötig außer für die
drei trigger-gebundenen Felder).

Zusätzlich: Fahrzeug-WLAN-Erkennung und alle Entity-IDs der nicht mehr
genutzten TommiG1/HA_VAG-EU-Data-Act-Integration entfernt. Fahrterkennung
läuft jetzt über den Zündungs-/ACC-Status des neu angebundenen Teltonika
FMM003 (ersetzt die WLAN-Verbindungserkennung); Standort und 12V-
Batteriespannung kommen ebenfalls vom FMM003. Kilometerstand, Tankfüllstand,
Reichweite, Türen/Fenster/Schlösser sowie Ölwechsel-/Inspektionsdaten haben
dadurch vorerst keine Quelle mehr und zeigen "unbekannt" - die Funktionen
selbst bleiben erhalten und lassen sich über das neue Setup-Menü jederzeit
neu zuordnen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 15:55:59 +02:00
parent 7e979ecfab
commit 9794193803
13 changed files with 848 additions and 197 deletions
+62 -83
View File
@@ -7,106 +7,85 @@ des Fahrzeugprofils (data/fahrzeugprofil.json) und über die Oberfläche
Fahrzeugstatus-Abfrage brauchen sie als festen Wert, bevor überhaupt ein
Profil gelesen werden kann.
In Home Assistant unter Entwicklerwerkzeuge -> Zustände nachschlagen.
In Home Assistant unter Entwicklerwerkzeuge -> Zustände nachschlagen. Werte
lassen sich außerdem über das Setup-Menü in der Oberfläche zuordnen (siehe
entitaeten.py) - Änderungen von dort werden zur Laufzeit auf diese Variablen
angewendet (überschreiben also die hier hinterlegten Standardwerte), ohne
diese Datei anzufassen.
Die drei ersten (WLAN, Kilometerstand, Tankfüllstand) werden vom Backend
zwingend gebraucht (§7.1, §7.2, §7.4, §7.5). Alles danach speist nur die
Übersicht im Frontend (§5.1, §5.2, §9) — bleibt ein Wert leer ("") oder passt
eine Entity-ID nicht zur tatsächlichen Integration, liefert
zustand_oder_none() in frontend_veroeffentlichung.py für das jeweilige Feld
None statt abzustürzen; die Oberfläche zeigt dann „unbekannt" statt eines
falschen Werts.
Alle Entity-IDs unten sind an der echten Integration TommiG1/HA_VAG-EU-Data-Act
(Version 0.6.35, per HACS installiert) real geprüft, nicht nur vermutet: das
Gerät heißt dort "Audi RS 4 Avant" (mit Leerzeichen vor der "4") - deshalb
"rs_4" mit Unterstrich im Slug, nicht "rs4". Eine ältere Integrationsversion
hatte hier noch deutsche Feldnamen (z. B. "..._tur_vorne_links"); die aktuelle
Version benennt englisch (z. B. "..._front_left_door").
2026-08-12: Die HACS-Integration TommiG1/HA_VAG-EU-Data-Act (bisherige
Quelle für Kilometerstand, Tankfüllstand, Türen/Fenster/Schlösser,
Ölwechsel-/Inspektionsdaten) wird nicht mehr verwendet - die zugehörigen
Entity-IDs sind deshalb unten bewusst leer. Neue Datenquelle ist der
Teltonika FMM003 (GPS-Tracker mit CAN-Anbindung, siehe AGENTS.md Abschnitt
B); er liefert Standort, Zündungsstatus und Batteriespannung, aber keinen
Tankfüllstand, keine Tür-/Fenster-/Schlossdaten und keine Ölwechsel-/
Inspektionstermine - die entsprechenden Kacheln zeigen deshalb bis auf
Weiteres "unbekannt" statt eines falschen Werts (siehe zustand_oder_none()
in frontend_veroeffentlichung.py). Bleibt ein Wert leer ("") oder passt eine
Entity-ID nicht zur tatsächlichen Integration, liefert zustand_oder_none()
für das jeweilige Feld None statt abzustürzen.
"""
# Companion-App-Sensor für das aktuell verbundene WLAN (iOS-App:
# Einstellungen -> Companion App -> Sensoren -> "Verbundenes WLAN")
WLAN_SENSOR = "sensor.iphone_wifi_connection"
# Fahrterkennung (§7.1): Start/Ende einer Fahrt wird über den Zündungs-/ACC-
# Status des FMM003 erkannt (on = Fahrt läuft), nicht mehr über die WLAN-
# Verbindung des iPhones zum Fahrzeug (siehe fahrterkennung.py).
ZUENDUNG_SENSOR = "binary_sensor.testzone_fmm003_engine_ignition_or_acc_status"
# Kilometerstand aus der HACS-Integration TommiG1/HA_VAG-EU-Data-Act
KM_SENSOR = "sensor.audi_rs_4_avant_mileage"
# Kilometerstand - bisher aus der TommiG1-Integration, aktuell keine Quelle
# vorhanden. Der FMM003 liefert unter sensor.testzone_fmm003_total_calculated_mileage
# einen selbst berechneten Wert, der aber auf einer anderen Zählbasis beruht
# als der echte Fahrzeug-Kilometerstand (GPS-Streckenberechnung statt
# Tacho) - bewusst NICHT automatisch übernommen, um Reifenzähler,
# Ölwechsel-Prognose und Fahrtabschluss-Screening nicht mit einem
# inkonsistenten Basiswert zu verfälschen. Bei Bedarf über das Setup-Menü
# gezielt zuordnen.
KM_SENSOR = ""
# Tankfüllstand aus derselben Integration (Prozent)
TANK_SENSOR = "sensor.audi_rs_4_avant_fuel_level"
# Tankfüllstand (Prozent) - keine Quelle mehr vorhanden (der FMM003 ist kein
# Tankgeber).
TANK_SENSOR = ""
# Reichweite (§5.1 Übersicht)
RANGE_SENSOR = "sensor.audi_rs_4_avant_range_primary"
# Reichweite (§5.1 Übersicht) - keine Quelle mehr vorhanden.
RANGE_SENSOR = ""
# 12V-Batteriespannung (Mein Audi -> Zustand). Die aktuell genutzte
# HACS-Integration (TommiG1/HA_VAG-EU-Data-Act 0.6.35) liefert dafür KEINEN
# Sensor (real geprüft: kein "battery"/"voltage"-Entity unter diesem Gerät) -
# deshalb hier bewusst leer gelassen. Liefert später eine andere Quelle (z. B.
# ein OBD-Adapter) eine Spannung, einfach die Entity-ID eintragen; bis dahin
# zeigt die Oberfläche "unbekannt" statt eines falschen Werts (siehe
# zustand_oder_none() in frontend_veroeffentlichung.py).
BATTERIE_SENSOR = ""
# 12V-Batteriespannung (Mein Audi -> Zustand). Vom FMM003 geliefert -
# external_power_voltage ist die vom Gerät gemessene Bordnetzspannung des
# Fahrzeugs, NICHT battery_voltage (das ist die interne Pufferbatterie des
# Trackers selbst und hat mit der Fahrzeugbatterie nichts zu tun).
BATTERIE_SENSOR = "sensor.testzone_fmm003_external_power_voltage"
# Der von der Integration selbst bereitgestellte Knopf für eine sofortige
# Neuabfrage beim Fahrzeug (Entity-Domäne "button", real geprüft) - genau der
# Weg, den "Ziehen zum Aktualisieren" im Frontend auslöst (siehe
# audi_dashboard_jetzt_aktualisieren() in frontend_api.py), statt eines
# generischen homeassistant.update_entity auf einzelne Sensoren.
REFRESH_BUTTON = "button.audi_rs_4_avant_refresh_now"
# Knopf für eine sofortige Neuabfrage beim Fahrzeug - kam aus der
# TommiG1-Integration, keine Entsprechung beim FMM003 vorhanden.
REFRESH_BUTTON = ""
# Türen (§4.1) - die Integration liefert vier Einzelsensoren statt eines
# Summensensors. binary_sensor, device_class "door": "off" = zu (real
# geprüft).
TUER_SENSOREN = [
"binary_sensor.audi_rs_4_avant_front_left_door",
"binary_sensor.audi_rs_4_avant_front_right_door",
"binary_sensor.audi_rs_4_avant_rear_left_door",
"binary_sensor.audi_rs_4_avant_rear_right_door",
]
# Türen (§4.1) - keine Quelle mehr vorhanden.
TUER_SENSOREN = []
# Fenster (§4.1) - device_class "window": "off" = zu (real geprüft)
FENSTER_SENSOREN = [
"binary_sensor.audi_rs_4_avant_front_left_window",
"binary_sensor.audi_rs_4_avant_front_right_window",
"binary_sensor.audi_rs_4_avant_rear_left_window",
"binary_sensor.audi_rs_4_avant_rear_right_window",
]
# Fenster (§4.1) - keine Quelle mehr vorhanden.
FENSTER_SENSOREN = []
# Verriegelung - kein lock.*-Entity vorhanden, sondern vier
# Türschloss-Einzelsensoren. binary_sensor mit device_class "lock" (real
# geprüft): "on" = entriegelt, "off" = verriegelt (Home-Assistant-Konvention
# für diese device_class).
TUERSCHLOSS_SENSOREN = [
"binary_sensor.audi_rs_4_avant_front_left_door_lock",
"binary_sensor.audi_rs_4_avant_front_right_door_lock",
"binary_sensor.audi_rs_4_avant_rear_left_door_lock",
"binary_sensor.audi_rs_4_avant_rear_right_door_lock",
]
# Verriegelung - keine Quelle mehr vorhanden.
TUERSCHLOSS_SENSOREN = []
# Heckklappe und Motorhaube - von der Integration separat von den vier Türen
# geführt, für "Sicher abgestellt" (§9) aber ebenso relevant wie diese
HECKKLAPPE_SENSOR = "binary_sensor.audi_rs_4_avant_tailgate"
HECKKLAPPENSCHLOSS_SENSOR = "binary_sensor.audi_rs_4_avant_tailgate_lock"
HAUBE_SENSOR = "binary_sensor.audi_rs_4_avant_hood"
HAUBENSCHLOSS_SENSOR = "binary_sensor.audi_rs_4_avant_hood_lock"
# Heckklappe und Motorhaube - keine Quelle mehr vorhanden.
HECKKLAPPE_SENSOR = ""
HECKKLAPPENSCHLOSS_SENSOR = ""
HAUBE_SENSOR = ""
HAUBENSCHLOSS_SENSOR = ""
# Vom Fahrzeug selbst gemeldete Service-Fälligkeit (ergänzt die App-eigene,
# aus dem Servicebuch berechnete Prognose - siehe fahrzeugMeldung() im
# Frontend). Je ein Datum (ISO mit Zeitzone) und eine Streckenangabe in km;
# die Streckensensoren liefern negative Werte (Restkilometer als Countdown),
# im Frontend wird davon nur der Betrag angezeigt.
NAECHSTER_OELWECHSEL_SENSOR = "sensor.audi_rs_4_avant_oil_change_due"
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"
# aus dem Servicebuch berechnete Prognose) - keine Quelle mehr vorhanden.
NAECHSTER_OELWECHSEL_SENSOR = ""
OELWECHSEL_STRECKE_SENSOR = ""
NAECHSTE_INSPEKTION_SENSOR = ""
INSPEKTION_STRECKE_SENSOR = ""
# 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 = ""
# Konvention, siehe _standort() in frontend_veroeffentlichung.py) - jetzt
# vom FMM003 geliefert.
STANDORT_TRACKER = "device_tracker.testzone_fmm003"
# Update-Funktion (Einstellungen -> "Update suchen", siehe
# updateverwaltung.py): Git-Repository, in das dieses Projekt gepflegt wird -