অ্যান্ড্রয়েডের জন্য ডোরবেল ডিভাইস গাইড

ডোরবেল ডিভাইসের ধরণটি দুটি বৈশিষ্ট্য ব্যবহার করে বাস্তবায়িত হয়: PushAvStreamTransport , যা পুশ-ভিত্তিক প্রোটোকল ব্যবহার করে অডিও এবং ভিডিও স্ট্রিম পরিবহন পরিচালনা করে এবং WebRtcLiveView , যা লাইভস্ট্রিম এবং টকব্যাক নিয়ন্ত্রণ করার ক্ষমতা প্রদান করে।

কোনও বৈশিষ্ট্য ব্যবহার করার আগে বা বৈশিষ্ট্য আপডেট করার চেষ্টা করার আগে সর্বদা ডিভাইসের জন্য বৈশিষ্ট্য এবং কমান্ড সমর্থন পরীক্ষা করুন। নিয়ন্ত্রণ ডিভাইসগুলি দেখুনAndroid আরও তথ্যের জন্য.

হোম এপিআই ডিভাইসের ধরণ বৈশিষ্ট্য কোটলিন নমুনা অ্যাপ ব্যবহারের ধরণ

ডোরবেল

Google Doorbell Device

home.matter.6006.types.0113

দরজার বাইরের একটি বোতাম দ্বারা চালিত একটি ডিভাইস যা একটি শ্রবণযোগ্য এবং/অথবা দৃশ্যমান সংকেত তৈরি করে, যা দরজার অন্য পাশে কোথাও থাকা ব্যক্তির দৃষ্টি আকর্ষণ করার জন্য ব্যবহৃত হয়। ডোরবেলগুলিতে অ্যাক্সেসযোগ্য লাইভস্ট্রিম, দ্বি-মুখী টকব্যাক বা সনাক্তকরণ ইভেন্ট থাকতে পারে।

প্রয়োজনীয় বৈশিষ্ট্য
গুগল পুশএভিস্ট্রিমট্রান্সপোর্ট
গুগল ওয়েবআরটিসিলাইভভিউ

ডোরবেল

একটি ডিভাইস সম্পর্কে প্রাথমিক তথ্য পান

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}")
        println("serialNumber ${basicInformation.serialNumber}")
    }

ডিভাইসের সংযোগ পরীক্ষা করুন

একটি ডিভাইসের সংযোগ আসলে ডিভাইসের ধরণ স্তরে পরীক্ষা করা হয় কারণ কিছু ডিভাইস একাধিক ডিভাইসের ধরণ সমর্থন করে। ফিরে আসা অবস্থা হল সেই ডিভাইসের সমস্ত বৈশিষ্ট্যের জন্য সংযোগের অবস্থার সংমিশ্রণ।

val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState

মিশ্র ডিভাইস ধরণের ক্ষেত্রে যখন ইন্টারনেট সংযোগ থাকে না, তখন PARTIALLY_ONLINE অবস্থা লক্ষ্য করা যেতে পারে। স্থানীয় রাউটিংয়ের কারণে Matter স্ট্যান্ডার্ড বৈশিষ্ট্যগুলি এখনও অনলাইনে থাকতে পারে, তবে ক্লাউড-ভিত্তিক বৈশিষ্ট্যগুলি অফলাইনে থাকবে।

একটি লাইভস্ট্রিম শুরু করুন

লাইভস্ট্রিম শুরু করতে, WebRtcLiveView বৈশিষ্ট্যের startLiveView() পদ্ধতিতে Session Description Protocol (SDP) স্ট্রিং পাঠান, যা তিনটি মান সম্বলিত WebRtcLiveViewTrait.StartLiveViewCommand.Response প্রদান করে:

  • অধিবেশনের জন্য এসডিপি।
  • সেশনের সময়কাল সেকেন্ডে।
  • সেশন আইডি, যা সেশন প্রসারিত বা সমাপ্ত করতে ব্যবহার করা যেতে পারে।
suspend fun getWebRtcLiveViewTrait(cameraDevice: HomeDevice) {
 return cameraDevice.type(GoogleDoorbellDevice).trait(WebRtcLiveView).first {
    it?.metadata?.sourceConnectivity?.connectivityState == ConnectivityState.ONLINE
  }

}

