Przewodnik po korzystaniu z urządzenia do terapii światłem

Urządzenia oświetleniowe używają standardowych cech Matter do identyfikowania opraw oświetleniowych, przełączania stanów zasilania i regulowania poziomów jasności.

Najbardziej podstawowym typem urządzenia oświetleniowego jest OnOffLightDeviceType, który jest implementowany za pomocą cech OnOffTrait i IdentifyTrait i opcjonalnie obsługuje cechy LevelControlTrait i LightEffectsTrait.

Inne typy oświetlenia oferują dodatkowe możliwości i są implementowane z innymi cechami:

Typ urządzenia w interfejsach API Google Home Cechy Przykładowa aplikacja Swift Przypadek użycia

Światło o temperaturze kolorów

ColorTemperatureLightDeviceType

home.matter.0000.types.010c

Urządzenie oświetleniowe, które można włączać i wyłączać oraz którego intensywność światła i temperaturę kolorów można regulować.

Wymagane cechy
     matter IdentifyTrait
     matter OnOffTrait
     matter LevelControlTrait
     matter ColorControlTrait

Optional Traits
     google LightEffectsTrait
     google ExtendedColorControlTrait
Jasny

Światło z możliwością przyciemniania

DimmableLightDeviceType

home.matter.0000.types.0101

Urządzenie oświetleniowe, które można włączać i wyłączać, regulować jego intensywność oraz przełączać za pomocą powiązanego czujnika obecności.

Wymagane cechy
     matter IdentifyTrait
     matter OnOffTrait
     matter LevelControlTrait

Opcjonalne cechy
     google LightEffectsTrait
Jasny

Rozszerzone oświetlenie kolorowe

ExtendedColorLightDeviceType

home.matter.0000.types.010d

Urządzenie oświetleniowe, które można włączać i wyłączać, regulować jego intensywność i temperaturę kolorów oraz przełączać za pomocą powiązanego czujnika obecności.

Wymagane cechy
     matter IdentifyTrait
     matter OnOffTrait
     matter LevelControlTrait
     matter ColorControlTrait

Optional Traits
     google LightEffectsTrait
     google ExtendedColorControlTrait
Jasny

Włączanie/wyłączanie światła

OnOffLightDeviceType

home.matter.0000.types.0100

Urządzenie oświetleniowe, które można włączać i wyłączać.

Wymagane cechy
     matter IdentifyTrait
     matter OnOffTrait

Opcjonalne cechy
     matter LevelControlTrait
     google LightEffectsTrait
Jasny

Przed użyciem jakichkolwiek funkcji lub próbą aktualizacji atrybutów zawsze sprawdź, czy urządzenie obsługuje dany atrybut i polecenie. Więcej informacji znajdziesz w artykule Sterowanie urządzeniami naiOS.

Wymagania wstępne

Zanim zaczniesz pracować z urządzeniami oświetleniowymi i krzywymi oświetlenia, upewnij się, że aplikacja inicjuje pakiet Home SDK i zawiera wymagane importy:

import Foundation
import GoogleHomeSDK
import GoogleHomeTypes
import Network

Znajdowanie urządzeń oświetleniowych

Aby znaleźć urządzenia oświetleniowe w domu, przefiltruj listę urządzeń według typu, np. OnOffLightDeviceType i DimmableLightDeviceType.

let allDevices = try await home.devices().list()

// Get all On/Off Light devices in the structure
let onOffLights = allDevices.filter {
  $0.types.contains(OnOffLightDeviceType.self)
}

// Get all Dimmable Light devices in the structure
let dimmableLights = allDevices.filter {
  $0.types.contains(DimmableLightDeviceType.self)
}

// Retrieve a specific device type instance to access its traits
let onOffLightDeviceType =
  await onOffLights.first?.types.get(OnOffLightDeviceType.self)

let dimmableLightDeviceType =
  await dimmableLights.first?.types.get(DimmableLightDeviceType.self)

Możesz też pobrać wszystkie urządzenia oświetleniowe różnych typów za pomocą jednego filtra:

// Get a list of devices with similar device types (lights)
let lightDevices =
  try await self.home.devices().list().compactMap {
    $0.types.contains(DimmableLightDeviceType.self)
      || $0.types.contains(OnOffLightDeviceType.self)
      || $0.types.contains(ColorTemperatureLightDeviceType.self)
      || $0.types.contains(ExtendedColorLightDeviceType.self)
  }

