ประเภทอุปกรณ์กริ่งประตูจะใช้งานโดยใช้ลักษณะ 2 อย่าง
PushAvStreamTransport
ซึ่งจัดการการรับส่งสตรีมเสียงและวิดีโอโดยใช้โปรโตคอลแบบพุช และ
WebRtcLiveView
ซึ่งช่วยให้ควบคุมสตรีมแบบสดและฟีเจอร์ Talkback ได้
โปรดตรวจสอบการรองรับแอตทริบิวต์และคำสั่งของอุปกรณ์เสมอก่อนที่จะใช้ฟีเจอร์หรือพยายามอัปเดตแอตทริบิวต์ ดูข้อมูลเพิ่มเติมได้ที่ควบคุมอุปกรณ์ใน Android
| ประเภทอุปกรณ์ API สำหรับบ้าน | ลักษณะ | แอปตัวอย่าง Kotlin | กรณีการใช้งาน |
|---|---|---|---|
|
กริ่งประตู
อุปกรณ์ที่ทำงานด้วยปุ่มนอกประตูซึ่งส่งสัญญาณเสียงและ/หรือภาพ ใช้เพื่อขอความสนใจจากบุคคลที่อยู่ด้านในประตู กริ่งประตูอาจมีฟีเจอร์สตรีมแบบสดที่เข้าถึงได้ การโต้ตอบด้วยเสียงแบบ 2 ทาง หรือเหตุการณ์การตรวจจับ |
ลักษณะที่ต้องระบุ google PushAvStreamTransport google WebRtcLiveView |
กริ่งประตู |
ดูข้อมูลพื้นฐานเกี่ยวกับอุปกรณ์
ลักษณะ BasicInformation
ประกอบด้วยข้อมูลต่างๆ เช่น ชื่อผู้จำหน่าย รหัสผู้จำหน่าย รหัสผลิตภัณฑ์
ชื่อผลิตภัณฑ์ (รวมถึงข้อมูลรุ่น) เวอร์ชันซอฟต์แวร์
และหมายเลขซีเรียลของอุปกรณ์
// Get device basic information. All general information traits are on the RootNodeDevice type. device.type(RootNodeDevice).first().standardTraits.basicInformation?.let { basicInformation -> println("vendorName ${basicInformation.vendorName}") println("vendorId ${basicInformation.vendorId}") println("productId ${basicInformation.productId}") println("productName ${basicInformation.productName}") println("softwareVersion ${basicInformation.softwareVersion}") println("serialNumber ${basicInformation.serialNumber}") }
ตรวจสอบการเชื่อมต่อสำหรับอุปกรณ์
ระบบจะตรวจสอบการเชื่อมต่อของอุปกรณ์ที่ระดับประเภทอุปกรณ์เนื่องจาก อุปกรณ์บางเครื่องรองรับอุปกรณ์หลายประเภท สถานะที่ส่งคืนคือ การรวมสถานะการเชื่อมต่อสำหรับลักษณะทั้งหมดในอุปกรณ์นั้น
val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState
สถานะ PARTIALLY_ONLINE อาจปรากฏในกรณี
ของอุปกรณ์ประเภทผสมเมื่อไม่มีการเชื่อมต่ออินเทอร์เน็ต
Matter ลักษณะมาตรฐานอาจยังออนไลน์อยู่เนื่องจากการกำหนดเส้นทางในพื้นที่ แต่ลักษณะที่อิงตามระบบคลาวด์จะออฟไลน์
เริ่มไลฟ์สด
หากต้องการเริ่มไลฟ์สด ให้ส่งสตริง Session Description Protocol (SDP)
ไปยัง
WebRtcLiveView
ของลักษณะ
startLiveView() ซึ่งจะแสดงผล
WebRtcLiveViewTrait.StartLiveViewCommand.Response
ที่มีค่า 3 ค่า ได้แก่
- SDP สำหรับเซสชัน
- ระยะเวลาเซสชันเป็นวินาที
- รหัสเซสชัน ซึ่งอาจใช้เพื่อขยายหรือสิ้นสุดเซสชัน
suspend fun getWebRtcLiveViewTrait(cameraDevice: HomeDevice) { return cameraDevice.type(GoogleDoorbellDevice).trait(WebRtcLiveView).first { it?.metadata?.sourceConnectivity?.connectivityState == ConnectivityState.ONLINE } } // Start the live view suspend fun startCameraStream(trait: WebRtcLiveView, offerSdp: String) { val response = trait.startLiveView(offerSdp) // Response contains three fields (see below) return response } ... // This is used to manage the WebRTC connection val peerConnection: RTCPeerConnection = ... ... val startResponse = startCameraStream(sdp) val answerSdp = startResponse?.answerSdp val sessionDuration = startResponse?.liveSessionDurationSeconds val mediaSessionId = startResponse?.mediaSessionId peerConnection.setRemoteDescription(SessionDescription.Type.ANSWER, answerSdp)
ขยายเวลาไลฟ์สด
ไลฟ์สดมีระยะเวลาที่กำหนดไว้ล่วงหน้าซึ่งจะหมดอายุหลังจากนั้น หากต้องการขยาย
ระยะเวลาของสตรีมที่ใช้งานอยู่ ให้ส่งคำขอขยายเวลาโดยใช้เมธอด
WebRtcLiveView.extendLiveView()
// Assuming camera stream has just been started suspend fun scheduleExtension(trait: WebRtcLiveView, mediaSessionId: String, liveSessionDurationSeconds: UShort ) { delay(liveSessionDurationSeconds - BUFFER_SECONDS * 1000) val response = trait.extendLiveView(mediaSessionId) // returns how long the session will be live for return response.liveSessionDurationSeconds }
เริ่มและหยุด TalkBack
หากต้องการเริ่ม Talkback ให้เรียกใช้เมธอด 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) } }
เปิดและปิดใช้ความสามารถในการบันทึก
หากต้องการเปิดใช้ความสามารถในการบันทึกของกล้อง ให้ส่ง
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 } }
การตั้งค่าแบตเตอรี่
คุณควบคุมการตั้งค่าแบตเตอรี่ต่างๆ ได้ผ่าน 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
การตั้งค่าเสียง
คุณควบคุมการตั้งค่าเสียงต่างๆ ได้ผ่าน 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()) } }
การตั้งค่าอื่นๆ
คุณควบคุมการตั้งค่าอื่นๆ ได้ผ่าน Home API
เปิดหรือปิดฟีเจอร์ภาพกลางคืน
หากต้องการเปิดหรือปิดวิสัยทัศน์กลางคืนสำหรับกล้อง ให้ใช้ TriStateAutoEnum
เพื่ออัปเดตแอตทริบิวต์
nightVision
ของลักษณะ CameraAvStreamManagement โดยใช้ฟังก์ชัน setNightVision Kotlin ในตัว ดังนี้
// 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 โดยใช้ฟังก์ชัน 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 ที่มีค่า 4 ค่า ซึ่งใช้เป็นพิกัดของวิวพอร์ต โดยพิกัดจะได้รับการกําหนดดังนี้
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
การกำหนดค่าสำหรับ ViewportStruct ขึ้นอยู่กับ UI ของแอปและการติดตั้งใช้งานกล้อง
ในระดับพื้นฐานมากที่สุด หากต้องการตั้งค่า Viewport ของวิดีโอจากกล้อง ให้อัปเดตแอตทริบิวต์
viewport
ของลักษณะ CameraAvStreamManagement ด้วย ViewportStruct โดยใช้ฟังก์ชัน 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(), ) ) }
ปรับความไวในการปลุกอุปกรณ์
ความไวในการปลุกของอุปกรณ์จะใช้เพื่อประหยัดแบตเตอรี่โดยการลด ช่วงที่อุปกรณ์ตรวจหากิจกรรมได้ และเพิ่มเวลาในการปลุก หลังจากตรวจพบกิจกรรมนั้น
ใน Home API คุณตั้งค่านี้ได้โดยใช้พร็อพเพอร์ตี้ motionSensitivity ของ
triggerOptions ใน transportOptions ของอุปกรณ์ ตัวเลือกเหล่านี้กำหนดไว้
ในPushAvStreamTransportลักษณะของอุปกรณ์แต่ละเครื่อง
คุณตั้งค่าความไวต่อการปลุกได้เฉพาะค่าต่อไปนี้
- 1 = ต่ำ
- 5 = ปานกลาง
- 10 = สูง
กระบวนการอัปเดตคือการค้นหาการกำหนดค่าการรับส่งข้อมูลสำหรับสตรีมการบันทึกที่ใช้งานอยู่โดยใช้คำสั่ง
findTransport
จากนั้นแก้ไขการกำหนดค่าด้วยค่าความไวใหม่โดยใช้คำสั่ง
modifyPushTransport
// Create a struct with the new wake-up sensitivity val toUpdate = TransportOptionsStruct( triggerOptions = TransportTriggerOptionsStruct( motionSensitivity = OptionalValue.present(wakeUpSensitivity.toUByte()) ) ) // Get the configurations for active connections val connections = pushAvStreamTransport.findTransport().transportConfigurations // Update all recording streams with the new transport options. for (connection in connections) { if (connection.transportOptions.getOrNull()?.streamUsage == StreamUsageEnum.Recording) { trait.modifyPushTransport( connectionId = connection.connectionId, transportOptions = toUpdate, ) } }
ปรับระยะเวลาสูงสุดของเหตุการณ์
ความยาวสูงสุดของเหตุการณ์คือระยะเวลาที่กล้องจะบันทึกคลิปสำหรับเหตุการณ์ คุณกำหนดค่านี้ได้ต่ออุปกรณ์ผ่าน Home API ให้มีความยาวเท่ากับที่กำหนดผ่าน GHA โดยมีช่วงเวลาเป็นวินาที
- 10 วินาที
- 15 วินาที
- 30 วินาที
- 60 วินาที (1 นาที)
- 120 วินาที (2 นาที)
- 180 วินาที (3 นาที)
ใน Home API คุณตั้งค่านี้ได้โดยใช้พร็อพเพอร์ตี้ motionTimeControl ของ
triggerOptions ใน transportOptions ของอุปกรณ์ ตัวเลือกเหล่านี้กำหนดไว้
ในPushAvStreamTransportลักษณะของอุปกรณ์แต่ละเครื่อง
กระบวนการอัปเดตคือการค้นหาการกำหนดค่าการรับส่งสำหรับสตรีมการบันทึกที่ใช้งานอยู่โดยใช้คำสั่ง
findTransport
จากนั้นแก้ไขการกำหนดค่าด้วยค่าความยาวของเหตุการณ์ใหม่โดยใช้คำสั่ง
modifyPushTransport
// Create a struct with the new max event length // where maxDuration is the length in seconds val toUpdate = TransportOptionsStruct( triggerOptions = TransportTriggerOptionsStruct( motionTimeControl = OptionalValue.present( TransportMotionTriggerTimeControlStruct(maxDuration = it.toUInt()) ) ) ) // Get the configurations for active connections val connections = pushAvStreamTransport.findTransport().transportConfigurations // Update all recording streams with the new transport options. for (connection in connections) { if (connection.transportOptions.getOrNull()?.streamUsage == StreamUsageEnum.Recording) { trait.modifyPushTransport( connectionId = connection.connectionId, transportOptions = toUpdate, ) } }
การตั้งค่ากริ่ง
คุณควบคุมการตั้งค่าเสียงกริ่งประตูต่างๆ ได้ผ่าน Home API
เปลี่ยนเสียงกริ่ง
หากต้องการเปลี่ยนเสียงกริ่งประตู ให้รับรายการเสียงกริ่งที่
ติดตั้งในอุปกรณ์ก่อนโดยใช้แอตทริบิวต์
installedChimeSounds
ของลักษณะ Chime
// Get a list of chimes and identify the currently selected one private val doorbellChimeTraitFlow: Flow= device.traitFromType(Chime, GoogleDoorbellDevice) val chimeSounds = doorbellChimeTraitFlow.first().installedChimeSounds ?: emptyList()
จากนั้นอัปเดตแอตทริบิวต์
selectedChime
ของลักษณะ Chime โดยใช้ฟังก์ชัน setSelectedChime Kotlin
ในตัว
// Set the chime using the chimeId from the installed list chimeSounds.firstOrNull { it.name == name }?.let { setSelectedChime(it.chimeId) }
ใช้กริ่งภายนอก
คุณสามารถกำหนดค่ากริ่งประตูให้ใช้กริ่งภายนอก เช่น กริ่งกลไก ที่ติดตั้งภายในบ้าน คุณควรกำหนดค่านี้ในระหว่างการติดตั้งกริ่งประตู เพื่อหลีกเลี่ยงความเสียหายที่อาจเกิดขึ้นกับกริ่งภายนอก
หากต้องการระบุประเภทกริ่งภายนอกที่ติดตั้ง ให้ใช้
ExternalChimeType
เพื่ออัปเดตแอตทริบิวต์
externalChime
ของลักษณะ Chime โดยใช้ฟังก์ชัน Kotlin setExternalChime ในตัว
// Indicate the external chime is mechanical chime.update { setExternalChime(ChimeTrait.ExternalChimeType.Mechanical) }
เปลี่ยนระยะเวลาของกริ่งภายนอก
คุณกำหนดค่าระยะเวลาเป็นวินาทีที่กริ่งภายนอกจะดังได้ผ่าน Home API หากกริ่งภายนอกรองรับระยะเวลาเสียงกริ่ง ผู้ใช้อาจต้องการ กำหนดค่านี้
ค่าที่ตั้งไว้ที่นี่จะขึ้นอยู่กับข้อกำหนดของกริ่งภายนอก เอง และระยะเวลาของเสียงกริ่งที่แนะนำ
หากต้องการเปลี่ยนระยะเวลาเสียงกริ่งภายนอก ให้อัปเดตแอตทริบิวต์
externalChimeDurationSeconds
ของลักษณะ Chime โดยใช้ฟังก์ชัน Kotlin setExternalChimeDurationSeconds ในตัว ดังนี้
// Change the external chime duration chime.update { setExternalChimeDurationSeconds(newDuration.toUShort()) }
เปิดใช้ธีมเสียงกริ่ง
กริ่งประตูบางรุ่นอาจมีเสียงกริ่งที่พร้อมให้บริการแก่ผู้ใช้เป็น ระยะเวลาจำกัดเท่านั้น เช่น เสียงกริ่งเฉพาะสำหรับวันหยุด ซึ่งเรียกว่าธีมเสียงกริ่ง
หากต้องการดูว่าธีมเสียงกริ่งใดบ้างที่พร้อมใช้งานสำหรับผู้ใช้ ให้สร้างตัวกรอง Timebox
แล้วใช้เพื่อกรองผลลัพธ์ของคำสั่ง
getAvailableThemes()
จากลักษณะ
ChimeThemes ซึ่งจะแสดงรายการธีมที่ใช้ได้ รวมถึงชื่อธีม
ตัวอย่างต่อไปนี้แสดงวิธีกรองรายการ
ระบบจะถือว่าธีมทำงานอยู่หากเวลาปัจจุบันอยู่ภายในเวลาเริ่มต้นและเวลาสิ้นสุด (ค่า startTimeSeconds และ endTimeSeconds ตามลำดับ) หากไม่ได้ตั้งเวลาเริ่มต้น ระบบจะถือว่าใช้งานได้ตั้งแต่ต้น หากไม่ได้ตั้งเวลาสิ้นสุด การตั้งค่าจะยังคงใช้งานได้
ต่อไปเรื่อยๆ หากไม่มีทั้ง 2 อย่าง ธีมจะใช้งานอยู่เสมอ
// Get themes from the ChimeThemes trait fun List<ChimeThemesTrait.ThemeStruct>.filterTimeboxedThemes(): List<ChimeThemesTrait.ThemeStruct> { val now = timeSource.instant().epochSecond.toULong() return filter { chimeStruct: ChimeThemesTrait.ThemeStruct -> val startTime: ULong = chimeStruct.startTimeSeconds.getOrNull() ?: 0UL val endTime: ULong = chimeStruct.endTimeSeconds.getOrNull() ?: MAX_VALUE startTime <= now && now <= endTime } } val availableThemes = doorbellChimeThemesTraitFlow .first() .getAvailableThemes() .themes .filterTimeboxedThemes()
เมื่อทราบชื่อธีมที่ต้องการแล้ว เช่น Christmas คุณสามารถ
เลือกธีมนั้นได้โดยใช้ฟังก์ชัน setSelectedTimeboxedThemeName() ในลักษณะ
ChimeThemes
ดังนี้
// Select a theme using the ChimeThemes trait val themeToSelect = "Christmas" if (themeToSelect in availableThemeNames) { doorbellChimeThemesTraitFlow.first().setSelectedTimeboxedThemeName(themeToSelect) }