mirror of
https://forgejo.timo-erdbruegger.de/aiways/AiwaysApp.git
synced 2026-10-10 09:33:06 +02:00
Eine Aiways Community App
- Java 91.7%
- Dart 8.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Nach dem Forgejo-Release laedt die CI die APK per POST /firmware ins Backend (Header X-Upload-Token aus secrets.BACKEND_UPLOAD_TOKEN, Ziel vars.BACKEND_URL, Default https://aiways.it-perspective.de). Damit haengen die Landing-Downloads nicht mehr an Forgejo. Fehlt das Secret oder scheitert der Upload: nur Warnung, Release bleibt gueltig. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011shUomooZ2agMQJjKmjHpi |
||
| .github/workflows | ||
| android | ||
| assets | ||
| ios | ||
| lib | ||
| reference | ||
| scripts | ||
| store | ||
| test | ||
| tool | ||
| web | ||
| .gitattributes | ||
| .gitignore | ||
| .metadata | ||
| analysis_options.yaml | ||
| codemagic.yaml | ||
| IOS_RELEASE.md | ||
| IOS_SIDELOAD.md | ||
| l10n.yaml | ||
| PLAY_STORE_RELEASE.md | ||
| POST | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| README.md | ||
| VIN | ||
Aiways App (AiwaysCommunity)
Flutter-App fürs Smartphone, die mit unserem AiwaysCommunity-Backend (aiways/Backend,
https://aiways.it-perspective.de) spricht — Look & Feel inspiriert von der originalen
Aiways-App, dunkles Design, Akzentfarbe Aiways-Türkis #00CFB4.
Teil des AiwaysCommunity-Projekts — Steuerung & Telemetrie des eigenen Aiways U5, nachdem der Hersteller die Cloud abgeschaltet hat.
Features
- Login gegen das Backend (
/auth/login, Token wird lokal gespeichert). - Erstinbetriebnahme — „Mit Fahrzeug starten" direkt auf dem Login-Screen: den
Head-Unit-QR scannen, Backend-URL daraus übernehmen, anmelden (oder Konto anlegen,
falls das Backend
allowRegistrationmeldet) und weiter ins Provisionieren. Später liegt derselbe Weg unter Mehr → Profil → Fahrzeuge → Fahrzeug hinzufügen. - Fahrzeug hinzufügen — geführter Assistent: pro Abschnitt ein Screen mit animiertem
Symbolbild, einem Satz Klartext und höchstens zwei Knöpfen (QR scannen → Schlüssel holen
→ im TBox-WLAN aufspielen → Bluetooth-Test → Erst-Daten hochladen). Scheitert der Scan
(1 Minute oder drei fremde Codes), bietet die App die Texteingabe an.
Das frühere Protokoll steckt hinter „Details" (Knopf oben rechts).
- WLAN-Schritt: ab Android 10 verbindet die App selbst (
WifiNetworkSpecifier,MainActivity.kt) — ein Systemdialog mit genau diesem Netz, ein Tipp, kein Passwort abtippen; danach trennt sie es auch selbst wieder. Wichtig dabei: das TBox-AP hat kein Internet, deshalb bindet die App ihren Prozess ausdrücklich an das WLAN (bindProcessToNetwork). Ohne das lässt Android den Standard-Weg aller Sockets auf Mobilfunk stehen und192.168.x.1:9000ist trotz „verbunden" unerreichbar (Issue #26). Rückfall (iOS/Android 9/abgelehnt): Knopf öffnet die WLAN-Auswahl und legt das Passwort in die Zwischenablage — die App bindet sich dann an das von Hand gewählte Netz. - Solange der Assistent läuft, pausiert der BLE-Verbindungshalter (
BleLink.suspend): sonst verbraucht seine Hintergrundsuche das Scan-Budget, das Android pro 30 s vergibt, und der Bluetooth-Test im vorletzten Schritt findet „kein Fahrzeug in Reichweite".
- WLAN-Schritt: ab Android 10 verbindet die App selbst (
- Übersicht — SoC-Ring, Reichweite, Spannung/Strom, Speed, Kilometerstand, Gang, Ladezustand, Standort (GPS). Pull-to-refresh.
- Telemetrie — Zeitreihen-Chart (SoC/Spannung/Strom/Speed/Reichweite) aus
/vehicles/:id/timeseries(fl_chart). - Fahrten — Standort → Uhr-Symbol oben rechts: Fahrtenhistorie der letzten 90 Tage,
nach Tagen gruppiert; dahinter je Fahrt von/bis, Strecke, Akkuverbrauch,
Durchschnittsverbrauch und der Streckenzug auf der Karte. Die Fahrten leitet die App
aus der Telemetrie ab (
lib/drive_session.dart) — einen Fahrten-Endpunkt gibt es im Backend nicht. Grundlage sind Tempo und Kilometerstand aus demdbcvpage/cache_data-Pfad; die GPS-Spur wird getrennt nachgeladen. - Steuerung — Command-Queue: Befehle (verriegeln/entriegeln/Klima/Hupe/Blinken)
einreihen (
POST /commands) + Status der letzten Befehle. - Einstellungen — Sprache, Einheiten, Backend-URL umstellbar, Nutzer/Rolle, Logout.
- Sprachen & Einheiten (Issue #38) — Deutsch, Englisch, Französisch, Italienisch,
Spanisch. Vorgabe ist die Systemsprache; passt keine, fragt die App beim ersten Start
(Auswahl in der jeweiligen Landessprache) und merkt sich die Antwort. Später umstellbar
unter Mehr → Einstellungen → Sprache. Ebenda die Einheiten: metrisch (km, km/h,
°C, kWh/100 km) oder imperial (mi, mph, °F, mi/kWh) — umgerechnet wird nur die Anzeige,
gespeichert und ans Fahrzeug geschickt wird weiter metrisch (
lib/units.dart). Die Texte liegen als ARB unterlib/l10n/, der erzeugte Code unterlib/l10n/gen(nach Änderungen an einer.arb:flutter gen-l10n). Übersetzt ist der Alltagsteil der App; Einrichtungs-Assistenten, Diagnose, Bluetooth-Seite und die Dienste-Anbindung sprechen vorerst weiter Deutsch.
Design-Vorlage
Die Farb-/Icon-Anker stammen aus dem jadx-Decompilat der Original-App unter
reference/original-app-jadx/ — u.a. app_base_color = #00CFB4.
Das Original ist selbst eine Flutter-App; die Dart-Logik ist kompiliert (nicht lesbar),
die Ressourcen dienen als Inspiration.
Entwicklung
flutter pub get
flutter run # auf angeschlossenem Gerät / Emulator
flutter analyze # statische Prüfung (aktuell: keine Issues)
Build (Android-APK)
flutter build apk --release
# Ergebnis: build/app/outputs/flutter-apk/app-release.apk
Projektstruktur
lib/
main.dart App-Einstieg, Provider, Dark-Theme, Auth-Routing
theme.dart Dark-Theme + Aiways-Farben (#00CFB4)
api.dart HTTP-Client fürs Backend
app_state.dart Zustand (Auth-Token, Fahrzeuge) + Persistenz
models.dart Vehicle / Telemetry / Command
widgets/soc_gauge.dart SoC-Ring (CustomPainter)
screens/ Login, Übersicht, Telemetrie, Steuerung, Einstellungen
reference/ jadx-Decompilat der Original-App (Design-Lookup, LFS)
Stack
Flutter (dark-only), http, provider, fl_chart, shared_preferences, intl.