Uzyskiwanie podstawowych informacji o urządzeniu

   Zaimplementowano w przykładowej aplikacji na iOS   

Atrybut BasicInformation zawiera informacje takie jak nazwa dostawcy, identyfikator dostawcy, identyfikator produktu, nazwa produktu (w tym informacje o modelu) i wersja oprogramowania urządzenia:

let vendorName = basicInfoTrait.attributes.vendorName!
let vendorID = basicInfoTrait.attributes.vendorID!
let productID = basicInfoTrait.attributes.productID!
let productName = basicInfoTrait.attributes.productName!
let softwareVersion = basicInfoTrait.attributes.softwareVersion!

Identyfikowanie urządzenia oświetleniowego

Jeśli w pomieszczeniu jest kilka lamp, możesz pomóc użytkownikom zlokalizować konkretną oprawę, uruchamiając stan identyfikacji wizualnej, np. miganie światła przez kilka sekund. Wszystkie 4 typy urządzeń oświetleniowych wymagają cechy Matter.IdentifyTrait.

Aby rozpocząć stan identyfikacji, wywołaj polecenie identify z czasem trwania identifyTime w sekundach. Przekazanie wartości 0 natychmiast zatrzymuje stan identyfikacji. Możesz też wywołać triggerEffect, aby uruchomić konkretny efekt wizualny, taki jak Blink lub Breathe.

func identifyLight(lightDeviceType: DimmableLightDeviceType) async throws {
  guard let identifyTrait = lightDeviceType.matterTraits.identifyTrait else {
    return
  }

  // Blink the light for 10 seconds so the user can locate it
  if identifyTrait.supportsIdentifyCommand {
    try await identifyTrait.identify(identifyTime: 10)
  }

  // Or trigger a specific visual identification effect
  if identifyTrait.supportsTriggerEffectCommand {
    try await identifyTrait.triggerEffect(
      effectIdentifier: .blink,
      effectVariant: .default
    )
  }
}

Sprawdzanie połączenia urządzenia oświetleniowego

Połączenie urządzenia jest sprawdzane na poziomie typu urządzenia, ponieważ niektóre urządzenia obsługują wiele typów urządzeń. Zwracany stan jest kombinacją stanów połączenia wszystkich cech na tym urządzeniu.

let lightConnectivity =
  dimmableLightDeviceType.metadata.sourceConnectivity
  .connectivityState

W przypadku różnych typów urządzeń, gdy nie ma połączenia z internetem, może być widoczny stan partiallyOnline. Niektóre standardowe cechy Matter mogą nadal być dostępne online dzięki lokalnemu routingowi, ale cechy działające w chmurze będą offline.

Uzyskiwanie adresu IP urządzenia

Aby znaleźć adres IP urządzenia, użyj atrybutu networkInterfaces zasobu GeneralDiagnosticsTrait. Adresy są zwracane jako obiekty Data, które można sformatować jako standardowe ciągi IPv4 lub IPv6 za pomocą platformy Network:

func getIpAddresses(trait: Matter.GeneralDiagnosticsTrait) -> [String] {
  let interfaces = trait.attributes.networkInterfaces ?? []
  var ipAddresses: [String] = []

  for interface in interfaces {
    for data in interface.iPv4Addresses {
      if let ipv4 = IPv4Address(data) {
        ipAddresses.append(String(describing: ipv4))
      }
    }
    for data in interface.iPv6Addresses {
      if let ipv6 = IPv6Address(data) {
        ipAddresses.append(String(describing: ipv6))
      }
    }
  }

  return ipAddresses
}

Sterowanie urządzeniami oświetleniowymi

Urządzenia typu OnOffLight i DimmableLight używają standardowych cech Matter do identyfikowania opraw oświetleniowych, przełączania stanów zasilania i regulowania poziomów jasności.

Włączanie i wyłączanie światła

Użyj cechy OnOffTrait, aby odczytać bieżący stan zasilania urządzenia OnOffLight lub DimmableLight i włączyć lub wyłączyć światło.

Zanim odczytasz atrybut onOff, sprawdź, czy urządzenie go obsługuje. Niektóre urządzenia działają jako punkty końcowe tylko do poleceń i nie zgłaszają stanu.

// Check if the OnOff trait supports the onOff attribute.
if onOffTrait.attributes.$onOff.isSupported {
  print("onOffTrait supports onOff state")
} else {
  print("onOffTrait is for a command only device!")
}

