Loại thiết bị Camera được triển khai bằng 2 đặc điểm: PushAvStreamTransport, xử lý việc truyền luồng âm thanh và video bằng các giao thức dựa trên tính năng truyền dữ liệu và WebRtcLiveView, cung cấp khả năng kiểm soát luồng phát trực tiếp và tính năng phản hồi bằng giọng nói.
Luôn kiểm tra xem thiết bị có hỗ trợ thuộc tính và lệnh hay không trước khi sử dụng bất kỳ tính năng nào hoặc cố gắng cập nhật thuộc tính. Hãy xem bài viết Điều khiển thiết bị trênAndroid để biết thêm thông tin.
| Loại thiết bị Home API | Đặc điểm | Ứng dụng mẫu Kotlin | Trường hợp sử dụng |
|---|---|---|---|
|
Máy ảnh
Thiết bị chụp ảnh tĩnh hoặc quay video. Camera có thể có tính năng phát trực tiếp, đàm thoại hai chiều hoặc phát hiện sự kiện. |
Đặc điểm bắt buộc google PushAvStreamTransport google WebRtcLiveView |
Camera |
Lấy thông tin cơ bản về một thiết bị
Đặc điểm BasicInformation bao gồm những thông tin như tên nhà cung cấp, mã nhận dạng nhà cung cấp, mã sản phẩm, tên sản phẩm (bao gồm thông tin về kiểu máy), phiên bản phần mềm và số sê-ri của thiết bị:
// 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}") }
Nhận thời gian liên hệ gần đây nhất của thiết bị với đám mây
Để tìm thời gian gần đây nhất mà thiết bị có kết nối với đám mây, hãy sử dụng thuộc tính lastContactTimestamp của đặc điểm ExtendedGeneralDiagnostics:
fun getLastContactTimeStamp(trait: ExtendedGeneralDiagnostics): java.time.Instant { val timestamp = trait.lastContactTimestamp return Instant.ofEpochSecond(timestamp.toLong()) }
Kiểm tra khả năng kết nối của thiết bị
Khả năng kết nối của thiết bị thực sự được kiểm tra ở cấp loại thiết bị vì một số thiết bị hỗ trợ nhiều loại thiết bị. Trạng thái được trả về là sự kết hợp của các trạng thái kết nối cho tất cả các đặc điểm trên thiết bị đó.
val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState
Trạng thái PARTIALLY_ONLINE có thể xuất hiện trong trường hợp có nhiều loại thiết bị khi không có kết nối Internet.
Các đặc điểm tiêu chuẩn của Matter vẫn có thể trực tuyến do định tuyến cục bộ, nhưng các đặc điểm dựa trên đám mây sẽ không trực tuyến.
Bắt đầu phát trực tiếp
Để bắt đầu phát trực tiếp, hãy gửi chuỗi Giao thức mô tả phiên (SDP) đến phương thức startLiveView() của đặc điểm WebRtcLiveView. Phương thức này sẽ trả về một WebRtcLiveViewTrait.StartLiveViewCommand.Response chứa 3 giá trị:
- SDP cho phiên.
- Thời lượng phiên tính bằng giây.
- Mã phiên, có thể dùng để kéo dài hoặc kết thúc phiên.
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)
Kéo dài sự kiện phát trực tiếp
Sự kiện phát trực tiếp có thời lượng đặt sẵn và sẽ hết hạn sau thời lượng đó. Để kéo dài thời lượng của một luồng đang hoạt động, hãy đưa ra yêu cầu gia hạn bằng phương thức 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 }
Bắt đầu và dừng TalkBack
Để bắt đầu TalkBack, hãy gọi phương thức startTalkback() của đặc điểm WebRtcLiveView. Để dừng, hãy sử dụng biểu tượng 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) } }
Bật và tắt tính năng ghi lại
Để bật tính năng ghi hình của camera, hãy truyền TransportStatusEnum.Active đến phương thức setTransportStatus() của đặc điểm PushAvStreamTransport. Để tắt khả năng ghi, hãy truyền TransportStatusEnum.Inactive.
Trong ví dụ sau, chúng ta sẽ gói các lệnh gọi này trong một lệnh gọi duy nhất sử dụng Boolean để bật/tắt khả năng ghi:
// 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) } }
Việc bật hoặc tắt khả năng ghi hình của camera cũng giống như việc bật hoặc tắt video của camera. Khi video của camera đang bật, camera sẽ ghi hình (cho mục đích ghi lại các sự kiện và đoạn video liên quan).
Khi tính năng ghi hình bị tắt (video camera ở trạng thái tắt):
- Camera vẫn có thể hiển thị là đang trực tuyến theo
connectivityStatecủa loại thiết bị. - Bạn không thể truy cập vào phiên phát trực tiếp và camera cũng không phát hiện thấy sự kiện nào trên đám mây.
Kiểm tra xem bạn đã bật tính năng ghi hình hay chưa
Để xác định xem camera có được bật tính năng ghi hình hay không, hãy kiểm tra xem có kết nối nào đang hoạt động hay không. Ví dụ sau đây xác định 2 hàm để thực hiện việc này:
// 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 }
Một cách khác để kiểm tra là sử dụng hàm findTransport() với một vị từ:
// Fetch the current connections suspend fun queryRecordModeState(trait: PushAvStreamTransport) { return trait.findTransport().let { it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active } }
Cài đặt pin
Bạn có thể kiểm soát nhiều chế độ cài đặt pin thông qua Home API.
Đặt lựa chọn ưu tiên về mức sử dụng pin
Việc thiết lập mức cân bằng năng lượng cho phép bạn định cấu hình sự cân bằng giữa thời lượng pin và hiệu suất của thiết bị. Bạn có thể tạo nhiều hồ sơ pin, chẳng hạn như "Mở rộng", "Cân bằng" và "Hiệu suất", rồi chuyển đổi giữa các hồ sơ này.
Tính năng này được triển khai bằng cách cập nhật thuộc tính currentEnergyBalance của đặc điểm EnergyPreference. Thuộc tính này chấp nhận một chỉ mục số nguyên tương ứng với một hồ sơ cụ thể được xác định trong danh sách energyBalances của thiết bị (ví dụ: 0 cho EXTENDED, 1 cho BALANCED và 2 cho PERFORMANCE).
Giá trị null cho currentEnergyBalance cho biết thiết bị đang sử dụng một hồ sơ tuỳ chỉnh. Đây là trạng thái chỉ đọc.
Sau đây là ví dụ về một cấu trúc mà thuộc tính currentEnergyBalance sẽ sử dụng, theo sau là đoạn mã thực tế sử dụng thuộc tính này.
// 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)
Bật trình tiết kiệm pin tự động
Để định cấu hình tính năng này, hãy cập nhật thuộc tính currentLowPowerModeSensitivity của đặc điểm EnergyPreference. Thuộc tính này dùng một chỉ mục để chọn mức độ nhạy, trong đó 0 thường biểu thị Disabled và 1 biểu thị Enabled hoặc 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) } }
Lấy trạng thái sạc pin
Để biết trạng thái sạc hiện tại của thiết bị (đang sạc, đã sạc đầy hoặc không sạc), hãy sử dụng thuộc tính batChargeState của đặc điểm 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" }
Nhận mức pin
Để biết mức pin hiện tại, hãy sử dụng thuộc tính batChargeLevel của đặc điểm PowerSource. Cấp độ là OK, Warning (thấp) hoặc 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" }
Tìm nguồn điện
Để xác định nguồn điện mà thiết bị đang sử dụng, hãy dùng các thuộc tính BatPresent và wiredPresent của đặc điểm PowerSource.
val trait: PowerSource val isWired = trait.wiredPresent val hasBattery = trait.batPresent
Cài đặt âm thanh
Bạn có thể kiểm soát nhiều chế độ cài đặt âm thanh thông qua Home API.
Bật hoặc tắt micrô
Để bật hoặc tắt micrô của thiết bị, hãy cập nhật thuộc tính microphoneMuted của đặc điểm CameraAvStreamManagement bằng hàm setMicrophoneMuted Kotlin tích hợp sẵn:
// Turn the device's microphone on or off suspend fun turnOffMicrophone(disableMicrophone: Boolean, trait: CameraAvStreamManagement) { trait.update { setMicrophoneMuted(disableMicrophone) } }
Bật hoặc tắt tính năng ghi âm
Để bật hoặc tắt tính năng ghi âm cho thiết bị, hãy cập nhật thuộc tính recordingMicrophoneMuted của đặc điểm CameraAvStreamManagement bằng cách sử dụng hàm setRecordingMicrophoneMuted Kotlin tích hợp sẵn:
// Turn audio recording on or off for the device suspend fun turnOffAudioRecording(disableAudioRecording: Boolean, trait: CameraAvStreamManagement) { trait.update { setRecordingMicrophoneMuted(disableAudioRecording) } }
Điều chỉnh âm lượng loa
Để điều chỉnh âm lượng loa cho thiết bị, hãy cập nhật thuộc tính speakerVolumeLevel của đặc điểm CameraAvStreamManagement bằng cách sử dụng hàm setSpeakerVolumeLevel Kotlin tích hợp sẵn:
// Adjust the camera speaker volume suspend fun adjustSpeakerVolume(volume: Int, trait: CameraAvStreamManagement) { trait.update { setSpeakerVolumeLevel(volume.toUbyte()) } }
Cài đặt khu vực hoạt động
Đặc điểm ZoneManagement cung cấp một giao diện để quản lý các khu vực tuỳ chỉnh mà người dùng quan tâm (khu vực hoạt động) trên các thiết bị camera và chuông cửa.
Các vùng này được dùng để lọc thông tin phát hiện sự kiện (chẳng hạn như chuyển động của người hoặc xe) theo các khu vực cụ thể trong trường nhìn của thiết bị.
Người dùng có thể định cấu hình khu vực hoạt động trong một ứng dụng đối tác, cho phép họ vẽ các khu vực trên những vị trí cụ thể trong trường nhìn của camera. Sau đó, các vùng do người dùng xác định này sẽ được chuyển đổi thành các cấu trúc mà đặc điểm này sử dụng. Để biết thêm thông tin về cách hoạt động của vùng hoạt động, hãy xem bài viết Thiết lập và sử dụng vùng hoạt động.
Các vùng hoạt động thường được xác định bằng toạ độ Đề các 2D.
Đặc điểm này cung cấp TwoDCartesianVertexStruct cho các đỉnh và TwoDCartesianZoneStruct cho định nghĩa vùng (tên, đỉnh, màu sắc và cách sử dụng).
Kiểm tra khu vực hoạt động
Để hiển thị các vùng hoạt động, hãy kiểm tra thuộc tính zones của đặc điểm 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() }
Thêm một vùng hoạt động
Để tạo một vùng mới, hãy dùng lệnh createTwoDCartesianZone. Lệnh này lấy TwoDCartesianZoneStruct, xác định tên, đỉnh, màu sắc và cách sử dụng của vùng.
Ví dụ sau đây cho thấy cách tạo một vùng có tên "Hiên nhà" với 4 đỉnh, có màu cá hồi (#F439A0) và được dùng để phát hiện chuyển động.
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}") } }
Cập nhật một vùng hoạt động
Để cập nhật một vùng hiện có, hãy dùng lệnh updateTwoDCartesianZone. Lệnh này yêu cầu zoneId và TwoDCartesianZoneStruct đã cập nhật.
private suspend fun ZoneManagement.updateZone( zoneId: UShort, zone: ZoneManagementTrait.TwoDCartesianZoneStruct ) { // Execute the command to update the zone this.updateTwoDCartesianZone(zoneId = zoneId, zone = zone) }
Xoá một vùng hoạt động
Để xoá một vùng, hãy dùng lệnh removeZone với zoneId cụ thể.
private suspend fun ZoneManagement.deleteZone(zoneId: UShort) { // Execute the command to remove the zone this.removeZone(zoneId = zoneId) }
Trình kích hoạt sự kiện âm thanh
Đặc điểm AvStreamAnalysis cung cấp một giao diện để quản lý các trình kích hoạt phát hiện sự kiện trên thiết bị camera và chuông cửa. Mặc dù các điều kiện kích hoạt dựa trên hình ảnh (chẳng hạn như người hoặc xe) có thể dành riêng cho từng khu vực, nhưng các điều kiện kích hoạt liên quan đến âm thanh thường là cấu hình ở cấp thiết bị.
Các loại điều kiện kích hoạt sau đây có sẵn cho tính năng phát hiện âm thanh bằng EventTriggerTypeEnum:
| Chế độ | Giá trị enum | Mô tả |
|---|---|---|
| Âm thanh | Sound |
Tính năng phát hiện âm thanh chung. |
| Tiếng người nói | PersonTalking |
Phát hiện lời nói. |
| Tiếng chó sủa | DogBark |
Phát hiện tiếng sủa của chó. |
| Tiếng kính vỡ | GlassBreak |
Phát hiện tiếng kính vỡ. |
| Chuông báo khói | SmokeAlarm |
Phát hiện chuông báo khói, thường được nhận dạng bằng mẫu âm thanh T3 (3 tiếng bíp ngắn, sau đó là một khoảng dừng). |
| chuông báo khí CO | CoAlarm |
Phát hiện chuông báo khí cacbon monoxit (CO), thường được nhận dạng bằng mẫu âm thanh T4 (bốn tiếng bíp ngắn, sau đó là một khoảng dừng). |
Kiểm tra trạng thái phát hiện âm thanh
Để cho người dùng thấy trạng thái hiện tại của tính năng phát hiện âm thanh, bạn phải kiểm tra xem thiết bị hỗ trợ tính năng nào và phần cứng của thiết bị đã bật tính năng nào. Hai thuộc tính cần kiểm tra là:
Trong quá trình phát triển Android bằng Luồng Kotlin, bạn thường sẽ quan sát đặc điểm AvStreamAnalysis từ 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) ) } }
Cập nhật bộ trình kích hoạt đã bật
Để cập nhật tập hợp các điều kiện kích hoạt đã bật, hãy dùng lệnh SetOrUpdateEventDetectionTriggers. Lệnh này sẽ lấy một danh sách các cấu trúc 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) }
Chế độ ghi hình
Đặc điểm RecordingMode cung cấp một giao diện để quản lý hành vi ghi hình và chụp ảnh trên các thiết bị camera và chuông cửa. Tính năng này cho phép người dùng chọn giữa chế độ ghi hình liên tục, ghi hình theo sự kiện hoặc tắt hoàn toàn chế độ ghi hình (chỉ có trong Chế độ xem trực tiếp).
RecordingModeEnum xác định các chiến lược ghi hình hiện có:
| Chế độ | Giá trị enum | Mô tả |
|---|---|---|
| Đã tắt | Disabled |
Tính năng ghi hoàn toàn bị vô hiệu hoá. Chủ yếu được dùng bởi các thiết bị cũ. |
| CVR (Quay video liên tục) | Cvr |
Video được quay 24/7. Cần có gói thuê bao (ví dụ: Google Google Home Premium. |
| EBR (Ghi hình dựa trên sự kiện) | Ebr |
Quá trình ghi hình được kích hoạt bởi các sự kiện (người, chuyển động). Thời lượng video phụ thuộc vào thời lượng sự kiện và gói thuê bao. |
| ETR (Ghi hình khi có sự kiện kích hoạt) | Etr |
Bản ghi xem trước ngắn (ví dụ: 10 giây) được kích hoạt bởi các sự kiện. |
| Chế độ xem trực tiếp | LiveView |
Tính năng ghi hình bị tắt, nhưng người dùng vẫn có thể truy cập vào sự kiện phát trực tiếp. |
| Hình ảnh tĩnh | Images |
Ảnh chụp nhanh sẽ được ghi lại thay vì video khi có sự kiện xảy ra. |
Kiểm tra các chế độ ghi
Để hiển thị cấu hình ghi hiện tại, hãy kiểm tra các thuộc tính của đặc điểm RecordingMode:
supportedRecordingModes– Tất cả các chế độ có thểavailableRecordingModes– Các chế độ có thể chọnselectedRecordingMode– Chế độ đang hoạt động
// 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(), ) } }
Thay đổi chế độ ghi
Trước khi cập nhật, hãy đảm bảo rằng chỉ mục đã chọn từ thuộc tính supportedRecordingModes có trong thuộc tính availableRecordingModes.
Để cập nhật chế độ đã chọn, hãy dùng hàm setSelectedRecordingMode, truyền chỉ mục của chế độ đã chọn:
private suspend fun RecordingMode.updateRecordingMode(index: Int) { // Execute the command to update the selected mode this.setSelectedRecordingMode(index.toUByte()) }
Chế độ cài đặt khác
Bạn có thể kiểm soát nhiều chế độ cài đặt khác thông qua Home API.
Thay đổi hướng của hình ảnh
Bạn có thể xoay hướng của hình ảnh (video) camera. Bạn chỉ có thể xoay video 180 độ.
Để thay đổi hướng hình ảnh của camera, hãy cập nhật thuộc tính imageRotation của đặc điểm CameraAvStreamManagement bằng hàm setImageRotation Kotlin tích hợp sẵn:
// Change the camera's image orientation val isRotated = false cameraAvStreamManagement.update { setImageRotation(if (isRotated) 180.toUShort() else 0.toUShort()) }
Bật hoặc tắt chế độ cảnh đêm
Để bật hoặc tắt chế độ nhìn ban đêm cho camera, hãy dùng TriStateAutoEnum để cập nhật thuộc tính nightVision của đặc điểm CameraAvStreamManagement bằng hàm setNightVision Kotlin tích hợp sẵn:
// Turn night vision on cameraAvStreamManagement.update { setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.On) } // Turn night vision off CameraAvStreamManagement.update { setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.Off) }
Thay đổi độ sáng của đèn LED trạng thái
Để thay đổi độ sáng của đèn LED trạng thái, hãy dùng ThreeLevelAutoEnum để cập nhật thuộc tính statusLightBrightness của đặc điểm CameraAvStreamManagement bằng hàm setStatusLightBrightness Kotlin tích hợp:
// Set the LED brightness to high cameraAvStreamManagement.update { setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.High) } // Set the LED brightness to low cameraAvStreamManagement.update { setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.Low) }
Thay đổi khung nhìn camera
Khung hiển thị camera giống với tính năng Thu phóng và cắt mà bạn có thể xem trong bài viết hỗ trợ Thu phóng và cải thiện video của camera Nest.
Khung hiển thị được xác định trong một ViewportStruct chứa 4 giá trị, được dùng làm toạ độ của khung hiển thị. Toạ độ được xác định như sau:
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
Việc xác định các giá trị cho ViewportStruct phụ thuộc vào giao diện người dùng và cách triển khai camera của ứng dụng. Ở cấp độ rất cơ bản, để đặt khung hiển thị của video trên camera, hãy cập nhật thuộc tính viewport của đặc điểm CameraAvStreamManagement bằng ViewportStruct, sử dụng hàm setViewport Kotlin tích hợp sẵn:
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(), ) ) }
Điều chỉnh độ nhạy đánh thức thiết bị
Độ nhạy đánh thức của thiết bị được dùng để tiết kiệm pin bằng cách giảm phạm vi mà thiết bị có thể cảm nhận được hoạt động và tăng thời gian đánh thức sau khi phát hiện thấy hoạt động đó.
Trong Home API, bạn có thể thiết lập chế độ này bằng cách dùng thuộc tính motionSensitivity của triggerOptions trong transportOptions của thiết bị. Các lựa chọn này được xác định trong đặc điểm PushAvStreamTransport cho từng thiết bị.
Bạn chỉ có thể đặt độ nhạy đánh thức thành các giá trị sau:
- 1 = Thấp
- 5 = Trung bình
- 10 = Cao
Quy trình cập nhật là tìm cấu hình truyền tải cho các luồng ghi đang hoạt động bằng lệnh findTransport, sau đó sửa đổi cấu hình bằng giá trị độ nhạy mới bằng lệnh 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, ) } }
Điều chỉnh thời lượng tối đa của sự kiện
Thời lượng tối đa của sự kiện là khoảng thời gian camera sẽ ghi lại một đoạn video cho một sự kiện. Thông qua Home API, bạn có thể định cấu hình giá trị này cho từng thiết bị với cùng độ dài như thông qua GHA, theo khoảng thời gian tính bằng giây:
- 10 giây
- 15 giây
- 30 giây
- 60 giây (1 phút)
- 120 giây (2 phút)
- 180 giây (3 phút)
Trong Home API, bạn có thể thiết lập chế độ này bằng cách dùng thuộc tính motionTimeControl của triggerOptions trong transportOptions của thiết bị. Các lựa chọn này được xác định trong đặc điểm PushAvStreamTransport cho từng thiết bị.
Quy trình cập nhật là tìm cấu hình truyền tải cho các luồng ghi đang hoạt động bằng lệnh findTransport, sau đó sửa đổi cấu hình bằng giá trị độ dài sự kiện mới bằng lệnh 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, ) } }
Bật hoặc tắt tính năng phân tích
Mỗi thiết bị có thể chọn gửi dữ liệu phân tích chi tiết đến đám mây Google Home (xem phần Giám sát đám mây cho API Home).
Để bật tính năng phân tích cho một thiết bị, hãy đặt thuộc tính analyticsEnabled của ExtendedGeneralDiagnosticsTrait thành true. Khi bạn đặt analyticsEnabled, một thuộc tính khác, logUploadEnabled, sẽ tự động được đặt thành true, cho phép tải tệp nhật ký phân tích lên đám mây Google Home.
// Enable analytics extendedGeneralDiagnostics.update { setAnalyticsEnabled(true) } // Disable analytics extendedGeneralDiagnostics.update { setAnalyticsEnabled(false) }