f8b877d555
PWA laeuft: Manifest, Symbole in allen noetigen Groessen und die iOS-Angaben, die Apple statt des Manifests auswertet. Das Startsymbol ist bewusst neutral - die Vier Ringe auf einem Homescreen waeren nach aussen sichtbar und fielen nicht mehr unter die private Nutzung. Vorbereitet, aber nicht ausgefuehrt: Capacitor-Konfiguration, ein Ablage-Adapter fuer Schluesselbund und Keystore (greift defensiv auf die Laufzeit zu, damit die App ohne das Plugin unveraendert weiterlaeuft), die Pfad-Freigabeliste fuer den Reverse Proxy und das Geruest der FMM003-Zuordnungstabelle. Die QR-Seite fuer die Einrichtung war zunaechst ein Fehlgriff: Ich hatte den QR-Erzeuger selbst geschrieben. Der Vergleich gegen eine erprobte Implementierung zeigte 1239 abweichende Module von 3249 - der Code waere unlesbar gewesen. Jetzt liegt eine bewaehrte Bibliothek (MIT, 57 KB) neben der Seite im eigenen Home Assistant. Das erfuellt die eigentliche Anforderung genauso: kein Netzzugriff, der Token verlaesst das eigene Netz nicht. Geprueft ueber einen Umlauf - 233 Zeichen hinein, identisch wieder heraus.
137 lines
5.3 KiB
Markdown
137 lines
5.3 KiB
Markdown
# FMM003 → Home Assistant: Zuordnungstabelle
|
|
|
|
**Gerüst, noch nicht ausgefüllt.** Gehört zu Phase 13 des
|
|
`../UMSETZUNGSPLAN.md`; die Architektur dahinter steht in
|
|
`../COMPANION_APP_ARCHITECTURE.md` §2b.
|
|
|
|
> **Grundregel: nicht raten.** Wie die CAN/FMS-Werte im Codec JSON heißen, ist
|
|
> unbekannt und je nach Firmware verschieden. Die Tabelle unten wird aus einer
|
|
> **echten mitgeschnittenen Nachricht** gefüllt, nicht aus der Dokumentation
|
|
> abgeleitet. Bis dahin bleiben die Felder leer.
|
|
|
|
## Datenweg
|
|
|
|
```
|
|
FMM003 (CAN/FMS) ──MQTT über TLS──▶ Mosquitto-Add-on ──▶ MQTT-Integration ──▶ Entitäten
|
|
```
|
|
|
|
Traccar entfällt: Das Gerät liefert bereits JSON, es gibt nichts zu dekodieren.
|
|
|
|
## Schritt 1 — Gerät einstellen
|
|
|
|
Im Teltonika Configurator:
|
|
|
|
| Ort | Einstellung |
|
|
|---|---|
|
|
| System → System Settings → Data Protocol | **Codec JSON** |
|
|
| GPRS → Server Settings | Broker-IP und Port **8883** |
|
|
| GPRS → Server Settings | Benutzername und Passwort des Brokers |
|
|
| Security | Wurzelzertifikat, Gerätezertifikat, privater Schlüssel |
|
|
|
|
**Firmware-Version hier eintragen:** `________________`
|
|
|
|
Codec JSON ist nicht in jeder Firmware enthalten (bei mehreren Modellen erst ab
|
|
03.28.00). Ohne hochgeladene Zertifikate verweigert das Gerät die
|
|
MQTT-Verbindung — das ist kein Fehler, sondern Absicht.
|
|
|
|
## Schritt 2 — Nachricht mitschneiden
|
|
|
|
```bash
|
|
mosquitto_sub -h <broker> -p 8883 --cafile ca.crt \
|
|
-u <benutzer> -P <passwort> -t '#' -v | tee mitschnitt.txt
|
|
```
|
|
|
|
Dabei nacheinander: Zündung an, kurz fahren, anhalten, Zündung aus. Danach den
|
|
Mitschnitt sichten und die Tabelle unten füllen.
|
|
|
|
**Nicht ins Repository legen** — der Mitschnitt enthält echte Positionsdaten.
|
|
|
|
## Schritt 3 — Zuordnungstabelle
|
|
|
|
Aus dem Mitschnitt zu füllen. Die Spalte „Entität" nennt den Namen, unter dem
|
|
das Backend den Wert erwartet.
|
|
|
|
| JSON-Feld | Bedeutung | Einheit | Entität in HA | Gefunden am |
|
|
|---|---|---|---|---|
|
|
| | Zündung an/aus | 0/1 | `binary_sensor.audi_zuendung` | |
|
|
| | Geschwindigkeit | km/h | `sensor.audi_geschwindigkeit` | |
|
|
| | Position Breite | Grad | `device_tracker.audi_position` | |
|
|
| | Position Länge | Grad | `device_tracker.audi_position` | |
|
|
| | Kilometerstand | km | `sensor.audi_kilometerstand` | |
|
|
| | Tankfüllstand | % | `sensor.audi_tankfuellstand` | |
|
|
| | Drehzahl | min⁻¹ | `sensor.audi_drehzahl` | |
|
|
| | Kühlmitteltemperatur | °C | `sensor.audi_kuehlmittel` | |
|
|
| | Bordspannung | V | `sensor.audi_bordspannung` | |
|
|
| | Zeitstempel | ISO/Epoch | — (Attribut) | |
|
|
|
|
Teltonika nennt CAN-Werte oft nur über eine AVL-Kennung (etwa `"12"` für
|
|
Kraftstoffstand). Deshalb hier immer **beides** notieren: die Kennung aus der
|
|
Nachricht und ihre Bedeutung aus der AVL-Liste des Geräts.
|
|
|
|
## Schritt 4 — MQTT-Integration
|
|
|
|
Aus der ausgefüllten Tabelle entstehen die Entitäten. Gerüst für
|
|
`configuration.yaml`, die Feldnamen in den Vorlagen sind erst danach einsetzbar:
|
|
|
|
```yaml
|
|
mqtt:
|
|
binary_sensor:
|
|
- name: "Audi Zündung"
|
|
state_topic: "teltonika/<imei>/data"
|
|
value_template: "{{ 'ON' if value_json.<FELD> | int == 1 else 'OFF' }}"
|
|
device_class: power
|
|
|
|
sensor:
|
|
- name: "Audi Geschwindigkeit"
|
|
state_topic: "teltonika/<imei>/data"
|
|
value_template: "{{ value_json.<FELD> }}"
|
|
unit_of_measurement: "km/h"
|
|
state_class: measurement
|
|
|
|
device_tracker:
|
|
- name: "Audi Position"
|
|
state_topic: "teltonika/<imei>/data"
|
|
json_attributes_topic: "teltonika/<imei>/data"
|
|
# latitude/longitude erwartet HA als Attribute
|
|
```
|
|
|
|
## Schritt 5 — Fahrterkennung umstellen
|
|
|
|
Neues `pyscript/fahrterkennung_fmm003.py` nach dem Muster von
|
|
`pyscript/fahrterkennung.py`, mit zwei Unterschieden:
|
|
|
|
1. Der Auslöser ist die **Zündungs-Entität**, nicht der WLAN-Sensor.
|
|
2. Der Startzeitpunkt darf nicht mehr nur im Arbeitsspeicher liegen — beim
|
|
FMM003 gibt es keinen Grund mehr für diese Einschränkung, weil der Zustand
|
|
jederzeit vom Gerät neu gelesen werden kann.
|
|
|
|
**Unverändert übernehmen:** die Pausentoleranz (`fahrten_pausenzeit_min` aus dem
|
|
Profil, Standard 15 Minuten) über `task.unique()` und `task.sleep()`. Das ist
|
|
eine bewusste Produktentscheidung, dreimal durchdacht: Springt der Motor
|
|
innerhalb der Toleranz wieder an, ist es **eine** Fahrt, nicht zwei. Die Zündung
|
|
fällt bei Start-Stopp nicht ab, ein zusätzlicher Filter dafür ist also
|
|
unnötig.
|
|
|
|
Vorgehen: erst parallel laufen lassen und in eine Testdatei schreiben, mit der
|
|
bisherigen Erkennung vergleichen, dann scharf schalten. Danach
|
|
`WLAN_SENSOR` aus `pyscript/modules/einstellungen.py` entfernen.
|
|
|
|
## Schritt 6 — Live-Ansicht einschalten
|
|
|
|
In `companion-app/src/funktionen.ts` den Schalter `LIVE_VERFUEGBAR` auf `true`
|
|
setzen und in `companion-app/src/screens/LiveFahrt.tsx` die Feldnamen in
|
|
`liveZustandLesen()` an die tatsächlichen Entitäten anpassen.
|
|
|
|
Damit werden auch die Fahrtdetails erstmals echte Routen zeigen, statt nur
|
|
Start- und Zielpunkt.
|
|
|
|
## Noch zu entscheiden
|
|
|
|
- **Erreichbarkeit des Brokers für das Fahrzeug:** Portfreigabe 8883 direkt auf
|
|
Mosquitto gegen VPS-Broker mit Mosquitto-Bridge über Tailscale. Ersteres ist
|
|
einfacher, aber eine echte Freigabe; letzteres öffnet zuhause nichts, kostet
|
|
aber einen zusätzlichen Server.
|
|
- **Datenvolumen:** Codec JSON braucht deutlich mehr Bytes als das binäre
|
|
Codec8E. Bei einem privat genutzten Fahrzeug vernachlässigbar, bei knappem
|
|
Mobilfunktarif im Blick behalten.
|