Gdy onOff jest true, światło jest włączone. Gdy onOff jest false, dioda jest wyłączona.

Aby zmienić stan zasilania światła, sprawdź, czy cecha obsługuje zamierzone polecenie, a następnie wywołaj on(), off() lub toggle().

// Check if the OnOff trait supports the toggle command.
if onOffTraitTest.supportsToggleCommand {
  print("onOffTrait supports toggle command")
} else {
  print("onOffTrait does not support stateful toggle command")
}
// Calling a command on a trait.
do {
  try await onOffTraitTest.toggle()
} catch let _ as HomeError {
  // Code for handling the exception
}

Możesz też bezpośrednio wywołać funkcje on() i off(), aby ustawić konkretny stan:

do {
  try await onOffTraitTest.off()
  try await onOffTraitTest.on()
} catch let _ as HomeError {
  // Code for handling the exception
}

Aby wyłączyć światło ze stopniowym przejściem wizualnym, wywołaj offWithEffect() i podaj wartość EffectIdentifierEnum:

// Turn off the light using the DyingLight effect.
do {
  try await onOffTraitTest.offWithEffect(
    effectIdentifier: Matter.OnOffTrait.EffectIdentifierEnum.dyingLight,
    effectVariant: 0
  )
} catch let _ as HomeError {
  // Code for handling the exception
}

Dostosowywanie poziomów jasności

DimmableLight wymaga cechy LevelControlTrait, a OnOffLight może ją opcjonalnie obsługiwać. Użyj tej cechy, aby odczytywać i kontrolować poziom jasności światła.

Atrybut currentLevel podaje bieżący poziom jasności w skali od 0 do 254. Możesz też sprawdzić minLevel i maxLevel, aby określić prawidłowy zakres jasności obsługiwany przez sprzęt.

Aby ustawić jasność na określoną wartość, wywołaj moveToLevel(). Pamiętaj, że moveToLevel() zmienia bieżący poziom tylko wtedy, gdy światło jest już włączone, chyba że skonfigurujesz optionsOverride za pomocą executeIfOff. Aby automatycznie włączać światło po ustawieniu niezerowego poziomu jasności (lub wyłączać je po ustawieniu minimalnego poziomu), użyj moveToLevelWithOnOff().

// Change the brightness of the light to 50%
do {
  try await levelControlTraitTest.moveToLevel(
    level: UInt8(127),
    transitionTime: 0,
    optionsMask: Matter.LevelControlTrait.OptionsBitmap(),
    optionsOverride: Matter.LevelControlTrait.OptionsBitmap()
  )
} catch let _ as HomeError {
  // Code for handling the exception
}

W tym przykładzie odczytywany jest bieżący poziom jasności, a następnie używana jest komenda moveToLevelWithOnOff(), aby ustawić jasność ściemnianego światła na 75% (190) w ciągu 1 sekundy (10 dziesiątych sekundy):

func setLightBrightness(lightDeviceType: DimmableLightDeviceType) async throws {
  guard let levelControl = lightDeviceType.matterTraits.levelControlTrait else {
    return
  }

  // Read the current brightness level (0 to 254)
  let currentLevel: UInt8? = levelControl.attributes.currentLevel
  print("Current brightness level: \(String(describing: currentLevel))")

  // Move to ~75% brightness (190 out of 254) and turn on the light if it is off
  if levelControl.supportsMoveToLevelWithOnOffCommand {
    try await levelControl.moveToLevelWithOnOff(
      level: UInt8(190),
      transitionTime: 10,
      optionsMask: Matter.LevelControlTrait.OptionsBitmap(),
      optionsOverride: Matter.LevelControlTrait.OptionsBitmap()
    )
  }
}

Możesz też zwiększyć lub zmniejszyć jasność względem bieżącego poziomu, wywołując stepWithOnOff() z .up lub .down i stepSize.

Kolor elementu sterującego

Atrybut ColorControlTrait jest dostępny zarówno w ColorTemperatureLightDeviceType, jak i ExtendedColorLightDeviceType.

Ta cecha umożliwia dostosowanie temperatury kolorów w mikrostopniach odwrotnych lub miredach.

guard let colorControlTrait =
  colorTempLightDeviceType.matterTraits.colorControlTrait
