लाइट डिवाइस गाइड

लाइट डिवाइस, फ़िक्सचर की पहचान करने, पावर स्टेट को टॉगल करने, और चमक के लेवल को अडजस्ट करने के लिए, स्टैंडर्ड Matter ट्रेट का इस्तेमाल करते हैं.

सबसे बुनियादी लाइट डिवाइस टाइप OnOffLight है. इसे OnOff और Identify ट्रेट के साथ लागू किया जाता है. साथ ही, इसमें LevelControl ट्रेट और LightEffects ट्रेट का इस्तेमाल किया जा सकता है.

अन्य तरह की लाइटें, अतिरिक्त सुविधाएं देती हैं और उन्हें अलग-अलग ट्रेट के साथ लागू किया जाता है:

Home APIs के लिए डिवाइस टाइप Traits Kotlin सैंपल के तौर पर मिला ऐप्लिकेशन इस्तेमाल का उदाहरण

कलर टेंपरेचर लाइट

ColorTemperatureLightDevice

home.matter.0000.types.010c

रोशनी देने वाला ऐसा डिवाइस जिसे चालू या बंद किया जा सकता है. साथ ही, इसकी रोशनी की इंटेंसिटी और कलर टेंपरेचर को अडजस्ट किया जा सकता है.

ज़रूरी Traits
     matter Identify
     matter OnOff
     matter LevelControl
     matter ColorControl

वैकल्पिक ट्रेट
     google LightEffects
     google ExtendedColorControl

चालू और बंद करना, रोशनी
हल्की

Dimmable Light

DimmableLightDevice

home.matter.0000.types.0101

यह एक ऐसा लाइटिंग डिवाइस है जिसे चालू या बंद किया जा सकता है. साथ ही, इसकी रोशनी की इंटेंसिटी को अडजस्ट किया जा सकता है. इसके अलावा, इसे होम में लोगों की मौजूदगी का पता लगाने वाले सेंसर की मदद से चालू या बंद किया जा सकता है.

ज़रूरी विशेषताएं
     matter Identify
     matter OnOff
     matter LevelControl

वैकल्पिक ट्रेट
     google LightEffects

चालू और बंद करना, रोशनी
हल्की

एक्सटेंडेड कलर लाइट

ExtendedColorLightDevice

home.matter.0000.types.010d

रोशनी देने वाला ऐसा डिवाइस जिसे चालू या बंद किया जा सकता है. साथ ही, इसकी रोशनी की तीव्रता और कलर टेंपरेचर को अडजस्ट किया जा सकता है. इसके अलावा, इसे होम में लोगों की मौजूदगी का पता लगाने वाले सेंसर की मदद से चालू या बंद किया जा सकता है.

ज़रूरी Traits
     matter Identify
     matter OnOff
     matter LevelControl
     matter ColorControl

वैकल्पिक ट्रेट
     google LightEffects
     google ExtendedColorControl

चालू और बंद करना, रोशनी
हल्की

लाइट चालू/बंद करना

OnOffLightDevice

home.matter.0000.types.0100

रोशनी करने वाला ऐसा डिवाइस जिसे चालू या बंद किया जा सकता है.

ज़रूरी एट्रिब्यूट
     matter Identify
     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 के स्टैंडर्ड ट्रेट अब भी ऑनलाइन हो सकते हैं. हालांकि, क्लाउड-आधारित ट्रेट ऑफ़लाइन होंगे.

डिवाइस का आईपी पता पाना

डिवाइस का आईपी पता ढूंढने के लिए, GeneralDiagnosticsTrait के networkInterfaces एट्रिब्यूट का इस्तेमाल करें. पते, 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 के लिए यह ज़रूरी नहीं है. इस trait का इस्तेमाल करके, लाइट की चमक के लेवल को पढ़ा और कंट्रोल किया जा सकता है.

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

मौजूदा लेवल के हिसाब से रोशनी को बढ़ाया या घटाया भी जा सकता है. इसके लिए, StepModeEnum.Up या StepModeEnum.Down और stepSize के साथ stepWithOnOff() को कॉल करें.

कंट्रोल का रंग

ColorControl ट्रेट, ColorTemperatureLightDevice और ExtendedColorLightDevice, दोनों पर उपलब्ध है.

