راهنمای دستگاه روشنایی

دستگاه‌های روشنایی از ویژگی‌های استاندارد Matter برای شناسایی تجهیزات، تغییر وضعیت‌های برق، و تنظیم سطوح روشنایی استفاده می‌کنند.

ابتدایی‌ترین نوع دستگاه روشنایی OnOffLightDeviceType است که با ویژگی‌های OnOffTrait و IdentifyTrait پیاده‌سازی می‌شود و به‌طور اختیاری از ویژگی‌های LevelControlTrait و LightEffectsTrait پشتیبانی می‌کند.

انواع دیگر چراغ‌ها قابلیت‌های بیشتری ارائه می‌دهند و با مشخصه‌های متفاوتی پیاده‌سازی می‌شوند:

نوع دستگاه Home APIs ویژگی‌ها برنامه نمونه Swift مورد استفاده

دمای رنگ روشن

ColorTemperatureLightDeviceType

home.matter.0000.types.010c

دستگاه روشنایی که می‌توان آن را روشن یا خاموش کرد، شدت نور آن را تنظیم کرد، و دمای رنگ آن را تنظیم کرد.

Required Traits
     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

دستگاه روشنایی که می‌توان آن را روشن یا خاموش کرد، شدت نور آن را تنظیم کرد، دمای رنگ آن را تنظیم کرد، و بااستفاده از حسگر حضور در خانه محدودشده آن را روشن یا خاموش کرد.

Required Traits
     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 مراجعه کنید.

پیش‌نیازها

قبل‌از کار با دستگاه‌های روشنایی و منحنی‌های روشنایی، مطمئن شوید که برنامه‌تان 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 برگردانده می‌شوند که می‌توانید آن‌ها را بااستفاده از چارچوب Network به رشته‌های استاندارد IPv4 یا IPv6 قالب‌بندی کنید:

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() برای تنظیم روشنایی چراغ کم‌نورشدنی روی ۷۵٪ (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 و مقادیر اشباع و فام ۱۶ بیتی تنظیم کنید.

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 منحصربه‌فرد اختصاص‌داده‌شده به تنظیم منحنی نورپردازی جدید را برمی‌گرداند.

مثال زیر منحنی روشنایی روزهای هفته را برای اتاقی ایجاد می‌کند که روشنایی را از ۳۰٪ در ساعت ۷:۰۰ صبح به ۸۰٪ در ساعت ۹:۰۰ صبح افزایش می‌دهد و در ساعت ۹:۰۰ شب به ۲۰٪ کاهش می‌دهد:

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