else {
  return
}
// Read the current color temperature and hardware limits in mireds
// (Mireds = 1,000,000 / Kelvin; e.g., 370 mireds ≈ 2700K warm white, 250 mireds = 4000K cool white)
let currentMireds = colorControlTrait.attributes.colorTemperatureMireds
let minMireds = colorControlTrait.attributes.colorTempPhysicalMinMireds ?? 153
let maxMireds = colorControlTrait.attributes.colorTempPhysicalMaxMireds ?? 500
// Clamp target (370 mireds ≈ 2700K) to the device's physical bounds
let targetMireds = min(max(UInt16(370), minMireds), maxMireds)
if colorControlTrait.supportsMoveToColorTemperatureCommand {
  try await colorControlTrait.moveToColorTemperature(
    colorTemperatureMireds: targetMireds,
    transitionTime: 20, // 2.0 seconds (in 0.1s units)
    optionsMask: Matter.ColorControlTrait.OptionsBitmap(),
    optionsOverride: Matter.ColorControlTrait.OptionsBitmap()
  )
}

Możesz też ustawić kolor, używając współrzędnych chromatyczności CIE 1931 oraz 16-bitowych wartości odcienia i nasycenia.

guard let colorControlTrait =
  extendedColorLightDeviceType.matterTraits.colorControlTrait
else {
  return
}
// 1. Move to CIE 1931 xy chromaticity coordinates (scaled 0..65279)
// Example: x = 0.3127 (20493), y = 0.3290 (21561) for D65 white point
if colorControlTrait.supportsMoveToColorCommand {
  try await colorControlTrait.moveToColor(
    colorX: 20493,
    colorY: 21561,
    transitionTime: 10, // 1.0 second (in 0.1s units)
    optionsMask: Matter.ColorControlTrait.OptionsBitmap(),
    optionsOverride: Matter.ColorControlTrait.OptionsBitmap()
  )
}
let currentX = colorControlTrait.attributes.currentX
let currentY = colorControlTrait.attributes.currentY
// 2. Move to 16-bit Enhanced Hue (0..65534) and 8-bit Saturation (0..254)
if colorControlTrait.supportsEnhancedMoveToHueAndSaturationCommand {
  try await colorControlTrait.enhancedMoveToHueAndSaturation(
    enhancedHue: 43690, // ~240° (Blue) on the 0..65534 scale
    saturation: 254,    // Full saturation
    transitionTime: 15, // 1.5 seconds (in 0.1s units)
    optionsMask: Matter.ColorControlTrait.OptionsBitmap(),
    optionsOverride: Matter.ColorControlTrait.OptionsBitmap()
  )
}
// 3. Start a hardware color loop across the device's hue range
if colorControlTrait.supportsColorLoopSetCommand {
  try await colorControlTrait.colorLoopSet(
    updateFlags: [
      .updateAction,
      .updateDirection,
      .updateTime,
      .updateStartHue
    ],
    action: .activateFromColorLoopStartEnhancedHue,
    direction: .increment,
    time: 30, // 30 seconds per full cycle
    startHue: 0,
    optionsMask: Matter.ColorControlTrait.OptionsBitmap(),
    optionsOverride: Matter.ColorControlTrait.OptionsBitmap()
  )
}

Google.ExtendedColorControlTrait to opcjonalna cecha Google w ExtendedColorLightDevice, która upraszcza sterowanie kolorami, akceptując nazwy kolorów, wartości RGB lub ujednolicone wartości HSV w reprezentacji zmiennoprzecinkowej, które łączą kolor i jasność w jedną jednostkę.

guard let extendedColorControlTrait =
  extendedColorLightDeviceType.googleTraits.extendedColorControlTrait
else {
  return
}
// 1. Set color by name
if extendedColorControlTrait.supportsMoveToColorNameCommand {
  try await extendedColorControlTrait.moveToColorName(colorName: "Lavender")
}
let currentColorName = extendedColorControlTrait.attributes.currentName
// 2. Set color using 8-bit RGB values (0..255 per channel)
// Automatically coordinates brightness (LevelControl) and color (ColorControl)
if extendedColorControlTrait.supportsMoveToColorRGBCommand {
  try await extendedColorControlTrait.moveToColorRGB(
    red: 255,
    green: 128,
    blue: 0
  )
}
let currentRed = extendedColorControlTrait.attributes.currentRed
let currentGreen = extendedColorControlTrait.attributes.currentGreen
let currentBlue = extendedColorControlTrait.attributes.currentBlue
// 3. Set color and brightness together using floating-point HSV
// hue: 0.0...360.0, saturation: 0.0...1.0, value (brightness): 0.0...1.0
if extendedColorControlTrait.supportsMoveToColorHSVCommand {
  try await extendedColorControlTrait.moveToColorHSV(
    hue: 210.0,
    saturation: 0.85,
    value: 0.75
  )
}
let currentHue = extendedColorControlTrait.attributes.currentHue
let currentSaturation = extendedColorControlTrait.attributes.currentSaturation
let currentValue = extendedColorControlTrait.attributes.currentValue

