Android-এর জন্য ক্যামেরা ডিভাইস গাইড

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

কোনও ফিচার ব্যবহার করার বা অ্যাট্রিবিউট আপডেট করার চেষ্টা করার আগে, ডিভাইসের জন্য অ্যাট্রিবিউট ও কমান্ড সাপোর্ট আছে কিনা তা সবসময় চেক করুন। আরও তথ্যের জন্য Android-এ ডিভাইস কন্ট্রোল করুন দেখুন।

Home API ডিভাইসের ধরন বৈশিষ্ট্য Kotlin স্যাম্পেল অ্যাপ ব্যবহারিক ক্ষেত্র

ক্যামেরা

GoogleCameraDevice

home.matter.6006.types.0158

এমন একটি ডিভাইস যা স্থির ছবি বা ভিডিও ক্যাপচার করে। ক্যামেরায় অ্যাক্সেসযোগ্য লাইভস্ট্রিম, টু-ওয়ে টকব্যাক বা শনাক্তকরণ ইভেন্টের মতো ফিচার থাকতে পারে।

প্রয়োজনীয় বৈশিষ্ট্য
     google PushAvStreamTransport
     google WebRtcLiveView

ক্যামেরা

কোনও ডিভাইস সম্পর্কে প্রাথমিক তথ্য পাওয়া

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

সিরিয়াল নম্বর পান

ডিভাইসের সিরিয়াল নম্বর পেতে, ExtendedBasicInformation ট্রেইটের GetSerialNumber কমান্ড ব্যবহার করুন। এই উদাহরণে দেখানো হয়েছে যে কীভাবে serialNumber নামের ভেরিয়েবলে সিরিয়াল নম্বর সেভ করতে হয়:

val basicInfo: ExtendedBasicInformation = device.getTrait(ExtendedBasicInformation)
val serialNumber = basicInfo.getSerialNumber().serialNumber

ডিভাইস ক্লাউড পরিচিতির সবচেয়ে সাম্প্রতিক সময় পান

ডিভাইসটি ক্লাউডের সাথে সবচেয়ে সম্প্রতি কখন যোগাযোগ করেছিল তা জানতে, ExtendedGeneralDiagnostics ট্রেটের lastContactTimestamp অ্যাট্রিবিউট ব্যবহার করুন:

fun getLastContactTimeStamp(trait: ExtendedGeneralDiagnostics): java.time.Instant {
  val timestamp = trait.lastContactTimestamp
  return Instant.ofEpochSecond(timestamp.toLong())
}

ক্যামেরা মাউন্ট টাইপ সেটিংস

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

// Get the Mount trait
val mountTrait: Mount = device.getTrait(Mount)

// Read the current mount state and detection type
val mountState = mountTrait.mountState
val mountDetectionType = mountTrait.mountDetectionType

// Read the current mount type name
val mountTypeName = mountTrait.mountTypeName

// Update the mount type override
mountTrait.update {
  setMountTypeOverride(MountTrait.MountTypeOverrideEnum.Official)
}

কোনও ডিভাইসের কানেক্টিভিটি চেক করা

ডিভাইসের কানেক্টিভিটি আসলে ডিভাইসের ধরন লেভেলে চেক করা হয় কারণ কিছু ডিভাইস একাধিক ডিভাইসের ধরন সাপোর্ট করে। যে স্ট্যাটাস দেখানো হয় তা হল সেই ডিভাইসের সব বৈশিষ্ট্যের জন্য কানেক্টিভিটি স্ট্যাটাসের কম্বিনেশন।

val cameraConnectivity = cameraDevice.metadata.sourceConnectivity.connectivityState

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

ডিভাইসের IP অ্যাড্রেস পান

ডিভাইসের IP অ্যাড্রেস খুঁজে পেতে, 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()

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

   Android-এর জন্য স্যাম্পেল অ্যাপে প্রয়োগ করা হয়েছে   

লাইভ স্ট্রিম শুরু করতে, সেশন ডেসক্রিপশন প্রোটোকল (SDP) স্ট্রিং WebRtcLiveView ট্রেইটের startLiveView() পদ্ধতিতে পাঠান, যা তিনটি ভ্যালু সহ WebRtcLiveViewTrait.StartLiveViewCommand.Response ফেরত পাঠায়:

  • সেশনের জন্য SDP।
  • সেকেন্ডে সেশনের সময়সীমা।
  • সেশন আইডি, যা সেশন বাড়াতে বা বন্ধ করতে ব্যবহার করা হতে পারে।
suspend fun getWebRtcLiveViewTrait(cameraDevice: HomeDevice) {
 return cameraDevice.type(GoogleCameraDevice).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)

