คู่มืออุปกรณ์กล้องสำหรับ Android

ประเภทอุปกรณ์กล้องจะใช้ลักษณะ 3 อย่าง ได้แก่ PushAvStreamTransport ซึ่งจัดการการส่งสตรีมเสียงและวิดีโอโดยใช้โปรโตคอลแบบพุช WebRtcLiveView ซึ่งให้ความสามารถในการควบคุมไลฟ์สดและฟีเจอร์ TalkBack และ CameraSnapshot ซึ่งให้ภาพรวมตัวอย่างที่แคชไว้และการจับภาพสแนปชอตแบบสด

ตรวจสอบการรองรับแอตทริบิวต์และคำสั่งสำหรับอุปกรณ์ก่อนใช้ฟีเจอร์หรือพยายามอัปเดตแอตทริบิวต์เสมอ ดูข้อมูลเพิ่มเติมได้ที่ควบคุมอุปกรณ์ในAndroid

ประเภทอุปกรณ์ของ Home API ลักษณะเฉพาะ แอปตัวอย่าง Kotlin กรณีการใช้งาน

กล้อง

GoogleCameraDevice

home.matter.6006.types.0158

อุปกรณ์ที่จับภาพนิ่งหรือวิดีโอ กล้องอาจมีฟีเจอร์ไลฟ์สดที่เข้าถึงได้, ฟีเจอร์พูดคุยแบบ 2 ทาง หรือเหตุการณ์การตรวจจับ

ลักษณะที่จำเป็น
     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}")
    }

ดูหมายเลขซีเรียล

หากต้องการดูหมายเลขซีเรียลของอุปกรณ์ ให้ใช้คำสั่ง GetSerialNumber ของลักษณะ ExtendedBasicInformation ตัวอย่างแสดงการบันทึกหมายเลขซีเรียลในตัวแปรชื่อ serialNumber ดังนี้

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

ดูเวลาล่าสุดที่อุปกรณ์ติดต่อกับระบบคลาวด์

หากต้องการค้นหาเวลาล่าสุดที่อุปกรณ์ติดต่อกับระบบคลาวด์ ให้ใช้แอตทริบิวต์ lastContactTimestamp ของลักษณะ ExtendedGeneralDiagnostics ดังนี้

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 ของอุปกรณ์ ให้ใช้แอตทริบิวต์ networkInterfaces ของลักษณะ GeneralDiagnostics ระบบจะแสดงผลที่อยู่เป็นอาร์เรย์ไบต์ ซึ่งคุณสามารถจัดรูปแบบเป็นสตริง 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   

หากต้องการเริ่มไลฟ์สด ให้ส่งสตริง Session Description Protocol (SDP) ไปยังเมธอด startLiveView() ของลักษณะ WebRtcLiveView ซึ่งจะแสดงผล WebRtcLiveViewTrait.StartLiveViewCommand.Response ที่มีค่า 3 ค่าต่อไปนี้

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

เริ่มและหยุด TalkBack

   ติดตั้งใช้งานในแอปตัวอย่างสำหรับ Android   

หากต้องการเริ่มการพูดตอบ ให้เรียกใช้เมธอด startTalkback() ของลักษณะ WebRtcLiveView หากต้องการหยุด ให้ใช้ 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 จะจัดการความละเอียดของเซสชันไลฟ์สดที่ใช้งานอยู่บนไคลเอ็นต์หนึ่งๆ โดยเฉพาะ ซึ่งไม่เหมือนกับการกำหนดค่าการตั้งค่าการใช้แบนด์วิดท์ทั้งอุปกรณ์โดยตรงบนอุปกรณ์ ซึ่งจะส่งผลต่อผู้ชมที่ดูพร้อมกันทั้งหมดและคุณภาพของการบันทึกวิดีโอที่ผ่านมาซึ่งบันทึกไว้ในระบบคลาวด์

