mg4-server:2.0.0 is on git.stinnesbeck.com and pulls anonymously, so the Deployment no longer references a registry pull secret. The image is pinned by digest (sha256:6feea777…) so a re-pushed tag cannot change what the cluster runs. README and secrets template updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QLJfZQZeAKAwSqViTmLzki
6.0 KiB
6.0 KiB
SPECS — Nils' MG4
Journal for this fork of fatihdonmezdev/FatihsMG4: what has been changed, and what is still to do.
- Our repository: https://git.stinnesbeck.com/nils/mg4
- Upstream: https://github.com/fatihdonmezdev/FatihsMG4 (itself a fork of malys / EVABRPUploader and Leon Kernan / ABRP_Uploader). Credited in the app's About dialog.
Architecture: car server at car.stinnesbeck.com
The car sends everything to our own server. The server stores it in InfluxDB 2 and forwards live telemetry to ABRP, so the ABRP token lives only on the server, never in the APK. Grafana reads InfluxDB directly for the dashboards.
car ──live telemetry───▶ car.stinnesbeck.com (Go) ──▶ ABRP api.iternio.com/1/tlm/send
──daily chunks─────▶ │
──charging sessions▶ ▼
InfluxDB 2 ◀── Grafana (car-grafana.stinnesbeck.com)
- Server:
server/, Go 1.26, API only — seeserver/README.mdfor endpoints, configuration and the storage layout. Replaced the Next.js app from upstream (web/, removed 2026-10-17). - Dashboards: Grafana, provisioned from
k8s/grafana/: Live (stats, SoC/range, power/speed, route map, temperatures, tyres), Consumption (period totals, lifetime, SoH, per-day energy, distance and efficiency) and Charging (totals, session table, curves). Prices in euro. - Car app: Server tab (URL, ingest token, installation id, config import); live telemetry every 15 s while driving or charging; consumption chunks and charging sessions as before.
- Deployment:
k8s/, plain manifests. Nothing is ever applied to the cluster by us — Nils applies them (k8s/README.md). TLS comes from Traefik's default certificate.
Status
- Go server 2.0.0: tests and govulncheck clean; image builds (about 11 MB).
- End-to-end in podman (server + InfluxDB 2.7.12 + Grafana 13.2.3): every endpoint, retry idempotency, all 25 dashboard queries return data, dashboards rendered and checked.
- Manifests validated offline (including Traefik CRDs). Not applied.
- Car app 2.3.0: unit tests and lint pass; not yet tried on the car.
- Image
mg4-server:2.0.0pushed to git.stinnesbeck.com (public; pinned by digestsha256:6feea777…ink8s/kustomization.yaml). - Check in
k8s/ingress.yaml: the Traefik ingress class (placeholdertraefik-external) and Grafana's host (placeholdercar-grafana.stinnesbeck.com). - First drive with 2.3.0: telemetry arrives in InfluxDB, Grafana and ABRP.
To do
- About dialog link and QR code → https://git.stinnesbeck.com/nils/mg4.
Both come from
REPOSITORY_URLinapp/src/main/java/com/evsuite/abrp/MainActivity.javaandabout_repositoryinapp/src/main/res/values/strings.xml. They still point to Fatih's GitHub repository. - Re-enable OTA updates against our own releases.
RELEASES_APIinapp/src/unstable/java/com/evsuite/abrp/OtaUpdater.javapoints atupdates.invalidon purpose, so checks fail. The updater speaks the GitHub releases API and only allows GitHub hosts (ALLOWED_HOSTS). For git.stinnesbeck.com it needs the host on the allowlist, and the response parsing checked against that server's releases API. Release assets must be namedNilsMG4-unstable-<version>.apkwith a.sha256sidecar (build-carwrites both). - Telemetry queue survives restarts. Unsent live samples are kept in memory only.
- Translate the rest. The docs (
CHANGELOG.md,OTA.md's message table, comments inmise.toml/app/build.gradle) are still Turkish or French. - Docs still use the old package ID.
README.md,OTA.md,CHANGELOG.md,mise.tomlanddocs/MG4_PLATFORM_INSTALL.mdrefer tocom.evsuite.abrp(.unstable)andFatihsMG4-*.apk. - Move hardcoded UI strings into
strings.xml. Many are inline in Java and layouts.
Done
- 2026-10-17 — Translated the app UI from Turkish to English.
- 2026-10-17 — Nix flake:
nix developprovides JDK 21 and the Android SDK.build-carbuilds the unstable APK and signs it with the AOSP test platform key, which the MG4 head unit uses (cert SHA-256c8a2e9bc…192ab8). - 2026-10-17 — OTA update checks disabled by pointing at an unresolvable host (see To do).
- 2026-10-17 — Renamed to "Nils' MG4": package ID
com.stinnesbeck.nilsmg4(.unstablefor the car build), APK namesNilsMG4-*.apk. It installs next to the old FatihsMG4 app instead of replacing it, and starts with empty settings and history. - 2026-10-17 — Server rewritten for InfluxDB 2 with live telemetry and ABRP forwarding; Dockerfile; Kubernetes manifests (not applied).
- 2026-10-17 — App 2.3.0: Server tab (URL, ingest token, installation id, config import), live
telemetry restored from before
ea8032aand sent to the server, Upload-tab cadence controls reconnected, dead switches removed. The removed ABRP classes' unit tests compile and pass again (AbrpApi and HeadUnitWeather tests deleted with their classes). - 2026-10-17 — Accent colour: MG red instead of muted gold. Web app renamed to Nils' MG4.
- 2026-10-17 — Dashboard translated to English (en-GB formatting); euro instead of lira in the dashboard and the car app's charging tab.
- 2026-10-17 — Server rewritten in Go (API only); dashboards moved to Grafana with provisioned
InfluxDB datasource and three dashboards; the Next.js app (
web/) removed. Per-host cert-manager certificates dropped in favour of Traefik's default certificate. - 2026-10-17 — Temporary on-screen diagnostics (
b2a5b32) to debug blank values without adb; removed again (1002962) once values showed on the car. Revert1002962to bring them back.
Installing on the car
nix develop
build-car
adb push build/car/NilsMG4-unstable-<version>.apk /data/local/tmp/update.apk
adb shell "pm install -r -f -d -t /data/local/tmp/update.apk"
To remove the old upstream app: adb uninstall com.evsuite.abrp.unstable.