// Start the live view
suspend fun startCameraStream(trait: WebRtcLiveView, offerSdp: String) {
  val response = trait.startLiveView(offerSdp)
  // Response contains three fields (see below)
  return response
}
  ...

// This is used to manage the WebRTC connection
val peerConnection: RTCPeerConnection = ...

   ...

val startResponse = startCameraStream(sdp)
val answerSdp = startResponse?.answerSdp
val sessionDuration = startResponse?.liveSessionDurationSeconds
val mediaSessionId = startResponse?.mediaSessionId

peerConnection.setRemoteDescription(SessionDescription.Type.ANSWER,
                                    answerSdp)

লাইভস্ট্রিম প্রসারিত করুন

লাইভস্ট্রিমের একটি পূর্বনির্ধারিত সময়কাল থাকে যার পরে এর মেয়াদ শেষ হয়ে যায়। একটি সক্রিয় স্ট্রিমের সময়কাল বাড়ানোর জন্য, WebRtcLiveView.extendLiveView() পদ্ধতি ব্যবহার করে একটি এক্সটেনশন অনুরোধ জারি করুন:

// Assuming camera stream has just been started
suspend fun scheduleExtension(trait: WebRtcLiveView, mediaSessionId: String, liveSessionDurationSeconds: UShort ) {
  delay(liveSessionDurationSeconds - BUFFER_SECONDS * 1000)
  val response = trait.extendLiveView(mediaSessionId)
  // returns how long the session will be live for
  return response.liveSessionDurationSeconds
}

টকব্যাক শুরু করুন এবং বন্ধ করুন

টকব্যাক শুরু করতে, WebRtcLiveView বৈশিষ্ট্যের startTalkback() পদ্ধতিটি কল করুন। থামাতে, stopTalkback() ব্যবহার করুন।

// Make sure camera stream is on
suspend fun setTalkback(isOn: Boolean, trait: WebRtcLiveView, mediaSessionId: String) {
  if(isOn) {
    trait.startTalkback(mediaSessionId)
  } else {
    trait.stopTalkback(mediaSessionId)
  }
}

রেকর্ডিং ক্ষমতা সক্ষম এবং অক্ষম করুন

ক্যামেরার রেকর্ডিং ক্ষমতা সক্রিয় করতে, TransportStatusEnum.Active কে PushAvStreamTransport বৈশিষ্ট্যের setTransportStatus() পদ্ধতিতে পাস করুন। রেকর্ডিং ক্ষমতা অক্ষম করতে, এটি TransportStatusEnum.Inactive পাস করুন। নিম্নলিখিত উদাহরণে, আমরা এই কলগুলিকে একটি একক কলে মুড়ে ফেলি যা রেকর্ডিং ক্ষমতা টগল করার জন্য একটি Boolean ব্যবহার করে:

// Start or stop recording for all connections.
suspend fun setCameraRecording(trait: PushAvStreamTransport, isOn: Boolean) {
  if(isOn) {
    trait.setTransportStatus(TransportStatusEnum.Active)
  } else {
    trait.setTransportStatus(TransportStatusEnum.Inactive)
  }
}

ক্যামেরার রেকর্ডিং ক্ষমতা সক্রিয় বা নিষ্ক্রিয় করা ক্যামেরার ভিডিও চালু বা বন্ধ করার মতোই। যখন একটি ক্যামেরার ভিডিও চালু থাকে, তখন এটি রেকর্ডিং হয় (ইভেন্ট এবং সম্পর্কিত ক্লিপগুলির উদ্দেশ্যে)।

যখন রেকর্ডিং ক্ষমতা অক্ষম থাকে (ক্যামেরা ভিডিও বন্ধ থাকে):

  • ডিভাইসের ধরণের connectivityState অনুসারে ক্যামেরাটি এখনও অনলাইনে দেখাতে পারে।
  • লাইভস্ট্রিমটি অ্যাক্সেস করা যাচ্ছে না, এবং ক্যামেরা কোনও ক্লাউড ইভেন্ট সনাক্ত করতে পারে না।

রেকর্ডিং ক্ষমতা সক্রিয় আছে কিনা তা পরীক্ষা করুন