ตัวอย่างต่อไปนี้แสดงวิธีดึงข้อมูลและอัปเดตคุณภาพไลฟ์สดของอุปกรณ์

  • ดึงข้อมูลตัวเลือกคุณภาพที่รองรับ: ดูความละเอียดในการสตรีมที่อุปกรณ์รองรับ โค้ดจะค้นหาแอตทริบิวต์ supportedQualityHints ของลักษณะ WebRtcLiveView ในขั้นตอนประเภทอุปกรณ์ และแสดงคุณภาพที่รองรับเป็น StateFlow ที่มีรายการค่า QualityHint (เช่น QUALITY_HINT_SD, QUALITY_HINT_HD, QUALITY_HINT_FHD, QUALITY_HINT_QHD หรือ QUALITY_HINT_UHD)

  • เปลี่ยนคุณภาพไลฟ์สด: ใช้ QualityHint ที่เลือกเพื่อเปลี่ยนความละเอียดในการสตรีมของไลฟ์สดที่กำลังดำเนินอยู่ (เช่น เปลี่ยนจากความละเอียดมาตรฐานเป็นความละเอียดสูง) ฟังก์ชัน changeQuality จะแก้ไขลักษณะการไลฟ์สดของอุปกรณ์และเรียกใช้ changeLiveViewQuality ด้วย mediaSessionId ที่ใช้งานอยู่และการกำหนดค่า QualityHint ที่เลือก

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

เปิดและปิดใช้ความสามารถในการบันทึก

หากต้องการเปิดใช้ความสามารถในการบันทึกของกล้อง ให้ส่ง TransportStatusEnum.Active ไปยังเมธอด setTransportStatus() ของลักษณะ PushAvStreamTransport หากต้องการปิดใช้ความสามารถในการบันทึก ให้ส่ง 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ของประเภทอุปกรณ์
  • คุณจะเข้าถึงไลฟ์สดไม่ได้ และกล้องจะไม่ตรวจจับเหตุการณ์ในระบบคลาวด์

ตรวจสอบว่าเปิดใช้ความสามารถในการบันทึกหรือไม่

หากต้องการตรวจสอบว่าความสามารถในการบันทึกของกล้องเปิดใช้อยู่หรือไม่ ให้ดูว่ามีการเชื่อมต่อที่ใช้งานอยู่หรือไม่ ตัวอย่างต่อไปนี้จะกำหนด 2 ฟังก์ชันเพื่อดำเนินการนี้

// 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 เพื่อดึงข้อมูลสแนปชอตรูปภาพนิ่งจากกล้อง ภาพรวมเหล่านี้มีประโยชน์ในหลายสถานการณ์ ดังนี้

  • ปรากฏเป็นการ์ดตัวยึดตำแหน่งใน UI ขณะที่ไลฟ์สด WebRTC กำลังโหลด
  • เป็นภาพตัวอย่างแบบคงที่ซึ่งจะอัปเกรดเป็นไลฟ์สดเมื่อผู้ใช้โต้ตอบ
  • เป็นภาพพื้นหลังสำหรับวาดและกำหนดค่าโซนตรวจจับกิจกรรมที่กำหนดเอง

ลักษณะ CameraSnapshot มี 2 วิธีในการดึงสแนปชอต โดยขึ้นอยู่กับว่าคุณต้องการสแนปชอตที่แคชไว้สำหรับการแสดงผลอย่างรวดเร็วหรือสแนปชอตแบบสดตามต้องการ

ดูภาพรวมตัวอย่างที่แคชไว้

ภาพรวมตัวอย่างคือรูปภาพที่แคชไว้ซึ่ง 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-frame แรกของส่วนย่อยวิดีโอล่าสุด) หรือสแนปชอตที่กล้องอัปโหลดเป็นระยะ ทั้งนี้ขึ้นอยู่กับการกำหนดค่าและกิจกรรมของกล้อง

ระบบคลาวด์ของ Google Home จะฝังส่วนหัว X-Home-Image-Captured-At ไว้ในรูปภาพ JPEG/PNG ที่แสดงในรูปแบบ 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 ของสแนปชอตทั้งหมดจะชี้ไปยังสื่อที่ปลอดภัยและต้องใช้โทเค็น OAuth 2.0 สำหรับขอบเขต Home API v2 หากต้องการดาวน์โหลดและแสดงผลรูปภาพ คุณต้องแทรกโทเค็น OAuth เป็นโทเค็นสำหรับผู้ถือในส่วนหัว Authorization ของคำขอ HTTP

ตัวอย่างต่อไปนี้แสดงวิธีกำหนดค่าคำขอเครือข่ายที่ปลอดภัยเพื่อดาวน์โหลดสแนปชอต

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

ตั้งค่ากำหนดการใช้งานแบตเตอรี่

การตั้งค่าสมดุลพลังงานช่วยให้คุณกำหนดค่าการแลกเปลี่ยนระหว่างระยะเวลาการใช้งานแบตเตอรี่และประสิทธิภาพของอุปกรณ์ได้ คุณสามารถสร้างโปรไฟล์แบตเตอรี่ที่แตกต่างกัน เช่น "ขยาย" "สมดุล" และ "ประสิทธิภาพ" และสลับไปมาได้

