superx-goes-arch/docs/frostbay-ble-protocol.md
Kay Türtscher a7b23f0eea frostbay: BLE-Steuerung produktiv + Doku + Repo-Aufräumung
- tools/frostbay_ble.py: Vollständige Frostbay-Steuerung via BlueZ/D-Bus
  (Fan/Pumpe drosseln, Status lesen, RGB vorbereitet)
- docs/frostbay-ble-protocol.md: Protokoll-Doku aus Live-Reverse-Engineering
- README.md: Projektstand aktualisiert (niri/DMS, Frostbay, Roadmap)
- tools/wmi/: Build-Artefakte entfernt (Makefile-Output)
2026-06-05 21:13:35 +02:00

3.2 KiB

Frostbay ONEC1 — BLE GATT Protocol (Getestet & Funktionierend)

Stand: 2026-06-05 — Live getestet an CoolingSystem_ONEC1 via BlueZ/D-Bus.

TL;DR

Frostbay verwendet BLE GATT (nicht HID!) für Steuerung. Fan/Pumpe-Drosselung funktioniert, RGB ist aktuell nicht nutzbar (LED-Strips nach Reparatur nicht angeschlossen).

sudo python3 tools/frostbay_ble.py status          # Live-Werte
sudo python3 tools/frostbay_ble.py mode custom --fan 25 --pump 25   # Drosseln
sudo python3 tools/frostbay_ble.py off               # Ausschalten

Verbindung

Eigenschaft Wert
Gerätename CoolingSystem_ONEC1
BT-Adresse variabel (z.B. C8:17:17:F5:C8:62)
Service 0000ffe0-0000-1000-8000-00805f9b34fb
Char (R/W) 0000ffe1-0000-1000-8000-00805f9b34fb (64 Byte Blocks)

Der Service erscheint als service003f im BlueZ-Objektbaum unter /org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX/.

Protokoll

Lesen (Status abfragen)

Einfach die ffe1-Characteristic per D-Bus ReadValue() auslesen. Antwort ist ein 64-Byte-Block:

Byte  0:    0xC1 (Echo)
Byte  1:    0x10 (Read-Flag — nie ändern!)
Byte  2:    0x08 oder 0x00
Byte  3:    Module Switch: 0x01=follow, 0x02=save, 0x04=reconnect
Byte  4:    Betriebsmodus
Byte  5:    Fan PWM (0-100%)
Byte  6-7:  Fan RPM (uint16)
Byte  8:    Pump PWM (0-100%)
Byte  9-10: Pump RPM (uint16)
Byte 11-12: Water Flow mL/min (uint16)
Byte 13:    Inlet Temp (°C)
Byte 14:    Outlet Temp (°C)
Byte 15:    Status-Bitmask
Byte 16:    RGB Mode (0x00-0x13=preset, 0xFD=Helligkeit, 0xFE=Custom)
Byte 17:    RGB Switch (0-7 Bitmask: Strip1/2/3)
Byte 18:    RGB Speed (0-9)
Byte 19:    RGB Brightness (0-4)
Byte 20-22: RGB Custom R/G/B (Readback)
...
Byte 57:    Auto-RGB-Off Timeout

Schreiben (Steuerung)

Write-Flag = 0x02 in Byte 1 setzen (kritisch!). Ohne 0x02 wird der Write ignoriert. Dann kompletter 64-Byte-Block schreiben.

Betriebsmodi:

Code Name Beschreibung
0x00 off Aus
0x01 silent Leise (25% Fan, 30% Pump)
0x02 gentle Sanft
0x03 strong Stark
0x04 extreme Extrem
0xFE smart Intelligent (automatisch)
0xFF custom Manuelle Fan/Pump-Steuerung

Nur im custom-Mode (0xFF) werden Fan- und Pump-PWM vom User akzeptiert. Die anderen Modi haben feste Kurven.

RGB

Theoretisch unterstützt, praktisch nicht nutzbar (LED-Strips nach Reparatur physisch nicht angeschlossen).

Workflow (falls LEDs vorhanden):

  1. buff[16]=0xFD, buff[17]=0x07, buff[18]=5, buff[19]=4 → Helligkeit max
  2. buff[16]=0xFE, buff[17..19]=R,G,B → Farbe setzen
  3. Zwei separate 64-Byte-Writes, nicht ein kombinierter!

Implementierung

tools/frostbay_ble.py:

  • Python + D-Bus (BlueZ)
  • status — Live-Werte anzeigen
  • mode <mode> [--fan N] [--pump N] — Modus setzen
  • fan <pwm> / pump <pwm> — Einzelwerte (implizit custom mode)
  • rgb <r> <g> <b> — RGB setzen (nur wenn LEDs angeschlossen)
  • off — Frostbay ausschalten

Benötigt Root-Rechte für D-Bus-Zugriff auf BlueZ.

Quellen

  • 接口.C aus OEM-Firmware-ZIP (Protokoll-Logik)
  • coolingsystem_debugger.html (Web-Bluetooth-Debugger, bestätigt 64-Byte-BLE)
  • Reverse-Engineering durch SuperX-goes-Arch, 2026-06-05