iOS के लिए डोरबेल डिवाइस गाइड

डोरबेल डिवाइस टाइप को दो ट्रेट का इस्तेमाल करके लागू किया जाता है: PushAvStreamTransportTrait, यह पुश-आधारित प्रोटोकॉल का इस्तेमाल करके, ऑडियो और वीडियो स्ट्रीम को ट्रांसफ़र करता है. साथ ही, WebRtcLiveViewTrait, यह लाइव स्ट्रीम को कंट्रोल करने और टॉकबैक की सुविधा देता है.

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

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

दरवाज़े की घंटी

GoogleDoorbellDeviceType

home.matter.6006.types.0113

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

ज़रूरी एट्रिब्यूट
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

डोरबेल

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

BasicInformation ट्रेट में डिवाइस के बारे में यह जानकारी शामिल होती है: वेंडर का नाम, वेंडर आईडी, प्रॉडक्ट आईडी, प्रॉडक्ट का नाम (इसमें मॉडल की जानकारी शामिल होती है), और सॉफ़्टवेयर का वर्शन:

// [START get_device_information]
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!
// [END get_device_information]

सीरियल नंबर पाना

डिवाइस का सीरियल नंबर पाने के लिए, ExtendedBasicInformation ट्रेट की GetSerialNumber कमांड का इस्तेमाल करें. इस उदाहरण में, सीरियल नंबर को serialNumber नाम के वैरिएबल में सेव करने का तरीका दिखाया गया है:

// Assuming extendedBasicInformationTrait: Google.ExtendedBasicInformationTrait
let response = try await extendedBasicInformationTrait.getSerialNumber()
let serialNumber = response.serialNumber

पहले से तैयार जवाब

'पहले से तैयार जवाब' सुविधा की मदद से, उपयोगकर्ता Doorbell डिवाइस को पहले से तय किया गया मैसेज भेज सकता है.

यह सुविधा सिर्फ़ डोरबेल डिवाइसों पर उपलब्ध है. पहले से तय किए गए मैसेज की सूची, पार्टनर ऐप्लिकेशन के लिए उपलब्ध होती है. यह सूची, लोगों को मैसेज चुनने के लिए दिखाई जा सकती है. पहले से तय किए गए मैसेज में उपयोगकर्ता बदलाव नहीं कर सकते.

Quick Responses सुविधा को PresetMessage ट्रेट के ज़रिए लागू किया जाता है.

पहले से सेट किया गया मैसेज चलाना

पहले से सेट किया गया मैसेज चलाने के लिए, playPresetMessage तरीके का इस्तेमाल करें. इसके लिए, availablePhraseTypes प्रॉपर्टी में मौजूद स्ट्रिंग वैल्यू में से किसी एक को पास करें.


import GoogleHomeSDK
import GoogleHomeTypes

func playDoorbellPresetMessage(device: HomeDevice, phraseTypeString: String) async {
    // 1. Retrieve the GoogleDoorbellDeviceType helper on the device
    guard let doorbellDeviceType = await device.types.get(GoogleDoorbellDeviceType.self) else {
        print("This device is not a Google Doorbell or is currently uninitialized.")
        return
    }

    // 2. Extract the Google.PresetMessageTrait
    guard let presetMessageTrait = doorbellDeviceType.traits[Google.PresetMessageTrait.self] else {
        print("PresetMessageTrait is not supported on this device.")
        return
    }

    // 3. (Optional) Check available phrase types supported by the device
    if let availablePhrases = presetMessageTrait.attributes.availablePhraseTypes {
        let phraseTypeNames = availablePhrases.map { $0.phraseType }
        print("Supported quick response phrases: \(phraseTypeNames)")
    }

    // 4. Send the playPresetMessage command asynchronously
    do {
        try await presetMessageTrait.playPresetMessage(phraseType: phraseTypeString)
        print("Preset message successfully requested.")
    } catch {
        print("SDK error occurred playing preset message: \(error)")
    }
}

मीटिंग में बोली जाने वाली भाषा सेट करना

मीटिंग में बोली जाने वाली भाषा सेट करना

LocalizationConfiguration ट्रेट के setActiveLocale तरीके का इस्तेमाल करके, किसी डिवाइस पर बोली जाने वाली भाषा को किसी खास स्थान-भाषा (उदाहरण के लिए, "en_US") पर सेट करें.

// Setting the active language
// Assuming localizationConfigurationTrait: Matter.LocalizationConfigurationTrait
let selectedLocale = "en_US"
try await localizationConfigurationTrait.update {
    $0.setActiveLocale(selectedLocale)
}

डिवाइस के क्लाउड से कनेक्ट होने का सबसे हाल ही का समय पाएं

डिवाइस के क्लाउड से कनेक्ट होने का सबसे हाल का समय जानने के लिए, ExtendedGeneralDiagnostics ट्रेट के lastContactTimestamp एट्रिब्यूट का इस्तेमाल करें:

if let lastContactTimeStamp = extendedGeneralDiagnosticsTrait.attributes.lastContactTimestamp {
  self.lastContactTime = Date(timeIntervalSince1970: Double(lastConnectedTimeStamp))
}

कैमरे के माउंट टाइप की सेटिंग

Mount ट्रेट में, कैमरे को माउंट करने की सेटिंग और स्टेटस की जानकारी होती है. माउंट करने की स्थिति, पता लगाने का टाइप, और माउंट करने के टाइप का नाम जैसे एट्रिब्यूट पढ़े जा सकते हैं. इसके अलावा, Mount ट्रेट का इस्तेमाल करके, डिफ़ॉल्ट माउंट टाइप कॉन्फ़िगरेशन को बदला जा सकता है.

// 1. Get the Mount trait
guard let mountTrait = deviceType.traits[Google.MountTrait.self] else {
  print("Mount trait not supported or configured on this device.")
  return
}

// 2. Read the current mount state, detection type, and type name
let mountState         = mountTrait.attributes.mountState         // Type: Google.MountTrait.MountStateEnum?
let mountDetectionType = mountTrait.attributes.mountDetectionType // Type: Google.MountTrait.MountDetectionTypeEnum?
let mountTypeName      = mountTrait.attributes.mountTypeName      // Type: String?

// 3. Update the mount type override
try await mountTrait.update { mutableTrait in
  mutableTrait.setMountTypeOverride(.official)
}

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

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

let lightConnectivity =
  dimmableLightDeviceType.metadata.sourceConnectivity
  .connectivityState

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

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

