دليل جهاز الإضاءة

تستخدم أجهزة الإضاءة سمات Matter العادية لتحديد تركيبات الإضاءة وتبديل حالات الطاقة وضبط مستويات السطوع.

إنّ نوع جهاز الإضاءة الأساسي هو OnOffLightDeviceType الذي يتم تنفيذه باستخدام السمتَين OnOffTrait وIdentifyTrait ويمكن أن يتوافق مع السمة LevelControlTrait والسمة LightEffectsTrait.

وتوفّر أنواع الإضاءة الأخرى إمكانات إضافية ويتم تنفيذها باستخدام سمات مختلفة:

نوع الجهاز في Home APIs السمات نموذج تطبيق Swift حالة الاستخدام

درجة حرارة الألوان

ColorTemperatureLightDeviceType

home.matter.0000.types.010c

جهاز إضاءة يمكن تشغيله أو إيقافه، وضبط مستوى سطوعه ودرجة حرارة ألوانه.

السمات المطلوبة
     matter IdentifyTrait
     matter OnOffTrait
     matter LevelControlTrait
     matter ColorControlTrait

سمات اختيارية
     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

سمات اختيارية
     google LightEffectsTrait
     google ExtendedColorControlTrait
خفيفة

تشغيل/إيقاف الإضاءة

OnOffLightDeviceType

home.matter.0000.types.0100

جهاز إضاءة يمكن تشغيله أو إيقافه

السمات المطلوبة
     matter IdentifyTrait
     matter OnOffTrait

السمات الاختيارية
     matter LevelControlTrait
     google LightEffectsTrait
خفيفة

يجب دائمًا التحقّق من توافق الجهاز مع السمات والأوامر قبل استخدام أي ميزات أو محاولة تعديل السمات. لمزيد من المعلومات، يُرجى الاطّلاع على التحكّم في الأجهزة على iOS.

المتطلبات الأساسية

قبل العمل مع أجهزة الإضاءة ومنحنيات الإضاءة، تأكَّد من أنّ تطبيقك يُهيئ حزمة تطوير البرامج (SDK) لمنصة Home ويتضمّن عمليات الاستيراد المطلوبة:

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 الموحّدة ذات الفاصلة العائمة التي تجمع بين اللون والسطوع في وحدة واحدة.

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 في الساعة 9: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)
}