লাইভ স্ট্রিমের সময়সীমা বাড়ানো

   Android-এর জন্য স্যাম্পেল অ্যাপে প্রয়োগ করা হয়েছে   

লাইভস্ট্রিমের একটি প্রি-সেট সময়সীমা থাকে যার পরে সেটির মেয়াদ শেষ হয়ে যায়। অ্যাক্টিভ স্ট্রিমের সময়সীমা বাড়াতে, 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
}

টকব্যাক শুরু ও বন্ধ করা

   Android-এর জন্য স্যাম্পেল অ্যাপে প্রয়োগ করা হয়েছে   

টকব্যাক শুরু করতে, 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)
  }
}

লাইভ স্ট্রিম ম্যানেজ করা

ক্লায়েন্টের দেখার কনটেক্সটের (যেমন, ছোট প্রিভিউ টাইল, গ্রিড ভিউ বা ছবির-মধ্যে-ছবি মোড দেখানোর সময় কম রেজোলিউশনে পরিবর্তন করা) উপর ভিত্তি করে ব্যান্ডউইথ ব্যবহার অপ্টিমাইজ করার জন্য লাইভ স্ট্রিমের কোয়ালিটি অ্যাডজাস্ট করা উপযোগী।

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

নিম্নলিখিত উদাহরণ থেকে বোঝা যায় যে কোনও ডিভাইসের জন্য লাইভ স্ট্রিমের কোয়ালিটি কীভাবে উদ্ধার ও আপডেট করতে হয়:

  • কাজ করে এমন কোয়ালিটির বিকল্প ফিরিয়ে আনা: ডিভাইসে কাজ করে এমন উপলভ্য স্ট্রিমিং রেজোলিউশন পান। কোডটি ডিভাইসের ধরন ফ্লোতে WebRtcLiveView ট্রেটের supportedQualityHints অ্যাট্রিবিউট কোয়েরি করে এবং কাজ করে এমন কোয়ালিটি StateFlow হিসেবে প্রকাশ করে যাতে QualityHint ভ্যালুর তালিকা থাকে (যেমন QUALITY_HINT_SD, QUALITY_HINT_HD, QUALITY_HINT_FHD, QUALITY_HINT_QHD বা QUALITY_HINT_UHD)।

  • লাইভস্ট্রিমের কোয়ালিটি পরিবর্তন করুন: অ্যাক্টিভ লাইভস্ট্রিমের স্ট্রিমিং রেজোলিউশন পরিবর্তন করতে বেছে নেওয়া QualityHint প্রয়োগ করুন (যেমন, স্ট্যান্ডার্ড ডেফিনেশন থেকে হাই ডেফিনেশনে পরিবর্তন করা)। changeQuality ফাংশন ডিভাইসের লাইভস্ট্রিমিং ট্রেইট সমাধান করে এবং অ্যাক্টিভ mediaSessionId ও বেছে নেওয়া QualityHint কনফিগারেশন সহ changeLiveViewQuality কল করে।

// Assuming you have a HomeDevice instance 'device'
val availableQualityHints: StateFlow<List> =
    device.type(GoogleCameraDevice)
        .trait(WebRtcLiveView)
        .map { trait -> 
            trait?.supportedQualityHints ?: emptyList() 
        }
        .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())

// Assuming you have a HomeDevice instance 'device'
suspend fun changeQuality(mediaSessionId: String, qualityHint: QualityHint) {
    // Get the trait from the device
    val trait = device.type(GoogleCameraDevice).trait(WebRtcLiveView).first() ?: return
    try {
        trait.changeLiveViewQuality(mediaSessionId, qualityHint)
    } catch (e: Exception) {
        // Handle error
    }
}

রেকর্ডিংয়ের ক্ষমতা চালু ও বন্ধ করা

ক্যামেরার রেকর্ডিং ক্ষমতা চালু করতে, PushAvStreamTransport বৈশিষ্ট্যের setTransportStatus() পদ্ধতিতে TransportStatusEnum.Active পাস করুন। রেকর্ডিংয়ের ক্ষমতা বন্ধ করতে, এটি পাস করুন 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() ফাংশন ব্যবহার করা:

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

ক্যামেরা স্ন্যাপশট ফিরিয়ে আনুন

   Android-এর জন্য স্যাম্পেল অ্যাপে প্রয়োগ করা হয়েছে   

ক্যামেরা থেকে স্ট্যাটিক ছবির স্ন্যাপশট পেতে CameraSnapshot ট্রেট ব্যবহার করুন। এই স্ন্যাপশটগুলি বিভিন্ন পরিস্থিতিতে কাজে লাগে:

  • WebRTC লাইভ স্ট্রিম লোড হওয়ার সময় UI-তে প্লেসহোল্ডার টাইল হিসেবে।
  • একটি স্ট্যাটিক প্রিভিউ ছবি হিসেবে যা ব্যবহারকারীর ইন্টার‍্যাকশনের পরে লাইভস্ট্রিমে আপগ্রেড হয়।
  • কাস্টম অ্যাক্টিভিটি জোন আঁকা ও কনফিগার করার জন্য ব্যাকগ্রাউন্ড ক্যানভাস হিসেবে।