ক্যামেরার রেকর্ডিং ক্ষমতা সক্রিয় কিনা তা নির্ধারণ করতে, কোনও সংযোগ সক্রিয় আছে কিনা তা পরীক্ষা করে দেখুন। নিম্নলিখিত উদাহরণটি এটি করার জন্য দুটি ফাংশন সংজ্ঞায়িত করে:

// Get the on/off state
suspend fun onOffState(pushAvStreamTransport: PushAvStreamTransport) {
  return pushAvStreamTransport
    .currentConnections?.any { it.transportStatus == TransportStatusEnum.Active } ?: false
}

// Check if the camera's recording capability is enabled
fun PushAvStreamTransport.recordModeActive(): Boolean {
  return currentConnections?.any { it.transportStatus == TransportStatusEnum.Active } ?: false
}

পরীক্ষা করার আরেকটি উপায় হল findTransport() ফাংশনটি একটি predicate সহ ব্যবহার করা:

// Fetch the current connections
suspend fun queryRecordModeState(trait: PushAvStreamTransport) {
  return trait.findTransport().let {
      it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active
    }
}

ব্যাটারি সেটিংস

হোম এপিআই-এর মাধ্যমে বিভিন্ন ব্যাটারি সেটিংস নিয়ন্ত্রণ করা যেতে পারে।

ব্যাটারি ব্যবহারের পছন্দ সেট করুন

শক্তির ভারসাম্য সেট করার মাধ্যমে আপনি একটি ডিভাইসের ব্যাটারি লাইফ এবং পারফরম্যান্সের মধ্যে ট্রেডঅফ কনফিগার করতে পারবেন। আপনি "বর্ধিত," "ভারসাম্যপূর্ণ," এবং "পারফরম্যান্স" এর মতো বিভিন্ন ব্যাটারি প্রোফাইল তৈরি করতে পারেন এবং তাদের মধ্যে স্যুইচ করতে পারেন।

এই বৈশিষ্ট্যটি 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"
  }
]
// The index parameter must be within the UByte range (0-255).
suspend fun setEnergyBalance(trait: EnergyPreference, index: Int) {
  trait.update { setCurrentEnergyBalance(index.toUByte()) }
}

// Setting the battery usage to more recording ie performance
setEnergyBalance(energyPreference, 2)

অটোমেটিক ব্যাটারি সেভার চালু করুন

এই বৈশিষ্ট্যটি কনফিগার করতে, EnergyPreference বৈশিষ্ট্যের currentLowPowerModeSensitivity বৈশিষ্ট্যটি আপডেট করুন। এই বৈশিষ্ট্যটি একটি সংবেদনশীলতা স্তর নির্বাচন করতে একটি সূচক ব্যবহার করে, যেখানে 0 সাধারণত Disabled প্রতিনিধিত্ব করে এবং 1 Enabled বা Automatic প্রতিনিধিত্ব করে।

suspend fun setAutomaticBatterySaver(enable: Boolean, trait: EnergyPreference) {
  // 0 is Disabled, 1 is Enabled
  val value = if (enable) 1.toUByte() else 0.toUByte()
  trait.update { setCurrentLowPowerModeSensitivity(value) }
}

ব্যাটারি চার্জিং অবস্থা পান

ডিভাইসের বর্তমান চার্জিং অবস্থা (চার্জ হচ্ছে, সম্পূর্ণ চার্জ হচ্ছে, অথবা চার্জ হচ্ছে না) জানতে, PowerSource বৈশিষ্ট্যের batChargeState বৈশিষ্ট্যটি ব্যবহার করুন।

// Get the battery charging state
val batteryChargeState = powerSource.batChargeState

when (batteryChargeState) {
    PowerSourceTrait.BatChargeStateEnum.IsCharging -> "Charging"
    PowerSourceTrait.BatChargeStateEnum.IsAtFullCharge -> "Full"
    PowerSourceTrait.BatChargeStateEnum.IsNotCharging -> "Not Charging"
    else -> "Unknown"
}

ব্যাটারির লেভেল জেনে নিন

বর্তমান ব্যাটারি লেভেল পেতে, PowerSource বৈশিষ্ট্যের batChargeLevel অ্যাট্রিবিউট ব্যবহার করুন। লেভেলটি হয় OK , Warning (নিম্ন), অথবা Critical

