App:
- New DeviceRole.solar with its own BLE session/protocol/state
(SolarSession, VanAlignSolarProtocol, SolarState), mirroring the
leveling sensor but deliberately not wired into the Live Activity.
- BluetoothManager now keeps an in-memory history per metric (voltage,
current, power) instead of a single primary-metric series; cleared on
app restart by design, not persisted to disk.
- DeviceDetailView shows a channel picker above the history chart when a
device has more than one chartable metric.
- AddDeviceView recognizes the solar service UUID during setup.
- DemoData gets a simulated solar device so the integration can be
checked in the simulator without hardware.
Firmware:
- Add esp32_ble_solar.yaml (Votronic solar charge controller over BLE)
and simulated variants (esp32_ble_sim.yaml, esp32_ble_solar_sim.yaml)
for testing without a vehicle.
- esp32_ble.yaml: set flash_size/psram for the ESP32-S3 N16R8 module.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Assign the shared development team to the widget extension and watch
complication targets, and correct the watch app's companion bundle
identifier so on-device installs succeed after the bundle ID rename
to de.s0.fototeddy.VanAligneiOS.
- Guard against two ConfiguredDevices sharing a peripheralID (e.g. a
double-tapped "Sichern"), which crashed BluetoothManager's
Dictionary(uniqueKeysWithValues:) on launch.
- Keep Bluetooth running in the background while a Live Activity is
active, so lock screen/CarPlay keep receiving fresh readings instead
of freezing at the last value before backgrounding.
- Render the actual bubble-level graphic (not just a static icon) in
the Live Activity's lock screen view and expanded Dynamic Island.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>