README aktualisieren: Demo-Modus, Votronic-Quelle, keine persönlichen Pfade

* Demo-Modus-Abschnitt an den tatsächlichen Code angeglichen: Schalter in
  den Einstellungen (für lokal installierte Builds ohne Xcode) und
  Umgebungsvariable, beide dokumentiert.
* Quelle für den Votronic-Solarregler ergänzt (syssi/esphome-votronic),
  eigener Abschnitt analog zu Kühlbox/WattCycle.
* Persönlichen Pfad aus der Bauanleitung entfernt (open VanControl.xcodeproj
  statt eines lokalen Nutzerpfads); Beispiel-Bundle-ID im Demo-Modus-Befehl
  durch Platzhalter ersetzt.

Zusätzlich: Symbolliste für Fahrzeugprofile auf Wunsch exakt auf die aus
solar-integration zurückgesetzt (car, car.side, suv.side, truck.pickup.side,
box.truck, bus), statt sie mit dev_watchs Liste zusammenzuführen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
fototeddy
2026-09-06 22:11:36 +02:00
co-authored by Claude Sonnet 5
parent eed8f33e30
commit 8e5ee6927e
3 changed files with 43 additions and 12 deletions
+40 -8
View File
@@ -38,7 +38,7 @@ liegen als `firmware/vanalign/esp32_ble_solar.yaml` im selben Ordner.
## Bauen und installieren
```bash
open /Users/fritob/GIT/Camper-Management/VanControl.xcodeproj
open VanControl.xcodeproj
```
Dann in Xcode:
@@ -177,6 +177,21 @@ sie mit, was einen Quervergleich zu Batterie und Solarregler erlaubt.
Protokoll und Feldbelegung stammen aus
[Gruni22/alpicool_ha_ble](https://github.com/Gruni22/alpicool_ha_ble).
### Votronic-Solarladeregler
Anders als der Victron-Regler hängt der Votronic-Regler nicht selbst am
BLE-Advertising er wird über eine eigene, unabhängige ESP32-Bridge
ausgelesen (siehe `firmware/vanalign/esp32_ble_solar.yaml`). Die Bridge
bewirbt ihren eigenen Dienst, wird beim Einrichten also automatisch erkannt
und die Art vorbelegt, genau wie beim Neigungsmesser.
Die Bridge liest den Regler über dessen Displaylink-Port (UART) mit der
externen ESPHome-Komponente
[syssi/esphome-votronic](https://github.com/syssi/esphome-votronic) aus und
stellt PV-Leistung, PV-Spannung/-Strom, Batteriespannung, Reglertemperatur
sowie Lade- und Reglerstatus über eigene Charakteristiken bereit reine
Lesewerte, im Takt abgefragt wie beim Neigungsmesser.
### Nivellierung
Der Neigungsmesser [VanAlign Pro](https://github.com/) ist ein ESP32 mit
@@ -414,14 +429,31 @@ eingerichtet wurden, wandern beim Update automatisch ins erste Profil.
## Ohne Fahrzeug ansehen
Ein Demo-Modus füllt die App mit erfundenen Werten, damit sich die Ansichten
ohne Bluetooth prüfen lassen. In Xcode unter *Product → Scheme → Edit Scheme →
Run → Arguments* die Umgebungsvariable `CAMPER_DEMO` auf `1` setzen. Er greift
nur in Debug-Builds.
Ein Demo-Modus füllt die App mit erfundenen Fahrzeugen und Messwerten, damit
sich die Ansichten ohne Bluetooth prüfen lassen. Nur in Debug-Builds, auf zwei
Wegen einzuschalten:
Die Watch-App kennt denselben Schalter und braucht dann kein iPhone: Im Schema
`VanControlWatch` dieselbe Variable setzen. Die Neigung wandert dort
langsam hin und her, sonst hätte der Ausrichtungs-Assistent nichts zu zeigen.
* **Schalter in den Einstellungen** (*Einstellungen → Entwicklung →
Demo-Modus*) der Weg für einen lokal installierten Build ohne
Xcode-Verbindung, etwa auf dem eigenen iPhone. Wirkt erst nach einem
Neustart der App (im App-Umschalter nach oben wischen, dann neu öffnen),
weil `DeviceStore` und `BluetoothManager` den Stand nur beim Start lesen.
* **Umgebungsvariable** `CAMPER_DEMO=1` in Xcode unter *Product → Scheme →
Edit Scheme → Run → Arguments*, oder im Simulator direkt:
```bash
xcrun simctl launch --terminate-running-process booted <deine-bundle-id>
# mit SIMCTL_CHILD_CAMPER_DEMO=1 davor
```
Solange der Demo-Modus läuft, schreibt die App nichts in die echte
Geräteliste Änderungen an den erfundenen Fahrzeugen/Geräten verschwinden
beim Ausschalten wieder.
Die Watch-App kennt nur den Umgebungsvariablen-Weg und braucht dann kein
iPhone: Im Schema `VanControlWatch` dieselbe Variable setzen. Die Neigung
wandert dort langsam hin und her, sonst hätte der Ausrichtungs-Assistent
nichts zu zeigen.
## Protokolle prüfen
+2 -3
View File
@@ -15,7 +15,7 @@ struct Profile: Identifiable, Codable, Hashable, Sendable {
init(id: UUID = UUID(),
name: String,
symbol: String = "box.truck",
symbol: String = "suv.side",
trackWidth: Double? = nil,
wheelbase: Double? = nil) {
self.id = id
@@ -47,7 +47,6 @@ struct Profile: Identifiable, Codable, Hashable, Sendable {
/// Alle Namen gegen NSImage(systemSymbolName:) geprüft ein nicht
/// existierendes Symbol lässt SwiftUI stillschweigend auf Text zurückfallen.
static let symbols = [
"box.truck", "truck.pickup.side", "bus", "bus.doubledecker",
"car", "car.side", "tent", "sailboat", "house.lodge", "mountain.2",
"car", "car.side", "suv.side", "truck.pickup.side", "box.truck", "bus",
]
}
+1 -1
View File
@@ -145,7 +145,7 @@ private struct ProfileEditView: View {
@Environment(\.dismiss) private var dismiss
@State private var name = ""
@State private var symbol = "box.truck"
@State private var symbol = "suv.side"
@State private var trackWidth = ""
@State private var wheelbase = ""