Zarządzanie krzywymi oświetlenia

Krzywa oświetlenia definiuje automatyczny harmonogram, który płynnie zmienia jasność i opcjonalną temperaturę kolorów docelowych świateł w ciągu dnia. Na przykład krzywa oświetlenia może stopniowo rozjaśniać światła rano i przyciemniać je do cieplejszego tonu wieczorem. Urządzenia oświetleniowe, które obsługują tylko jasność, takie jak lampy z możliwością ściemniania, podążają za krzywą jasności i ignorują temperaturę kolorów.

Atrybut Google.LightingCurveTrait jest atrybutem Google Home platform (GHP) na poziomie domu. Dostęp do niego można uzyskać z instancji Structure, a nie z pojedynczego urządzenia oświetleniowego.

Każdy harmonogram w cesze jest reprezentowany przez LightingCurveSetting, który łączy unikalny settingId z LightingCurveConfig. W tabeli poniżej opisano pola konfiguracji LightingCurveConfig:

Pole Opis
curvePointsArray Sekwencja co najmniej 2 elementów CurvePoint z różnymi godzinami. Każdy punkt określa time (CurveTimeOfDay z hours od 0 do 23 i minutes od 0 do 59), brightnessPercent (od 0 do 100) i opcjonalnie colorTemperature w kelwinach. Jeśli dla dowolnego punktu określono parametr colorTemperature, musi on mieć wartość dodatnią dla wszystkich punktów.
roomId Identyfikator pokoju docelowego (np. room@{uuid}). Stosuje krzywą oświetlenia do zgodnych lamp ze ściemniaczem i temperaturą kolorów w tym pokoju. Podaj roomId lub devices.
devices Obiekt TargetDevices zawierający listę wpisów TargetDevice, z których każdy zawiera id i identyfikator urządzenia type (np. home.matter.0000.types.0101 dla DimmableLight lub home.matter.0000.types.010c dla ColorTemperatureLight). Podaj devices lub roomId.
daysOfWeekArray Dni tygodnia, w których działa krzywa oświetlenia (Locale.Weekday). Jeśli lista jest pusta, krzywa oświetlenia działa codziennie.
adaptive Opcjonalna wartość logiczna wskazująca, czy krzywa oświetlenia jest adaptacyjna, co oznacza, że docelowe światło powraca do aktywnego poziomu krzywej, gdy zostanie włączone w czasie oczekiwania. Gdy funkcja false jest włączona, ręczna zmiana ustawień światła powoduje odłączenie go od krzywej oświetlenia na resztę dnia. Gdy true, światło, które zostanie wyłączone, a następnie ponownie włączone w czasie oczekiwania, zostanie ponownie dostosowane do krzywej oświetlenia, co spowoduje, że będzie odpowiadać bieżącej jasności i temperaturze kolorów krzywej i będzie podążać za krzywą od tego momentu.
enabled Opcjonalna wartość logiczna wskazująca, czy ustawienie krzywej oświetlenia jest aktywne. Domyślna wartość podczas tworzenia nowego ustawienia to true. Jeśli w poleceniu aktualizacji pominięto parametr enabled, stan parametru enabled nie ulega zmianie.

Odczytywanie ustawień krzywej oświetlenia

Aby sprawdzić krzywe oświetlenia skonfigurowane dla budynku, pobierz cechę Google.LightingCurveTrait z Structure i odczytaj jej atrybut lightingCurveSettingsArray.

func readLightingCurves(structure: Structure) async {
  guard let lightingCurve = await structure.traits.get(
    Google.LightingCurveTrait.self
  ) else {
    return
  }

  for setting in lightingCurve.attributes.lightingCurveSettingsArray {
    let settingId = setting.settingId
    let config = setting.config
    print(
      "Setting ID: \(String(describing: settingId)), " +
        "enabled: \(String(describing: config?.enabled))"
    )
    for point in config?.curvePointsArray ?? [] {
      print(
        "  Time: \(point.time?.hours ?? 0):\(point.time?.minutes ?? 0), " +
          "Brightness: \(point.brightnessPercent ?? 0)%, " +
          "ColorTemp: \(point.colorTemperature ?? 0)K"
      )
    }
  }
}

