diff --git a/AGENTS.md b/AGENTS.md index 45448a4..4d003c1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -198,10 +198,16 @@ capacitor/iframe/browser (`umgebung.ts`), types + entity table (`types.ts`), fac against the existing HA API - [ ] Define the reverse-proxy path allowlist (depends on final entity/service names) - [ ] Install/wire the FMM003; record firmware version (Codec JSON is firmware-dependent) -- [ ] Generate TLS certificates for Mosquitto + device (small private CA); FMM003 refuses MQTT - without them -- [ ] Decide broker reachability for the vehicle: port-forward 8883 vs. VPS broker with - Mosquitto bridge over Tailscale +- [x] Generate TLS certificates for Mosquitto + device (small private CA) — done 2026-08-11, 10-year + validity; Mosquitto configured (`certfile`/`keyfile`/`cafile`/`require_certificate: true`). + Remaining: upload root/client cert/key to the FMM003 Security tab — filenames must end in + `.pem`/`.pem.crt`/`.pem.key` (Configurator rejects plain `.crt`/`.key`, content-agnostic check) +- [x] Decide broker reachability for the vehicle — port-forward 8883 (not VPS bridge), decided + 2026-08-11; DuckDNS hostname `datametric360.duckdns.org` set up, Dual-Stack confirmed on the + router (no DS-Lite blocker). Remaining: the port-forward itself on the Speedport Smart 4 Plus +- [ ] MQTT Client Type on the FMM003: "Custom server" (value 3, seen in Configurator help text) was + not selectable in practice — use **"AWS IoT Custom"** pointed at the own broker instead + (confirmed working by two independent community reports); verify once the device is live - [ ] Capture the first real Codec JSON message (`mosquitto_sub`/MQTT Explorer) and build the field mapping from it — **do not guess beforehand** (explicit decision) - [ ] Move trip detection to FMM003 ignition (reuse the `fahrterkennung.py` pattern, keep pause diff --git a/COMPANION_APP_ARCHITECTURE.md b/COMPANION_APP_ARCHITECTURE.md index b210833..e30dd70 100644 --- a/COMPANION_APP_ARCHITECTURE.md +++ b/COMPANION_APP_ARCHITECTURE.md @@ -165,6 +165,11 @@ Entschlüsseln des binären Codec8-Protokolls. Das Gerät liefert die Daten dann Exakte eigene Werte erst bei der Inbetriebnahme festlegen. - **TLS ist Pflicht, nicht optional:** ohne hochgeladene Zertifikate arbeitet MQTT nicht. Zertifikat, privater Schlüssel und Wurzelzertifikat werden im Configurator unter *Security* hinterlegt. + - **Dateinamen-Endung ist strikt geprüft (2026-08-11, live am Configurator beobachtet):** hochgeladene + Dateien müssen auf `.pem`, `.pem.crt` oder `.pem.key` enden, sonst Fehler „File format is not valid + or not supported". Reiner Inhalt (PEM-Format) reicht nicht, die Endung muss stimmen. Schema folgt + offenbar der AWS-IoT-Download-Konvention: Root-Zertifikat `*.pem`, Geräte-Zertifikat `*.pem.crt`, + privater Schlüssel `*.pem.key`. Eigene CA-Dateien entsprechend umbenennen, nicht nur `.crt`/`.key`. - **Firmware-Abhängigkeit:** Codec JSON ist nicht in jeder Firmware enthalten (bei mehreren Modellen erst ab 03.28.00 dokumentiert). Der Besitzer bestätigt, dass es auf diesem Gerät verfügbar ist — vor der Inbetriebnahme trotzdem die Firmware-Version notieren. @@ -341,10 +346,23 @@ else in this document: Privatfahrzeug. Betrifft nur den Weg Fahrzeug→Zuhause und ist unabhängig von der Anbindung der App (§4, dort bleibt es bei Cloudflare Tunnel — kein Widerspruch, siehe dort die Begründung, warum ein eng begrenzter, zertifikatsgesicherter Port etwas anderes ist als HA selbst offenzulegen). - **Noch zu erledigen:** stabile öffentliche Adresse fürs Zuhause (feste IP oder DynDNS-Hostname) - und die Portfreigabe am Router selbst — beides erst bei der Inbetriebnahme. -2b. **TLS-Zertifikate für Mosquitto und das Gerät** — bei der Inbetriebnahme zu erzeugen; ohne sie - verweigert der FMM003 die MQTT-Verbindung. + **Umsetzungsstand (2026-08-11):** DuckDNS-Hostname `datametric360.duckdns.org` angelegt und als + Add-on in HA eingerichtet (inkl. eigenständigem Let's-Encrypt-Zertifikat für die HA-Oberfläche + selbst — unabhängig von den MQTT-Zertifikaten unten, siehe dortige Anmerkung). Router bestätigt + **Dual-Stack** (kein DS-Lite) — die Portfreigabe funktioniert damit grundsätzlich. **Noch offen:** + die Portfreigabe selbst am Speedport Smart 4 Plus. + + Nebenbei geklärt: ein Vorschlag, stattdessen komplett auf Cloudflare zu setzen, wurde geprüft und + **ist keine Alternative** — Cloudflare Tunnel kann kein rohes MQTT/TCP transportieren (nur HTTP), + der FMM003 kennt außerdem kein Tunnel-Konzept, nur IP/Domain+Port. Bleibt bei der klaren Trennung: + Cloudflare Tunnel für die App (§4), Portfreigabe+DuckDNS nur für die Fahrzeug-MQTT-Verbindung. +2b. **TLS-Zertifikate für Mosquitto und das Gerät** — ✅ **ERLEDIGT (2026-08-11):** eigene private CA + (10 Jahre gültig) erzeugt, Server-Zertifikat (CN `datametric360.duckdns.org`) und Client-Zertifikat + für das Gerät signiert, beide gegen die CA verifiziert. Mosquitto ist mit `certfile`/`keyfile`/ + `cafile`/`require_certificate: true` konfiguriert. **Noch offen:** die drei Geräte-Dateien (Root, + Client-Zertifikat, privater Schlüssel) müssen noch in den FMM003-Configurator hochgeladen werden — + dabei auf die Dateinamen-Endung achten (siehe Anmerkung oben bei „Dateinamen-Endung ist strikt + geprüft"). 3. **Reverse-proxy add-on: Nginx Proxy Manager vs. Traefik** — both viable (§4), pick deferred to the next audit pass. Doesn't depend on the FMM003 — could be set up and tested against HA's existing API before the hardware arrives, if worth doing ahead of time.