ประเภทอุปกรณ์กล้องจะใช้ลักษณะ 3 อย่าง ได้แก่
PushAvStreamTransport
ซึ่งจัดการการส่งสตรีมเสียงและวิดีโอโดยใช้โปรโตคอลแบบพุช
WebRtcLiveView
ซึ่งให้ความสามารถในการควบคุมไลฟ์สดและฟีเจอร์ TalkBack และ
CameraSnapshot
ซึ่งให้ภาพรวมตัวอย่างที่แคชไว้และการจับภาพสแนปชอตแบบสด
ตรวจสอบการรองรับแอตทริบิวต์และคำสั่งสำหรับอุปกรณ์ก่อนใช้ฟีเจอร์หรือพยายามอัปเดตแอตทริบิวต์เสมอ ดูข้อมูลเพิ่มเติมได้ที่ควบคุมอุปกรณ์ในAndroid
| ประเภทอุปกรณ์ของ Home API | ลักษณะเฉพาะ | แอปตัวอย่าง Kotlin | กรณีการใช้งาน |
|---|---|---|---|
|
กล้อง
อุปกรณ์ที่จับภาพนิ่งหรือวิดีโอ กล้องอาจมีฟีเจอร์ไลฟ์สดที่เข้าถึงได้, ฟีเจอร์พูดคุยแบบ 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 ดังนี้
supportedRecordingModes- ทุกวิธีการที่เป็นไปได้availableRecordingModes- โหมดที่เลือกได้selectedRecordingMode- โหมดทำงาน
// 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 ชั่วโมง ประวัติเหตุการณ์ คลิป และคลังใบหน้าที่คุ้นเคยที่บันทึกไว้ทั้งหมดในบ้านอย่างถาวร
ดูวิธีการโดยละเอียดและตัวอย่างโค้ดได้ที่นำอุปกรณ์ออก