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

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

סוג המכשיר הבסיסי ביותר של תאורה הוא OnOffLightDeviceType שמיושם עם התכונות OnOffTrait ו- IdentifyTrait ותומך באופן אופציונלי בתכונה LevelControlTrait ובתכונה LightEffectsTrait.

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

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

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

ColorTemperatureLightDeviceType

home.matter.0000.types.010c

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

תכונות נדרשות
     matter IdentifyTrait
     matter OnOffTrait
     matter LevelControlTrait
     matter ColorControlTrait

Optional Traits
     google LightEffectsTrait
     google ExtendedColorControlTrait
בהיר

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

DimmableLightDeviceType

home.matter.0000.types.0101

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

תכונות נדרשות
     matter IdentifyTrait
     matter OnOffTrait
     matter LevelControlTrait

תכונות אופציונליות
     google LightEffectsTrait
בהיר

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

ExtendedColorLightDeviceType

home.matter.0000.types.010d

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

תכונות נדרשות
     matter IdentifyTrait
     matter OnOffTrait
     matter LevelControlTrait
     matter ColorControlTrait

Optional Traits
     google LightEffectsTrait
     google ExtendedColorControlTrait
בהיר

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

OnOffLightDeviceType

home.matter.0000.types.0100

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

תכונות נדרשות
     matter IdentifyTrait
     matter OnOffTrait

תכונות אופציונליות
     matter LevelControlTrait
     google LightEffectsTrait
בהיר

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

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

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

import Foundation
import GoogleHomeSDK
import GoogleHomeTypes
import Network

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

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

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

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

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

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

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

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!

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

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

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

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

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

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 כדי לזהות גופי תאורה, להחליף בין מצבי הפעלה ולשנות את רמות הבהירות.

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

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

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

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

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

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

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

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

כדי לכבות אור עם מעבר חזותי הדרגתי, צריך להפעיל את offWithEffect() ולציין ערך של 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
}

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

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

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

כדי להגדיר את הבהירות לערך ספציפי, צריך להתקשר אל moveToLevel(). שימו לב שהפקודה moveToLevel() משנה את הרמה הנוכחית רק כשהאור כבר דולק, אלא אם מגדירים את optionsOverride עם executeIfOff. כדי להדליק את האור באופן אוטומטי כשמגדירים רמת בהירות שאינה אפס (או לכבות אותו כשמגדירים את הרמה למינימום), משתמשים ב-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
}

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

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

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

צבע הפקד

התכונה ColorControlTrait זמינה גם ב- ColorTemperatureLightDeviceType וגם ב- ExtendedColorLightDeviceType.

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

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

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

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

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

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

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

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

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

שדה תיאור
curvePointsArray רצף של לפחות שני פריטים מסוג 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.
daysOfWeekArray הימים בשבוע שבהם עקומת התאורה פועלת (Locale.Weekday). אם הרשימה ריקה, עקומת התאורה פועלת מדי יום.
adaptive ערך בוליאני אופציונלי שמציין אם עקומת התאורה היא דינמית, כלומר אם תאורת היעד חוזרת לרמת העקומה הפעילה כשהיא מופעלת במהלך החלון המתוזמן. כשהאפשרות false מופעלת, שינוי ידני של תאורה מנתק את התאורה מעקומת התאורה למשך שאר היום. כשtrue, נורה שכובתה ואז הודלקה שוב במהלך חלון הזמנים של לוח הזמנים, תתחבר מחדש לעקומת התאורה, תתאים את עצמה לבהירות ולטמפרטורת הצבע הנוכחיות של העקומה, ותפעל לפי העקומה מאותו רגע.
enabled ערך בוליאני אופציונלי שמציין אם הגדרת עקומת התאורה פעילה. ברירת המחדל היא true כשיוצרים הגדרה חדשה. כשמשמיטים את enabled מפקודת עדכון, המצב של enabled לא משתנה.

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

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

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

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

בדוגמה הבאה נוצרת עקומת תאורה לחדר בימי חול, שבה הבהירות עולה מ-30% בשעה 7:00 ל-80% בשעה 9:00, ומתעמעמת ל-20% בשעה 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
}

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

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

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

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

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

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