מדריך למכשיר קל

מכשירי תאורה משתמשים בתכונות סטנדרטיות של Matter כדי לזהות גופי תאורה, להחליף בין מצבי הפעלה ולשנות את רמות הבהירות.

סוג המכשיר הבסיסי ביותר של תאורה הוא OnOffLight שמיושם עם התכונות OnOff ו- Identify ותומך באופן אופציונלי בתכונה LevelControl ובתכונה LightEffects.

סוגי תאורה אחרים מציעים יכולות נוספות ומוטמעים באמצעות תכונות שונות:

סוג המכשיר ב-Home APIs תכונות אפליקציה לדוגמה ב-Kotlin תרחיש לדוגמה

טמפרטורת צבע בהירה

ColorTemperatureLightDevice

home.matter.0000.types.010c

מכשיר תאורה שאפשר להדליק או לכבות, לכוונן את עוצמת האור שלו ולכוונן את טמפרטורת הצבע שלו.

תכונות נדרשות
     matter זיהוי
     matter OnOff
     matter LevelControl
     matter ColorControl

תכונות אופציונליות
     google LightEffects
     google ExtendedColorControl

הפעלה וכיבוי, בהירות
בהיר

מנורה עם אפשרות עמעום

DimmableLightDevice

home.matter.0000.types.0101

מכשיר תאורה שאפשר להדליק או לכבות, לכוון את עוצמת האור שלו ולהפעיל אותו באמצעות חיישן נוכחות מקושר.

תכונות נדרשות
     matter זיהוי
     matter OnOff
     matter LevelControl

תכונות אופציונליות
     google LightEffects

הפעלה וכיבוי, בהירות
בהיר

תאורה עם מגוון צבעים רחב

ExtendedColorLightDevice

home.matter.0000.types.010d

מכשיר תאורה שאפשר להדליק או לכבות, לכוונן את עוצמת האור שלו, לכוונן את טמפרטורת הצבע שלו ולהפעיל אותו באמצעות חיישן נוכחות מקושר.

תכונות נדרשות
     matter זיהוי
     matter OnOff
     matter LevelControl
     matter ColorControl

תכונות אופציונליות
     google LightEffects
     google ExtendedColorControl

הפעלה וכיבוי, בהירות
בהיר

נורית הפעלה/כיבוי

OnOffLightDevice

home.matter.0000.types.0100

מכשיר תאורה שאפשר להדליק או לכבות.

תכונות נדרשות
     matter זיהוי
     matter OnOff

תכונות אופציונליות
     matter LevelControl
     google LightEffects

הפעלה וכיבוי, בהירות
בהיר

לפני שמשתמשים בתכונות או מנסים לעדכן מאפיינים, תמיד צריך לבדוק אם המכשיר תומך במאפיינים ובפקודות. מידע נוסף זמין במאמר שליטה במכשירים ב-Android.

דרישות מוקדמות

לפני שמתחילים לעבוד עם מכשירי תאורה ועקומות תאורה, צריך לוודא שהאפליקציה מפעילה את Home SDK וכוללת את הייבוא הנדרש:

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

איתור מכשירים קלים

כדי למצוא מכשירי תאורה במבנה, מסננים את רשימת המכשירים לפי סוג המכשיר, למשל OnOffLightDevice ו-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()

אפשר גם לאחזר את כל מכשירי התאורה מכמה סוגים של מכשירי תאורה במסנן אחד:

// 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)
    }
  }

לקבל מידע בסיסי על מכשיר

   הטמעה באפליקציה לדוגמה ל-Android   

המאפיין BasicInformation כולל מידע כמו שם הספק, מזהה הספק, מזהה המוצר, שם המוצר (כולל מידע על הדגם) וגרסת התוכנה של המכשיר:

// 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}")
    }

זיהוי מכשיר תאורה