// Get the battery charge level
val batteryLevel = powerSourceTrait.batChargeLevel

when (batteryLevel) {
    PowerSourceTrait.BatChargeLevelEnum.OK -> "OK"
    PowerSourceTrait.BatChargeLevelEnum.Warning -> "Warning"
    PowerSourceTrait.BatChargeLevelEnum.Critical -> "Critical"
    else -> "Unknown"
}

পাওয়ার সোর্সটি পান

ডিভাইসটি কোন পাওয়ার সোর্স ব্যবহার করছে তা নির্ধারণ করতে, PowerSource বৈশিষ্ট্যের BatPresent এবং wiredPresent বৈশিষ্ট্যগুলি ব্যবহার করুন।

  val trait: PowerSource
  val isWired = trait.wiredPresent
  val hasBattery = trait.batPresent

অডিও সেটিংস

হোম এপিআই-এর মাধ্যমে বিভিন্ন অডিও সেটিংস নিয়ন্ত্রণ করা যেতে পারে।

মাইক্রোফোন চালু বা বন্ধ করুন

ডিভাইসের মাইক্রোফোন চালু বা বন্ধ করতে, বিল্ট-ইন setMicrophoneMuted Kotlin ফাংশন ব্যবহার করে CameraAvStreamManagement বৈশিষ্ট্যের microphoneMuted বৈশিষ্ট্যটি আপডেট করুন:

// Turn the device's microphone on or off
suspend fun turnOffMicrophone(disableMicrophone: Boolean, trait: CameraAvStreamManagement) {
  trait.update { setMicrophoneMuted(disableMicrophone) }
}

অডিও রেকর্ডিং চালু বা বন্ধ করুন

ডিভাইসের জন্য অডিও রেকর্ডিং চালু বা বন্ধ করতে, বিল্ট-ইন setRecordingMicrophoneMuted Kotlin ফাংশন ব্যবহার করে CameraAvStreamManagement বৈশিষ্ট্যের recordingMicrophoneMuted বৈশিষ্ট্যটি আপডেট করুন:

// Turn audio recording on or off for the device
suspend fun turnOffAudioRecording(disableAudioRecording: Boolean, trait: CameraAvStreamManagement) {
  trait.update { setRecordingMicrophoneMuted(disableAudioRecording) }
}

স্পিকারের ভলিউম সামঞ্জস্য করুন

ডিভাইসের জন্য স্পিকার ভলিউম সামঞ্জস্য করতে, বিল্ট-ইন setSpeakerVolumeLevel Kotlin ফাংশন ব্যবহার করে CameraAvStreamManagement বৈশিষ্ট্যের speakerVolumeLevel বৈশিষ্ট্যটি আপডেট করুন:

// Adjust the camera speaker volume
suspend fun adjustSpeakerVolume(volume: Int, trait: CameraAvStreamManagement) {
  trait.update { setSpeakerVolumeLevel(volume.toUbyte()) }
}

অন্যান্য সেটিংস

হোম এপিআই-এর মাধ্যমে অন্যান্য বিভিন্ন সেটিংস নিয়ন্ত্রণ করা যেতে পারে।

নাইট ভিশন চালু বা বন্ধ করুন

ক্যামেরার জন্য নাইট ভিশন চালু বা বন্ধ করতে, বিল্ট-ইন setNightVision Kotlin ফাংশন ব্যবহার করে CameraAvStreamManagement বৈশিষ্ট্যের nightVision বৈশিষ্ট্য আপডেট করতে TriStateAutoEnum ব্যবহার করুন:

// Turn night vision on
cameraAvStreamManagement.update {
  setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.On)
}

// Turn night vision off
CameraAvStreamManagement.update {
  setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.Off)
}

স্ট্যাটাস LED এর উজ্জ্বলতা পরিবর্তন করুন

স্ট্যাটাস LED এর উজ্জ্বলতা পরিবর্তন করতে, বিল্ট-ইন setStatusLightBrightness Kotlin ফাংশন ব্যবহার করে CameraAvStreamManagement বৈশিষ্ট্যের statusLightBrightness বৈশিষ্ট্য আপডেট করতে ThreeLevelAutoEnum ব্যবহার করুন:

// Set the LED brightness to high
cameraAvStreamManagement.update {
  setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.High)
}