CameraSnapshot ট্রেট স্ন্যাপশট ফেচ করার দুটি উপায় অফার করে, এটি নির্ভর করে দ্রুত রেন্ডারিংয়ের জন্য আপনার ক্যাশে করা স্ন্যাপশট নাকি অন-ডিমান্ড লাইভ স্ন্যাপশট প্রয়োজন তার উপর।

ক্যাশে করা প্রিভিউ স্ন্যাপশট পান

প্রিভিউ স্ন্যাপশট হল একটি ক্যাশে করা ছবি যা SDK ক্যামেরা চালু না করেই উদ্ধার করতে পারে। এটি স্ট্যাটিক ছবি ফেচ করার সবচেয়ে দ্রুত পদ্ধতি এবং ক্যামেরা ওভারভিউ পৃষ্ঠা বা ড্যাশবোর্ড গ্রিডের জন্য আদর্শ।

প্রিভিউ স্ন্যাপশট পেতে, preview_image_url ট্রেট অ্যাট্রিবিউট পড়ুন:

// Get a flow of the CameraSnapshot trait
val cameraSnapshotFlow: Flow<CameraSnapshot?> = cameraDevice
  .type(GoogleCameraDevice)
  .trait(CameraSnapshot)

// Get the current trait state
val cameraSnapshot = cameraSnapshotFlow.firstOrNull()
if (cameraSnapshot != null) {
  val previewImageUrl = cameraSnapshot.previewImageUrl
  // Load the preview image from the URL
} else {
  // CameraSnapshot trait not supported on this device
}

ক্যামেরা কনফিগারেশন এবং অ্যাক্টিভিটির উপর নির্ভর করে, প্রিভিউ URL সাম্প্রতিক ভিডিও ফুটেজ (লেটেস্ট ভিডিও ফ্র্যাগমেন্টের প্রথম I-ফ্রেম) থেকে জেনারেট করা ক্যাশে করা ছবি বা ক্যামেরা দ্বারা পর্যায়ক্রমে আপলোড করা স্ন্যাপশট দেখায়।

ছবির ফ্রেশনেস নির্দেশ করতে, Google Home ক্লাউড, পরিবেশিত JPEG/PNG ছবিতে একটি X-Home-Image-Captured-At হেডার এম্বেড করে, যা UTC-তে ফর্ম্যাট করা হয়। অ্যাপে স্ন্যাপশটের বয়স দেখানোর জন্য আপনি ক্লায়েন্ট-সাইডে এই হেডার পার্স করতে পারবেন।

চাহিদা অনুযায়ী লাইভ স্ন্যাপশট পান

ব্যবহারকারীর অভিজ্ঞতার জন্য ক্যামেরার বর্তমান লাইভ ভিউ প্রয়োজন—যেমন অ্যাক্টিভিটি জোন সেট-আপ করা—আপনি লাইভ স্ন্যাপশটের জন্য অনুরোধ করতে পারেন। লাইভ স্ন্যাপশট ট্রিগার করার অর্থ হল ক্যামেরাকে চালু হতে, নতুন ফ্রেম ক্যাপচার করতে এবং সেটি ক্লাউডে আপলোড করতে নির্দেশ দেওয়া।

লাইভ স্ন্যাপশটের অনুরোধ করতে, getLiveSnapshot() কমান্ড ব্যবহার করুন:

try {
  val response = cameraSnapshot.getLiveSnapshot()
  val snapshotUrl = response.snapshotUrl
  // Load the live snapshot image from the URL
} catch (e: Exception) {
  Log.e("CameraSnapshot", "Failed to get live snapshot: ${e.message}")
}

স্ন্যাপশট সংক্রান্ত অনুরোধ যাচাই করা

   Android-এর জন্য স্যাম্পেল অ্যাপে প্রয়োগ করা হয়েছে   

সব স্ন্যাপশট URL সুরক্ষিত মিডিয়াতে পয়েন্ট করে এবং Home APIs v2 স্কোপের জন্য OAuth 2.0 টোকেন প্রয়োজন। ছবি ডাউনলোড ও রেন্ডার করতে, আপনার HTTP অনুরোধের Authorization হেডারে OAuth টোকেন বিয়ারার টোকেন হিসেবে ইনজেক্ট করতে হবে।