डिवाइस का आईपी पता ढूंढने के लिए, GeneralDiagnosticsTrait के networkInterfaces एट्रिब्यूट का इस्तेमाल करें. पते, Data ऑब्जेक्ट के तौर पर दिखाए जाते हैं. इन्हें Network फ़्रेमवर्क का इस्तेमाल करके, स्टैंडर्ड आईपीवी4 या आईपीवी6 स्ट्रिंग के तौर पर फ़ॉर्मैट किया जा सकता है:

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
}

लाइव स्ट्रीम शुरू करना

लाइव स्ट्रीम शुरू करने के लिए, सेशन डिस्क्रिप्शन प्रोटोकॉल (एसडीपी) स्ट्रिंग को WebRtcLiveViewTrait ट्रेट के startLiveView(offerSdp:) तरीके पर भेजें. इससे तीन वैल्यू मिलती हैं:

  • सेशन के लिए एसडीपी.
  • सत्र की अवधि, सेकंड में.
  • सेशन आईडी, जिसका इस्तेमाल सेशन को बढ़ाने या खत्म करने के लिए किया जा सकता है.
public func sendOffer(offerSdp: String) async throws
-> (answerSdp: String, mediaSessionId: String, liveViewDuration: TimeInterval)
{
  do {
    // Sending StartLiveView command
    let response = try await liveViewTrait.startLiveView(
      offerSdp: offerSdp
    )
    // Received StartLiveView response
    return (
      answerSdp: response.answerSdp,
      mediaSessionId: response.mediaSessionId,
      liveViewDuration: TimeInterval(response.liveSessionDurationSeconds)
    )
  } catch {
    // Failed to send StartLiveView command
    throw error
  }
}

लाइव स्ट्रीम की अवधि बढ़ाना

लाइव स्ट्रीम की अवधि पहले से तय होती है. इसके बाद, वे खत्म हो जाती हैं. चालू स्ट्रीम की अवधि बढ़ाने के लिए, extendLiveView(mediaSessionId:optionalArgsProvider:) तरीके का इस्तेमाल करके, अवधि बढ़ाने का अनुरोध करें:

public func extendLiveView(mediaSessionId: String) async throws {
  do {
    // Extending live view
    let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
  } catch {
    // Failed to extend live view
    throw error
  }
}

TalkBack को चालू और बंद करना

TalkBack की सुविधा शुरू करने के लिए, WebRtcLiveViewTrait ट्रेट के startTalkback(mediaSessionId:optionalArgsProvider:) तरीके को कॉल करें. इसे बंद करने के लिए, stopTalkback(mediaSessionId:) का इस्तेमाल करें.

public func toggleTwoWayTalk(isOn: Bool, mediaSessionId: String) async throws {
  do {
    if isOn {
      try await liveViewTrait.startTalkback(mediaSessionId: mediaSessionId)
    } else {
      try await liveViewTrait.stopTalkback(mediaSessionId: mediaSessionId)
    }
  } catch {
    throw HomeError.commandFailed("Failed to toggle twoWayTalk: \(error)")
  }
}

लाइव स्ट्रीम मैनेज करना

लाइव स्ट्रीम की क्वालिटी को अडजस्ट करने से, क्लाइंट के देखने के कॉन्टेक्स्ट के आधार पर बैंडविड्थ के इस्तेमाल को ऑप्टिमाइज़ करने में मदद मिलती है. उदाहरण के लिए, छोटी प्रीव्यू टाइल, ग्रिड व्यू या पिक्चर-इन-पिक्चर मोड में वीडियो दिखाते समय, कम रिज़ॉल्यूशन पर स्विच करना.

WebRtcLiveView ट्रेट का इस्तेमाल करके, क्वालिटी को डाइनैमिक तरीके से बदला जा सकता है. यह ट्रेट, किसी क्लाइंट पर चालू लाइव स्ट्रीम सेशन के रिज़ॉल्यूशन को मैनेज करती है. यह सेटिंग, डिवाइस पर सीधे तौर पर बैंडविड्थ के इस्तेमाल की सेटिंग को कॉन्फ़िगर करने जैसी नहीं है. इससे एक साथ वीडियो देखने वाले सभी दर्शकों और क्लाउड में सेव की गई वीडियो रिकॉर्डिंग की क्वालिटी पर असर पड़ेगा.

यहां दिए गए उदाहरण में, किसी डिवाइस के लिए लाइव स्ट्रीम की क्वालिटी को वापस पाने और अपडेट करने का तरीका बताया गया है:

  • सपोर्ट की गई क्वालिटी के विकल्प वापस पाएं: डिवाइस पर उपलब्ध स्ट्रीमिंग रिज़ॉल्यूशन पाएं. यह कोड, supportedQualityHints प्रॉपर्टी का इस्तेमाल करके, WebRtcLiveView ट्रेट से क्वेरी करता है. इससे, स्ट्रीम की उन क्वालिटी को QualityHint वैल्यू की सूची के तौर पर दिखाया जाता है जो काम करती हैं. जैसे, .sd, .hd, .fhd, .qhd या .uhd.

  • लाइव स्ट्रीम की क्वालिटी बदलना: चालू लाइव स्ट्रीम का रिज़ॉल्यूशन बदलने के लिए, चुने गए QualityHint को लागू करें. उदाहरण के लिए, स्टैंडर्ड डेफ़िनिशन से हाई डेफ़िनिशन पर स्विच करना. updateQualityHint फ़ंक्शन, WebRtcLiveView ट्रेट के changeLiveViewQuality तरीके का इस्तेमाल करके, चुने गए QualityHint कॉन्फ़िगरेशन को चालू मीडिया सेशन पर लागू करता है.

public var supportedQualityHints: [Google.WebRtcLiveViewTrait.QualityHint] {
  return liveViewTrait?.attributes.supportedQualityHints ?? []
}

public func updateQualityHint(
  liveViewTrait: Google.WebRtcLiveViewTrait,
  hint: Google.WebRtcLiveViewTrait.QualityHint,
  mediaSessionId: String
) async {
  do {
    _ = try await liveViewTrait.changeLiveViewQuality(
      mediaSessionId: mediaSessionId,
      qualityHint: hint
    )
  } catch {
    // error
  }
}

रिकॉर्डिंग की सुविधा को चालू और बंद करना

कैमरे की रिकॉर्डिंग की सुविधा चालू करने के लिए, PushAvStreamTransportTrait ट्रेट के setTransportStatus(transportStatus:optionalArgsProvider:) तरीके में TransportStatusEnum.Active पास करें. रिकॉर्डिंग की सुविधा बंद करने के लिए, इसे TransportStatusEnum.Inactive पर सेट करें. यहां दिए गए उदाहरण में, हमने इन कॉल को एक ही कॉल में रैप किया है. इसमें रिकॉर्डिंग की सुविधा को टॉगल करने के लिए Boolean का इस्तेमाल किया गया है:

public func toggleIsRecording(isOn: Bool) {
  self.uiState = .loading

  guard let pushAvStreamTransportTrait else {
    // PushAvStreamTransportTrait not found.
    return
  }
  Task {
    do {
      try await pushAvStreamTransportTrait.setTransportStatus(
        transportStatus: isOn ? .active : .inactive)
      if isOn {
        do {
          self.player = try self.createWebRtcPlayer()
        } catch {
          // Failed to initialize WebRtcPlayer
          self.uiState = .disconnected
          return
        }
        await self.player?.initialize()
        self.uiState = .live
      } else {
        self.player = nil
        self.uiState = .off
      }
    } catch {
      // Failed to toggle onOff
    }
  }
}

कैमरे की रिकॉर्डिंग की सुविधा को चालू या बंद करने का मतलब है कि कैमरे का वीडियो चालू या बंद करना. जब कैमरे का वीडियो चालू होता है, तब वह रिकॉर्डिंग कर रहा होता है. ऐसा इवेंट और उनसे जुड़ी क्लिप के लिए किया जाता है.

जब रिकॉर्डिंग की सुविधा बंद हो (कैमरे का वीडियो बंद हो):

  • connectivityState डिवाइस टाइप के हिसाब से, कैमरा अब भी ऑनलाइन दिख सकता है.
  • लाइव स्ट्रीम को ऐक्सेस नहीं किया जा सकता. साथ ही, कैमरा किसी भी क्लाउड इवेंट का पता नहीं लगाता.

देखें कि रिकॉर्डिंग की सुविधा चालू है या नहीं

यह पता लगाने के लिए कि कैमरे की रिकॉर्डिंग की सुविधा चालू है या नहीं, देखें कि कोई कनेक्शन चालू है या नहीं. यहां दिए गए उदाहरण में, ऐसा करने के लिए दो फ़ंक्शन तय किए गए हैं:

public func isDeviceRecording() -> Bool {
  guard let pushAvStreamTransportTrait else {
    // PushAvStreamTransportTrait not found.
    return false
  }
  guard
    let hasActiveConnection =
      pushAvStreamTransportTrait
      .attributes
      .currentConnections?
      .contains(where: { $0.transportStatus == .active })
  else {
    return false
  }
  return hasActiveConnection
}

बैटरी की सेटिंग

Home API की मदद से, बैटरी से जुड़ी अलग-अलग सेटिंग को कंट्रोल किया जा सकता है.

बैटरी खर्च करने की प्राथमिकता सेट करना

एनर्जी बैलेंस सेट करने से, किसी डिवाइस के लिए बैटरी लाइफ़ और परफ़ॉर्मेंस के बीच समझौता किया जा सकता है. बैटरी की अलग-अलग प्रोफ़ाइलें बनाई जा सकती हैं. जैसे, "एक्सटेंडेड", "बैलेंस्ड", और "परफ़ॉर्मेंस". इसके बाद, इन प्रोफ़ाइलों के बीच स्विच किया जा सकता है.

इस सुविधा को लागू करने के लिए, EnergyPreference ट्रेट के currentEnergyBalance एट्रिब्यूट को अपडेट किया जाता है. इस एट्रिब्यूट के लिए, पूर्णांक इंडेक्स स्वीकार किया जाता है. यह इंडेक्स, डिवाइस की energyBalances सूची में तय की गई किसी प्रोफ़ाइल से मेल खाता है. उदाहरण के लिए, EXTENDED के लिए 0, BALANCED के लिए 1, और PERFORMANCE के लिए 2.

currentEnergyBalance के लिए null वैल्यू से पता चलता है कि डिवाइस, कस्टम प्रोफ़ाइल का इस्तेमाल कर रहा है. यह सिर्फ़ पढ़ने के लिए उपलब्ध है.

यहां currentEnergyBalance एट्रिब्यूट के इस्तेमाल का एक उदाहरण दिया गया है. इसके बाद, एट्रिब्यूट का इस्तेमाल करने वाला कोड स्निपेट दिया गया है.

// Example energyBalances list
{
  "energy_balances": [
    {
      "step": 0,
      "label": "EXTENDED"
    },
    {
      "step": 50,
      "label": "BALANCED"
    },
    {
      "step": 100,
      "label": "PERFORMANCE"
    }
  ]
}
private func setBatteryUsage(to option: UInt8) async throws {
  _ = try await energyPreferenceTrait.update {
    $0.setCurrentEnergyBalance(option)
  }
}

बैटरी सेवर अपने-आप चालू होने की सुविधा चालू करना

इस सुविधा को कॉन्फ़िगर करने के लिए, EnergyPreference ट्रेट के currentLowPowerModeSensitivity एट्रिब्यूट की वैल्यू अपडेट करें. इस एट्रिब्यूट में, संवेदनशीलता का लेवल चुनने के लिए इंडेक्स का इस्तेमाल किया जाता है. इसमें 0 का मतलब आम तौर पर Disabled होता है और 1 का मतलब Enabled या Automatic होता है.

private func setAutoBatterySaver(to value: Bool) async throws {
  _ = try await energyPreferenceTrait.update {
    $0.setCurrentLowPowerModeSensitivity(value ? 1 : 0)
  }
}

बैटरी चार्ज होने की स्थिति पाना

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

self.chargingState = powerSourceTrait.attributes.batChargeState

var description: String
switch self.chargingState {
case .isCharging:
  description = "Charging"
case .isAtFullCharge:
  description = "Full"
case .isNotCharging:
  description = "Not Charging"
default:
  description = "Unknown"
}

बैटरी लेवल की जानकारी पाना

बैटरी का मौजूदा लेवल पाने के लिए, PowerSource ट्रेट के batChargeLevel एट्रिब्यूट का इस्तेमाल करें. यह लेवल OK, Warning (कम) या Critical है.

self.batteryLevel = powerSourceTrait.attributes.batChargeLevel

var description: String
switch self.batteryLevel {
case .ok:
  description = "OK"
case .warning:
  description = "Warning"
case .critical:
  description = "Critical"
default:
  description = "Unknown"
}

पावर सोर्स की जानकारी पाना

डिवाइस के पावर सोर्स का पता लगाने के लिए, PowerSource ट्रेट के BatPresent और wiredPresent एट्रिब्यूट का इस्तेमाल करें.