כשיש בחדר כמה נורות, אתם יכולים לעזור למשתמשים לאתר גוף תאורה פיזי ספציפי על ידי הפעלת מצב זיהוי חזותי, כמו הבהוב של הנורה למשך כמה שניות. כל ארבעת סוגי המכשירים של תאורה דורשים את התכונה Identify.

כדי להתחיל את מצב הזיהוי, מפעילים את הפקודה identify עם משך זמן של identifyTime בשניות. העברת הערך 0 מפסיקה את מצב הזיהוי באופן מיידי. אפשר גם להפעיל את triggerEffect כדי להריץ אפקט חזותי ספציפי, כמו Blink או 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
    )
  }
}

בדיקת הקישוריות של מכשיר תאורה

הקישוריות של מכשיר נבדקת בפועל ברמת סוג המכשיר, כי חלק מהמכשירים תומכים בכמה סוגי מכשירים. המצב שמוחזר הוא שילוב של מצבי הקישוריות של כל התכונות במכשיר הזה.

let lightConnectivity =
  dimmableLightDeviceType.metadata.sourceConnectivity
  .connectivityState

יכול להיות שיוצג מצב של partiallyOnline במקרה של סוגי מכשירים מעורבים כשאין חיבור לאינטרנט. יכול להיות שתכונות סטנדרטיות של Matter עדיין יהיו אונליין בגלל ניתוב מקומי, אבל תכונות מבוססות-ענן יהיו אופליין.

איך מוצאים את כתובת ה-IP של המכשיר

כדי למצוא את כתובת ה-IP של המכשיר, משתמשים במאפיין networkInterfaces של GeneralDiagnosticsTrait. הכתובות מוחזרות כאובייקטים מסוג Data, שאפשר להמיר למחרוזות IPv4 או IPv6 רגילות באמצעות מסגרת 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
}

שליטה במכשירי תאורה

סוגי המכשירים OnOffLight ו-DimmableLight משתמשים בתכונות הסטנדרטיות של Matter כדי לזהות גופי תאורה, להחליף בין מצבי הפעלה ולשנות את רמות הבהירות.

הדלקה או כיבוי של אורות

אפשר להשתמש בתכונה OnOff כדי לקרוא את מצב ההפעלה הנוכחי של OnOffLight או DimmableLight, ולהדליק או לכבות את האור.

לפני שקוראים את המאפיין onOff, צריך לוודא שהמכשיר תומך בו. חלק מהמכשירים פועלים כנקודות קצה לפקודות בלבד ולא מדווחים על המצב.

// 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!")
}

כשהערך של onOff הוא true, הנורה דולקת. כשהערך של onOff הוא false, הנורית כבויה.

כדי לשנות את מצב ההפעלה של הנורה, צריך לוודא שהתכונה תומכת בפקודה הרצויה ואז להפעיל את on(), off() או 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
}

אפשר גם לקרוא ישירות ל-on() ול-off() כדי להגדיר מצב מפורש:

onOffTrait.off()
onOffTrait.on()

כדי לכבות אור עם מעבר חזותי הדרגתי, צריך להפעיל את offWithEffect() ולציין ערך של EffectIdentifierEnum:

// Turn off the light using the DyingLight effect.
onOffTrait.offWithEffect(
  effectIdentifier = OnOffTrait.EffectIdentifierEnum.DyingLight,
  effectVariant = 0u,
)

כוונון רמות הבהירות

DimmableLight דורש את המאפיין LevelControl, ו-OnOffLight יכול לתמוך בו. אפשר להשתמש בתכונה הזו כדי לקרוא את רמת הבהירות של האור ולשלוט בה.

המאפיין currentLevel מדווח על רמת הבהירות הנוכחית בסולם מ-0 עד 254. אפשר גם לבדוק את minLevel ו-maxLevel כדי לקבוע את טווח הבהירות החוקי שנתמך על ידי החומרה.