নিচের উদাহরণে দেখানো হয়েছে যে কীভাবে স্ন্যাপশট ডাউনলোড করার জন্য একটি সুরক্ষিত নেটওয়ার্ক অনুরোধ কনফিগার করতে হয়:

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import java.io.IOException
import java.net.HttpURLConnection
import java.net.URL
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

/**
 * Downloads a snapshot from a URL using an OAuth access token.
 */
suspend fun loadSnapshotImage(urlString: String, oauthToken: String): Bitmap? =
  withContext(Dispatchers.IO) {
    var connection: HttpURLConnection? = null
    try {
      val url = URL(urlString)
      connection = url.openConnection() as HttpURLConnection
      // 1. Configure the HTTP GET request with the Bearer token
      connection.setRequestProperty("Authorization", "Bearer $oauthToken")

      // 2. Fetch the image data
      if (connection.responseCode == HttpURLConnection.HTTP_OK) {
        connection.inputStream.use { inputStream ->
          BitmapFactory.decodeStream(inputStream)
        }
      } else {
        null
      }
    } catch (e: IOException) {
      e.printStackTrace()
      null
    } finally {
      connection?.disconnect()
    }
  }

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

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"
  }
]
// 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

ব্যাটারি পরিবর্তন করতে হবে কিনা তা চেক করুন

batReplaceability অ্যাট্রিবিউট থেকে বোঝা যায় যে ব্যাটারি পরিবর্তন করা যাবে না, ব্যবহারকারী পরিবর্তন করতে পারবেন নাকি ফ্যাক্টরি-রিপ্লেসেবল।

PowerSource ট্রেটের batReplacementNeeded অ্যাট্রিবিউট আপনাকে জানায় যে ব্যাটারি পরিবর্তন করতে হবে কিনা।

// Get the battery replacement status
val batteryStatus = powerSourceTrait.batReplacementNeeded

if (batteryStatus) {
  println("Replace the battery.")
}

ব্যাটারি ব্যবহারকারী পরিবর্তন করতে পারলে, batReplacementDescription ব্যাটারির বিবরণ দেয়, যার মধ্যে ফর্ম ফ্যাক্টর, কেমিস্ট্রি ও পছন্দের প্রস্তুতকারকের মতো তথ্য থাকে।

অডিও সেটিংস

Home API-এর মাধ্যমে বিভিন্ন অডিও সেটিংস কন্ট্রোল করা যায়।

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

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

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

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

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

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

অ্যাক্টিভিটি জোন সেটিংস

   Android-এর জন্য স্যাম্পেল অ্যাপে প্রয়োগ করা হয়েছে   

ZoneManagement বৈশিষ্ট্য ক্যামেরা ও কলিং বেল ডিভাইসে কাস্টম অঞ্চল (অ্যাক্টিভিটি জোন) ম্যানেজ করার জন্য ইন্টারফেস প্রদান করে। ডিভাইসের ফিল্ড অফ ভিউয়ের মধ্যে নির্দিষ্ট এলাকায় ইভেন্ট শনাক্তকরণ (যেমন, ব্যক্তি বা গাড়ির গতিবিধি) ফিল্টার করতে এইসব জোন ব্যবহার করা হয়।

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

অ্যাক্টিভিটি জোন সাধারণত 2D কার্টেসিয়ান কোঅর্ডিনেট ব্যবহার করে সংজ্ঞায়িত করা হয়। এই বৈশিষ্ট্যটি ভার্টিসেসের জন্য TwoDCartesianVertexStruct এবং জোন সংজ্ঞার (নাম, ভার্টিসেস, রঙ এবং ব্যবহার) জন্য TwoDCartesianZoneStruct প্রদান করে।

অ্যাক্টিভিটি জোন চেক করুন

অ্যাক্টিভিটি জোন দেখাতে, ZoneManagement ট্রেইটের zones অ্যাট্রিবিউট চেক করুন।

// 1. Obtain the trait flow from the device
private val zoneManagementFlow: Flow =
  device.type(CAMERA_TYPE).flatMapLatest { it.trait(ZoneManagement) }

// 2. Map the flow to the list of zone structures
val activityZones: Flow<List<ZoneManagementTrait.ZoneInformationStruct>> =
  zoneManagementFlow.map { trait ->
    trait.zones ?: emptyList()
  }

অ্যাক্টিভিটি জোন যোগ করুন

নতুন জোন তৈরি করতে, createTwoDCartesianZone কমান্ড ব্যবহার করুন। এই কমান্ড TwoDCartesianZoneStruct নেয়, যা জোনের নাম, ভার্টিসেস, রঙ ও ব্যবহার নির্ধারণ করে।

