Rename solar integration types to VotronicSolarESP
Renames every type and identifier we built for the solar charge controller bridge from generic "Solar" naming to the product name VotronicSolarESP: VanAlignSolarProtocol -> VotronicSolarESPProtocol, SolarSession -> VotronicSolarESPSession, SolarState -> VotronicSolarESPState, plus the dependent properties, parameters, and user-facing discovery/empty-state strings. Purely a Swift-side rename - the underlying BLE service/characteristic UUIDs are untouched, so it has no effect on communicating with the actual firmware. DeviceRole.solar's case name, and DemoData's device instance variables, are left as-is since they describe the role/demo device rather than this specific integration code. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
7fc9442aeb
commit
644c4c7767
@@ -18,7 +18,7 @@ struct Discovery: Identifiable, Hashable {
|
|||||||
/// Der Neigungsmesser bewirbt seinen Dienst, ist also sicher erkennbar.
|
/// Der Neigungsmesser bewirbt seinen Dienst, ist also sicher erkennbar.
|
||||||
var isLevelSensor = false
|
var isLevelSensor = false
|
||||||
/// Der Solarladeregler bewirbt seinen Dienst ebenso.
|
/// Der Solarladeregler bewirbt seinen Dienst ebenso.
|
||||||
var isSolarSensor = false
|
var isVotronicSolarESPSensor = false
|
||||||
|
|
||||||
//var isVictron: Bool { victronRecordType != nil }
|
//var isVictron: Bool { victronRecordType != nil }
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ struct Discovery: Identifiable, Hashable {
|
|||||||
|
|
||||||
var subtitle: String {
|
var subtitle: String {
|
||||||
if isLevelSensor { return "VanAlign Neigungsmesser" }
|
if isLevelSensor { return "VanAlign Neigungsmesser" }
|
||||||
if isSolarSensor { return "VanAlign Solarladeregler" }
|
if isVotronicSolarESPSensor { return "VotronicSolarESP" }
|
||||||
return "Bluetooth-Gerät"
|
return "Bluetooth-Gerät"
|
||||||
}
|
}
|
||||||
/*var subtitle: String {
|
/*var subtitle: String {
|
||||||
@@ -164,7 +164,7 @@ final class BluetoothManager: NSObject {
|
|||||||
//private(set) var bmsDiagnostics: [UUID: BMSDiagnostics] = [:]
|
//private(set) var bmsDiagnostics: [UUID: BMSDiagnostics] = [:]
|
||||||
//private(set) var fridgeStates: [UUID: AlpicoolState] = [:]
|
//private(set) var fridgeStates: [UUID: AlpicoolState] = [:]
|
||||||
private(set) var levelStates: [UUID: LevelState] = [:]
|
private(set) var levelStates: [UUID: LevelState] = [:]
|
||||||
private(set) var solarStates: [UUID: SolarState] = [:]
|
private(set) var votronicSolarESPStates: [UUID: VotronicSolarESPState] = [:]
|
||||||
private(set) var isBluetoothReady = false
|
private(set) var isBluetoothReady = false
|
||||||
private(set) var bluetoothStatusText = "Bluetooth wird gestartet…"
|
private(set) var bluetoothStatusText = "Bluetooth wird gestartet…"
|
||||||
|
|
||||||
@@ -201,7 +201,7 @@ final class BluetoothManager: NSObject {
|
|||||||
|
|
||||||
//private var bmsSessions: [UUID: BMSSession] = [:]
|
//private var bmsSessions: [UUID: BMSSession] = [:]
|
||||||
private var levelSessions: [UUID: LevelSession] = [:]
|
private var levelSessions: [UUID: LevelSession] = [:]
|
||||||
private var solarSessions: [UUID: SolarSession] = [:]
|
private var votronicSolarESPSessions: [UUID: VotronicSolarESPSession] = [:]
|
||||||
private var connectedPeripherals: [UUID: CBPeripheral] = [:]
|
private var connectedPeripherals: [UUID: CBPeripheral] = [:]
|
||||||
private var reconnectTimer: DispatchSourceTimer?
|
private var reconnectTimer: DispatchSourceTimer?
|
||||||
|
|
||||||
@@ -285,10 +285,10 @@ final class BluetoothManager: NSObject {
|
|||||||
// voraussetzen.
|
// voraussetzen.
|
||||||
linkStates[DemoData.level.id] = .live
|
linkStates[DemoData.level.id] = .live
|
||||||
|
|
||||||
solarStates[DemoData.solar.id] = DemoData.solarState
|
votronicSolarESPStates[DemoData.solar.id] = DemoData.votronicSolarESPState
|
||||||
linkStates[DemoData.solar.id] = .live
|
linkStates[DemoData.solar.id] = .live
|
||||||
record(DemoData.solarState.snapshot(deviceID: DemoData.solar.id, rssi: -58))
|
record(DemoData.votronicSolarESPState.snapshot(deviceID: DemoData.solar.id, rssi: -58))
|
||||||
history[DemoData.solar.id] = DemoData.solarHistory()
|
history[DemoData.solar.id] = DemoData.votronicSolarESPHistory()
|
||||||
/* for snapshot in DemoData.snapshots() {
|
/* for snapshot in DemoData.snapshots() {
|
||||||
snapshots[snapshot.deviceID] = snapshot
|
snapshots[snapshot.deviceID] = snapshot
|
||||||
linkStates[snapshot.deviceID] = .live
|
linkStates[snapshot.deviceID] = .live
|
||||||
@@ -346,7 +346,7 @@ final class BluetoothManager: NSObject {
|
|||||||
//bmsDiagnostics = bmsDiagnostics.filter { known.contains($0.key) }
|
//bmsDiagnostics = bmsDiagnostics.filter { known.contains($0.key) }
|
||||||
//fridgeStates = fridgeStates.filter { known.contains($0.key) }
|
//fridgeStates = fridgeStates.filter { known.contains($0.key) }
|
||||||
levelStates = levelStates.filter { known.contains($0.key) }
|
levelStates = levelStates.filter { known.contains($0.key) }
|
||||||
solarStates = solarStates.filter { known.contains($0.key) }
|
votronicSolarESPStates = votronicSolarESPStates.filter { known.contains($0.key) }
|
||||||
|
|
||||||
// Geräte, die nur auf Anforderung verbunden werden, zeigen bis dahin
|
// Geräte, die nur auf Anforderung verbunden werden, zeigen bis dahin
|
||||||
// ihren zuletzt gestellten Stand.
|
// ihren zuletzt gestellten Stand.
|
||||||
@@ -556,9 +556,9 @@ final class BluetoothManager: NSObject {
|
|||||||
levelSessions[peripheralID] = nil
|
levelSessions[peripheralID] = nil
|
||||||
disconnect(peripheralID)
|
disconnect(peripheralID)
|
||||||
}
|
}
|
||||||
for (peripheralID, session) in solarSessions where !wanted.contains(peripheralID) {
|
for (peripheralID, session) in votronicSolarESPSessions where !wanted.contains(peripheralID) {
|
||||||
session.stop()
|
session.stop()
|
||||||
solarSessions[peripheralID] = nil
|
votronicSolarESPSessions[peripheralID] = nil
|
||||||
disconnect(peripheralID)
|
disconnect(peripheralID)
|
||||||
}
|
}
|
||||||
// Einstellungen an bestehende Sitzungen weiterreichen.
|
// Einstellungen an bestehende Sitzungen weiterreichen.
|
||||||
@@ -606,11 +606,11 @@ final class BluetoothManager: NSObject {
|
|||||||
discoveryFlushTimer?.cancel(); discoveryFlushTimer = nil
|
discoveryFlushTimer?.cancel(); discoveryFlushTimer = nil
|
||||||
//for (_, session) in bmsSessions { session.stop() }
|
//for (_, session) in bmsSessions { session.stop() }
|
||||||
for (_, session) in levelSessions { session.stop() }
|
for (_, session) in levelSessions { session.stop() }
|
||||||
for (_, session) in solarSessions { session.stop() }
|
for (_, session) in votronicSolarESPSessions { session.stop() }
|
||||||
for (_, peripheral) in connectedPeripherals { central?.cancelPeripheralConnection(peripheral) }
|
for (_, peripheral) in connectedPeripherals { central?.cancelPeripheralConnection(peripheral) }
|
||||||
//bmsSessions.removeAll()
|
//bmsSessions.removeAll()
|
||||||
levelSessions.removeAll()
|
levelSessions.removeAll()
|
||||||
solarSessions.removeAll()
|
votronicSolarESPSessions.removeAll()
|
||||||
connectedPeripherals.removeAll()
|
connectedPeripherals.removeAll()
|
||||||
connectedSince.removeAll()
|
connectedSince.removeAll()
|
||||||
//pendingControls.removeAll()
|
//pendingControls.removeAll()
|
||||||
@@ -806,8 +806,8 @@ final class BluetoothManager: NSObject {
|
|||||||
if let name, !name.isEmpty { entry.name = name }
|
if let name, !name.isEmpty { entry.name = name }
|
||||||
let services = advertisementData[CBAdvertisementDataServiceUUIDsKey] as? [CBUUID] ?? []
|
let services = advertisementData[CBAdvertisementDataServiceUUIDsKey] as? [CBUUID] ?? []
|
||||||
entry.isLevelSensor = services.contains(LevelSession.serviceUUID)
|
entry.isLevelSensor = services.contains(LevelSession.serviceUUID)
|
||||||
entry.isSolarSensor = services.contains(SolarSession.serviceUUID)
|
entry.isVotronicSolarESPSensor = services.contains(VotronicSolarESPSession.serviceUUID)
|
||||||
entry.looksLikeSupported = entry.isLevelSensor || entry.isSolarSensor
|
entry.looksLikeSupported = entry.isLevelSensor || entry.isVotronicSolarESPSensor
|
||||||
pendingDiscoveries[peripheral.identifier] = entry
|
pendingDiscoveries[peripheral.identifier] = entry
|
||||||
}
|
}
|
||||||
/*private func updateDiscovery(peripheral: CBPeripheral,
|
/*private func updateDiscovery(peripheral: CBPeripheral,
|
||||||
@@ -965,7 +965,7 @@ extension BluetoothManager: CBCentralManagerDelegate {
|
|||||||
// Bewusst kein Draht zu `activityManager`: Der Solarertrag soll
|
// Bewusst kein Draht zu `activityManager`: Der Solarertrag soll
|
||||||
// nicht in der Live Activity/CarPlay auftauchen, die ist dem
|
// nicht in der Live Activity/CarPlay auftauchen, die ist dem
|
||||||
// Neigungsmesser vorbehalten.
|
// Neigungsmesser vorbehalten.
|
||||||
let session = SolarSession(
|
let session = VotronicSolarESPSession(
|
||||||
deviceID: device.id,
|
deviceID: device.id,
|
||||||
peripheral: peripheral,
|
peripheral: peripheral,
|
||||||
queue: queue,
|
queue: queue,
|
||||||
@@ -973,11 +973,11 @@ extension BluetoothManager: CBCentralManagerDelegate {
|
|||||||
onStateChange: { [weak self] state in
|
onStateChange: { [weak self] state in
|
||||||
self?.publish { self?.linkStates[device.id] = state }
|
self?.publish { self?.linkStates[device.id] = state }
|
||||||
},
|
},
|
||||||
onSolarState: { [weak self] state in
|
onVotronicSolarESPState: { [weak self] state in
|
||||||
self?.publish { self?.solarStates[device.id] = state }
|
self?.publish { self?.votronicSolarESPStates[device.id] = state }
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
solarSessions[peripheral.identifier] = session
|
votronicSolarESPSessions[peripheral.identifier] = session
|
||||||
session.start()
|
session.start()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -1029,8 +1029,8 @@ extension BluetoothManager: CBCentralManagerDelegate {
|
|||||||
//bmsSessions[peripheral.identifier] = nil
|
//bmsSessions[peripheral.identifier] = nil
|
||||||
levelSessions[peripheral.identifier]?.handleDisconnect()
|
levelSessions[peripheral.identifier]?.handleDisconnect()
|
||||||
levelSessions[peripheral.identifier] = nil
|
levelSessions[peripheral.identifier] = nil
|
||||||
solarSessions[peripheral.identifier]?.handleDisconnect()
|
votronicSolarESPSessions[peripheral.identifier]?.handleDisconnect()
|
||||||
solarSessions[peripheral.identifier] = nil
|
votronicSolarESPSessions[peripheral.identifier] = nil
|
||||||
connectedPeripherals[peripheral.identifier] = nil
|
connectedPeripherals[peripheral.identifier] = nil
|
||||||
|
|
||||||
let lifetime = connectedSince.removeValue(forKey: peripheral.identifier)
|
let lifetime = connectedSince.removeValue(forKey: peripheral.identifier)
|
||||||
|
|||||||
@@ -81,8 +81,8 @@ enum DemoData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Mittags, gute Sonne.
|
/// Mittags, gute Sonne.
|
||||||
static var solarState: SolarState {
|
static var votronicSolarESPState: VotronicSolarESPState {
|
||||||
var state = SolarState()
|
var state = VotronicSolarESPState()
|
||||||
state.batteryVoltage = 13.9
|
state.batteryVoltage = 13.9
|
||||||
state.pvVoltage = 19.4
|
state.pvVoltage = 19.4
|
||||||
state.pvCurrent = 6.2
|
state.pvCurrent = 6.2
|
||||||
@@ -96,7 +96,7 @@ enum DemoData {
|
|||||||
|
|
||||||
/// Ein paar Stunden Verlauf je Kanal, damit die Grafik im Demo-Modus
|
/// Ein paar Stunden Verlauf je Kanal, damit die Grafik im Demo-Modus
|
||||||
/// sofort etwas zeigt statt erst nach ein paar Minuten Laufzeit.
|
/// sofort etwas zeigt statt erst nach ein paar Minuten Laufzeit.
|
||||||
static func solarHistory() -> DeviceHistory {
|
static func votronicSolarESPHistory() -> DeviceHistory {
|
||||||
let now = Date()
|
let now = Date()
|
||||||
func series(around value: Double, noise: Double) -> [HistorySample] {
|
func series(around value: Double, noise: Double) -> [HistorySample] {
|
||||||
(0..<120).reversed().map { step in
|
(0..<120).reversed().map { step in
|
||||||
|
|||||||
@@ -195,7 +195,7 @@ private struct ConfigureDeviceView: View {
|
|||||||
}
|
}
|
||||||
} else*/ if discovery.isLevelSensor {
|
} else*/ if discovery.isLevelSensor {
|
||||||
role = .leveling
|
role = .leveling
|
||||||
} else if discovery.isSolarSensor {
|
} else if discovery.isVotronicSolarESPSensor {
|
||||||
role = .solar
|
role = .solar
|
||||||
} /*else if let name = discovery.name?.lowercased(),
|
} /*else if let name = discovery.name?.lowercased(),
|
||||||
["alpicool", "icecube", "ice cube", "fridge", "cool"].contains(where: name.contains) {
|
["alpicool", "icecube", "ice cube", "fridge", "cool"].contains(where: name.contains) {
|
||||||
@@ -208,8 +208,8 @@ private struct ConfigureDeviceView: View {
|
|||||||
// ohnehin darüber unter "Gefunden als".
|
// ohnehin darüber unter "Gefunden als".
|
||||||
if discovery.isLevelSensor {
|
if discovery.isLevelSensor {
|
||||||
name = "Nivellierung"
|
name = "Nivellierung"
|
||||||
} else if discovery.isSolarSensor {
|
} else if discovery.isVotronicSolarESPSensor {
|
||||||
name = "Solarladeregler"
|
name = role.title
|
||||||
} else if let advertised = discovery.name, advertised.count <= 20,
|
} else if let advertised = discovery.name, advertised.count <= 20,
|
||||||
advertised.contains(" ") || advertised.rangeOfCharacter(from: .decimalDigits) == nil {
|
advertised.contains(" ") || advertised.rangeOfCharacter(from: .decimalDigits) == nil {
|
||||||
name = advertised
|
name = advertised
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ struct DashboardView: View {
|
|||||||
Label("Noch keine Geräte", systemImage: "antenna.radiowaves.left.and.right")
|
Label("Noch keine Geräte", systemImage: "antenna.radiowaves.left.and.right")
|
||||||
} description: {
|
} description: {
|
||||||
Text("Füge \(store.activeProfile.map { "„\($0.name)“" } ?? "diesem Fahrzeug") "
|
Text("Füge \(store.activeProfile.map { "„\($0.name)“" } ?? "diesem Fahrzeug") "
|
||||||
+ "den Ladebooster, den Solarladeregler und das BMS hinzu.")
|
+ "den Ladebooster, den VotronicSolarESP und das BMS hinzu.")
|
||||||
} actions: {
|
} actions: {
|
||||||
Button("Gerät suchen") { isAddingDevice = true }
|
Button("Gerät suchen") { isAddingDevice = true }
|
||||||
.buttonStyle(.borderedProminent)
|
.buttonStyle(.borderedProminent)
|
||||||
|
|||||||
+2
-2
@@ -1,13 +1,13 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
/// Solarladeregler „VanAlign Solar" – zweiter ESP32 im Fahrzeug, liest einen
|
/// VotronicSolarESP – zweiter ESP32 im Fahrzeug, liest einen
|
||||||
/// Votronic-Solarladeregler aus und stellt die Werte über einen eigenen
|
/// Votronic-Solarladeregler aus und stellt die Werte über einen eigenen
|
||||||
/// BLE-Dienst bereit. Siehe `firmware/vanalign/esp32_ble_solar.yaml`.
|
/// BLE-Dienst bereit. Siehe `firmware/vanalign/esp32_ble_solar.yaml`.
|
||||||
///
|
///
|
||||||
/// Wie beim Neigungsmesser: kein Rahmenprotokoll, jede Messgrösse liegt in
|
/// Wie beim Neigungsmesser: kein Rahmenprotokoll, jede Messgrösse liegt in
|
||||||
/// einer eigenen Charakteristik, alle sind reine Lesewerte, der Client fragt
|
/// einer eigenen Charakteristik, alle sind reine Lesewerte, der Client fragt
|
||||||
/// sie im Takt ab.
|
/// sie im Takt ab.
|
||||||
enum VanAlignSolarProtocol {
|
enum VotronicSolarESPProtocol {
|
||||||
|
|
||||||
/// Wird vom Gerät beworben, das Gerät ist darüber auffindbar.
|
/// Wird vom Gerät beworben, das Gerät ist darüber auffindbar.
|
||||||
static let serviceUUID = "05C9A349-2B8E-4B1D-9C9D-C247E9A6A001"
|
static let serviceUUID = "05C9A349-2B8E-4B1D-9C9D-C247E9A6A001"
|
||||||
+20
-20
@@ -6,25 +6,25 @@ import Foundation
|
|||||||
/// Einfacher noch als `LevelSession`: die Firmware bietet für keine
|
/// Einfacher noch als `LevelSession`: die Firmware bietet für keine
|
||||||
/// Charakteristik `notify` an (siehe `esp32_ble_solar.yaml`), es wird also
|
/// Charakteristik `notify` an (siehe `esp32_ble_solar.yaml`), es wird also
|
||||||
/// immer im Takt abgefragt statt abonniert.
|
/// immer im Takt abgefragt statt abonniert.
|
||||||
final class SolarSession: NSObject {
|
final class VotronicSolarESPSession: NSObject {
|
||||||
|
|
||||||
static let serviceUUID = CBUUID(string: VanAlignSolarProtocol.serviceUUID)
|
static let serviceUUID = CBUUID(string: VotronicSolarESPProtocol.serviceUUID)
|
||||||
private static let batteryVoltageUUID = CBUUID(string: VanAlignSolarProtocol.batteryVoltageUUID)
|
private static let batteryVoltageUUID = CBUUID(string: VotronicSolarESPProtocol.batteryVoltageUUID)
|
||||||
private static let pvVoltageUUID = CBUUID(string: VanAlignSolarProtocol.pvVoltageUUID)
|
private static let pvVoltageUUID = CBUUID(string: VotronicSolarESPProtocol.pvVoltageUUID)
|
||||||
private static let pvCurrentUUID = CBUUID(string: VanAlignSolarProtocol.pvCurrentUUID)
|
private static let pvCurrentUUID = CBUUID(string: VotronicSolarESPProtocol.pvCurrentUUID)
|
||||||
private static let pvPowerUUID = CBUUID(string: VanAlignSolarProtocol.pvPowerUUID)
|
private static let pvPowerUUID = CBUUID(string: VotronicSolarESPProtocol.pvPowerUUID)
|
||||||
private static let controllerTempUUID = CBUUID(string: VanAlignSolarProtocol.controllerTempUUID)
|
private static let controllerTempUUID = CBUUID(string: VotronicSolarESPProtocol.controllerTempUUID)
|
||||||
private static let statusFlagsUUID = CBUUID(string: VanAlignSolarProtocol.statusFlagsUUID)
|
private static let statusFlagsUUID = CBUUID(string: VotronicSolarESPProtocol.statusFlagsUUID)
|
||||||
|
|
||||||
let deviceID: UUID
|
let deviceID: UUID
|
||||||
private let queue: DispatchQueue
|
private let queue: DispatchQueue
|
||||||
private let peripheral: CBPeripheral
|
private let peripheral: CBPeripheral
|
||||||
private let onUpdate: (DeviceSnapshot) -> Void
|
private let onUpdate: (DeviceSnapshot) -> Void
|
||||||
private let onStateChange: (DeviceLinkState) -> Void
|
private let onStateChange: (DeviceLinkState) -> Void
|
||||||
private let onSolarState: (SolarState) -> Void
|
private let onVotronicSolarESPState: (VotronicSolarESPState) -> Void
|
||||||
|
|
||||||
private var characteristics: [CBUUID: CBCharacteristic] = [:]
|
private var characteristics: [CBUUID: CBCharacteristic] = [:]
|
||||||
private var state = SolarState()
|
private var state = VotronicSolarESPState()
|
||||||
private var pollTimer: DispatchSourceTimer?
|
private var pollTimer: DispatchSourceTimer?
|
||||||
|
|
||||||
/// Reicht für einen Solarregler, dessen Werte sich über Sekunden ändern –
|
/// Reicht für einen Solarregler, dessen Werte sich über Sekunden ändern –
|
||||||
@@ -36,13 +36,13 @@ final class SolarSession: NSObject {
|
|||||||
queue: DispatchQueue,
|
queue: DispatchQueue,
|
||||||
onUpdate: @escaping (DeviceSnapshot) -> Void,
|
onUpdate: @escaping (DeviceSnapshot) -> Void,
|
||||||
onStateChange: @escaping (DeviceLinkState) -> Void,
|
onStateChange: @escaping (DeviceLinkState) -> Void,
|
||||||
onSolarState: @escaping (SolarState) -> Void) {
|
onVotronicSolarESPState: @escaping (VotronicSolarESPState) -> Void) {
|
||||||
self.deviceID = deviceID
|
self.deviceID = deviceID
|
||||||
self.queue = queue
|
self.queue = queue
|
||||||
self.peripheral = peripheral
|
self.peripheral = peripheral
|
||||||
self.onUpdate = onUpdate
|
self.onUpdate = onUpdate
|
||||||
self.onStateChange = onStateChange
|
self.onStateChange = onStateChange
|
||||||
self.onSolarState = onSolarState
|
self.onVotronicSolarESPState = onVotronicSolarESPState
|
||||||
super.init()
|
super.init()
|
||||||
peripheral.delegate = self
|
peripheral.delegate = self
|
||||||
}
|
}
|
||||||
@@ -87,14 +87,14 @@ final class SolarSession: NSObject {
|
|||||||
private func publish() {
|
private func publish() {
|
||||||
guard state.hasReading else { return }
|
guard state.hasReading else { return }
|
||||||
onStateChange(.live)
|
onStateChange(.live)
|
||||||
onSolarState(state)
|
onVotronicSolarESPState(state)
|
||||||
onUpdate(state.snapshot(deviceID: deviceID, rssi: nil))
|
onUpdate(state.snapshot(deviceID: deviceID, rssi: nil))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - CBPeripheralDelegate
|
// MARK: - CBPeripheralDelegate
|
||||||
|
|
||||||
extension SolarSession: CBPeripheralDelegate {
|
extension VotronicSolarESPSession: CBPeripheralDelegate {
|
||||||
|
|
||||||
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
|
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
|
||||||
if let error {
|
if let error {
|
||||||
@@ -137,17 +137,17 @@ extension SolarSession: CBPeripheralDelegate {
|
|||||||
|
|
||||||
switch characteristic.uuid {
|
switch characteristic.uuid {
|
||||||
case Self.batteryVoltageUUID:
|
case Self.batteryVoltageUUID:
|
||||||
state.batteryVoltage = VanAlignSolarProtocol.float(from: value)
|
state.batteryVoltage = VotronicSolarESPProtocol.float(from: value)
|
||||||
case Self.pvVoltageUUID:
|
case Self.pvVoltageUUID:
|
||||||
state.pvVoltage = VanAlignSolarProtocol.float(from: value)
|
state.pvVoltage = VotronicSolarESPProtocol.float(from: value)
|
||||||
case Self.pvCurrentUUID:
|
case Self.pvCurrentUUID:
|
||||||
state.pvCurrent = VanAlignSolarProtocol.float(from: value)
|
state.pvCurrent = VotronicSolarESPProtocol.float(from: value)
|
||||||
case Self.pvPowerUUID:
|
case Self.pvPowerUUID:
|
||||||
state.pvPower = VanAlignSolarProtocol.float(from: value)
|
state.pvPower = VotronicSolarESPProtocol.float(from: value)
|
||||||
case Self.controllerTempUUID:
|
case Self.controllerTempUUID:
|
||||||
state.controllerTemperature = VanAlignSolarProtocol.float(from: value)
|
state.controllerTemperature = VotronicSolarESPProtocol.float(from: value)
|
||||||
case Self.statusFlagsUUID:
|
case Self.statusFlagsUUID:
|
||||||
guard let flags = VanAlignSolarProtocol.statusFlags(from: value) else { return }
|
guard let flags = VotronicSolarESPProtocol.statusFlags(from: value) else { return }
|
||||||
state.isBatteryCharging = flags.isBatteryCharging
|
state.isBatteryCharging = flags.isBatteryCharging
|
||||||
state.isBatteryDischarging = flags.isBatteryDischarging
|
state.isBatteryDischarging = flags.isBatteryDischarging
|
||||||
state.isControllerActive = flags.isControllerActive
|
state.isControllerActive = flags.isControllerActive
|
||||||
@@ -19,7 +19,7 @@ enum DeviceRole: String, Codable, CaseIterable, Identifiable, Sendable {
|
|||||||
//case .bms: return "Batterie / BMS"
|
//case .bms: return "Batterie / BMS"
|
||||||
//case .fridge: return "Kühlbox"
|
//case .fridge: return "Kühlbox"
|
||||||
case .leveling: return "Nivellierung"
|
case .leveling: return "Nivellierung"
|
||||||
case .solar: return "Solarladeregler"
|
case .solar: return "VotronicSolarESP"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
/// Zustand des Solarladereglers.
|
/// Zustand des Solarladereglers.
|
||||||
struct SolarState: Equatable, Codable, Sendable {
|
struct VotronicSolarESPState: Equatable, Codable, Sendable {
|
||||||
var batteryVoltage: Double?
|
var batteryVoltage: Double?
|
||||||
var pvVoltage: Double?
|
var pvVoltage: Double?
|
||||||
var pvCurrent: Double?
|
var pvCurrent: Double?
|
||||||
Reference in New Issue
Block a user