इस trait की मदद से, कलर टेंपरेचर को माइक्रो-रेसिप्रोकल डिग्री या मायर्ड में अडजस्ट किया जा सकता है.

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 ExtendedColorLightDevice पर Google की एक वैकल्पिक विशेषता है. इससे रंग को कंट्रोल करना आसान हो जाता है. इसके लिए, रंगों के नाम, आरजीबी वैल्यू या यूनिफ़ाइड फ़्लोटिंग-पॉइंट एचएसवी वैल्यू को स्वीकार किया जाता है. ये वैल्यू, रंग और चमक को एक ही यूनिट में जोड़ती हैं.

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 आईडी होता है. जैसे, DimmableLight के लिए home.matter.0000.types.0101 या ColorTemperatureLight के लिए home.matter.0000.types.010c. devices या roomId में से कोई एक डालें.
daysOfWeekList हफ़्ते के वे दिन जब लाइटिंग कर्व चलता है (DayOfWeek). अगर सूची खाली है, तो लाइटिंग कर्व रोज़ चलता है.
adaptive यह वैकल्पिक बूलियन वैल्यू है. इससे पता चलता है कि लाइटिंग कर्व अडैप्टिव है या नहीं. इसका मतलब है कि शेड्यूल की गई विंडो के दौरान, टारगेट लाइट चालू होने पर, वह ऐक्टिव कर्व लेवल को फिर से शुरू कर देती है. false होने पर, लाइट में मैन्युअल तरीके से बदलाव करने पर, वह लाइट दिन के बाकी समय के लिए लाइटिंग कर्व से अलग हो जाती है. true चालू होने पर, अगर शेड्यूल की गई समयावधि के दौरान किसी लाइट को बंद करके फिर से चालू किया जाता है, तो वह लाइट फिर से लाइटिंग कर्व के साथ जुड़ जाती है. इससे वह कर्व की मौजूदा चमक और कलर टेंपरेचर के हिसाब से काम करती है. साथ ही, वह कर्व के हिसाब से काम करती है.
enabled ज़रूरी नहीं है. बूलियन से पता चलता है कि लाइटिंग कर्व की सेटिंग चालू है या नहीं. नई सेटिंग बनाते समय, डिफ़ॉल्ट रूप से true पर सेट होती है. जब अपडेट कमांड से enabled को हटा दिया जाता है, तो enabled की स्थिति नहीं बदलती.

लाइटिंग कर्व की सेटिंग देखना

किसी स्ट्रक्चर के लिए कॉन्फ़िगर किए गए लाइटिंग कर्व की जांच करने के लिए, Structure से LightingCurve ट्रेट को वापस पाएं और उसका 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"
      )
    }
  }
}

लाइटिंग कर्व की सेटिंग बनाना

किसी स्ट्रक्चर पर लाइटिंग कर्व का नया शेड्यूल बनाने के लिए, कम से कम दो CurvePoint एंट्री वाला LightingCurveConfig बनाएं. साथ ही, टारगेट लाइट (roomId या devices से तय की गई) और हफ़्ते के चालू दिन तय करें. इसके बाद, कॉन्फ़िगरेशन को createLightingCurveSetting() में पास करें. कमांड, नई लाइटिंग कर्व सेटिंग को असाइन किया गया यूनीक settingId दिखाता है.

नीचे दिए गए उदाहरण में, किसी कमरे के लिए हफ़्ते के दिनों में रोशनी के कर्व को बनाया गया है. यह सुबह 7:00 बजे 2,700K की वॉर्म लाइट पर 30% ब्राइटनेस से शुरू होती है और सुबह 9:00 बजे 4,000K की कूलर लाइट पर 80% तक पहुंच जाती है. इसके बाद, रात 9:00 बजे तक 2,200K की वेरी वॉर्म लाइट पर 20% तक कम हो जाती है:

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

पूरे कमरे के बजाय, रोशनी करने वाले चुनिंदा डिवाइसों को टारगेट करने के लिए, LightingCurveTrait.TargetDevices का इस्तेमाल करके devices पैरामीटर दें:

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
)

लाइटिंग कर्व की सेटिंग अपडेट करना

किसी मौजूदा लाइटिंग कर्व में बदलाव करने के लिए, जैसे कि उसके कर्व पॉइंट बदलना, हफ़्ते के चालू दिनों को अपडेट करना या शेड्यूल को चालू और बंद करना—टारगेट settingId और अपडेट किए गए LightingCurveConfig के साथ updateLightingCurveSetting() को कॉल करें.

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