নিচের উদাহরণে দেখানো হয়েছে যে কীভাবে চারটি ভার্টেক্স, স্যামন রঙ (#F439A0) সহ "সামনের বারান্দা" নামের জোন তৈরি করতে হয় এবং মোশন ডিটেকশনের জন্য ব্যবহার করতে হয়।

import com.google.home.google.ZoneManagement
import com.google.home.google.ZoneManagementTrait
import com.google.home.matter.serialization.OptionalValue

/**
 * Creates a custom activity zone named "Front Porch" with a salmon color
 * configured for motion detection.
 */
suspend fun createFrontPorchZone(zoneManagement: ZoneManagement) {
  // 1. Define the vertices for the zone (2D Cartesian coordinates)
  // Values are typically scaled to a maximum defined by the device's twoDCartesianMax attribute.
  val vertices =
    listOf(
      ZoneManagementTrait.TwoDCartesianVertexStruct(x = 260u, y = 422u),
      ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1049u, y = 0u),
      ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048u, y = 0u),
      ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048u, y = 950u),
      ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1630u, y = 1349u),
      ZoneManagementTrait.TwoDCartesianVertexStruct(x = 880u, y = 2048u),
      ZoneManagementTrait.TwoDCartesianVertexStruct(x = 0u, y = 2048u),
      ZoneManagementTrait.TwoDCartesianVertexStruct(x = 638u, y = 1090u)
    )

  // 2. Define the zone structure
  val newZone =
    ZoneManagementTrait.TwoDCartesianZoneStruct(
      name = "Front Porch",
      vertices = vertices,
      // Usage defines what the zone filters (for example, Motion, Person, Vehicle)
      use = listOf(ZoneManagementTrait.ZoneUseEnum.Motion),
      // Color is typically a hex string (for example, Salmon/Pink)
      color = OptionalValue.present("#F439A0")
    )

  try {
    // 3. Execute the command to add the zone to the device
    zoneManagement.createTwoDCartesianZone(newZone)
    println("Successfully created activity zone.")
  } catch (e: Exception) {
    // Handle potential HomeException or Timeout
    println("Failed to create activity zone: ${e.message}")
  }
}

অ্যাক্টিভিটি জোন আপডেট করা

আগে থেকে থাকা জোন আপডেট করতে, updateTwoDCartesianZone কমান্ড ব্যবহার করুন। এই কমান্ডের জন্য zoneId এবং আপডেট করা TwoDCartesianZoneStruct প্রয়োজন।

private suspend fun ZoneManagement.updateZone(
  zoneId: UShort,
  zone: ZoneManagementTrait.TwoDCartesianZoneStruct
) {
  // Execute the command to update the zone
  this.updateTwoDCartesianZone(zoneId = zoneId, zone = zone)
}

অ্যাক্টিভিটি জোন মুছে ফেলা

কোনও জোন সরাতে, নির্দিষ্ট zoneId-এর সাথে removeZone কমান্ড ব্যবহার করুন।

private suspend fun ZoneManagement.deleteZone(zoneId: UShort) {
  // Execute the command to remove the zone
  this.removeZone(zoneId = zoneId)
}

সাউন্ড ইভেন্ট ট্রিগার

AvStreamAnalysis ট্রেইট ক্যামেরা ও ডোরবেল ডিভাইসে ইভেন্ট শনাক্তকরণ ট্রিগার ম্যানেজ করার জন্য একটি ইন্টারফেস প্রদান করে। ভিশন-ভিত্তিক ট্রিগার (যেমন, লোকজন বা গাড়ি) জোন-নির্দিষ্ট হতে পারে, সাউন্ড-সম্পর্কিত ট্রিগার সাধারণত ডিভাইস-লেভেল কনফিগারেশন।

EventTriggerTypeEnum-এর মাধ্যমে শব্দ শনাক্তকরণের জন্য নিম্নলিখিত ট্রিগারের ধরন উপলভ্য:

মোড Enum ভ্যালু বিবরণ
সাউন্ড Sound সাধারণ শব্দ শনাক্তকরণ।
কেউ কথা বলছে PersonTalking স্পিচ শনাক্ত করে।
কুকুরের ডাক DogBark কুকুরের ডাক শনাক্ত করে।
কাঁচ ভাঙা GlassBreak কাঁচ ভাঙার শব্দ শনাক্ত করে।
স্মোক অ্যালার্ম SmokeAlarm স্মোক অ্যালার্ম শনাক্ত করে, যা প্রায়ই T3 অডিও প্যাটার্ন (তিনটি ছোট বিপের পরে একটি পজ) দ্বারা চেনা যায়।
CO অ্যালার্ম CoAlarm কার্বন মনোক্সাইড (CO) অ্যালার্ম শনাক্ত করে, সাধারণত T4 শ্রবণযোগ্য প্যাটার্ন (চারটি ছোট বিপের পরে একটি বিরতি) দ্বারা স্বীকৃত।

