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 OnOffLight, który jest implementowany za pomocą cech OnOff i Identify i opcjonalnie obsługuje cechy LevelControl i LightEffects.
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 w języku Kotlin | Przypadek użycia |
|---|---|---|---|
|
Światło o temperaturze kolorów
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 Identify matter OnOff matter LevelControl matter ColorControl |
włączanie i wyłączanie, jasność |
Jasny |
|
Światło z możliwością przyciemniania
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 Identify matter OnOff matter LevelControl |
włączanie i wyłączanie, jasność |
Jasny |
|
Rozszerzone oświetlenie kolorowe
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 Identify matter OnOff matter LevelControl matter ColorControl |
włączanie i wyłączanie, jasność |
Jasny |
|
Włączanie/wyłączanie światła
Urządzenie oświetleniowe, które można włączać i wyłączać. |
Wymagane cechy matter Identify matter OnOff |
włączanie i wyłączanie, jasność |
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 naAndroid.
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 com.google.home.HomeDevice import com.google.home.Structure import com.google.home.google.DayOfWeek import com.google.home.google.ExtendedColorControl import com.google.home.google.ExtendedColorControlTrait import com.google.home.google.LightingCurve import com.google.home.google.LightingCurveTrait import com.google.home.matter.standard.ColorControl import com.google.home.matter.standard.ColorControlTrait import com.google.home.matter.standard.ColorTemperatureLightDevice import com.google.home.matter.standard.DimmableLightDevice import com.google.home.matter.standard.ExtendedColorLightDevice import com.google.home.matter.standard.GeneralDiagnostics import com.google.home.matter.standard.Identify import com.google.home.matter.standard.IdentifyTrait import com.google.home.matter.standard.LevelControl import com.google.home.matter.standard.LevelControlTrait import com.google.home.matter.standard.OnOff import com.google.home.matter.standard.OnOffLightDevice import com.google.home.matter.standard.OnOffTrait import com.google.home.matter.standard.RootNodeDevice import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.firstOrNull
Znajdowanie urządzeń oświetleniowych
Aby znaleźć urządzenia oświetleniowe w domu, przefiltruj listę urządzeń według typu, np. OnOffLightDevice i DimmableLightDevice.
// Get all On/Off Light devices in the structure val onOffLights: List<HomeDevice> = home.devices().list().filter { it.has(OnOffLightDevice) } // Get all Dimmable Light devices in the structure val dimmableLights: List<HomeDevice> = home.devices().list().filter { it.has(DimmableLightDevice) } // Retrieve a specific device type instance to access its traits val onOffLightDevice: OnOffLightDevice? = onOffLights.firstOrNull()?.type(OnOffLightDevice)?.firstOrNull() val dimmableLightDevice: DimmableLightDevice? = dimmableLights.firstOrNull()?.type(DimmableLightDevice)?.firstOrNull()
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) val lightDevices = home.devices().map { devices -> devices.filter { it.has(DimmableLightDevice) || it.has(OnOffLightDevice) || it.has(ColorTemperatureLightDevice) || it.has(ExtendedColorLightDevice) } }
Uzyskiwanie podstawowych informacji o urządzeniu
Wdrożone w przykładowej aplikacji na Androida
Atrybut BasicInformation zawiera informacje takie jak nazwa dostawcy, identyfikator dostawcy, identyfikator produktu, nazwa produktu (w tym informacje o modelu) i wersja oprogramowania urządzenia:
// Get device basic information. All general information traits are on the RootNodeDevice type. device.type(RootNodeDevice).first().standardTraits.basicInformation?.let { basicInformation -> println("vendorName ${basicInformation.vendorName}") println("vendorId ${basicInformation.vendorId}") println("productId ${basicInformation.productId}") println("productName ${basicInformation.productName}") println("softwareVersion ${basicInformation.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 Identify.
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.
suspend fun identifyLight(lightDevice: DimmableLightDevice) {
val identifyTrait = lightDevice.standardTraits.identify ?: return
// Blink the light for 10 seconds so the user can locate it
if (identifyTrait.supports(Identify.Command.Identify)) {
identifyTrait.identify(identifyTime = 10u)
}
// Or trigger a specific visual identification effect
if (identifyTrait.supports(Identify.Command.TriggerEffect)) {
identifyTrait.triggerEffect(
effectIdentifier = IdentifyTrait.EffectIdentifierEnum.Blink,
effectVariant = IdentifyTrait.EffectVariantEnum.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 OnOff, 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.supports(OnOff.Attribute.onOff)) { println("onOffTrait supports onOff state") } else { println("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 (onOffTrait.supports(OnOff.Command.Toggle)) { println("onOffTrait supports toggle command") } else { println("onOffTrait does not support stateful toggle command") }
// Calling a command on a trait. try { onOffTrait.toggle() } catch (e: HomeException) { // Code for handling the exception }
Możesz też bezpośrednio wywołać funkcje on() i off(), aby ustawić konkretny stan:
onOffTrait.off() onOffTrait.on()
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. onOffTrait.offWithEffect( effectIdentifier = OnOffTrait.EffectIdentifierEnum.DyingLight, effectVariant = 0u, )
Dostosowywanie poziomów jasności
DimmableLight wymaga cechy LevelControl, 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% levelControlTrait.moveToLevel( level = 127u.toUByte(), transitionTime = null, optionsMask = LevelControlTrait.OptionsBitmap(), optionsOverride = LevelControlTrait.OptionsBitmap(), )
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% (190u) w ciągu 1 sekundy (10u dziesiątych sekundy):
suspend fun setLightBrightness(lightDevice: DimmableLightDevice) { val levelControl = lightDevice.standardTraits.levelControl ?: return // Read the current brightness level (0 to 254) val currentLevel: UByte? = levelControl.currentLevel println("Current brightness level: $currentLevel") // Move to ~75% brightness (190 out of 254) and turn on the light if it is off if (levelControl.supports(LevelControl.Command.MoveToLevelWithOnOff)) { levelControl.moveToLevelWithOnOff( level = 190u, transitionTime = 10u, optionsMask = LevelControlTrait.OptionsBitmap(), optionsOverride = LevelControlTrait.OptionsBitmap() ) } }
Możesz też zwiększać lub zmniejszać jasność względem bieżącego poziomu, wywołując stepWithOnOff() z StepModeEnum.Up lub StepModeEnum.Down i stepSize.
Kolor elementu sterującego
AtrybutColorControl jest dostępny zarówno w ColorTemperatureLightDevice, jak i ExtendedColorLightDevice.
Ta cecha umożliwia dostosowanie temperatury kolorów w mikrostopniach odwrotnych lub miredach.
val colorControlTrait = colorTempLightDevice.standardTraits.colorControl ?: 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) val currentMireds = colorControlTrait.colorTemperatureMireds val minMireds = colorControlTrait.colorTempPhysicalMinMireds ?: 153u // ~6500K (coolest) val maxMireds = colorControlTrait.colorTempPhysicalMaxMireds ?: 500u // 2000K (warmest) // Clamp target (370 mireds ≈ 2700K) to the device's physical bounds val targetMireds = 370u.toUShort().coerceIn(minMireds, maxMireds) if ( colorControlTrait.supports( ColorControl.Command.MoveToColorTemperature ) ) { colorControlTrait.moveToColorTemperature( colorTemperatureMireds = targetMireds, transitionTime = 20u, // 2.0 seconds (in 0.1s units) optionsMask = ColorControlTrait.OptionsBitmap(), optionsOverride = 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.
val colorControlTrait = extendedColorLightDevice.standardTraits.colorControl ?: 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.supports(ColorControl.Command.MoveToColor)) { colorControlTrait.moveToColor( colorX = 20493u, colorY = 21561u, transitionTime = 10u, // 1.0 second (in 0.1s units) optionsMask = ColorControlTrait.OptionsBitmap(), optionsOverride = ColorControlTrait.OptionsBitmap() ) } val currentX = colorControlTrait.currentX val currentY = colorControlTrait.currentY // 2. Move to 16-bit Enhanced Hue (0..65534) and 8-bit Saturation (0..254) if ( colorControlTrait.supports( ColorControl.Command.EnhancedMoveToHueAndSaturation ) ) { colorControlTrait.enhancedMoveToHueAndSaturation( enhancedHue = 43690u, // ~240° (Blue) on the 0..65534 scale saturation = 254u, // Full saturation transitionTime = 15u, // 1.5 seconds (in 0.1s units) optionsMask = ColorControlTrait.OptionsBitmap(), optionsOverride = ColorControlTrait.OptionsBitmap() ) } // 3. Start a hardware color loop across the device's hue range if (colorControlTrait.supports(ColorControl.Command.ColorLoopSet)) { colorControlTrait.colorLoopSet( updateFlags = ColorControlTrait.UpdateFlagsBitmap( updateAction = true, updateDirection = true, updateTime = true, updateStartHue = true ), action = ColorControlTrait.ColorLoopActionEnum .ActivateFromColorLoopStartEnhancedHue, direction = ColorControlTrait.ColorLoopDirectionEnum.Increment, time = 30u, // 30 seconds per full cycle startHue = 0u, optionsMask = ColorControlTrait.OptionsBitmap(), optionsOverride = ColorControlTrait.OptionsBitmap() ) }
ExtendedColorControl 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ę.
val extendedColorControlTrait = extendedColorLightDevice.googleTraits.extendedColorControl ?: return // 1. Set color by name if ( extendedColorControlTrait.supports( ExtendedColorControl.Command.MoveToColorName ) ) { extendedColorControlTrait.moveToColorName(colorName = "Lavender") } val currentColorName = extendedColorControlTrait.currentName // 2. Set color using 8-bit RGB values (0..255 per channel) // Automatically coordinates brightness (LevelControl) and color (ColorControl) if ( extendedColorControlTrait.supports( ExtendedColorControl.Command.MoveToColorRgb ) ) { extendedColorControlTrait.moveToColorRgb( red = 255u, green = 128u, blue = 0u ) } val currentRed = extendedColorControlTrait.currentRed val currentGreen = extendedColorControlTrait.currentGreen val currentBlue = extendedColorControlTrait.currentBlue // 3. Set color and brightness together using floating-point HSV // hue: 0.0f..360.0f, saturation: 0.0f..1.0f, value (brightness): 0.0f..1.0f if ( extendedColorControlTrait.supports( ExtendedColorControl.Command.MoveToColorHsv ) ) { extendedColorControlTrait.moveToColorHsv( hue = 210.0f, saturation = 0.85f, value = 0.75f ) } val currentHue = extendedColorControlTrait.currentHue val currentSaturation = extendedColorControlTrait.currentSaturation val currentValue = extendedColorControlTrait.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.
Cecha LightingCurve jest cechą Google Home platform na poziomie domu. Dostęp do niego można uzyskać z instancji Structure, a nie z poziomu poszczególnych urządzeń oświetleniowych.
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 |
|---|---|
curvePointsList |
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. |
daysOfWeekList |
Dni tygodnia, w których działa krzywa oświetlenia (DayOfWeek). 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ę LightingCurve z Structure i odczytaj jej atrybut lightingCurveSettingsList.
suspend fun readLightingCurves(structure: Structure) {
val lightingCurve = structure.trait(LightingCurve).firstOrNull() ?: return
for (setting in lightingCurve.lightingCurveSettingsList) {
val settingId = setting.settingId
val config = setting.config
println("Setting ID: $settingId, enabled: ${config?.enabled}")
config?.curvePointsList?.forEach { point ->
println(
" Time: ${point.time?.hours}:${point.time?.minutes}, " +
"Brightness: ${point.brightnessPercent}%, " +
"ColorTemp: ${point.colorTemperature}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.
Poniższy przykład tworzy krzywą oświetlenia w dni powszednie dla pomieszczenia. Zaczyna się od 30% jasności przy ciepłej barwie 2700 K o 7:00, następnie przechodzi do 80% przy chłodniejszej barwie 4000 K o 9:00, a potem przyciemnia się do 20% przy bardzo ciepłej barwie 2200 K o 21:00:
suspend fun createRoomLightingCurve(
structure: Structure,
targetRoomId: String
): String? {
val lightingCurve = structure.trait(LightingCurve).firstOrNull() ?: return null
val curvePoints = listOf(
LightingCurveTrait.CurvePoint(
time = LightingCurveTrait.CurveTimeOfDay(hours = 7, minutes = 0),
brightnessPercent = 30,
colorTemperature = 2700
),
LightingCurveTrait.CurvePoint(
time = LightingCurveTrait.CurveTimeOfDay(hours = 9, minutes = 0),
brightnessPercent = 80,
colorTemperature = 4000
),
LightingCurveTrait.CurvePoint(
time = LightingCurveTrait.CurveTimeOfDay(hours = 21, minutes = 0),
brightnessPercent = 20,
colorTemperature = 2200
)
)
val config = LightingCurveTrait.LightingCurveConfig(
curvePointsList = curvePoints,
roomId = targetRoomId,
daysOfWeekList = listOf(
DayOfWeek.MONDAY,
DayOfWeek.TUESDAY,
DayOfWeek.WEDNESDAY,
DayOfWeek.THURSDAY,
DayOfWeek.FRIDAY
),
adaptive = true,
enabled = true
)
// Returns the newly created settingId
return lightingCurve.createLightingCurveSetting(config = config)
}
Aby kierować na konkretne urządzenia oświetleniowe, a nie na całe pomieszczenie, podaj parametr devices, używając LightingCurveTrait.TargetDevices:
val targetDevices = LightingCurveTrait.TargetDevices(
devicesList = listOf(
LightingCurveTrait.TargetDevice(
id = dimmableLight.id.id,
type = DimmableLightDevice.TYPE_ID
)
)
)
val deviceCurveConfig = LightingCurveTrait.LightingCurveConfig(
curvePointsList = curvePoints,
devices = targetDevices,
daysOfWeekList = listOf(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY),
adaptive = true,
enabled = true
)
val settingId = lightingCurve.createLightingCurveSetting(
config = deviceCurveConfig
)
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.
suspend fun updateLightingCurve(
structure: Structure,
settingId: String,
updatedConfig: LightingCurveTrait.LightingCurveConfig
) {
val lightingCurve = structure.trait(LightingCurve).firstOrNull() ?: return
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ąć.
suspend fun deleteLightingCurve(
structure: Structure,
settingId: String
) {
val lightingCurve = structure.trait(LightingCurve).firstOrNull() ?: return
lightingCurve.deleteLightingCurveSetting(settingId = settingId)
}