// Set the LED brightness to low
cameraAvStreamManagement.update {
  setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.Low)
}

ক্যামেরার ভিউপোর্ট পরিবর্তন করুন

ক্যামেরা ভিউপোর্টটি জুম এবং ক্রপ বৈশিষ্ট্যের মতোই যা জুম এবং এনহ্যান্স নেস্ট ক্যামেরা ভিডিও সাপোর্ট নিবন্ধে বর্ণিত হয়েছে।

ভিউপোর্টটি একটি ViewportStruct এ সংজ্ঞায়িত করা হয় যার চারটি মান থাকে, যা ভিউপোর্টের স্থানাঙ্ক হিসেবে ব্যবহৃত হয়। স্থানাঙ্কগুলি নিম্নরূপ সংজ্ঞায়িত করা হয়:

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

ViewportStruct এর মান নির্ধারণ করা অ্যাপের UI এবং ক্যামেরা বাস্তবায়নের উপর নির্ভর করে। খুব মৌলিক স্তরে, ক্যামেরা ভিডিওর ভিউপোর্ট সেট করতে, বিল্ট-ইন setViewport Kotlin ফাংশন ব্যবহার করে CameraAvStreamManagement বৈশিষ্ট্যের viewport অ্যাট্রিবিউটটি ViewportStruct দিয়ে আপডেট করুন:

cameraAvStreamManagement
  .update { setViewport(
    CameraAvStreamManagementTrait.ViewportStruct(
      x1 = horizontalRange.rangeStart.roundToInt().toUShort(),
      x2 = horizontalRange.rangeEnd.roundToInt().toUShort(),
      y1 = verticalRange.rangeStart.roundToInt().toUShort(),
      y2 = verticalRange.rangeEnd.roundToInt().toUShort(),
    )
) }

ডিভাইসের জাগরণ সংবেদনশীলতা সামঞ্জস্য করুন

ডিভাইসটির জেগে ওঠার সংবেদনশীলতা ব্যাটারি সংরক্ষণের জন্য ব্যবহৃত হয়, ডিভাইসটি যে পরিসরের কার্যকলাপ অনুভব করতে পারে তা হ্রাস করে এবং সেই কার্যকলাপ সনাক্ত করার পরে ঘুম থেকে ওঠার সময় বাড়িয়ে।

হোম এপিআইগুলিতে, ডিভাইসের transportOptionstriggerOptions এর motionSensitivity বৈশিষ্ট্য ব্যবহার করে এটি সেট করা যেতে পারে। এই বিকল্পগুলি প্রতিটি ডিভাইসের জন্য PushAvStreamTransport বৈশিষ্ট্যের মধ্যে সংজ্ঞায়িত করা হয়।

জাগরণ সংবেদনশীলতা শুধুমাত্র নিম্নলিখিত মানগুলিতে সেট করা যেতে পারে:

  • ১ = কম
  • ৫ = মাঝারি
  • ১০ = উচ্চ

আপডেট করার প্রক্রিয়া হল findTransport কমান্ড ব্যবহার করে সক্রিয় রেকর্ডিং স্ট্রিমগুলির জন্য পরিবহন কনফিগারেশন খুঁজে বের করা, তারপর modifyPushTransport কমান্ড ব্যবহার করে নতুন সংবেদনশীলতা মান দিয়ে কনফিগারেশনটি পরিবর্তন করা:

// Create a struct with the new wake-up sensitivity
val toUpdate =  TransportOptionsStruct(
  triggerOptions =
    TransportTriggerOptionsStruct(
      motionSensitivity =
        OptionalValue.present(wakeUpSensitivity.toUByte())
    )
  )

// Get the configurations for active connections
val connections  = pushAvStreamTransport.findTransport().transportConfigurations
  // Update all recording streams with the new transport options.
  for (connection in connections) {
    if (connection.transportOptions.getOrNull()?.streamUsage == StreamUsageEnum.Recording) {
      trait.modifyPushTransport(
        connectionId = connection.connectionId,
        transportOptions = toUpdate,
      )
    }
  }

ইভেন্টের সর্বোচ্চ দৈর্ঘ্য সামঞ্জস্য করুন