শব্দ শনাক্তকরণ স্ট্যাটাস চেক করা

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

Kotlin Flows ব্যবহার করে Android ডেভেলপমেন্টে, আপনি সাধারণত HomeDevice থেকে AvStreamAnalysis বৈশিষ্ট্য লক্ষ্য করবেন।

// Example structure to store the
data class EventTriggerAttribute(val type: EventTriggerTypeEnum, val enabled: Boolean)

// 1. Obtain the trait flow from the device
private val avStreamAnalysisFlow: Flow<AvStreamAnalysis> =
  device.traitFromType(AvStreamAnalysis, CAMERA_TYPES.first { device.has(it) })

// 2. Map the flow to a list of sound event attributes
val soundEventTriggersState: Flow<List<EventTriggerAttribute>> =
  avStreamAnalysisFlow.map { trait ->
    // Get raw lists from the trait attributes
    val supported = trait.supportedEventTriggers ?: emptyList()
    val enabled = trait.enabledEventTriggers ?: emptyList()

    // Define sound-specific triggers to filter for
    val soundTypes = setOf(
      EventTriggerTypeEnum.Sound,
      EventTriggerTypeEnum.PersonTalking,
      EventTriggerTypeEnum.DogBark,
      EventTriggerTypeEnum.GlassBreak,
      EventTriggerTypeEnum.SmokeAlarm,
      EventTriggerTypeEnum.CoAlarm,
    )

    // Filter and associate status
    supported
      .filter { soundTypes.contains(it) }
      .map { type ->
        EventTriggerAttribute(
          type = type,
          enabled = enabled.contains(type)
        )
      }
  }

চালু করা ট্রিগারের সেট আপডেট করুন

চালু করা ট্রিগারের সেট আপডেট করতে, SetOrUpdateEventDetectionTriggers কমান্ড ব্যবহার করুন, যা EventTriggerEnablement স্ট্রাকচারের তালিকা নেয়।

private suspend fun AvStreamAnalysis.updateEventTriggers(
  eventTriggers: List<EventTriggerAttribute>
) {
  val toUpdate = eventTriggers.map {
    EventTriggerEnablement(
      eventTriggerType = it.type,
      enablementStatus = if (it.enabled) {
        EnablementStatusEnum.Enabled
      } else {
        EnablementStatusEnum.Disabled
      },
    )
  }

  // Execute the command on the device
  setOrUpdateEventDetectionTriggers(toUpdate)
}

রেকর্ডিং মোড

   Android-এর জন্য স্যাম্পেল অ্যাপে প্রয়োগ করা হয়েছে   

RecordingMode ট্রেইট ক্যামেরা ও ডোরবেল ডিভাইসে ভিডিও ও ছবি রেকর্ডিংয়ের আচরণ ম্যানেজ করার জন্য ইন্টারফেস প্রদান করে। এটি ব্যবহারকারীদের একটানা রেকর্ডিং, ইভেন্ট-ভিত্তিক রেকর্ডিং বা রেকর্ডিং সম্পূর্ণভাবে বন্ধ করার (শুধুমাত্র লাইভ ভিউ) মধ্যে থেকে বেছে নেওয়ার সুবিধা দেয়।

RecordingModeEnum উপলভ্য রেকর্ডিং স্ট্র্যাটেজি নির্ধারণ করে:

