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

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

ابتدایی‌ترین نوع دستگاه روشنایی OnOffLight است که با ویژگی‌های OnOff و Identify پیاده‌سازی می‌شود و به‌طور اختیاری از ویژگی‌های LevelControl و LightEffects پشتیبانی می‌کند.

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

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

دمای رنگ روشن

ColorTemperatureLightDevice

home.matter.0000.types.010c

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

ویژگی‌های الزامی
     matter Identify
     matter OnOff
     matter LevelControl
     matter ColorControl

ویژگی‌های اختیاری
     google LightEffects
     google ExtendedColorControl

روشن و خاموش، روشنایی
سبک

چراغ با نور قابل‌تنظیم

DimmableLightDevice

home.matter.0000.types.0101

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

ویژگی‌های الزامی
     matter Identify
     matter OnOff
     matter LevelControl

ویژگی‌های اختیاری
     google LightEffects

روشن و خاموش، روشنایی
سبک

رنگ روشن گسترش‌یافته

ExtendedColorLightDevice

home.matter.0000.types.010d

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

ویژگی‌های الزامی
     matter Identify
     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 برگردانده می‌شوند که می‌توانید آن‌ها را بااستفاده از چارچوب 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 برای شناسایی لوازم، تغییر وضعیت برق، و تنظیم سطوح روشنایی استفاده می‌کنند.

روشن یا خاموش کردن چراغ

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

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 ممیز شناور یکپارچه که رنگ و روشنایی را در یک واحد ترکیب می‌کنند، ساده می‌کند.

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

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

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