Tworzenie ustawienia krzywej oświetlenia

Aby utworzyć nowy harmonogram krzywej oświetlenia w domu, utwórz obiekt LightingCurveConfig z co najmniej 2 wpisami CurvePoint, docelowymi światłami (określonymi przez roomId lub devices) i aktywnymi dniami tygodnia. Następnie przekaż konfigurację do createLightingCurveSetting(). Polecenie zwraca unikalny identyfikator settingId przypisany do nowego ustawienia krzywej oświetlenia.

W poniższym przykładzie tworzona jest krzywa oświetlenia w dni powszednie dla pomieszczenia, w którym jasność wzrasta z 30% o 7:00 do 80% o 9:00 i zmniejsza się do 20% o 21:00:

func createRoomLightingCurve(
  structure: Structure,
  targetRoomId: String
) async throws -> String? {
  guard let lightingCurve = await structure.traits.get(
    Google.LightingCurveTrait.self
  ) else {
    return nil
  }

  let curvePoints = [
    Google.LightingCurveTrait.CurvePoint(
      time: Google.LightingCurveTrait.CurveTimeOfDay(hours: 7, minutes: 0),
      brightnessPercent: 30,
      colorTemperature: 2700
    ),
    Google.LightingCurveTrait.CurvePoint(
      time: Google.LightingCurveTrait.CurveTimeOfDay(hours: 9, minutes: 0),
      brightnessPercent: 80,
      colorTemperature: 4000
    ),
    Google.LightingCurveTrait.CurvePoint(
      time: Google.LightingCurveTrait.CurveTimeOfDay(hours: 21, minutes: 0),
      brightnessPercent: 20,
      colorTemperature: 2200
    ),
  ]

  let config = Google.LightingCurveTrait.LightingCurveConfig(
    curvePointsArray: curvePoints,
    roomId: targetRoomId,
    daysOfWeekArray: [
      .monday,
      .tuesday,
      .wednesday,
      .thursday,
      .friday,
    ],
    adaptive: true,
    enabled: true
  )

  let response = try await lightingCurve.createLightingCurveSetting(
    config: config
  )
  return response.settingId
}

Aby kierować na konkretne urządzenia oświetleniowe, a nie na całe pomieszczenie, podaj parametr devices, używając Google.LightingCurveTrait.TargetDevices:

let targetDevices = Google.LightingCurveTrait.TargetDevices(
  devicesArray: [
    Google.LightingCurveTrait.TargetDevice(
      id: dimmableLight.id,
      type: DimmableLightDeviceType.identifier
    )
  ]
)

let deviceCurveConfig = Google.LightingCurveTrait.LightingCurveConfig(
  curvePointsArray: curvePoints,
  devices: targetDevices,
  daysOfWeekArray: [.saturday, .sunday],
  adaptive: true,
  enabled: true
)

let response = try await lightingCurve.createLightingCurveSetting(
  config: deviceCurveConfig
)
let settingId = response.settingId

Aktualizowanie ustawienia krzywej oświetlenia

Aby zmodyfikować istniejącą krzywą oświetlenia, np. zmienić jej punkty, zaktualizować aktywne dni tygodnia lub włączyć albo wyłączyć harmonogram, wywołaj updateLightingCurveSetting() z docelowym settingId i zaktualizowanym LightingCurveConfig.

func updateLightingCurve(
  structure: Structure,
  settingId: String,
  updatedConfig: Google.LightingCurveTrait.LightingCurveConfig
) async throws {
  guard let lightingCurve = await structure.traits.get(
    Google.LightingCurveTrait.self
  ) else {
    return
  }

  _ = try await lightingCurve.updateLightingCurveSetting(
    settingId: settingId,
    config: updatedConfig
  )
}

Usuwanie ustawienia krzywej oświetlenia

Aby usunąć ustawienie krzywej oświetlenia z domu, wywołaj deleteLightingCurveSetting() z settingId ustawienia, które chcesz usunąć.

func deleteLightingCurve(
  structure: Structure,
  settingId: String
) async throws {
  guard let lightingCurve = await structure.traits.get(
    Google.LightingCurveTrait.self
  ) else {
    return
  }

  _ = try await lightingCurve.deleteLightingCurveSetting(settingId: settingId)
}