মোড Enum ভ্যালু বিবরণ
বন্ধ আছে Disabled রেকর্ডিং সম্পূর্ণভাবে বন্ধ করা আছে। প্রধানত পুরনো ডিভাইসে ব্যবহার করা হয়।
CVR (অবিচ্ছিন্ন ভিডিও রেকর্ডিং) Cvr ভিডিও ২৪x৭ রেকর্ড করা হয়। সাবস্ক্রিপশন প্রয়োজন (যেমন, Google Home Premium।
EBR (ইভেন্ট-ভিত্তিক রেকর্ডিং) Ebr ইভেন্ট (ব্যক্তি, মোশন) রেকর্ডিং ট্রিগার করে। ইভেন্টের সময়সীমা ও সাবস্ক্রিপশনের উপর ভিডিওর দৈর্ঘ্য নির্ভর করে।
ETR (ইভেন্ট ট্রিগার করা রেকর্ডিং) Etr ইভেন্টের মাধ্যমে ট্রিগার হওয়া ছোট প্রিভিউ রেকর্ডিং (যেমন, ১০ সেকেন্ড)।
Live View LiveView রেকর্ডিং বন্ধ করা আছে, তবে ব্যবহারকারীরা এখনও লাইভ স্ট্রিম অ্যাক্সেস করতে পারবেন।
স্টিল ছবি Images ইভেন্ট ঘটলে ভিডিওর পরিবর্তে স্ন্যাপশট রেকর্ড করা হয়।

রেকর্ডিং মোড চেক করুন

বর্তমান রেকর্ডিং কনফিগারেশন দেখাতে, RecordingMode ট্রেইটের অ্যাট্রিবিউট চেক করুন:

// 1. Obtain the trait flow from the device
private val recordingModeTraitFlow: Flow =
    device.traitFromType(RecordingMode, CAMERA_TYPES.first { device.has(it) })

// 2. Map the flow to recording mode options
data class RecordingModeOptions(
    val recordingMode: RecordingModeTrait.RecordingModeEnum,
    val index: Int,
    val available: Boolean,
    val readableString: String,
)

private val recordingModeOptions: Flow<List> =
    recordingModeTraitFlow.map { trait ->
        val supported = trait.supportedRecordingModes?.map { it.recordingMode } ?: emptyList()
        val available = trait.availableRecordingModes?.map { it.toInt() } ?: emptyList()

        supported.withIndex().map { (index, mode) ->
            RecordingModeOptions(
                recordingMode = mode,
                index = index,
                available = available.contains(index),
                readableString = mode.toReadableString(),
            )
        }
    }

রেকর্ডিং মোড পরিবর্তন করুন

আপডেট করার আগে, supportedRecordingModes অ্যাট্রিবিউট থেকে বেছে নেওয়া ইন্ডেক্স availableRecordingModes অ্যাট্রিবিউটে আছে কিনা তা নিশ্চিত করুন।

বেছে নেওয়া মোড আপডেট করতে, setSelectedRecordingMode ফাংশন ব্যবহার করুন, বেছে নেওয়া মোডের ইন্ডেক্স পাস করুন:

private suspend fun RecordingMode.updateRecordingMode(index: Int) {
    // Execute the command to update the selected mode
    this.setSelectedRecordingMode(index.toUByte())
}

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

Home API-এর মাধ্যমে অন্যান্য বিভিন্ন সেটিংস কন্ট্রোল করা যায়।

ছবির ওরিয়েন্টেশন পরিবর্তন করুন

ক্যামেরা ইমেজের (ভিডিও) ওরিয়েন্টেশন ঘোরানো যেতে পারে। ভিডিওটি শুধুমাত্র ১৮০ ডিগ্রি ঘোরানো যাবে।

ক্যামেরার ছবির ওরিয়েন্টেশন পরিবর্তন করতে, বিল্ট-ইন setImageRotation Kotlin ফাংশন ব্যবহার করে CameraAvStreamManagement ট্রেইটের imageRotation অ্যাট্রিবিউট আপডেট করুন:

// Change the camera's image orientation
val isRotated = false

cameraAvStreamManagement.update { setImageRotation(if (isRotated) 180.toUShort() else 0.toUShort()) }

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

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

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

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

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

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

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

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

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

ক্যামেরা ভিউপোর্ট হল জুম ও ক্রপ ফিচারের মতোই, যা জুম করুন এবং Nest ক্যামেরা উন্নত করুন ভিডিও সহায়তা নিবন্ধে বর্ণনা করা হয়েছে।

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

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

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

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

অ্যানালিটিক্স চালু বা বন্ধ করুন

প্রতিটি ডিভাইস আলাদাভাবে Google Home ক্লাউডে বিস্তারিত অ্যানালিটিক্স ডেটা পাঠানোর জন্য অপ্ট-ইন করতে পারে (Home API-এর জন্য ক্লাউড মনিটরিং দেখুন)।

কোনও ডিভাইসের জন্য অ্যানালিটিক্স চালু করতে, ExtendedGeneralDiagnosticsTrait-এর analyticsEnabled প্রপার্টি true-এ সেট করুন। আপনি analyticsEnabled সেট করলে, অন্য একটি প্রপার্টি, logUploadEnabled, অটোমেটিক true-এ সেট হয়ে যায়, যা অ্যানালিটিক্স লগ ফাইল Google Home ক্লাউডে আপলোড করার অনুমতি দেয়।

// Enable analytics
extendedGeneralDiagnostics.update {
  setAnalyticsEnabled(true)
}

// Disable analytics
extendedGeneralDiagnostics.update {
  setAnalyticsEnabled(false)
}

ট্রান্সপোর্ট ও রেকর্ডিং কনফিগারেশন

এই বিভাগে ক্যামেরা স্ট্রিমিং কোয়ালিটি এবং ইভেন্ট ট্রিগার করা সম্পর্কিত সেটিংস কভার করা হয়েছে। এইসব সেটিংস PushAvStreamTransport ট্রেটের মাধ্যমে ম্যানেজ করা হয়।

পরিবহন সংক্রান্ত সেটিংস পড়ুন

এই বিভাগে দেখানো হয়েছে যে কীভাবে ক্যামেরা বা ডোরবেল ডিভাইস থেকে বর্তমান কনফিগারেশন উদ্ধার করতে হয়। এটি PushAvStreamTransport বৈশিষ্ট্য নিয়ে আসে, রেকর্ডিংয়ের জন্য ব্যবহৃত নির্দিষ্ট কানেকশন খুঁজে বের করে এবং তারপর ব্যান্ডউইথ কোয়ালিটি, ওয়েক-আপ সেন্সিটিভিটি এবং ইভেন্টের সর্বাধিক দৈর্ঘ্যের জন্য বর্তমান ভ্যালু এক্সট্র্যাক্ট করে।

val trait: PushAvStreamTransport = device.getTrait(PushAvStreamTransport)
val connections = trait.findTransport().transportConfigurations

// Locate the connection designated for recording
val recordingConnection = connections.firstOrNull {
    it.transportOptions.getOrNull()?.streamUsage == StreamUsageEnum.Recording
}

val options = recordingConnection?.transportOptions?.getOrNull()

// 1. Bandwidth Quality (Video Stream ID)
val videoStreamId = options?.videoStreamId?.getOrNull()

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

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

পরিবহন সংক্রান্ত সেটিংস আপডেট করুন

এই বিভাগে দেখানো হয়েছে যে কীভাবে ট্রান্সপোর্ট সেটিংস পরিবর্তন করতে হয়। এটি নতুন ভ্যালু সহ একটি নতুন TransportOptionsStruct তৈরি করে এবং তারপরে modifyPushTransport কমান্ড ব্যবহার করে এইসব আপডেট করা সেটিংস ডিভাইসে ফেরত পাঠায়, আগের ধাপে পাওয়া রেকর্ডিং কানেকশনে সেগুলি প্রয়োগ করে।

এইসব সেটিংস পরিবর্তন করতে, TransportOptionsStruct-এর সাথে modifyPushTransport কমান্ড ব্যবহার করুন।

val toUpdate = TransportOptionsStruct(
    videoStreamId = OptionalValue.present(2u), // e.g., Max Quality
    triggerOptions = TransportTriggerOptionsStruct(
        motionSensitivity = OptionalValue.present(5u), // e.g., Medium
        motionTimeControl = OptionalValue.present(
            TransportMotionTriggerTimeControlStruct(maxDuration = 30u)
        )
    )
)

if (recordingConnection != null) {
    trait.modifyPushTransport(
        connectionId = recordingConnection.connectionId,
        transportOptions = toUpdate
    )
}

ব্যান্ডউইথের কোয়ালিটি নির্ধারণ করা

TransportOptionsStruct-এর videoStreamId প্রপার্টি নির্দিষ্ট ভিডিও স্ট্রিম কনফিগারেশনের সাথে সম্পর্কিত।

কাজ করে এমন ভিডিও স্ট্রিম পেতে, allocatedVideoStreams অ্যাট্রিবিউট দেখুন, যা VideoStreamStructs-এর একটি তালিকা। ডিভাইসের জন্য CameraAvStreamManagement trait থেকে।

ডিভাইসের ওয়েক-আপ সেন্সিটিভিটি অ্যাডজাস্ট করুন

TransportTriggerOptionsStruct-এর motionSensitivity প্রপার্টি নিম্নলিখিত ভ্যালুর সাথে সম্পর্কিত:

লেবেল ভ্যালু (UByte)
কম ১u
মাঝারি ৫u
বেশি ১০u

ইভেন্টের সর্বাধিক দৈর্ঘ্য অ্যাডজাস্ট করুন

TransportMotionTriggerTimeControlStruct-এর maxDuration প্রপার্টি নিম্নলিখিত সময়সীমার (সেকেন্ডে) সাথে সম্পর্কিত:

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

ডিভাইস ডিকমিশন করা

কোনও স্ট্রাকচার থেকে ক্যামেরা সরাতে, device.decommissionDevice() নম্বরে কল করুন। ডিকমিশন করার সময় ব্যবহারকারীকে Google-এর ম্যানেজ করা কনফার্মেশন স্ক্রিন দেখানো হয়, যেখানে সতর্ক করা হয় যে ২৪/৭ রেকর্ড করা ভিডিও ইতিহাস, ইভেন্ট ইতিহাস, ক্লিপ এবং পরিচিত ফেস লাইব্রেরি ডেটা স্ট্রাকচার জুড়ে স্থায়ীভাবে মুছে যাবে।

বিস্তারিত নির্দেশাবলী ও কোডের উদাহরণের জন্য, ডিভাইস সরান বিকল্প দেখুন।