Kühlbox: Stellbefehl passend zur Zonenzahl, Schalter ohne Rückfrage

Ausschalten blieb wirkungslos. Zwei Ursachen, beide behoben.

Die Länge des Einstellungsblocks hing an der Länge des empfangenen
Datensatzes statt an der Zonenzahl. Einzonen-Boxen, die den langen
Datensatz trotzdem senden, bekamen so einen 25-Byte-Block für zwei Zonen
und nahmen ihn offenbar nicht an. Jetzt entscheidet die erkannte
Zonenzahl: eine Zone ergibt 20 Byte und passt damit ohne Aufteilen in
einen Schreibvorgang.

Der Bestätigungsdialog beim Ausschalten hing an einer Section, und dort
zeigt SwiftUI ihn nicht zuverlässig an - der Schalter tat dann gar
nichts. Ein und Aus laufen jetzt beide direkt über denselben Weg, ohne
Rückfrage.

Die Diagnose zeigt zusätzlich den zuletzt abgeschickten Stellbefehl mit
Zeitstempel, damit sich unterscheiden lässt, ob ein Befehl das Gerät
nicht erreicht oder von ihm verworfen wird.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
BiasF
2026-08-30 14:27:28 +02:00
co-authored by Claude Opus 5
parent c3d708ae09
commit 3bece5b785
6 changed files with 40 additions and 19 deletions
+6
View File
@@ -90,6 +90,8 @@ final class BMSSession: NSObject {
private var buffer: [UInt8] = []
private var pollTimer: Timer?
private var lastResponse: Data?
private var lastCommand: Data?
private var lastCommandAt: Date?
private var receivedByteCount = 0
private var sentFrameCount = 0
private var gattSummary: [String] = []
@@ -407,6 +409,8 @@ final class BMSSession: NSObject {
/// Schickt einen Stellbefehl und fragt kurz darauf den Zustand ab, damit
/// die Anzeige dem Gerät folgt statt der Vermutung.
func sendControl(_ packet: Data) {
lastCommand = packet
lastCommandAt = Date()
send(packet)
// Genug Abstand, damit ein aufgeteiltes Paket vollständig draußen ist.
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
@@ -507,6 +511,8 @@ final class BMSSession: NSObject {
receivedBytes: receivedByteCount,
lastSendAt: lastSendAt,
lastResponseHex: lastResponse.map { $0.map { String(format: "%02X", $0) }.joined(separator: " ") },
lastCommandHex: lastCommand.map { $0.map { String(format: "%02X", $0) }.joined(separator: " ") },
lastCommandAt: lastCommandAt,
updated: Date()
))
}