ฟีเจอร์นี้ใช้งานได้โดยการอัปเดตแอตทริบิวต์ currentEnergyBalance ของลักษณะ EnergyPreference แอตทริบิวต์นี้ยอมรับดัชนีจำนวนเต็มที่สอดคล้องกับโปรไฟล์ที่เฉพาะเจาะจงซึ่งกำหนดไว้ในรายการ energyBalances ของอุปกรณ์ (เช่น 0 สำหรับ EXTENDED, 1 สำหรับ BALANCED และ 2 สำหรับ PERFORMANCE)

ค่า null สำหรับ currentEnergyBalance บ่งบอกว่าอุปกรณ์กำลังใช้โปรไฟล์ที่กำหนดเอง ซึ่งเป็นสถานะแบบอ่านอย่างเดียว

ตัวอย่างต่อไปนี้แสดงโครงสร้างที่แอตทริบิวต์ 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)

เปิดโหมดประหยัดแบตเตอรี่อัตโนมัติ

หากต้องการกำหนดค่าฟีเจอร์นี้ ให้อัปเดตแอตทริบิวต์ currentLowPowerModeSensitivity ของลักษณะ EnergyPreference แอตทริบิวต์นี้ใช้ดัชนีเพื่อเลือกระดับความไว โดยที่ 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) }
}

ดูสถานะการชาร์จแบตเตอรี่

หากต้องการดูสถานะการชาร์จปัจจุบันของอุปกรณ์ (กำลังชาร์จ ชาร์จเต็ม หรือไม่ได้ชาร์จ) ให้ใช้แอตทริบิวต์ batChargeState ของลักษณะ PowerSource

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

ดูระดับแบตเตอรี่

หากต้องการดูระดับแบตเตอรี่ปัจจุบัน ให้ใช้แอตทริบิวต์ batChargeLevel ของลักษณะ PowerSource ระดับอาจเป็น 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"
}

รับแหล่งจ่ายไฟ

หากต้องการระบุแหล่งพลังงานที่อุปกรณ์ใช้อยู่ ให้ใช้แอตทริบิวต์ BatPresent และ wiredPresent ของลักษณะ PowerSource

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

ตรวจสอบว่าต้องเปลี่ยนแบตเตอรี่หรือไม่

แอตทริบิวต์ batReplaceability จะระบุว่าแบตเตอรี่เปลี่ยนไม่ได้ ผู้ใช้เปลี่ยนได้ หรือเปลี่ยนได้ที่โรงงาน

แอตทริบิวต์ batReplacementNeeded ของลักษณะ PowerSource จะบอกคุณว่าต้องเปลี่ยนแบตเตอรี่หรือไม่

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

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

เมื่อผู้ใช้เปลี่ยนแบตเตอรี่ได้ batReplacementDescription จะอธิบายแบตเตอรี่ รวมถึงข้อมูลต่างๆ เช่น รูปแบบ องค์ประกอบทางเคมี และผู้ผลิตที่แนะนำ

การตั้งค่าเสียง

คุณควบคุมการตั้งค่าเสียงต่างๆ ได้ผ่าน Home API

เปิดหรือปิดไมโครโฟน

หากต้องการเปิดหรือปิดไมโครโฟนของอุปกรณ์ ให้อัปเดตแอตทริบิวต์ microphoneMuted ของลักษณะ CameraAvStreamManagement โดยใช้ฟังก์ชัน Kotlin setMicrophoneMuted ในตัว ดังนี้

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

เปิดหรือปิดการบันทึกเสียง

หากต้องการเปิดหรือปิดการบันทึกเสียงสำหรับอุปกรณ์ ให้อัปเดตแอตทริบิวต์ recordingMicrophoneMuted ของลักษณะ CameraAvStreamManagement โดยใช้ฟังก์ชัน Kotlin setRecordingMicrophoneMuted ในตัว ดังนี้

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

ปรับระดับเสียงของลำโพง

หากต้องการปรับระดับเสียงลำโพงของอุปกรณ์ ให้อัปเดตแอตทริบิวต์ speakerVolumeLevel ของลักษณะ CameraAvStreamManagement โดยใช้ฟังก์ชัน Kotlin setSpeakerVolumeLevel ในตัว ดังนี้

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

