- 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)
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):
buff[16]=0xFD, buff[17]=0x07, buff[18]=5, buff[19]=4→ Helligkeit maxbuff[16]=0xFE, buff[17..19]=R,G,B→ Farbe setzen- Zwei separate 64-Byte-Writes, nicht ein kombinierter!
Implementierung
tools/frostbay_ble.py:
- Python + D-Bus (BlueZ)
status— Live-Werte anzeigenmode <mode> [--fan N] [--pump N]— Modus setzenfan <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
接口.Caus 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