moodlit-native/Tests/UnitTests
till 9e9c607dc3 feat(smart-home): μ-9.0/.1/.2 Philips Hue Bridge — Setup + Mood-Push
Native-lokale Hue-Integration ohne Server-Side-Bridge — App-Key
bleibt im iOS-Keychain, kein mana-Service speichert Lampen-Auth.

Was:
- Sources/Core/SmartHome/HueClient.swift — CLIP v2 REST-Client mit
  Discovery (https://discovery.meethue.com), manueller IP-Probe,
  Press-Button-Pair, listLights, setLight (xy+brightness+on+
  transitionMs). Self-signed-Bridge-Cert via dedicated URLSession-
  Delegate akzeptiert (begründet im File).
- HueColor.swift — sRGB-Hex → CIE-1931-xy Konvertierung (Gamut C +
  D65) inkl. Gamma-Linearisierung. 7 Unit-Tests (Red/Blue/White/
  Black + Edge-Cases) grün.
- HueController.swift @Observable @MainActor:
  - SetupState-Maschine (notConfigured/pairing/configured/failed)
  - Bridge + Light-Selection in App-Group-UserDefaults, App-Key
    im iOS-Keychain (kSecAttrAccessibleAfterFirstUnlock)
  - applyMood(colors, brightness) verteilt Farben zyklisch über
    ausgewählte Lampen, transitionMs=600 für smooth Switch
  - turnOffSelected() beim Player-Close
- HueSettingsView — Discovery → Manueller-IP-Fallback → Pair
  (30s-Retry-Loop) → Light-Picker mit On-Status-Indikator
- SettingsView neuer "Smart Home"-Section mit NavigationLink zu HueSettingsView
- MoodPlayerView hookt onAppear/onChange-mood/onChange-isPaused/
  onDisappear in den HueController

Build iOS+macOS BUILD SUCCEEDED. 18/18 Tests grün (11 Domain + 7 Hue).

Was NICHT in dieser Phase:
- Entertainment-API (DTLS 50Hz) — kommt mit μ-10.3 Beat-Sync
- Animation-Effekte (pulse/breath/wave als Hue-Schleifen) — μ-9.2
- LIFX/Nanoleaf/WLED-Adapter — μ-9.5
- HomeKit-Output — μ-9.3
- Background-Bridge-Service — wenn überhaupt nötig

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 15:11:56 +02:00
..
DomainCodingTests.swift μ-7.1: Funktionierende Hex-Color-Picker + 11 Unit-Tests 2026-05-18 15:10:31 +02:00
HueColorTests.swift feat(smart-home): μ-9.0/.1/.2 Philips Hue Bridge — Setup + Mood-Push 2026-05-19 15:11:56 +02:00