การตั้งค่าโซนตรวจจับกิจกรรม

   ติดตั้งใช้งานในแอปตัวอย่างสำหรับ Android   

ลักษณะ ZoneManagement มีอินเทอร์เฟซสำหรับจัดการขอบเขตที่สนใจ (โซนตรวจจับกิจกรรม) ที่กำหนดเองในอุปกรณ์กล้องและกริ่งประตู โซนเหล่านี้ใช้เพื่อกรองการตรวจจับเหตุการณ์ (เช่น การเคลื่อนไหวของบุคคลหรือยานพาหนะ) ไปยังพื้นที่เฉพาะภายในขอบเขตการมองเห็นของอุปกรณ์

ผู้ใช้จะกำหนดค่าโซนตรวจจับกิจกรรมภายในแอปพลิเคชันของพาร์ทเนอร์ ซึ่งช่วยให้ผู้ใช้สามารถวาดโซนเหนือพื้นที่ที่เฉพาะเจาะจงในขอบเขตการมองเห็นของกล้องได้ จากนั้นระบบจะแปลโซนที่ผู้ใช้กำหนดเหล่านี้เป็นโครงสร้างที่ลักษณะนี้ใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของโซนตรวจจับกิจกรรมได้ที่ตั้งค่าและใช้โซนตรวจจับกิจกรรม

โดยปกติแล้ว โซนตรวจจับกิจกรรมจะกำหนดโดยใช้พิกัดคาร์ทีเซียน 2 มิติ ลักษณะนี้จะให้ TwoDCartesianVertexStruct สำหรับจุดยอดและ TwoDCartesianZoneStruct สำหรับคำจำกัดความของโซน (ชื่อ จุดยอด สี และการใช้งาน)

ตรวจสอบโซนตรวจจับกิจกรรม

หากต้องการแสดงโซนตรวจจับกิจกรรม ให้ตรวจสอบแอตทริบิวต์ zones ของลักษณะ ZoneManagement

// 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 ซึ่งกำหนดชื่อ จุดยอด สี และการใช้งานของโซน

ตัวอย่างต่อไปนี้แสดงวิธีสร้างโซนชื่อ "ระเบียงหน้าบ้าน" ที่มีจุดยอด 4 จุด สีส้มแซลมอน (#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)
}

ลบโซนตรวจจับกิจกรรม

หากต้องการนำโซนออก ให้ใช้คำสั่ง removeZone กับ zoneId ที่เฉพาะเจาะจง

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 (เสียงบี๊บสั้นๆ 3 ครั้งตามด้วยการหยุดชั่วคราว)
สัญญาณเตือนคาร์บอนมอนอกไซด์ CoAlarm ตรวจจับสัญญาณเตือนคาร์บอนมอนอกไซด์ (CO) ซึ่งมักจะจดจำได้จากรูปแบบเสียง T4 (เสียงบี๊บสั้นๆ 4 ครั้งตามด้วยการหยุดชั่วคราว)

ตรวจสอบสถานะการตรวจจับเสียง

หากต้องการแสดงสถานะปัจจุบันของการตรวจจับเสียงให้ผู้ใช้เห็น คุณต้องตรวจสอบว่าอุปกรณ์รองรับอะไรบ้างและฮาร์ดแวร์ของอุปกรณ์เปิดใช้อะไรบ้าง แอตทริบิวต์ 2 รายการที่ต้องตรวจสอบมีดังนี้

ในการพัฒนาแอป Android โดยใช้ Kotlin Flows โดยทั่วไปคุณจะสังเกตลักษณะ AvStreamAnalysis จาก HomeDevice

// 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 ระบบจะบันทึกวิดีโอทุกวันตลอด 24 ชั่วโมง ต้องสมัครใช้บริการ (เช่น Google Home Premium)
EBR (การบันทึกเมื่อเกิดเหตุการณ์) Ebr การบันทึกจะเริ่มทำงานตามเหตุการณ์ (คน การเคลื่อนไหว) ความยาววิดีโอจะขึ้นอยู่กับระยะเวลาของเหตุการณ์และการสมัครใช้บริการ
ETR (การบันทึกที่ทริกเกอร์โดยเหตุการณ์) Etr การบันทึกตัวอย่างสั้นๆ (เช่น 10 วินาที) ที่ทริกเกอร์โดยเหตุการณ์
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

เปลี่ยนการวางแนวรูปภาพ

คุณหมุนการวางแนวของรูปภาพจากกล้อง (วิดีโอ) ได้ วิดีโอหมุนได้ 180 องศาเท่านั้น