if powerSourceTrait.attributes.wiredPresent ?? false {
  self.powerSourceType = .wired
} else if powerSourceTrait.attributes.batPresent ?? false {
  self.powerSourceType = .battery
} else {
  self.powerSourceType = nil
}

ऑडियो सेटिंग

Home APIs की मदद से, ऑडियो की अलग-अलग सेटिंग कंट्रोल की जा सकती हैं.

माइक्रोफ़ोन चालू या बंद करना

डिवाइस के माइक्रोफ़ोन को चालू या बंद करने के लिए, setMicrophoneMuted फ़ंक्शन का इस्तेमाल करके, CameraAvStreamManagementTrait ट्रेट के microphoneMuted एट्रिब्यूट की वैल्यू अपडेट करें:

// Turn the device's microphone on or off
func setMicrophone(on: Bool) async {
  do {
    _ = try await self.cameraAvStreamManagementTrait?.update {
      $0.setMicrophoneMuted(!on)
    }
  } catch {
    // Error
  }
}

ऑडियो रिकॉर्डिंग की सुविधा चालू या बंद करना

डिवाइस के लिए ऑडियो रिकॉर्डिंग की सुविधा चालू या बंद करने के लिए, CameraAvStreamManagementTrait ट्रेट के recordingMicrophoneMuted एट्रिब्यूट को अपडेट करें. इसके लिए, पहले से मौजूद setRecordingMicrophoneMuted फ़ंक्शन का इस्तेमाल करें:

// Turn audio recording on or off for the device
func setAudioRecording(on: Bool) async {
  do {
    _ = try await self.cameraAvStreamManagementTrait?.update {
      $0.setRecordingMicrophoneMuted(!on)
    }
  } catch {
    // Error
  }
}

स्पीकर की आवाज़ कम या ज़्यादा करना

डिवाइस के स्पीकर का वॉल्यूम अडजस्ट करने के लिए, setSpeakerVolumeLevel फ़ंक्शन का इस्तेमाल करके, CameraAvStreamManagementTrait ट्रेट के speakerVolumeLevel एट्रिब्यूट को अपडेट करें:

// Adjust the camera speaker volume
func setSpeakerVolume(to value: UInt8) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setSpeakerVolumeLevel(value)
    }
  } catch {
    // Error
  }
}

ऐक्टिविटी ज़ोन की सेटिंग

ZoneManagement ट्रेट, कैमरे और दरवाज़े की घंटी वाले डिवाइसों पर, दिलचस्पी वाले कस्टम क्षेत्रों (गतिविधि ज़ोन) को मैनेज करने के लिए एक इंटरफ़ेस उपलब्ध कराती है. इन ज़ोन का इस्तेमाल, डिवाइस के फ़ील्ड ऑफ़ व्यू में मौजूद किसी खास जगह पर इवेंट का पता लगाने के लिए किया जाता है. जैसे, किसी व्यक्ति या वाहन की गतिविधि.

ऐक्टिविटी ज़ोन को उपयोगकर्ता, पार्टनर ऐप्लिकेशन में कॉन्फ़िगर करता है. इससे वह कैमरे के फ़ील्ड ऑफ़ व्यू में मौजूद खास जगहों पर ज़ोन बना पाता है. इसके बाद, उपयोगकर्ता के तय किए गए इन ज़ोन को, इस ट्रेट में इस्तेमाल किए गए स्ट्रक्चर में बदल दिया जाता है. ऐक्टिविटी ज़ोन के काम करने के तरीके के बारे में ज़्यादा जानने के लिए, ऐक्टिविटी ज़ोन सेट अप करना और उनका इस्तेमाल करना लेख पढ़ें.

गतिविधि वाले ज़ोन आम तौर पर, 2D कार्टेशियन कोऑर्डिनेट का इस्तेमाल करके तय किए जाते हैं. इस ट्रेट से वर्टेक्स के लिए TwoDCartesianVertexStruct और ज़ोन की परिभाषा के लिए TwoDCartesianZoneStruct मिलता है. ज़ोन की परिभाषा में नाम, वर्टेक्स, रंग, और इस्तेमाल शामिल होता है.

ऐक्टिविटी ज़ोन की जांच करना

गतिविधि वाले ज़ोन दिखाने के लिए, ZoneManagement ट्रेट के zones एट्रिब्यूट की वैल्यू देखें.

let zoneManagementTrait: Google.ZoneManagementTrait

self.zones = zoneManagementTrait.attributes.zones ?? []

गतिविधि ज़ोन जोड़ना

नया ज़ोन बनाने के लिए, createTwoDCartesianZone कमांड का इस्तेमाल करें. इस कमांड में TwoDCartesianZoneStruct का इस्तेमाल किया जाता है. इससे ज़ोन का नाम, वर्टेक्स, रंग, और इस्तेमाल तय किया जाता है.

यहां दिए गए उदाहरण में, "Front Porch" नाम का एक ज़ोन बनाने का तरीका दिखाया गया है. इसमें चार वर्टेक्स हैं, इसका रंग सैल्मन (#F439A0) है, और इसका इस्तेमाल मोशन का पता लगाने के लिए किया जाता है.

import GoogleHomeSDK
import GoogleHomeTypes

func createFrontPorchZone(trait: Google.ZoneManagementTrait) async {
  // 1. Define the vertices for the zone (2D Cartesian coordinates)
  // Values are UInt16, typically scaled to the device's twoDCartesianMax.
  let vertices = [
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 260, y = 422),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1049, y = 0),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 0),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 950),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1630, y = 1349),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 880, y = 2048),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 0, y = 2048),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 638, y = 1090)
  ]

  // 2. Define the zone structure using the given SDK struct
  let newZone = Google.ZoneManagementTrait.TwoDCartesianZoneStruct(
    name: "Front Porch",
    use: [.motion], // ZoneUseEnum.motion
    vertices: vertices,
    // Color is a hex string (for example, Salmon/Pink)
    color: "#F439A0"
  )

  do {
    // 3. Execute the raw command to add the zone to the device
    // This returns the created zone's ID (UInt16).
    var newZoneID = try await trait.createTwoDCartesianZone(zone: newZone)
  } catch {
    // Error
  }
}

गतिविधि वाले ज़ोन की जानकारी अपडेट करना

किसी मौजूदा ज़ोन को अपडेट करने के लिए, updateTwoDCartesianZone कमांड का इस्तेमाल करें. इस कमांड के लिए, zoneId और अपडेट किया गया TwoDCartesianZoneStruct ज़रूरी है.