כדי להגדיר את הבהירות לערך ספציפי, צריך להתקשר אל moveToLevel(). שימו לב שהפקודה moveToLevel() משנה את הרמה הנוכחית רק כשהאור כבר דולק, אלא אם מגדירים את optionsOverride עם executeIfOff. כדי להדליק את האור באופן אוטומטי כשמגדירים רמת בהירות שאינה אפס (או לכבות אותו כשמגדירים את הרמה למינימום), משתמשים ב-moveToLevelWithOnOff().

// Change the brightness of the light to 50%
levelControlTrait.moveToLevel(
  level = 127u.toUByte(),
  transitionTime = null,
  optionsMask = LevelControlTrait.OptionsBitmap(),
  optionsOverride = LevelControlTrait.OptionsBitmap(),
)

בדוגמה הבאה, המערכת קוראת את רמת הבהירות הנוכחית ומשתמשת ב-moveToLevelWithOnOff() כדי להגדיר את הבהירות של נורה ניתנת לעמעום ל-75% (190u) במעבר של שנייה אחת (10u עשיריות השנייה):

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()
    )
  }
}

אפשר גם להגביר או להפחית את הבהירות ביחס לרמה הנוכחית, על ידי קריאה ל-stepWithOnOff() עם StepModeEnum.Up או StepModeEnum.Down ו-stepSize.

צבע הפקד

התכונה ColorControl זמינה גם ב- ColorTemperatureLightDevice וגם ב- ExtendedColorLightDevice.

התכונה הזו מאפשרת לכוון את טמפרטורת הצבע במיקרו-מעלות הדדיות או במיירדים.

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()
  )
}

אפשר גם להגדיר צבע באמצעות קואורדינטות של כרומטיות CIE 1931 וערכי גוון ורוויה של 16 ביט.

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 היא תכונה אופציונלית של Google ב- ExtendedColorLightDevice שמפשטת את השליטה בצבע על ידי קבלת שמות צבעים, ערכי RGB או ערכי HSV מאוחדים של נקודה צפה (floating-point) שמשלבים צבע ובהירות ביחידה אחת.

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

ניהול עקומות התאורה

עקומת תאורה מגדירה לוח זמנים אוטומטי שמשנה בצורה חלקה את הבהירות ואת טמפרטורת הצבע (אופציונלי) של נורות היעד במהלך היום. לדוגמה, עקומת תאורה יכולה להגביר בהדרגה את האורות בבוקר ולעמעם אותם לגוון חם יותר בערב. סוגי תאורה שתומכים רק בבהירות, כמו תאורה ניתנת לעמעום, פועלים לפי עקומת הבהירות ומתעלמים מטמפרטורת הצבע.

המאפיין LightingCurve הוא מאפיין Google Home platform ברמת הבית. אתם ניגשים אליו ממכונה של Structure ולא ממכשיר תאורה ספציפי.

כל לוח זמנים בתכונה מיוצג על ידי LightingCurveSetting, שמצמד settingId ייחודי עם LightingCurveConfig. בטבלה הבאה מתוארים שדות התצורה של LightingCurveConfig:

שדה תיאור
curvePointsList רצף של לפחות שני פריטים מסוג CurvePoint עם זמנים שונים. כל נקודה מציינת time (CurveTimeOfDay עם hours מ-0 עד 23 ו-minutes מ-0 עד 59), brightnessPercent (מ-0 עד 100) ו-colorTemperature אופציונלי בקלווין. אם מציינים את המאפיין colorTemperature בנקודה כלשהי, הוא חייב להיות ערך חיובי בכל הנקודות.
roomId המזהה של החדר הרלוונטי (לדוגמה, room@{uuid}). החלת עקומת התאורה על נורות תואמות בחדר הזה, שניתן לעמעם אותן ולשנות את טמפרטורת הצבע שלהן. צריך לציין roomId או devices.
devices אובייקט TargetDevices שמכיל רשימה של רשומות TargetDevice, כל אחת עם id של מכשיר ומזהה type של מכשיר (כמו home.matter.0000.types.0101 עבור DimmableLight או home.matter.0000.types.010c עבור ColorTemperatureLight). צריך לציין devices או roomId.
daysOfWeekList הימים בשבוע שבהם עקומת התאורה פועלת (DayOfWeek). אם הרשימה ריקה, עקומת התאורה פועלת מדי יום.
adaptive ערך בוליאני אופציונלי שמציין אם עקומת התאורה היא דינמית, כלומר אם תאורת היעד חוזרת לרמת העקומה הפעילה כשהיא מופעלת במהלך החלון המתוזמן. כשהאפשרות false מופעלת, שינוי ידני של תאורה מנתק את התאורה מעקומת התאורה למשך שאר היום. כשtrue, נורה שכובתה ואז הודלקה שוב במהלך חלון הזמנים של לוח הזמנים, תתחבר מחדש לעקומת התאורה, תתאים את עצמה לבהירות ולטמפרטורת הצבע הנוכחיות של העקומה, ותפעל לפי העקומה מאותו רגע.
enabled ערך בוליאני אופציונלי שמציין אם הגדרת עקומת התאורה פעילה. ברירת המחדל היא true כשיוצרים הגדרה חדשה. כשמשמיטים את enabled מפקודת עדכון, המצב של enabled לא משתנה.

קריאת ההגדרות של עקומת התאורה

כדי לבדוק את עקומות התאורה שהוגדרו למבנה, מאחזרים את המאפיין LightingCurve מה-Structure וקוראים את המאפיין 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"
      )
    }
  }
}

יצירת הגדרה של עקומת תאורה

כדי ליצור לוח זמנים חדש לעקומת תאורה במבנה, צריך ליצור LightingCurveConfig עם לפחות שני רשומות של CurvePoint, נורות יעד (שצוינו על ידי roomId או devices) והימים הפעילים בשבוע. ואז מעבירים את ההגדרה אל createLightingCurveSetting(). הפקודה מחזירה את הערך הייחודי של settingId שהוקצה להגדרה החדשה של עקומת התאורה.

בדוגמה הבאה נוצרת עקומת תאורה לחדר בימי חול. היא עולה מ-30% בהירות בגוון חם של 2,700K בשעה 7:00 ל-80% בגוון קר יותר של 4,000K בשעה 9:00, ואז מתעמעמת ל-20% בגוון חם מאוד של 2,200K עד השעה 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)
}

כדי לטרגט מכשירי תאורה ספציפיים במקום חדר שלם, צריך לספק את הפרמטר devices באמצעות 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
)

עדכון הגדרה של עקומת תאורה

כדי לשנות עקומת תאורה קיימת, למשל לשנות את נקודות העקומה, לעדכן את הימים הפעילים בשבוע או להפעיל ולהשבית את לוח הזמנים, צריך להפעיל את updateLightingCurveSetting() עם היעד settingId ו-LightingCurveConfig מעודכן.

suspend fun updateLightingCurve(
  structure: Structure,
  settingId: String,
  updatedConfig: LightingCurveTrait.LightingCurveConfig
) {
  val lightingCurve = structure.trait(LightingCurve).firstOrNull() ?: return

  lightingCurve.updateLightingCurveSetting(
    settingId = settingId,
    config = updatedConfig
  )
}

מחיקת הגדרה של עקומת תאורה

כדי להסיר הגדרה של עקומת תאורה ממבנה, מפעילים את deleteLightingCurveSetting() עם ה-settingId של ההגדרה שרוצים למחוק.

suspend fun deleteLightingCurve(
  structure: Structure,
  settingId: String
) {
  val lightingCurve = structure.trait(LightingCurve).firstOrNull() ?: return

  lightingCurve.deleteLightingCurveSetting(settingId = settingId)
}