หากต้องการเปลี่ยนการวางแนวรูปภาพของกล้อง ให้อัปเดตแอตทริบิวต์ imageRotation ของลักษณะ CameraAvStreamManagement โดยใช้ฟังก์ชัน Kotlin setImageRotation ในตัว ดังนี้

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

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

เปิดหรือปิดภาพกลางคืน

หากต้องการเปิดหรือปิดภาพกลางคืนของกล้อง ให้ใช้ TriStateAutoEnum เพื่ออัปเดตแอตทริบิวต์ nightVision ของลักษณะ CameraAvStreamManagement โดยใช้ฟังก์ชัน Kotlin setNightVision ในตัว ดังนี้

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

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

เปลี่ยนความสว่างของไฟ LED แสดงสถานะ

หากต้องการเปลี่ยนความสว่างของไฟ LED แสดงสถานะ ให้ใช้ ThreeLevelAutoEnum เพื่ออัปเดตแอตทริบิวต์ statusLightBrightness ของลักษณะ CameraAvStreamManagement โดยใช้ฟังก์ชัน Kotlin setStatusLightBrightness ในตัว ดังนี้

// 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 ซึ่งมีค่า 4 ค่าที่ใช้เป็นพิกัดของวิวพอร์ต พิกัดจะกำหนดเป็นค่าต่อไปนี้

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

การกำหนดค่าสำหรับ ViewportStruct ขึ้นอยู่กับ UI ของแอปและการใช้งานกล้อง ในระดับพื้นฐานที่สุด หากต้องการตั้งค่าวิวพอร์ตของวิดีโอกล้อง ให้อัปเดตแอตทริบิวต์ viewport ของลักษณะ CameraAvStreamManagement ด้วย ViewportStruct โดยใช้ฟังก์ชัน Kotlin setViewport ในตัว ดังนี้

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)

หากต้องการเปิดใช้การวิเคราะห์สำหรับอุปกรณ์ ให้ตั้งค่าพร็อพเพอร์ตี้ analyticsEnabled ของ ExtendedGeneralDiagnosticsTrait เป็น 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 เพื่อส่งการตั้งค่าที่อัปเดตเหล่านี้กลับไปยังอุปกรณ์ โดยใช้การตั้งค่าเหล่านี้กับการเชื่อมต่อการบันทึกที่พบในขั้นตอนก่อนหน้า

หากต้องการแก้ไขการตั้งค่าเหล่านี้ ให้ใช้คำสั่ง modifyPushTransport กับ TransportOptionsStruct

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

ตรวจสอบคุณภาพแบนด์วิดท์

พร็อพเพอร์ตี้ videoStreamId ของ TransportOptionsStruct สอดคล้องกับการกำหนดค่าสตรีมวิดีโอที่เฉพาะเจาะจง

หากต้องการรับสตรีมวิดีโอที่รองรับ โปรดดูแอตทริบิวต์ allocatedVideoStreams ซึ่งเป็นรายการของ VideoStreamStructs จากลักษณะ CameraAvStreamManagement ของอุปกรณ์

ปรับความไวในการปลุกระบบของอุปกรณ์

พร็อพเพอร์ตี้ motionSensitivity ของ TransportTriggerOptionsStruct สอดคล้องกับค่าต่อไปนี้

ป้ายกำกับ ค่า (UByte)
ต่ำ 1u
ปานกลาง 5u
สูง 10u

ปรับระยะเวลาสูงสุดของเหตุการณ์

พร็อพเพอร์ตี้ maxDuration ของ TransportMotionTriggerTimeControlStruct สอดคล้องกับระยะเวลาต่อไปนี้ (เป็นวินาที)

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

เลิกใช้งานอุปกรณ์

หากต้องการนำกล้องออกจากบ้าน ให้เรียกใช้ device.decommissionDevice() การเลิกใช้งานจะแสดงข้อความแจ้งผู้ใช้พร้อมหน้าจอยืนยันที่จัดการโดย Google ซึ่งเตือนว่าระบบจะลบข้อมูลประวัติวิดีโอทุกวันตลอด 24 ชั่วโมง ประวัติเหตุการณ์ คลิป และคลังใบหน้าที่คุ้นเคยที่บันทึกไว้ทั้งหมดในบ้านอย่างถาวร

ดูวิธีการโดยละเอียดและตัวอย่างโค้ดได้ที่นำอุปกรณ์ออก