let zoneManagementTrait: Google.ZoneManagementTrait
let zoneID: UInt16
let zone: Google.ZoneManagementTrait.TwoDCartesianZoneStruct

do {
  _ = try await zoneManagementTrait.updateTwoDCartesianZone(
        zoneID: zoneID, zone: zone)
} catch {
  // Error
}

गतिविधि ज़ोन मिटाना

किसी ज़ोन को हटाने के लिए, removeZone कमांड के साथ zoneId का इस्तेमाल करें.

let zoneManagementTrait: Google.ZoneManagementTrait
let zoneID: UInt16

do {
  _ = try await zoneManagementTrait.removeZone(zoneID: zoneID)
} catch {
  // Error
}

साउंड इवेंट ट्रिगर

AvStreamAnalysis ट्रेट, कैमरे और दरवाज़े की घंटी वाले डिवाइसों पर, इवेंट का पता लगाने वाले ट्रिगर को मैनेज करने के लिए इंटरफ़ेस उपलब्ध कराती है. विज़न पर आधारित ट्रिगर (जैसे, लोग या वाहन) किसी ज़ोन के हिसाब से सेट किए जा सकते हैं. हालांकि, आवाज़ से जुड़े ट्रिगर आम तौर पर डिवाइस के लेवल पर कॉन्फ़िगर किए जाते हैं.

EventTriggerTypeEnum की मदद से आवाज़ का पता लगाने के लिए, ये ट्रिगर टाइप उपलब्ध हैं:

मोड Enum वैल्यू ब्यौरा
आवाज़ Sound आवाज़ का पता लगाने की सामान्य सुविधा.
बातचीत करने की आवाज़ PersonTalking आवाज़ का पता लगाता है.
कुत्ते के भौंकने की आवाज़ DogBark यह कुत्ते के भौंकने की आवाज़ का पता लगाता है.
कांच टूटने की आवाज़ GlassBreak कांच टूटने की आवाज़ का पता लगाता है.
धुएं का अलार्म SmokeAlarm यह धुएं के अलार्म का पता लगाता है. इसकी पहचान अक्सर T3 के सुनाई देने वाले पैटर्न से होती है. इसमें तीन छोटी बीप के बाद कुछ देर का ठहराव होता है.
कार्बन मोनोऑक्साइड का अलार्म CoAlarm यह कार्बन मोनोऑक्साइड (CO) के अलार्म का पता लगाता है. आम तौर पर, इसकी पहचान T4 के सुनाई देने वाले पैटर्न से होती है. इसमें चार छोटी बीप के बाद कुछ देर का ठहराव होता है.

आवाज़ पहचानने की सुविधा की स्थिति देखना

उपयोगकर्ता को आवाज़ का पता लगाने की सुविधा की मौजूदा स्थिति दिखाने के लिए, आपको यह देखना होगा कि डिवाइस पर कौनसी सुविधाएं काम करती हैं और डिवाइस के हार्डवेयर में कौनसी सुविधाएं चालू हैं. इन दो एट्रिब्यूट की जांच की जानी चाहिए:

iOS डेवलपमेंट में, आम तौर पर इन एट्रिब्यूट को पढ़ने के लिए, डिवाइस से AvStreamAnalysis ट्रेट को ऐक्सेस किया जाता है.

// Example struct to store event triggers
public struct EventTrigger: Equatable {
  public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum
  public var enabled: Bool
}

let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait

let possibleEventTriggers = avStreamAnalysisTrait.attributes.supportedEventTriggers ?? []
let enabledEventTriggers = avStreamAnalysisTrait.attributes.enabledEventTriggers ?? []

let eventTriggers [EventTrigger] = []
for trigger in possibleEventTriggers {
  self.eventTriggers.append(
    EventTrigger(
      id: trigger,
      enabled: enabledEventTriggers.contains(trigger)
    )
  )
}

चालू किए गए ट्रिगर के सेट को अपडेट करना

चालू किए गए ट्रिगर के सेट को अपडेट करने के लिए, SetOrUpdateEventDetectionTriggers कमांड का इस्तेमाल करें. यह कमांड, EventTriggerEnablement स्ट्रक्चर की सूची लेती है.

// Example struct to store event triggers
public struct EventTrigger: Equatable {
  public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum
  public var enabled: Bool
}

let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait
let eventTriggers: [EventTrigger]

let enabledEventTriggers = eventTriggers.map {
  Google.AvStreamAnalysisTrait.EventTriggerEnablement(
    eventTriggerType: $0.id,
    enablementStatus: $0.enabled ? .enabled : .disabled
  )
}

try await avStreamAnalysisTrait.setOrUpdateEventDetectionTriggers(
  eventTriggerEnablements: enabledEventTriggers
)

रिकॉर्डिंग मोड

RecordingMode ट्रेट, कैमरा और दरवाज़े की घंटी वाले डिवाइसों पर वीडियो और इमेज रिकॉर्डिंग के व्यवहार को मैनेज करने के लिए एक इंटरफ़ेस उपलब्ध कराती है. इससे उपयोगकर्ताओं को लगातार रिकॉर्डिंग, इवेंट के आधार पर रिकॉर्डिंग या रिकॉर्डिंग की सुविधा को पूरी तरह से बंद करने (सिर्फ़ लाइव व्यू के लिए) का विकल्प मिलता है.

RecordingModeEnum से रिकॉर्डिंग की उपलब्ध रणनीतियों के बारे में पता चलता है:

मोड Enum वैल्यू ब्यौरा
बंद है Disabled रिकॉर्डिंग की सुविधा पूरी तरह से बंद है. इसका इस्तेमाल मुख्य रूप से लेगसी डिवाइसों के लिए किया जाता है.
सीवीआर (लगातार वीडियो रिकॉर्डिंग) Cvr वीडियो को हर समय रिकॉर्ड किया जाता है. इसके लिए, सदस्यता लेना ज़रूरी है (उदाहरण के लिए, Google Home Premium.
ईबीआर (इवेंट के आधार पर रिकॉर्डिंग) Ebr रिकॉर्डिंग, इवेंट (व्यक्ति, गति) के हिसाब से ट्रिगर होती है. वीडियो की अवधि, इवेंट की अवधि और सदस्यता पर निर्भर करती है.
ETR (इवेंट ट्रिगर होने पर रिकॉर्डिंग शुरू होना) Etr इवेंट से ट्रिगर होने वाली, कम अवधि की झलक रिकॉर्डिंग (उदाहरण के लिए, 10 सेकंड).
लाइव व्यू LiveView रिकॉर्डिंग बंद है, लेकिन उपयोगकर्ता अब भी लाइव स्ट्रीम ऐक्सेस कर सकते हैं.
स्टिल इमेज Images इवेंट होने पर, वीडियो के बजाय स्नैपशॉट रिकॉर्ड किए जाते हैं.

रिकॉर्डिंग मोड देखना

मौजूदा रिकॉर्डिंग कॉन्फ़िगरेशन दिखाने के लिए, RecordingMode ट्रेट के एट्रिब्यूट देखें:

// Example struct to store recording modes.
public struct RecordingMode: Hashable {
  public let id: UInt8
  public let mode: Google.RecordingModeTrait.RecordingModeEnum
}

let recordingModeTrait: Google.RecordingModeTrait

if let availableRecordingModes = recordingModeTrait.attributes.availableRecordingModes,
   let supportedRecordingModes = recordingModeTrait.attributes.supportedRecordingModes,
   let selectedRecordingMode = recordingModeTrait.attributes.selectedRecordingMode {

  var recordingModes: [RecordingMode] = []

  for recordingModeId in availableRecordingModes {
    guard Int(recordingModeId) < supportedRecordingModes.count,
          Int(recordingModeId) >= 0 else {
      // Out of bounds error
    }

    recordingModes.append(
      RecordingMode(
        id: recordingModeId,
        mode: supportedRecordingModes[Int(recordingModeId)].recordingMode,
      )
    )
  }
}

रिकॉर्डिंग का मोड बदलना

अपडेट करने से पहले, पक्का करें कि supportedRecordingModes एट्रिब्यूट में चुना गया इंडेक्स, availableRecordingModes एट्रिब्यूट में मौजूद हो.

चुने गए मोड को अपडेट करने के लिए, setSelectedRecordingMode फ़ंक्शन का इस्तेमाल करें. इसके लिए, चुने गए मोड का इंडेक्स पास करें:

let recordingModeTrait: Google.RecordingModeTrait
let recordingModeID: UInt8

_ = try await recordingModeTrait.update {
  $0.setSelectedRecordingMode(recordingModeID)
}

अन्य सेटिंग

Home API की मदद से, कई अन्य सेटिंग कंट्रोल की जा सकती हैं.

नाइट विज़न मोड को चालू या बंद करना

कैमरे के लिए नाइट विज़न की सुविधा चालू या बंद करने के लिए, TriStateAutoEnum का इस्तेमाल करें. इससे setNightVision फ़ंक्शन में मौजूद CameraAvStreamManagementTrait ट्रेट के nightVision एट्रिब्यूट को अपडेट किया जा सकता है:

// Turn night vision on or off
func setNightVision(
  to value: Google.CameraAvStreamManagementTrait.TriStateAutoEnum
) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setNightVision(value)
    }
  } catch {
    // Error
  }
}

स्टेटस एलईडी की चमक बदलना

स्टेटस एलईडी की चमक बदलने के लिए, ThreeLevelAutoEnum का इस्तेमाल करके CameraAvStreamManagementTrait ट्रेट के statusLightBrightness एट्रिब्यूट को अपडेट करें. इसके लिए, पहले से मौजूद setStatusLightBrightness फ़ंक्शन का इस्तेमाल करें:

// Set the LED brightness
func setStatusLightBrightness(
  to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setStatusLightBrightness(value)
    }
  } catch {
    // Error
  }
}

कैमरे का व्यूपोर्ट बदलना

कैमरे का व्यू पोर्ट, Nest Cam के वीडियो को ज़ूम और बेहतर बनाएं सहायता लेख में बताई गई ज़ूम और क्रॉप करने की सुविधा के जैसा ही होता है.

व्यूपोर्ट को ViewportStruct में तय किया जाता है. इसमें चार वैल्यू होती हैं. इनका इस्तेमाल व्यूपोर्ट के निर्देशांकों के तौर पर किया जाता है. कोऑर्डिनेट इस तरह तय किए जाते हैं:

(x1,y1) -- (x2,y1)
   |          |
(x1,y2) -- (x2,y2)

ViewportStruct के लिए वैल्यू तय करना, ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) और कैमरे को लागू करने के तरीके पर निर्भर करता है. कैमरे के वीडियो का व्यूपोर्ट सेट करने के लिए, CameraAvStreamManagementTrait ट्रेट के viewport एट्रिब्यूट को ViewportStruct के साथ अपडेट करें. इसके लिए, पहले से मौजूद setViewport फ़ंक्शन का इस्तेमाल करें.

func setCrop(x1: UInt16, y1: UInt16, x2: UInt16, y2: UInt16) {

  let viewport = Google.CameraAvStreamManagementTrait.ViewportStruct(
    x1: x1,
    y1: y1,
    x2: x2,
    y2: y2
  )

  Task {
    do {
      try await cameraAvStreamManagementTrait.update {
        $0.setViewport(viewport)
      }
    } catch {
      // Error
    }
  }

}

TransportOptionsStruct जनरेट करना

कुछ सेटिंग के लिए, TransportOptionsStruct में मौजूद प्रॉपर्टी में बदलाव करना ज़रूरी होता है. इसके बाद, इसे स्ट्रीमिंग कनेक्शन के ट्रांसपोर्ट विकल्पों में पास किया जाता है. Swift के लिए, किसी भी प्रॉपर्टी को अपडेट करने से पहले इस स्ट्रक्चर को जनरेट करना ज़रूरी है.

इस हेल्पर फ़ंक्शन का इस्तेमाल करके, स्ट्रक्चर जनरेट करें. इसका इस्तेमाल सेटिंग में इन बदलावों के लिए किया जा सकता है:

func getTransportOptions(
  transportOptions: Google.PushAvStreamTransportTrait.TransportOptionsStruct,
  wakeUpSensitivity: UInt8?,
  maxEventLength: UInt32?
) async throws
  -> Google.PushAvStreamTransportTrait.TransportOptionsStruct
{

  var newMotionTimeControl:
    Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct? = nil
  if let maxEventLength {
    guard let motionTimeControl = transportOptions.triggerOptions.motionTimeControl else {
      throw HomeError.failedPrecondition(
        // Error - cannot update max event length without motion time control
    }
    newMotionTimeControl =
      Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct(
        initialDuration: motionTimeControl.initialDuration,
        augmentationDuration: motionTimeControl.augmentationDuration,
        maxDuration: maxEventLength,
        blindDuration: motionTimeControl.blindDuration
      )
  }

  return Google.PushAvStreamTransportTrait.TransportOptionsStruct(
    streamUsage: .recording,
    videoStreamID: nil,
    audioStreamID: nil,
    tlsEndpointID: transportOptions.tlsEndpointID,
    url: transportOptions.url,
    triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct(
      triggerType: .motion,
      motionZones: nil,
      motionSensitivity: wakeUpSensitivity,
      motionTimeControl: newMotionTimeControl,
      maxPreRollLen: nil
    ),
    ingestMethod: .cmafIngest,
    containerOptions: Google.PushAvStreamTransportTrait.ContainerOptionsStruct(
      containerType: .cmaf,
      cmafContainerOptions: nil
    ),
    expiryTime: nil
  )
}

private func getRecordingConnection() async throws
  -> Google.PushAvStreamTransportTrait.TransportConfigurationStruct?
{
  guard let pushAvStreamTransportTrait else {
    // Error - PushAvStreamTransport trait not available
    return nil
  }

  let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations

  for connection in connections {
    guard let transportOptions = connection.transportOptions,
      transportOptions.streamUsage == .recording
    else {
      continue
    }

    return connection
  }

  return nil
}

Analytics को चालू या बंद करना

हर डिवाइस, Google Home क्लाउड को आंकड़ों का ज़्यादा डेटा भेजने के लिए अलग-अलग ऑप्ट-इन कर सकता है. इसके लिए, Home API के लिए क्लाउड मॉनिटरिंग देखें.

किसी डिवाइस के लिए Analytics की सुविधा चालू करने के लिए, ExtendedGeneralDiagnosticsTrait की analyticsEnabled प्रॉपर्टी को true पर सेट करें. analyticsEnabled को सेट करने पर, logUploadEnabled प्रॉपर्टी अपने-आप true पर सेट हो जाती है. इससे, Google Home क्लाउड पर आंकड़ों की लॉग फ़ाइलें अपलोड की जा सकती हैं.

// Enable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
  $0.setAnalyticsEnabled(true)
}

// Disable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
  $0.setAnalyticsEnabled(false)
}

ट्रांसपोर्ट और रिकॉर्डिंग के कॉन्फ़िगरेशन

इस सेक्शन में, कैमरा स्ट्रीमिंग की क्वालिटी और इवेंट ट्रिगर करने से जुड़ी सेटिंग के बारे में बताया गया है. इन सेटिंग को PushAvStreamTransport ट्रेट मैनेज करता है.

ट्रांसपोर्ट की सेटिंग पढ़ना

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

// Assuming access to
// var pushAvStreamTransportTrait: Google.PushAvStreamTransportTrait
let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations

// Locate the connection designated for recording
let recordingConnection = connections.first { connection in
    guard let transportOptions = connection.transportOptions else { return false }
    return transportOptions.streamUsage == .recording
}

let options = recordingConnection?.transportOptions

// 1. Bandwidth Quality (Video Stream ID)
let videoStreamId = options?.videoStreamID

// 2. Wake-up Sensitivity (Motion Sensitivity)
let wakeUpSensitivity = options?.triggerOptions.motionSensitivity

// 3. Max Event Length (Motion Trigger Time Control)
let maxEventLength = options?.triggerOptions.motionTimeControl?.maxDuration

ट्रांसपोर्ट की सेटिंग अपडेट करना

इस सेक्शन में, ट्रांसपोर्ट की सेटिंग बदलने का तरीका बताया गया है. यह नई वैल्यू वाला एक नया TransportOptionsStruct बनाता है. इसके बाद, modifyPushTransport कमांड का इस्तेमाल करके, अपडेट की गई इन सेटिंग को वापस डिवाइस पर भेजता है. साथ ही, पिछले चरण में मिले रिकॉर्डिंग कनेक्शन पर इन्हें लागू करता है.

इन सेटिंग में बदलाव करने के लिए, TransportOptionsStruct के साथ modifyPushTransport कमांड का इस्तेमाल करें.

// Example: Updating to Max Quality and 30s duration
let currentOptions = recordingConnection!.transportOptions!
let newOptions = Google.PushAvStreamTransportTrait.TransportOptionsStruct(
    streamUsage: .recording,
    videoStreamID: 2, // Max Quality
    tlsEndpointID: currentOptions.tlsEndpointID,
    url: currentOptions.url,
    triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct(
        triggerType: .motion,
        motionSensitivity: 5, // Medium
        motionTimeControl: Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct(
            initialDuration: currentOptions.triggerOptions.motionTimeControl?.initialDuration ?? 10,
            augmentationDuration: currentOptions.triggerOptions.motionTimeControl?.augmentationDuration ?? 5,
            maxDuration: 30,
            blindDuration: currentOptions.triggerOptions.motionTimeControl?.blindDuration ?? 0
        )
    ),
    ingestMethod: currentOptions.ingestMethod,
    containerOptions: currentOptions.containerOptions
)

try await pushAvStreamTransportTrait.modifyPushTransport(
    connectionID: recordingConnection!.connectionID,
    transportOptions: newOptions
)

बैंडविड्थ की क्वालिटी का पता लगाना

TransportOptionsStruct की videoStreamId प्रॉपर्टी, किसी वीडियो स्ट्रीम के कॉन्फ़िगरेशन से जुड़ी होती है.

सपोर्ट की गई वीडियो स्ट्रीम पाने के लिए, allocatedVideoStreams एट्रिब्यूट देखें. यह VideoStreamStructs की सूची होती है. डिवाइस के लिए CameraAvStreamManagement ट्रेट से.

डिवाइस के वेक-अप होने की सेंसिटिविटी को अडजस्ट करना

TransportTriggerOptionsStruct की motionSensitivity प्रॉपर्टी, इन वैल्यू के बराबर होती है:

लेबल वैल्यू (UInt8)
कम 1
मीडियम 5
ज़्यादा 10

इवेंट की ज़्यादा से ज़्यादा अवधि में बदलाव करना

TransportMotionTriggerTimeControlStruct की maxDuration प्रॉपर्टी, यहां दी गई UInt32 अवधि (सेकंड में) के बराबर होती है:

  • 10, 15, 30, 60, 120, 180

घंटी की सेटिंग

Home API की मदद से, डोरबेल की आवाज़ से जुड़ी अलग-अलग सेटिंग को कंट्रोल किया जा सकता है.

घंटी की आवाज़ बदलना

डोरबेल की आवाज़ बदलने के लिए, सबसे पहले डिवाइस में इंस्टॉल की गई आवाज़ों की सूची पाएं. इसके लिए, ChimeTrait ट्रेट के installedChimeSounds एट्रिब्यूट का इस्तेमाल करें:

doorbellChimeTrait.attributes.installedChimeSounds?.compactMap { chimeSound in
  return chimeSound.chimeID, chimeSound.name
}

इसके बाद, बिल्ट-इन setSelectedChime फ़ंक्शन का इस्तेमाल करके, ChimeTrait ट्रेट के selectedChime एट्रिब्यूट को अपडेट करें:

func setDoorbellChime(chimeID: UInt8) async {
  do {
    _ = try await doorbellChimeTrait.update {
      $0.setSelectedChime(chimeID)
    }
  } catch {
    // Error
  }
}

बाहरी चाइम का इस्तेमाल करना

डोरबेल को इस तरह कॉन्फ़िगर किया जा सकता है कि वह घर के अंदर लगी मैकेनिकल बेल जैसे बाहरी चाइम का इस्तेमाल करे. दरवाज़े की घंटी को इंस्टॉल करते समय इसे कॉन्फ़िगर किया जाना चाहिए, ताकि बाहरी चाइम को संभावित नुकसान से बचाया जा सके.

किस तरह का बाहरी चाइम इंस्टॉल किया गया है, यह बताने के लिए ExternalChimeType का इस्तेमाल करें. इससे setExternalChime फ़ंक्शन का इस्तेमाल करके, ChimeTrait ट्रेट के externalChime एट्रिब्यूट को अपडेट किया जा सकता है:

// Indicate the external chime is mechanical
func setExternalChime(to value: Google.ChimeTrait.ExternalChimeType) async {
  do {
    _ = try await doorbellChimeTrait.update {
      $0.setExternalChime(value)
    }
  } catch {
    // Error
  }
}

बाहरी घंटी बजने की अवधि बदलना

बाहरी डिवाइस पर घंटी बजने की अवधि को सेकंड में सेट किया जा सकता है. इसके लिए, Home API का इस्तेमाल किया जा सकता है. अगर बाहरी डिवाइस में सूचना की अवधि सेट करने की सुविधा है, तो उपयोगकर्ता इसे कॉन्फ़िगर कर सकता है.

यहां सेट की गई वैल्यू, बाहरी घंटी की खास बातों और उसके लिए सुझाई गई अवधि पर निर्भर करती है.

बाहरी घंटी के बजने की अवधि बदलने के लिए, ChimeTrait ट्रेट के externalChimeDurationSeconds एट्रिब्यूट को अपडेट करें. इसके लिए, पहले से मौजूद setExternalChimeDurationSeconds फ़ंक्शन का इस्तेमाल करें:

// Change the external chime duration
func setExternalChimeDuration(to value: UInt16) async {
  do {
    _ = try await doorbellChimeTrait.update {
      $0.setExternalChimeDuration(value)
    }
  } catch {
    // Error
  }
}

घंटी की आवाज़ वाली थीम चालू करना

ऐसा हो सकता है कि कुछ डोरबेल में ऐसी घंटियां हों जो सिर्फ़ सीमित समय के लिए उपलब्ध हों. उदाहरण के लिए, छुट्टियों के हिसाब से खास घंटियां. इन्हें चाइम थीम कहा जाता है.

किसी उपयोगकर्ता के लिए कौनसी चाइम थीम उपलब्ध हैं, यह देखने के लिए टाइमबॉक्स फ़िल्टर बनाएं. इसके बाद, इसका इस्तेमाल ChimeThemes ट्रेट की getAvailableThemes कमांड के नतीजों को फ़िल्टर करने के लिए करें. इससे उपलब्ध थीम की सूची दिखती है. इसमें थीम के नाम भी शामिल होते हैं.

यहां दिए गए उदाहरण में, सूची को फ़िल्टर करने का तरीका बताया गया है. किसी थीम को तब ऐक्टिव माना जाता है, जब मौजूदा समय, उसके शुरू और खत्म होने के समय (startTimeSeconds और endTimeSeconds वैल्यू) के बीच हो. अगर शुरू होने का समय सेट नहीं किया गया है, तो इसे शुरू से ही ऐक्टिव माना जाता है. अगर खत्म होने का समय सेट नहीं किया जाता है, तो यह हमेशा के लिए चालू रहता है. अगर दोनों मौजूद नहीं हैं, तो थीम हमेशा चालू रहती है.

let chimeThemes = try await chimeThemeTrait.getAvailableThemes().themes

if !chimeThemes.isEmpty {
  var chimeThemeSettings = []
  for chimeTheme in chimeThemes {
    let currentDateTime = UInt64(Date().timeIntervalSince1970)

    // Only show chime themes that are active.
    if chimeTheme.startTimeSeconds ?? 0 &lt;= currentDateTime
      &amp;&amp; chimeTheme.endTimeSeconds ?? UInt64.max &gt;= currentDateTime
    {
      self.chimeThemeSettings.append(chimeTheme.name)
    }
  }
}

अपनी पसंद की थीम का नाम जानने के बाद, जैसे कि Christmas, ChimeThemes ChimeThemes ट्रेट पर मौजूद setSelectedTimeboxedThemeName() फ़ंक्शन का इस्तेमाल करके, उसे चुना जा सकता है.

private func setChimeTheme(to value: String) async throws {
  _ = try await chimeThemeTrait.update {
    $0.setSelectedTimeboxedThemeName(value)
  }
}

'Nest Hello वीडियो डोरबेल' बजने पर मिलने वाली सूचनाओं की सेटिंग

Home API के VisitorAnnouncement ट्रेट का इस्तेमाल करके, दरवाज़े की घंटी के लिए, आने वाले व्यक्ति की सूचना देने की सेटिंग को मैनेज किया जा सकता है और इसके बारे में क्वेरी की जा सकती है. इस ट्रेट से यह कंट्रोल किया जाता है कि जब कोई व्यक्ति दरवाज़े की घंटी बजाता है, तो Google स्मार्ट स्पीकर या डिसप्ले पर उसकी मौजूदगी की सूचना दी जाए या नहीं.

यहां दिए गए उदाहरण में, यह देखने का तरीका बताया गया है कि मेहमानों के लिए सूचनाएं पाने की सुविधा चालू है या नहीं. साथ ही, इस सेटिंग को अपडेट करने का तरीका भी बताया गया है:

let visitorAnnouncementsEnabled: Bool = visitorAnnouncementTrait.attributes.visitorAnnouncementsEnabled

let value: Bool
_ = try await self.visitorAnnouncementTrait?.update {
  $0.setVisitorAnnouncementsEnabled(value)
}