forked from fritob/Camper-Monitor
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:
@@ -241,7 +241,10 @@ struct AlpicoolState: Equatable {
|
||||
p[10], p[11], p[12], p[13], // Kompressordrehzahlen
|
||||
]
|
||||
|
||||
if p.count >= 28 {
|
||||
// Der zweite Block gehört nur an den Befehl, wenn die Box wirklich
|
||||
// zwei Zonen hat. Einzonen-Boxen senden den langen Datensatz teils
|
||||
// mit, nehmen den langen Befehl aber nicht an.
|
||||
if isDualZone, p.count >= 28 {
|
||||
data += [
|
||||
p[18], // Sollwert rechts
|
||||
0, 0,
|
||||
|
||||
@@ -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()
|
||||
))
|
||||
}
|
||||
|
||||
@@ -82,6 +82,10 @@ struct BMSDiagnostics: Hashable {
|
||||
var receivedBytes: Int
|
||||
var lastSendAt: Date?
|
||||
var lastResponseHex: String?
|
||||
/// Zuletzt abgeschickter Stellbefehl, damit sich prüfen lässt, ob er das
|
||||
/// Gerät überhaupt erreicht hat.
|
||||
var lastCommandHex: String?
|
||||
var lastCommandAt: Date?
|
||||
var updated: Date
|
||||
|
||||
struct Pair: Hashable {
|
||||
|
||||
Reference in New Issue
Block a user