Android के लिए Chime डिवाइस गाइड

Chime डिवाइस टाइप को लागू करने के लिए, स्टैंडर्ड Matter-आधारित ट्रेट com.google.home.matter.standard.Chime या Google के कस्टम वर्शन वाली ट्रेट com.google.home.google.Chime का इस्तेमाल किया जा सकता है. Matter स्टैंडर्ड में बताई गई सुविधाओं के अलावा, यह बाहरी चाइम को भी सपोर्ट करती है. चाइम डिवाइस में Identify ट्रेट भी लागू हो सकता है. इससे चाइम डिवाइस को देखकर या उसकी आवाज़ सुनकर पहचाना जा सकता है.

किसी भी सुविधा का इस्तेमाल करने या एट्रिब्यूट अपडेट करने से पहले, हमेशा यह देख लें कि डिवाइस के लिए एट्रिब्यूट और कमांड काम करती हैं या नहीं. ज़्यादा जानकारी के लिए, Androidपर डिवाइसों को कंट्रोल करना लेख पढ़ें.

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

चाइम

ChimeDevice

home.matter.0000.types.0146

ऐसा डिवाइस जिसमें पहले से इंस्टॉल किए गए कई तरह के साउंड चलाए जा सकते हैं. आम तौर पर, इसका इस्तेमाल दरवाज़े की घंटी, ऑडियो डोरबेल या वीडियो डोरबेल के साथ किया जाता है.

ज़रूरी एट्रिब्यूट
     matter Chime

ज़रूरी नहीं है कि ये एट्रिब्यूट शामिल किए जाएं
     matter Identify
डोरबेल

किसी डिवाइस के बारे में बुनियादी जानकारी पाना

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

कई हिस्सों में बंटे वीडियो के लिए सहायता

घंटी में कई तरह के डिवाइस शामिल हो सकते हैं. जैसे, घंटी और स्पीकर (वैकल्पिक). इसके अलावा, कुछ घंटियों में Thread Border Router (TBR) भी शामिल होता है. ज़्यादा से ज़्यादा डिवाइसों के साथ काम करने के लिए, होम एपीआई ऐप्लिकेशन को इस तरह से लिखा जाना चाहिए कि वे मल्टीपार्ट घंटी डिवाइसों के साथ काम कर सकें. ज़्यादा जानकारी के लिए, एक से ज़्यादा पार्ट वाले डिवाइस देखें.

ऐप्लिकेशन में, मल्टीपार्ट चाइम वाले हर डिवाइस को एक ही टाइल से दिखाया जाना चाहिए. Chime डिवाइस, प्राइमरी डिवाइस होना चाहिए. साथ ही, बच्चे के स्पीकर को Chime डिवाइस के साथ कनेक्ट किया जाना चाहिए.

स्पीकर की आवाज़, Chime डिवाइस की प्राइमरी सेटिंग के तौर पर दिखनी चाहिए.

OnOff मैपिंग

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

Matter डिवाइस लाइब्रेरी के स्पेसिफ़िकेशन के मुताबिक, Chime trait के Enabled एट्रिब्यूट को False पर सेट करने से, Chime की सुविधा बंद हो सकती है. इसके अलावा, यह एक ग्लोबल म्यूट स्विच की तरह काम कर सकता है. इससे सुनाई देने वाले और दिखने वाले सभी इंडिकेटर बंद हो जाते हैं.

ऑटोमेशन से जुड़ी सहायता

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

ऑटोमेशन स्टार्टर और कार्रवाइयों में, सूचनाओं का इस्तेमाल किया जा सकता है.

ऑटोमेशन में इस्तेमाल किए गए पैरंट Chime डिवाइस के किसी भी कॉम्पोनेंट डिवाइस को AutomationPartPath का इस्तेमाल करके रेफ़रंस दिया जाना चाहिए.

यहां दिए गए ऑटोमेशन में, मल्टीपार्ट चाइम के साथ ऑटोमेशन बनाने का तरीका बताया गया है. इसमें Chime trait के साथ-साथ स्पीकर को भी लागू किया जाता है. सामने का दरवाज़ा खुलने पर, ऑटोमेशन ट्रिगर हो जाता है:

import com.google.home.automation.automation
import com.google.home.automation.greaterThan
import com.google.home.google.GoogleDoorDevice
import com.google.home.google.OpenClose
import com.google.home.matter.standard.ChimeDevice
import com.google.home.matter.standard.Chime
// ...

// Fetch devices
val devices = homeManager.devices()

// Fetch devices using the multipart device model.
val multipartDevices = homeManager.devices(enableMultipartDevices = true)

val doorDevice = devices.first() {
  it.has(GoogleDoorDevice) &&
  it.has(OpenClose)
}

// Obtain a reference to the chime device.
val chime = multipartDevices.first() {
  it.has(ChimeDevice) &&
  it.has(Chime)
}

// Extract the AutomationPartPath for the specific Chime part
val chimePartPath = chime.automationPart(chime.part(ChimeDevice).first())!!

// Build the automation
val chimeAutomation = automation {
  sequential {
    val doorOpenClose = stateReader<_>(doorDevice, GoogleDoorDevice, OpenClose)
    // Starter: When the door state changes
    val starterNode = starter<_>(doorDevice, GoogleDoorDevice, OpenClose)
    condition {
     expression = doorOpenClose.openPercent greaterThan(0)
    }
    // Action: Play a chime sound
    action(chimePartPath) {
      command(Chime.playChimeSound())
    }
  }
}

एक से ज़्यादा डिवाइसों के साथ काम करने वाले डिवाइसों का इस्तेमाल करके ऑटोमेशन सेट अप करने के बारे में ज़्यादा जानने के लिए, एक से ज़्यादा डिवाइसों के साथ काम करने वाले डिवाइसों के लिए ऑटोमेशन लेख पढ़ें.

किसी डिवाइस के लिए कनेक्टिविटी की जांच करना

किसी डिवाइस के लिए कनेक्टिविटी की जांच, डिवाइस टाइप के लेवल पर की जाती है. ऐसा इसलिए, क्योंकि कुछ डिवाइस कई तरह के डिवाइस टाइप के साथ काम करते हैं. जवाब में, डिवाइस की सभी विशेषताओं के लिए कनेक्टिविटी की स्थितियों का कॉम्बिनेशन दिखाया जाता है.

   Android के लिए सैंपल ऐप्लिकेशन में लागू किया गया   
val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState

इंटरनेट कनेक्टिविटी न होने पर, अलग-अलग तरह के डिवाइसों के लिए PARTIALLY_ONLINE स्थिति दिख सकती है. Matter लोकल राउटिंग की वजह से, स्टैंडर्ड ट्रेट अब भी ऑनलाइन हो सकती हैं. हालांकि, क्लाउड पर आधारित ट्रेट ऑफ़लाइन हो जाएंगी.

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

डिवाइस का आईपी पता ढूंढने के लिए, GeneralDiagnostics ट्रेट के networkInterfaces एट्रिब्यूट का इस्तेमाल करें. पते, बाइट अरे के तौर पर दिखाए जाते हैं. इन्हें स्टैंडर्ड IPv4 या IPv6 स्ट्रिंग के तौर पर फ़ॉर्मैट किया जा सकता है:

val ipAddresses =
  trait.networkInterfaces?.flatMap { networkInterface ->
    (networkInterface.ipv4Addresses + networkInterface.ipv6Addresses).mapNotNull { bytes ->
      try {
        java.net.InetAddress.getByAddress(bytes).hostAddress
      } catch (e: java.net.UnknownHostException) {
        null
      }
    }
  } ?: emptyList()