সর্বাধিক ইভেন্ট দৈর্ঘ্য হল ক্যামেরাটি একটি ইভেন্টের জন্য একটি ক্লিপ রেকর্ড করার সময়কাল। হোম API গুলির মাধ্যমে এটি প্রতি ডিভাইসে, GHA এর মতো একই দৈর্ঘ্যে, সেকেন্ডের ব্যবধানে কনফিগার করা যেতে পারে:

  • ১০ সেকেন্ড
  • ১৫ সেকেন্ড
  • ৩০ সেকেন্ড
  • ৬০ সেকেন্ড (১ মিনিট)
  • ১২০ সেকেন্ড (২ মিনিট)
  • ১৮০ সেকেন্ড (৩ মিনিট)

হোম এপিআইগুলিতে, এটি ডিভাইসের transportOptionstriggerOptions এর motionTimeControl বৈশিষ্ট্য ব্যবহার করে সেট করা যেতে পারে। এই বিকল্পগুলি প্রতিটি ডিভাইসের জন্য PushAvStreamTransport বৈশিষ্ট্যের মধ্যে সংজ্ঞায়িত করা হয়।

আপডেট করার প্রক্রিয়া হল findTransport কমান্ড ব্যবহার করে সক্রিয় রেকর্ডিং স্ট্রিমগুলির জন্য পরিবহন কনফিগারেশন খুঁজে বের করা, তারপর modifyPushTransport কমান্ড ব্যবহার করে নতুন ইভেন্ট দৈর্ঘ্যের মান দিয়ে কনফিগারেশনটি পরিবর্তন করা:

// Create a struct with the new max event length
// where maxDuration is the length in seconds
val toUpdate =  TransportOptionsStruct(
  triggerOptions =
    TransportTriggerOptionsStruct(
      motionTimeControl =
        OptionalValue.present(
          TransportMotionTriggerTimeControlStruct(maxDuration = it.toUInt())
        )
    )
  )

// Get the configurations for active connections
val connections  = pushAvStreamTransport.findTransport().transportConfigurations
  // Update all recording streams with the new transport options.
  for (connection in connections) {
    if (connection.transportOptions.getOrNull()?.streamUsage == StreamUsageEnum.Recording) {
      trait.modifyPushTransport(
        connectionId = connection.connectionId,
        transportOptions = toUpdate,
      )
    }
  }

চাইম সেটিংস

হোম এপিআই-এর মাধ্যমে বিভিন্ন ডোরবেল চাইম সেটিংস নিয়ন্ত্রণ করা যেতে পারে।

চাইমের শব্দ পরিবর্তন করুন

ডোরবেলের শব্দ পরিবর্তন করতে, প্রথমে Chime বৈশিষ্ট্যের installedChimeSounds বৈশিষ্ট্য ব্যবহার করে ডিভাইসে ইনস্টল করা শব্দের তালিকা পান:

// Get a list of chimes and identify the currently selected one
private val doorbellChimeTraitFlow: Flow =
    device.traitFromType(Chime, GoogleDoorbellDevice)
val chimeSounds = doorbellChimeTraitFlow.first().installedChimeSounds ?: emptyList()

তারপর, বিল্ট-ইন setSelectedChime Kotlin ফাংশন ব্যবহার করে Chime বৈশিষ্ট্যের selectedChime বৈশিষ্ট্যটি আপডেট করুন:

// Set the chime using the chimeId from the installed list
chimeSounds.firstOrNull { it.name == name }?.let { setSelectedChime(it.chimeId) }

একটি বহিরাগত চাইম ব্যবহার করুন

ডোরবেলটি একটি বাহ্যিক ঘণ্টা ব্যবহার করার জন্য কনফিগার করা যেতে পারে, যেমন বাড়ির ভিতরে স্থাপিত একটি যান্ত্রিক ঘণ্টা। ডোরবেল ইনস্টল করার সময় এটি কনফিগার করা উচিত যাতে বাইরের ঘণ্টার সম্ভাব্য ক্ষতি এড়ানো যায়।

কোন ধরণের বহিরাগত চাইম ইনস্টল করা আছে তা নির্দেশ করতে, বিল্ট-ইন setExternalChime Kotlin ফাংশন ব্যবহার করে Chime বৈশিষ্ট্যের externalChime বৈশিষ্ট্য আপডেট করতে ExternalChimeType ব্যবহার করুন:

// Indicate the external chime is mechanical
chime.update {
  setExternalChime(ChimeTrait.ExternalChimeType.Mechanical)
}

বাহ্যিক চাইমের সময়কাল পরিবর্তন করুন

একটি বহিরাগত চাইম বাজানোর সময়কাল, সেকেন্ডে, হোম API-এর মাধ্যমে কনফিগার করা যেতে পারে। যদি বহিরাগত চাইম একটি চাইম সময়কাল সমর্থন করে, তাহলে একজন ব্যবহারকারী এটি কনফিগার করতে চাইতে পারেন।

এখানে সেট করা মানটি বাহ্যিক চাইমের স্পেসিফিকেশন এবং এর প্রস্তাবিত চাইমের সময়কালের উপর নির্ভর করে।

বাহ্যিক চাইমের সময়কাল পরিবর্তন করতে, বিল্ট-ইন setExternalChimeDurationSeconds Kotlin ফাংশন ব্যবহার করে Chime বৈশিষ্ট্যের externalChimeDurationSeconds অ্যাট্রিবিউট আপডেট করুন:

// Change the external chime duration
chime.update {
  setExternalChimeDurationSeconds(newDuration.toUShort())
}

একটি চাইম থিম সক্ষম করুন

কিছু ডোরবেলে এমন ঘণ্টা থাকতে পারে যা শুধুমাত্র সীমিত সময়ের জন্য ব্যবহারকারীদের জন্য উপলব্ধ। উদাহরণস্বরূপ, ছুটির দিনগুলির জন্য নির্দিষ্ট ঘণ্টা। এগুলোকে ঘণ্টা থিম বলা হয়।

কোন ব্যবহারকারীর জন্য কোন চাইম থিমগুলি উপলব্ধ তা দেখতে, একটি টাইমবক্স ফিল্টার তৈরি করুন এবং ChimeThemes বৈশিষ্ট্য থেকে getAvailableThemes() কমান্ডের ফলাফল ফিল্টার করতে এটি ব্যবহার করুন। এটি থিমের নাম সহ উপলব্ধ থিমের একটি তালিকা প্রদান করে।

নিচের উদাহরণে তালিকাটি কীভাবে ফিল্টার করতে হয় তা দেখানো হয়েছে। একটি থিম সক্রিয় বলে বিবেচিত হবে যদি বর্তমান সময়টি তার শুরু এবং শেষ সময়ের (যথাক্রমে startTimeSeconds এবং endTimeSeconds মান) মধ্যে থাকে। যদি একটি শুরুর সময় সেট না করা থাকে, তাহলে এটি সময়ের শুরু থেকে সক্রিয় বলে বিবেচিত হবে। যদি একটি শেষ সময় সেট না করা থাকে, তাহলে এটি অনির্দিষ্টকালের জন্য সক্রিয় থাকবে। যদি দুটিই অনুপস্থিত থাকে, তাহলে থিমটি সর্বদা সক্রিয় থাকবে।

// Get themes from the ChimeThemes trait
fun List<ChimeThemesTrait.ThemeStruct>.filterTimeboxedThemes():
    List<ChimeThemesTrait.ThemeStruct> {
  val now = timeSource.instant().epochSecond.toULong()
  return filter { chimeStruct: ChimeThemesTrait.ThemeStruct ->
    val startTime: ULong = chimeStruct.startTimeSeconds.getOrNull() ?: 0UL
    val endTime: ULong = chimeStruct.endTimeSeconds.getOrNull() ?: MAX_VALUE
    startTime <= now && now <= endTime
  }
}

val availableThemes =
  doorbellChimeThemesTraitFlow
    .first()
    .getAvailableThemes()
    .themes
    .filterTimeboxedThemes()

একবার আপনার পছন্দের থিমের নাম হয়ে গেলে, যেমন Christmas , আপনি ChimeThemes বৈশিষ্ট্যের setSelectedTimeboxedThemeName() ফাংশন ব্যবহার করে এটি নির্বাচন করতে পারেন:

// Select a theme using the ChimeThemes trait
val themeToSelect = "Christmas"
if (themeToSelect in availableThemeNames) {
  doorbellChimeThemesTraitFlow.first().setSelectedTimeboxedThemeName(themeToSelect)
}