ประเภทอุปกรณ์กริ่งประตูจะใช้ลักษณะ 2 อย่างต่อไปนี้
PushAvStreamTransportTrait
ซึ่งจัดการการรับส่งสตรีมเสียงและวิดีโอโดยใช้โปรโตคอลแบบพุช และ
WebRtcLiveViewTrait
ซึ่งช่วยให้ควบคุมไลฟ์สดและฟีเจอร์ Talkback ได้
โปรดตรวจสอบว่าอุปกรณ์รองรับแอตทริบิวต์และคำสั่งก่อนที่จะใช้ฟีเจอร์หรือพยายามอัปเดตแอตทริบิวต์ ดูข้อมูลเพิ่มเติมได้ที่ควบคุมอุปกรณ์ในiOS
| ประเภทอุปกรณ์ API สำหรับ Home | ลักษณะ | แอปตัวอย่าง Swift | กรณีการใช้งาน |
|---|---|---|---|
|
กริ่งประตู
อุปกรณ์ที่ทำงานด้วยปุ่มนอกประตูซึ่งส่งสัญญาณเสียงและ/หรือภาพ ใช้เพื่อขอความสนใจจากบุคคลที่อยู่ด้านในประตู กริ่งประตูอาจมีสตรีมแบบสดที่เข้าถึงได้ การโต้ตอบด้วยเสียงแบบ 2 ทาง หรือเหตุการณ์ที่ตรวจพบ |
ลักษณะที่ต้องระบุ google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
กริ่งประตู |
ดูข้อมูลพื้นฐานเกี่ยวกับอุปกรณ์
ลักษณะBasicInformation
ประกอบด้วยข้อมูล เช่น ชื่อผู้ให้บริการ รหัสผู้ให้บริการ รหัสผลิตภัณฑ์
ชื่อผลิตภัณฑ์ (รวมถึงข้อมูลรุ่น) และเวอร์ชันซอฟต์แวร์สำหรับอุปกรณ์
// [START get_device_information] let vendorName = basicInfoTrait.attributes.vendorName! let vendorID = basicInfoTrait.attributes.vendorID! let productID = basicInfoTrait.attributes.productID! let productName = basicInfoTrait.attributes.productName! let softwareVersion = basicInfoTrait.attributes.softwareVersion! // [END get_device_information]
รับหมายเลขซีเรียล
หากต้องการรับหมายเลขซีเรียลของอุปกรณ์ ให้ใช้คำสั่ง
GetSerialNumberของลักษณะExtendedBasicInformation
ตัวอย่างแสดงการบันทึกหมายเลขซีเรียลในตัวแปรชื่อ serialNumber
// Assuming extendedBasicInformationTrait: Google.ExtendedBasicInformationTrait let response = try await extendedBasicInformationTrait.getSerialNumber() let serialNumber = response.serialNumber
คำตอบด่วน
ฟีเจอร์คำตอบด่วนช่วยให้ผู้ใช้ส่งข้อความที่กำหนดไว้ล่วงหน้าไปยังอุปกรณ์กริ่งประตูได้
ฟีเจอร์นี้ใช้ได้ในอุปกรณ์กริ่งประตูเท่านั้น แอปพาร์ทเนอร์จะดูรายการข้อความที่กำหนดไว้ล่วงหน้าได้ ซึ่งอาจแสดงข้อความเหล่านี้ต่อผู้ใช้เพื่อให้เลือก ผู้ใช้จะแก้ไขข้อความที่กำหนดไว้ล่วงหน้าไม่ได้
ระบบจะใช้คำตอบด่วนผ่านลักษณะ PresetMessage
เล่นข้อความที่ตั้งไว้ล่วงหน้า
หากต้องการเล่นข้อความที่กำหนดไว้ล่วงหน้า ให้เรียกใช้เมธอด
playPresetMessage
โดยส่งค่าสตริงค่าใดค่าหนึ่งที่พบในพร็อพเพอร์ตี้
availablePhraseTypes
import GoogleHomeSDK
import GoogleHomeTypes
func playDoorbellPresetMessage(device: HomeDevice, phraseTypeString: String) async {
// 1. Retrieve the GoogleDoorbellDeviceType helper on the device
guard let doorbellDeviceType = await device.types.get(GoogleDoorbellDeviceType.self) else {
print("This device is not a Google Doorbell or is currently uninitialized.")
return
}
// 2. Extract the Google.PresetMessageTrait
guard let presetMessageTrait = doorbellDeviceType.traits[Google.PresetMessageTrait.self] else {
print("PresetMessageTrait is not supported on this device.")
return
}
// 3. (Optional) Check available phrase types supported by the device
if let availablePhrases = presetMessageTrait.attributes.availablePhraseTypes {
let phraseTypeNames = availablePhrases.map { $0.phraseType }
print("Supported quick response phrases: \(phraseTypeNames)")
}
// 4. Send the playPresetMessage command asynchronously
do {
try await presetMessageTrait.playPresetMessage(phraseType: phraseTypeString)
print("Preset message successfully requested.")
} catch {
print("SDK error occurred playing preset message: \(error)")
}
}
ตั้งค่าภาษาที่พูด
ตั้งค่าภาษาที่พูด
ตั้งค่าภาษาที่พูดที่ใช้งานอยู่ของอุปกรณ์เป็นภาษาเฉพาะ
(เช่น "en_US") โดยใช้setActiveLocaleเมธอดของลักษณะLocalizationConfiguration
// Setting the active language // Assuming localizationConfigurationTrait: Matter.LocalizationConfigurationTrait let selectedLocale = "en_US" try await localizationConfigurationTrait.update { $0.setActiveLocale(selectedLocale) }
รับเวลาล่าสุดที่อุปกรณ์ติดต่อกับระบบคลาวด์
หากต้องการดูเวลาล่าสุดที่อุปกรณ์ติดต่อกับระบบคลาวด์ ให้ใช้lastContactTimestampแอตทริบิวต์ของลักษณะExtendedGeneralDiagnostics
ดังนี้
if let lastContactTimeStamp = extendedGeneralDiagnosticsTrait.attributes.lastContactTimestamp { self.lastContactTime = Date(timeIntervalSince1970: Double(lastConnectedTimeStamp)) }
การตั้งค่าประเภทขายึดกล้อง
ลักษณะ Mount
มีข้อมูลการตั้งค่าและสถานะของเมาท์กล้อง คุณสามารถอ่าน
แอตทริบิวต์ต่างๆ เช่น สถานะเมาท์ ประเภทการตรวจหา และชื่อประเภทเมาท์
นอกจากนี้ คุณยังใช้ลักษณะ Mount เพื่อลบล้างการกำหนดค่าประเภทเมาท์เริ่มต้นได้ด้วย
// 1. Get the Mount trait guard let mountTrait = deviceType.traits[Google.MountTrait.self] else { print("Mount trait not supported or configured on this device.") return } // 2. Read the current mount state, detection type, and type name let mountState = mountTrait.attributes.mountState // Type: Google.MountTrait.MountStateEnum? let mountDetectionType = mountTrait.attributes.mountDetectionType // Type: Google.MountTrait.MountDetectionTypeEnum? let mountTypeName = mountTrait.attributes.mountTypeName // Type: String? // 3. Update the mount type override try await mountTrait.update { mutableTrait in mutableTrait.setMountTypeOverride(.official) }
ตรวจสอบการเชื่อมต่อสำหรับอุปกรณ์
ระบบจะตรวจสอบการเชื่อมต่อของอุปกรณ์ที่ระดับประเภทอุปกรณ์ เนื่องจากอุปกรณ์บางเครื่องรองรับอุปกรณ์หลายประเภท สถานะที่ส่งคืนคือ การรวมสถานะการเชื่อมต่อสำหรับลักษณะทั้งหมดในอุปกรณ์นั้น
let lightConnectivity = dimmableLightDeviceType.metadata.sourceConnectivity .connectivityState
สถานะ partiallyOnline อาจสังเกตได้ในกรณีที่มีอุปกรณ์หลายประเภท
เมื่อไม่มีการเชื่อมต่ออินเทอร์เน็ต ลักษณะMatterมาตรฐาน
อาจยังออนไลน์อยู่เนื่องจากการกำหนดเส้นทางในพื้นที่ แต่ลักษณะที่อิงตามระบบคลาวด์จะ
ออฟไลน์
รับที่อยู่ IP ของอุปกรณ์
หากต้องการค้นหาที่อยู่ IP ของอุปกรณ์ ให้ใช้แอตทริบิวต์ networkInterfaces ของ
GeneralDiagnosticsTrait
ระบบจะแสดงที่อยู่เป็นออบเจ็กต์ Data ซึ่งคุณจัดรูปแบบเป็นสตริง IPv4 หรือ IPv6 มาตรฐานได้โดยใช้เฟรมเวิร์ก Network
func getIpAddresses(trait: Matter.GeneralDiagnosticsTrait) -> [String] {
let interfaces = trait.attributes.networkInterfaces ?? []
var ipAddresses: [String] = []
for interface in interfaces {
for data in interface.iPv4Addresses {
if let ipv4 = IPv4Address(data) {
ipAddresses.append(String(describing: ipv4))
}
}
for data in interface.iPv6Addresses {
if let ipv6 = IPv6Address(data) {
ipAddresses.append(String(describing: ipv6))
}
}
}
return ipAddresses
}
เริ่มไลฟ์สด
หากต้องการเริ่มไลฟ์สด ให้ส่งสตริง Session Description Protocol (SDP)
ไปยังเมธอด
WebRtcLiveViewTrait
ของลักษณะ
startLiveView(offerSdp:)
ซึ่งจะแสดงค่า 3 ค่า ได้แก่
- SDP สำหรับเซสชัน
- ระยะเวลาเซสชันเป็นวินาที
- รหัสเซสชัน ซึ่งอาจใช้เพื่อขยายหรือสิ้นสุดเซสชัน
public func sendOffer(offerSdp: String) async throws
-> (answerSdp: String, mediaSessionId: String, liveViewDuration: TimeInterval)
{
do {
// Sending StartLiveView command
let response = try await liveViewTrait.startLiveView(
offerSdp: offerSdp
)
// Received StartLiveView response
return (
answerSdp: response.answerSdp,
mediaSessionId: response.mediaSessionId,
liveViewDuration: TimeInterval(response.liveSessionDurationSeconds)
)
} catch {
// Failed to send StartLiveView command
throw error
}
}
ขยายเวลาไลฟ์สด
ไลฟ์สดมีระยะเวลาที่กำหนดไว้ล่วงหน้าและจะหมดอายุหลังจากนั้น หากต้องการขยาย
ระยะเวลาของไลฟ์สดที่กำลังเผยแพร่ ให้ส่งคำขอขยายเวลาโดยใช้เมธอด
extendLiveView(mediaSessionId:optionalArgsProvider:)
public func extendLiveView(mediaSessionId: String) async throws {
do {
// Extending live view
let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
} catch {
// Failed to extend live view
throw error
}
}
เริ่มและหยุด TalkBack
หากต้องการเริ่ม Talkback ให้เรียกใช้เมธอด startTalkback(mediaSessionId:optionalArgsProvider:) ของลักษณะ WebRtcLiveViewTrait
หากต้องการหยุด ให้ใช้ stopTalkback(mediaSessionId:)
public func toggleTwoWayTalk(isOn: Bool, mediaSessionId: String) async throws {
do {
if isOn {
try await liveViewTrait.startTalkback(mediaSessionId: mediaSessionId)
} else {
try await liveViewTrait.stopTalkback(mediaSessionId: mediaSessionId)
}
} catch {
throw HomeError.commandFailed("Failed to toggle twoWayTalk: \(error)")
}
}
จัดการไลฟ์สด
การปรับคุณภาพไลฟ์สดมีประโยชน์ในการเพิ่มประสิทธิภาพการใช้แบนด์วิดท์ตามบริบทการรับชมของไคลเอ็นต์ (เช่น การเปลี่ยนไปใช้ความละเอียดที่ต่ำลงเมื่อแสดงไทล์ตัวอย่างขนาดเล็ก มุมมองตารางกริด หรือโหมดการแสดงภาพซ้อนภาพ)
การเปลี่ยนคุณภาพแบบไดนามิกโดยใช้ลักษณะWebRtcLiveView
จะจัดการความละเอียดของเซสชันไลฟ์สดที่ใช้งานอยู่
ในไคลเอ็นต์หนึ่งๆ โดยเฉพาะ ซึ่งไม่เหมือนกับการกำหนดค่าการตั้งค่าการใช้แบนด์วิดท์
ทั่วทั้งอุปกรณ์โดยตรงบนอุปกรณ์ ซึ่งจะส่งผลต่อผู้ชมที่รับชมพร้อมกันทั้งหมด
และคุณภาพของการบันทึกวิดีโอที่ผ่านมา
ที่บันทึกลงในระบบคลาวด์
ตัวอย่างต่อไปนี้แสดงวิธีดึงและอัปเดตคุณภาพของไลฟ์สดสำหรับอุปกรณ์
เรียกตัวเลือกคุณภาพที่รองรับ: รับความละเอียดในการสตรีมที่มี ซึ่งอุปกรณ์รองรับ โค้ดจะค้นหาลักษณะ
WebRtcLiveViewเพื่อแสดงคุณภาพสตรีมที่รองรับเป็นรายการค่าQualityHint(เช่น.sd,.hd,.fhd,.qhdหรือ.uhd) โดยใช้พร็อพเพอร์ตี้supportedQualityHintsเปลี่ยนคุณภาพไลฟ์สด: ใช้
QualityHintที่เลือกเพื่อเปลี่ยน ความละเอียดการสตรีมของไลฟ์สดที่ทำงานอยู่ (เช่น เปลี่ยนจากความละเอียดมาตรฐานเป็นความละเอียดสูง) ฟังก์ชันupdateQualityHintใช้เมธอดchangeLiveViewQualityของลักษณะWebRtcLiveViewเพื่อใช้การกำหนดค่าQualityHintที่เลือกกับเซสชันสื่อที่ใช้งานอยู่
public var supportedQualityHints: [Google.WebRtcLiveViewTrait.QualityHint] { return liveViewTrait?.attributes.supportedQualityHints ?? [] } public func updateQualityHint( liveViewTrait: Google.WebRtcLiveViewTrait, hint: Google.WebRtcLiveViewTrait.QualityHint, mediaSessionId: String ) async { do { _ = try await liveViewTrait.changeLiveViewQuality( mediaSessionId: mediaSessionId, qualityHint: hint ) } catch { // error } }
เปิดและปิดใช้ความสามารถในการบันทึก
หากต้องการเปิดใช้ความสามารถในการบันทึกของกล้อง ให้ส่ง
TransportStatusEnum.Active
ไปยังเมธอด
setTransportStatus(transportStatus:optionalArgsProvider:)
ของลักษณะ
PushAvStreamTransportTrait หากต้องการปิดใช้ความสามารถในการบันทึก ให้ส่งTransportStatusEnum.Inactive
ในตัวอย่างต่อไปนี้ เราจะรวมการเรียกเหล่านี้ไว้ในการเรียกครั้งเดียวที่ใช้
Booleanเพื่อสลับความสามารถในการบันทึก
public func toggleIsRecording(isOn: Bool) {
self.uiState = .loading
guard let pushAvStreamTransportTrait else {
// PushAvStreamTransportTrait not found.
return
}
Task {
do {
try await pushAvStreamTransportTrait.setTransportStatus(
transportStatus: isOn ? .active : .inactive)
if isOn {
do {
self.player = try self.createWebRtcPlayer()
} catch {
// Failed to initialize WebRtcPlayer
self.uiState = .disconnected
return
}
await self.player?.initialize()
self.uiState = .live
} else {
self.player = nil
self.uiState = .off
}
} catch {
// Failed to toggle onOff
}
}
}
การเปิดหรือปิดใช้ความสามารถในการบันทึกของกล้องจะเหมือนกับการเปิดหรือปิดวิดีโอของกล้อง เมื่อวิดีโอของกล้องเปิดอยู่ กล้องจะบันทึก (เพื่อวัตถุประสงค์ของเหตุการณ์และคลิปที่เกี่ยวข้อง)
เมื่อปิดใช้ความสามารถในการบันทึก (วิดีโอจากกล้องปิดอยู่)
- กล้องอาจยังคงแสดงเป็นออนไลน์ตาม
connectivityStateของ ประเภทอุปกรณ์ - เข้าถึงไลฟ์สดไม่ได้ และกล้องไม่ตรวจพบเหตุการณ์ในระบบคลาวด์
ตรวจสอบว่าได้เปิดใช้ความสามารถในการบันทึกหรือไม่
หากต้องการดูว่าเปิดใช้ความสามารถในการบันทึกของกล้องหรือไม่ ให้ตรวจสอบว่ามีการเชื่อมต่อที่ใช้งานอยู่หรือไม่ ตัวอย่างต่อไปนี้กำหนดฟังก์ชัน 2 รายการเพื่อดำเนินการนี้
public func isDeviceRecording() -> Bool {
guard let pushAvStreamTransportTrait else {
// PushAvStreamTransportTrait not found.
return false
}
guard
let hasActiveConnection =
pushAvStreamTransportTrait
.attributes
.currentConnections?
.contains(where: { $0.transportStatus == .active })
else {
return false
}
return hasActiveConnection
}
ดึงข้อมูลสแนปชอตจากกล้อง
ใช้ลักษณะ CameraSnapshot เพื่อดึงสแนปชอตรูปภาพนิ่งจากกล้อง
สแนปชอตเหล่านี้มีประโยชน์ในหลายสถานการณ์ ดังนี้
- เป็นการ์ดตัวยึดตำแหน่งใน UI ขณะที่ไลฟ์สด WebRTC กำลังโหลด
- เป็นภาพตัวอย่างแบบคงที่ซึ่งอัปเกรดเป็นไลฟ์สดเมื่อผู้ใช้ โต้ตอบ
- เป็น Canvas พื้นหลังสำหรับการวาดและกำหนดค่าโซนกิจกรรม ที่กำหนดเอง
CameraSnapshot ลักษณะนี้มี 2 วิธีในการดึงข้อมูลสแนปชอต ขึ้นอยู่กับว่าคุณต้องการสแนปชอตที่แคชไว้เพื่อการแสดงผลที่รวดเร็วหรือสแนปชอตสดแบบออนดีมานด์
รับสแนปชอตตัวอย่างที่แคชไว้
สแนปชอตตัวอย่างคือรูปภาพที่แคชไว้ซึ่ง SDK สามารถดึงข้อมูลได้โดยไม่ต้องเปิดกล้อง วิธีนี้เป็นวิธีที่เร็วที่สุดในการดึงรูปภาพแบบคงที่ และเหมาะสำหรับหน้าภาพรวมของกล้องหรือตารางแดชบอร์ด
หากต้องการดูสแนปชอตตัวอย่าง ให้อ่านpreview_image_urlแอตทริบิวต์ลักษณะpreview_image_url
guard let cameraSnapshotTrait = deviceType.traits[ Google.CameraSnapshotTrait.self ] else { print("CameraSnapshot trait not supported on this device.") return } if let previewImageUrlString = cameraSnapshotTrait .attributes.preview_image_url, let url = URL(string: previewImageUrlString) { // Load the preview image from the URL }
URL ตัวอย่างจะชี้ไปยังรูปภาพที่แคชซึ่งสร้างจากฟุตเทจวิดีโอล่าสุด (I-frame แรกของ วิดีโอ Fragment ล่าสุด) หรือสแนปชอตที่กล้องอัปโหลดเป็นระยะๆ ทั้งนี้ขึ้นอยู่กับการกำหนดค่ากล้องและกิจกรรม
ระบบจะฝังDateTimeOriginalแท็ก Exif (ExifInterface#TAG_DATETIME_ORIGINAL) ในรูปภาพ JPEG/PNG ที่แสดงผล ซึ่งจัดรูปแบบเป็น UTC เพื่อระบุความใหม่ของรูปภาพในระบบคลาวด์ของ Google Home คุณสามารถแยกวิเคราะห์แท็กนี้ในฝั่งไคลเอ็นต์เพื่อแสดงอายุของสแนปชอตในแอปได้
ดูสแนปชอตสดแบบออนดีมานด์
สำหรับเส้นทางของผู้ใช้ที่ต้องใช้ฟีเจอร์ดูภาพสดปัจจุบันของกล้อง เช่น การตั้งค่าโซนตรวจหา กิจกรรม คุณสามารถขอภาพรวมสดได้ การเรียกใช้ภาพรวมสดจะสั่งให้กล้อง ตื่นขึ้น จับภาพเฟรมใหม่ และอัปโหลดไปยังระบบคลาวด์
หากต้องการขอสแนปชอตสด ให้ใช้คำสั่ง getLiveSnapshot()
do { let response = try await cameraSnapshotTrait.getLiveSnapshot() let snapshotUrlString = response.snapshot_url if let url = URL(string: snapshotUrlString) { // Load the live snapshot image from the URL } } catch { print("Failed to get live snapshot: \(error)") }
ตรวจสอบสิทธิ์คำขอสแนปชอต
URL ของภาพรวมทั้งหมดจะชี้ไปยังสื่อที่ปลอดภัยและต้องใช้โทเค็น OAuth 2.0 สำหรับขอบเขต Home APIs v2 หากต้องการดาวน์โหลดและแสดงรูปภาพ คุณต้องแทรกโทเค็น OAuth เป็นโทเค็น Bearer ในส่วนหัว Authorization ของคำขอ HTTP
ตัวอย่างต่อไปนี้แสดงวิธีกำหนดค่าคำขอเครือข่ายที่ปลอดภัย เพื่อดาวน์โหลดสแนปชอต
import UIKit func loadSnapshotImage(from url: URL, home: Home) async -> UIImage? { do { // 1. Retrieve the OAuth access token from the Home APIs SDK let (accessToken, _) = try await home.permissions.authorization() // 2. Configure the HTTP GET request with the Bearer token var request = URLRequest(url: url) request.setValue( "Bearer \(accessToken)", forHTTPHeaderField: "Authorization" ) // 3. Fetch the image data let (data, _) = try await URLSession.shared.data(for: request) return UIImage(data: data) } catch { print("Error loading snapshot image: \(error)") return nil } }
การตั้งค่าแบตเตอรี่
คุณควบคุมการตั้งค่าแบตเตอรี่ต่างๆ ได้ผ่าน 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" } ] }
private func setBatteryUsage(to option: UInt8) async throws { _ = try await energyPreferenceTrait.update { $0.setCurrentEnergyBalance(option) } }
เปิดโหมดประหยัดแบตเตอรี่อัตโนมัติ
หากต้องการกำหนดค่าฟีเจอร์นี้ ให้อัปเดตแอตทริบิวต์
currentLowPowerModeSensitivity
ของลักษณะEnergyPreference
แอตทริบิวต์นี้ใช้อินเด็กซ์
เพื่อเลือกระดับความละเอียด โดยปกติแล้ว 0 จะแทน Disabled
และ 1 จะแทน Enabled หรือ Automatic
private func setAutoBatterySaver(to value: Bool) async throws { _ = try await energyPreferenceTrait.update { $0.setCurrentLowPowerModeSensitivity(value ? 1 : 0) } }
รับสถานะการชาร์จแบตเตอรี่
หากต้องการดูสถานะการชาร์จปัจจุบันของอุปกรณ์ (กำลังชาร์จ ชาร์จเต็มแล้ว หรือไม่ได้ชาร์จ) ให้ใช้แอตทริบิวต์
batChargeState
ของลักษณะ
PowerSource
self.chargingState = powerSourceTrait.attributes.batChargeState var description: String switch self.chargingState { case .isCharging: description = "Charging" case .isAtFullCharge: description = "Full" case .isNotCharging: description = "Not Charging" default: description = "Unknown" }
รับระดับแบตเตอรี่
หากต้องการดูระดับแบตเตอรี่ปัจจุบัน ให้ใช้แอตทริบิวต์
batChargeLevel
ของลักษณะ
PowerSource
ระดับจะเป็น OK, Warning (ต่ำ) หรือ Critical
self.batteryLevel = powerSourceTrait.attributes.batChargeLevel var description: String switch self.batteryLevel { case .ok: description = "OK" case .warning: description = "Warning" case .critical: description = "Critical" default: description = "Unknown" }
เตรียมแหล่งจ่ายไฟ
หากต้องการระบุแหล่งพลังงานที่อุปกรณ์ใช้ ให้ใช้แอตทริบิวต์ BatPresent
และ
wiredPresent
ของลักษณะ PowerSource
if powerSourceTrait.attributes.wiredPresent ?? false { self.powerSourceType = .wired } else if powerSourceTrait.attributes.batPresent ?? false { self.powerSourceType = .battery } else { self.powerSourceType = nil }
การตั้งค่าเสียง
คุณควบคุมการตั้งค่าเสียงต่างๆ ได้ผ่าน Home API
เปิดหรือปิดไมโครโฟน
หากต้องการเปิดหรือปิดไมโครโฟนของอุปกรณ์ ให้อัปเดตแอตทริบิวต์
microphoneMuted
ของลักษณะ CameraAvStreamManagementTrait โดยใช้ฟังก์ชัน setMicrophoneMuted ในตัว ดังนี้
// Turn the device's microphone on or off
func setMicrophone(on: Bool) async {
do {
_ = try await self.cameraAvStreamManagementTrait?.update {
$0.setMicrophoneMuted(!on)
}
} catch {
// Error
}
}
เปิดหรือปิดการบันทึกเสียง
หากต้องการเปิดหรือปิดการบันทึกเสียงสำหรับอุปกรณ์ ให้อัปเดตแอตทริบิวต์
recordingMicrophoneMuted
ของลักษณะ CameraAvStreamManagementTrait โดยใช้ฟังก์ชัน setRecordingMicrophoneMuted ในตัว
// Turn audio recording on or off for the device
func setAudioRecording(on: Bool) async {
do {
_ = try await self.cameraAvStreamManagementTrait?.update {
$0.setRecordingMicrophoneMuted(!on)
}
} catch {
// Error
}
}
ปรับระดับเสียงของลำโพง
หากต้องการปรับระดับเสียงของลำโพงสำหรับอุปกรณ์ ให้อัปเดตแอตทริบิวต์
speakerVolumeLevel
ของลักษณะ CameraAvStreamManagementTrait โดยใช้ฟังก์ชัน setSpeakerVolumeLevel ในตัว ดังนี้
// Adjust the camera speaker volume
func setSpeakerVolume(to value: UInt8) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setSpeakerVolumeLevel(value)
}
} catch {
// Error
}
}
การตั้งค่าโซนตรวจจับกิจกรรม
ZoneManagement ลักษณะนี้มีอินเทอร์เฟซสำหรับจัดการภูมิภาคที่กำหนดเอง
ที่สนใจ (โซนตรวจจับกิจกรรม) ในอุปกรณ์กล้องและกริ่งประตู
ระบบจะใช้โซนเหล่านี้เพื่อกรองการตรวจหาเหตุการณ์ (เช่น การเคลื่อนไหวของบุคคล
หรือยานพาหนะ) ไปยังพื้นที่ที่เฉพาะเจาะจงภายในขอบเขตการมองเห็นของอุปกรณ์
ผู้ใช้จะกำหนดค่าโซนตรวจจับกิจกรรมได้ภายในแอปพลิเคชันพาร์ทเนอร์ ซึ่งจะช่วยให้ผู้ใช้สามารถวาดโซนเหนือพื้นที่ที่เฉพาะเจาะจงในขอบเขตการมองเห็นของกล้อง จากนั้นระบบจะแปลโซนที่ผู้ใช้กำหนดเหล่านี้เป็นโครงสร้างที่ลักษณะนี้ใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของโซนตรวจจับกิจกรรมได้ที่ ตั้งค่าและใช้โซนตรวจจับกิจกรรม
โดยปกติแล้ว โซนตรวจจับกิจกรรมจะกำหนดโดยใช้พิกัดคาร์ทีเซียน 2 มิติ
ลักษณะนี้ระบุ
TwoDCartesianVertexStructสำหรับจุดยอดและ
TwoDCartesianZoneStruct
สำหรับการกำหนดโซน (ชื่อ จุดยอด สี และการใช้งาน)
ตรวจสอบโซนตรวจจับกิจกรรม
หากต้องการแสดงโซนตรวจจับกิจกรรม ให้ตรวจสอบแอตทริบิวต์
zones
ของลักษณะZoneManagement
let zoneManagementTrait: Google.ZoneManagementTrait self.zones = zoneManagementTrait.attributes.zones ?? []
เพิ่มโซนตรวจจับกิจกรรม
หากต้องการสร้างโซนใหม่ ให้ใช้คำสั่ง
createTwoDCartesianZone คำสั่งนี้ใช้ TwoDCartesianZoneStruct
ซึ่งกำหนดชื่อ จุดยอด สี และการใช้งานของโซน
ตัวอย่างต่อไปนี้แสดงวิธีสร้างโซนชื่อ "Front Porch" ที่มีจุดยอด 4 จุด สีแซลมอน (#F439A0) และใช้สำหรับการตรวจจับการเคลื่อนไหว
import GoogleHomeSDK import GoogleHomeTypes func createFrontPorchZone(trait: Google.ZoneManagementTrait) async { // 1. Define the vertices for the zone (2D Cartesian coordinates) // Values are UInt16, typically scaled to the device's twoDCartesianMax. let vertices = [ Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 260, y = 422), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1049, y = 0), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 0), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 950), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1630, y = 1349), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 880, y = 2048), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 0, y = 2048), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 638, y = 1090) ] // 2. Define the zone structure using the given SDK struct let newZone = Google.ZoneManagementTrait.TwoDCartesianZoneStruct( name: "Front Porch", use: [.motion], // ZoneUseEnum.motion vertices: vertices, // Color is a hex string (for example, Salmon/Pink) color: "#F439A0" ) do { // 3. Execute the raw command to add the zone to the device // This returns the created zone's ID (UInt16). var newZoneID = try await trait.createTwoDCartesianZone(zone: newZone) } catch { // Error } }
อัปเดตโซนตรวจจับกิจกรรม
หากต้องการอัปเดตโซนที่มีอยู่ ให้ใช้คำสั่ง
updateTwoDCartesianZone คำสั่งนี้ต้องใช้ zoneId และ TwoDCartesianZoneStruct ที่อัปเดตแล้ว
let zoneManagementTrait: Google.ZoneManagementTrait let zoneID: UInt16 let zone: Google.ZoneManagementTrait.TwoDCartesianZoneStruct do { _ = try await zoneManagementTrait.updateTwoDCartesianZone( zoneID: zoneID, zone: zone) } catch { // Error }
ลบโซนตรวจจับกิจกรรม
หากต้องการนำโซนออก ให้ใช้คำสั่ง
removeZone กับ zoneId ที่เฉพาะเจาะจง
let zoneManagementTrait: Google.ZoneManagementTrait let zoneID: UInt16 do { _ = try await zoneManagementTrait.removeZone(zoneID: zoneID) } catch { // Error }
ทริกเกอร์เหตุการณ์ที่มีเสียง
AvStreamAnalysis ลักษณะนี้มีอินเทอร์เฟซสำหรับการจัดการทริกเกอร์การตรวจจับเหตุการณ์
ในอุปกรณ์กล้องและกริ่งประตู แม้ว่าทริกเกอร์ที่อิงตามวิสัยทัศน์
(เช่น ผู้คนหรือยานพาหนะ) จะเฉพาะเจาะจงโซนได้ แต่โดยปกติแล้วทริกเกอร์ที่เกี่ยวข้องกับเสียง
จะเป็นการกำหนดค่าระดับอุปกรณ์
ทริกเกอร์ประเภทต่อไปนี้ใช้ได้กับการตรวจจับเสียงด้วย
EventTriggerTypeEnum
| โหมด | ค่า enum | คำอธิบาย |
|---|---|---|
| เสียง | Sound |
การตรวจจับเสียงทั่วไป |
| คนพูดคุย | PersonTalking |
ตรวจจับคำพูด |
| เสียงสุนัขเห่า | DogBark |
ตรวจจับเสียงร้องของสุนัข |
| กระจกแตก | GlassBreak |
ตรวจจับเสียงกระจกแตก |
| สัญญาณเตือนควัน | SmokeAlarm |
ตรวจจับสัญญาณเตือนควัน ซึ่งมักจะจดจำได้จากรูปแบบเสียงที่ได้ยิน T3 (เสียงบี๊บสั้นๆ 3 ครั้งแล้วหยุด) |
| สัญญาณเตือนคาร์บอนมอนอกไซด์ | CoAlarm |
ตรวจจับสัญญาณเตือนคาร์บอนมอนอกไซด์ (CO) ซึ่งโดยปกติจะ สังเกตได้จากรูปแบบเสียง T4 (เสียงบี๊บสั้นๆ 4 ครั้ง ตามด้วย การหยุดชั่วคราว) |
ตรวจสอบสถานะการตรวจจับเสียง
หากต้องการแสดงสถานะปัจจุบันของการตรวจจับเสียงต่อผู้ใช้ คุณต้องตรวจสอบ สิ่งที่อุปกรณ์รองรับและสิ่งที่ฮาร์ดแวร์ของอุปกรณ์เปิดใช้ แอตทริบิวต์ 2 รายการที่ต้องตรวจสอบมีดังนี้
ในการพัฒนา iOS โดยปกติแล้วคุณจะเข้าถึงAvStreamAnalysisลักษณะ
จากอุปกรณ์เพื่ออ่านแอตทริบิวต์เหล่านี้
// Example struct to store event triggers public struct EventTrigger: Equatable { public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum public var enabled: Bool } let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait let possibleEventTriggers = avStreamAnalysisTrait.attributes.supportedEventTriggers ?? [] let enabledEventTriggers = avStreamAnalysisTrait.attributes.enabledEventTriggers ?? [] let eventTriggers [EventTrigger] = [] for trigger in possibleEventTriggers { self.eventTriggers.append( EventTrigger( id: trigger, enabled: enabledEventTriggers.contains(trigger) ) ) }
อัปเดตชุดทริกเกอร์ที่เปิดใช้
หากต้องการอัปเดตชุดทริกเกอร์ที่เปิดใช้ ให้ใช้คำสั่ง
SetOrUpdateEventDetectionTriggers
ซึ่งรับรายการโครงสร้าง EventTriggerEnablement
// Example struct to store event triggers public struct EventTrigger: Equatable { public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum public var enabled: Bool } let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait let eventTriggers: [EventTrigger] let enabledEventTriggers = eventTriggers.map { Google.AvStreamAnalysisTrait.EventTriggerEnablement( eventTriggerType: $0.id, enablementStatus: $0.enabled ? .enabled : .disabled ) } try await avStreamAnalysisTrait.setOrUpdateEventDetectionTriggers( eventTriggerEnablements: enabledEventTriggers )
โหมดการบันทึก
ลักษณะ RecordingMode มีอินเทอร์เฟซสำหรับจัดการลักษณะการทำงานของการบันทึกวิดีโอ
และรูปภาพในอุปกรณ์กล้องและกริ่งประตู ซึ่งช่วยให้
ผู้ใช้เลือกระหว่างการบันทึกต่อเนื่อง การบันทึกตามเหตุการณ์
หรือการปิดใช้การบันทึกทั้งหมด (มุมมองสดเท่านั้น)
RecordingModeEnum
กำหนดกลยุทธ์การบันทึกที่ใช้ได้ ดังนี้
| โหมด | ค่า enum | คำอธิบาย |
|---|---|---|
| ปิดใช้แล้ว | Disabled |
ปิดใช้การบันทึกโดยสมบูรณ์ อุปกรณ์รุ่นเดิมใช้เป็นหลัก |
| CVR (การบันทึกวิดีโอต่อเนื่อง) | Cvr |
ระบบจะบันทึกวิดีโอทุกวันตลอด 24 ชั่วโมง ต้องมีการสมัครใช้บริการ (เช่น Google Home Premium |
| EBR (การบันทึกเมื่อเกิดเหตุการณ์) | Ebr |
การบันทึกจะเริ่มขึ้นเมื่อเกิดเหตุการณ์ (บุคคล การเคลื่อนไหว) ความยาววิดีโอจะขึ้นอยู่กับระยะเวลาของกิจกรรมและการสมัครใช้บริการ |
| ETR (การบันทึกเมื่อเกิดเหตุการณ์) | Etr |
การบันทึกตัวอย่าง Shorts (เช่น 10 วินาที) ที่ทริกเกอร์โดยเหตุการณ์ |
| ดูภาพสด | LiveView |
ระบบจะปิดใช้การบันทึก แต่ผู้ใช้จะยังเข้าถึงไลฟ์สดได้ |
| ภาพนิ่ง | Images |
ระบบจะบันทึกสแนปชอตแทนวิดีโอเมื่อเกิดเหตุการณ์ |
ตรวจสอบโหมดการบันทึก
หากต้องการแสดงการกำหนดค่าการบันทึกปัจจุบัน ให้ตรวจสอบแอตทริบิวต์
ของลักษณะRecordingMode
supportedRecordingModes- โหมดที่เป็นไปได้ทั้งหมดavailableRecordingModes- โหมดที่เลือกได้selectedRecordingMode- โหมดแอ็กทีฟ
// Example struct to store recording modes. public struct RecordingMode: Hashable { public let id: UInt8 public let mode: Google.RecordingModeTrait.RecordingModeEnum } let recordingModeTrait: Google.RecordingModeTrait if let availableRecordingModes = recordingModeTrait.attributes.availableRecordingModes, let supportedRecordingModes = recordingModeTrait.attributes.supportedRecordingModes, let selectedRecordingMode = recordingModeTrait.attributes.selectedRecordingMode { var recordingModes: [RecordingMode] = [] for recordingModeId in availableRecordingModes { guard Int(recordingModeId) < supportedRecordingModes.count, Int(recordingModeId) >= 0 else { // Out of bounds error } recordingModes.append( RecordingMode( id: recordingModeId, mode: supportedRecordingModes[Int(recordingModeId)].recordingMode, ) ) } }
เปลี่ยนโหมดการบันทึก
ก่อนอัปเดต โปรดตรวจสอบว่าดัชนีที่เลือกจากแอตทริบิวต์ supportedRecordingModes
อยู่ในแอตทริบิวต์ availableRecordingModes
หากต้องการอัปเดตโหมดที่เลือก ให้ใช้ฟังก์ชัน setSelectedRecordingMode โดยส่งดัชนีของโหมดที่เลือก
let recordingModeTrait: Google.RecordingModeTrait let recordingModeID: UInt8 _ = try await recordingModeTrait.update { $0.setSelectedRecordingMode(recordingModeID) }
การตั้งค่าอื่นๆ
คุณควบคุมการตั้งค่าอื่นๆ ได้ผ่าน Home API
เปิดหรือปิดฟีเจอร์ภาพกลางคืน
หากต้องการเปิดหรือปิดการมองเห็นตอนกลางคืนสำหรับกล้อง ให้ใช้ TriStateAutoEnum
เพื่ออัปเดตแอตทริบิวต์
nightVision
ของลักษณะ CameraAvStreamManagementTrait โดยใช้ฟังก์ชัน setNightVision ในตัว
// Turn night vision on or off
func setNightVision(
to value: Google.CameraAvStreamManagementTrait.TriStateAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setNightVision(value)
}
} catch {
// Error
}
}
เปลี่ยนความสว่างของ LED แสดงสถานะ
หากต้องการเปลี่ยนความสว่างของไฟ LED แสดงสถานะ ให้ใช้
ThreeLevelAutoEnum
เพื่ออัปเดตแอตทริบิวต์
statusLightBrightness
ของลักษณะ CameraAvStreamManagementTrait โดยใช้ฟังก์ชัน setStatusLightBrightness ในตัว ดังนี้
// Set the LED brightness
func setStatusLightBrightness(
to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setStatusLightBrightness(value)
}
} catch {
// Error
}
}
เปลี่ยนวิวพอร์ตของกล้อง
ช่องมองภาพของกล้องจะเหมือนกับฟีเจอร์ซูมและครอบตัดที่อธิบายไว้ในบทความสนับสนุนซูมและปรับปรุงวิดีโอของกล้อง Nest
วิวพอร์ตกำหนดไว้ใน ViewportStruct ซึ่งมีค่า 4 ค่าที่ใช้เป็นพิกัดของวิวพอร์ต โดยพิกัดจะกําหนดดังนี้
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
การกำหนดค่าสำหรับ ViewportStruct ขึ้นอยู่กับ UI ของแอปและการติดตั้งใช้งานกล้อง ในระดับพื้นฐานมากที่สุด หากต้องการตั้งค่า วิวพอร์ต ของวิดีโอจากกล้อง ให้อัปเดต แอตทริบิวต์ viewport
ของ ลักษณะภาษา CameraAvStreamManagementTrait ด้วย ViewportStruct โดยใช้ ฟังก์ชัน setViewport ในตัว
func setCrop(x1: UInt16, y1: UInt16, x2: UInt16, y2: UInt16) {
let viewport = Google.CameraAvStreamManagementTrait.ViewportStruct(
x1: x1,
y1: y1,
x2: x2,
y2: y2
)
Task {
do {
try await cameraAvStreamManagementTrait.update {
$0.setViewport(viewport)
}
} catch {
// Error
}
}
}
สร้าง TransportOptionsStruct
การตั้งค่าบางอย่างต้องมีการแก้ไขพร็อพเพอร์ตี้ใน TransportOptionsStruct,
ซึ่งจะส่งไปยังตัวเลือกการรับส่งของการเชื่อมต่อการสตรีม สำหรับ
Swift คุณต้องสร้างโครงสร้างนี้ก่อนอัปเดตพร็อพเพอร์ตี้
ใช้ฟังก์ชันตัวช่วยนี้เพื่อสร้างโครงสร้างสำหรับใช้กับการเปลี่ยนแปลงการตั้งค่าต่อไปนี้
func getTransportOptions(
transportOptions: Google.PushAvStreamTransportTrait.TransportOptionsStruct,
wakeUpSensitivity: UInt8?,
maxEventLength: UInt32?
) async throws
-> Google.PushAvStreamTransportTrait.TransportOptionsStruct
{
var newMotionTimeControl:
Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct? = nil
if let maxEventLength {
guard let motionTimeControl = transportOptions.triggerOptions.motionTimeControl else {
throw HomeError.failedPrecondition(
// Error - cannot update max event length without motion time control
}
newMotionTimeControl =
Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct(
initialDuration: motionTimeControl.initialDuration,
augmentationDuration: motionTimeControl.augmentationDuration,
maxDuration: maxEventLength,
blindDuration: motionTimeControl.blindDuration
)
}
return Google.PushAvStreamTransportTrait.TransportOptionsStruct(
streamUsage: .recording,
videoStreamID: nil,
audioStreamID: nil,
tlsEndpointID: transportOptions.tlsEndpointID,
url: transportOptions.url,
triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct(
triggerType: .motion,
motionZones: nil,
motionSensitivity: wakeUpSensitivity,
motionTimeControl: newMotionTimeControl,
maxPreRollLen: nil
),
ingestMethod: .cmafIngest,
containerOptions: Google.PushAvStreamTransportTrait.ContainerOptionsStruct(
containerType: .cmaf,
cmafContainerOptions: nil
),
expiryTime: nil
)
}
private func getRecordingConnection() async throws
-> Google.PushAvStreamTransportTrait.TransportConfigurationStruct?
{
guard let pushAvStreamTransportTrait else {
// Error - PushAvStreamTransport trait not available
return nil
}
let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations
for connection in connections {
guard let transportOptions = connection.transportOptions,
transportOptions.streamUsage == .recording
else {
continue
}
return connection
}
return nil
}
เปิดหรือปิดใช้ข้อมูลวิเคราะห์
อุปกรณ์แต่ละเครื่องอาจเลือกที่จะส่งข้อมูลวิเคราะห์แบบละเอียดไปยัง ระบบคลาวด์ของ Google Home (ดูการตรวจสอบระบบคลาวด์สำหรับ Home API)
หากต้องการเปิดใช้ข้อมูลวิเคราะห์สําหรับอุปกรณ์ ให้ตั้งค่าพร็อพเพอร์ตี้
analyticsEnabled)
ของ
ExtendedGeneralDiagnosticsTrait
เป็น true เมื่อตั้งค่า analyticsEnabled
พร็อพเพอร์ตี้อื่น logUploadEnabled จะตั้งค่าเป็น true โดยอัตโนมัติ ซึ่ง
จะอนุญาตให้อัปโหลดไฟล์บันทึกข้อมูลวิเคราะห์ไปยังระบบคลาวด์ของ Google Home
// Enable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
$0.setAnalyticsEnabled(true)
}
// Disable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
$0.setAnalyticsEnabled(false)
}
การกำหนดค่าการขนส่งและการบันทึก
ส่วนนี้ครอบคลุมการตั้งค่าที่เกี่ยวข้องกับคุณภาพการสตรีมของกล้องและ
การทริกเกอร์เหตุการณ์ การตั้งค่าเหล่านี้ได้รับการจัดการโดยลักษณะภาษา
PushAvStreamTransport
อ่านการตั้งค่าการรับส่ง
ส่วนนี้แสดงวิธีดึงข้อมูลการกำหนดค่าปัจจุบันจาก
อุปกรณ์กล้องหรือกริ่งประตู โดยจะดึงข้อมูลPushAvStreamTransportลักษณะ
ค้นหาการเชื่อมต่อที่เฉพาะเจาะจงซึ่งใช้สำหรับการบันทึก แล้วแยก
ค่าปัจจุบันสำหรับคุณภาพแบนด์วิดท์ ความไวในการปลุกระบบ
และระยะเวลาสูงสุดของเหตุการณ์
// Assuming access to // var pushAvStreamTransportTrait: Google.PushAvStreamTransportTrait let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations // Locate the connection designated for recording let recordingConnection = connections.first { connection in guard let transportOptions = connection.transportOptions else { return false } return transportOptions.streamUsage == .recording } let options = recordingConnection?.transportOptions // 1. Bandwidth Quality (Video Stream ID) let videoStreamId = options?.videoStreamID // 2. Wake-up Sensitivity (Motion Sensitivity) let wakeUpSensitivity = options?.triggerOptions.motionSensitivity // 3. Max Event Length (Motion Trigger Time Control) let maxEventLength = options?.triggerOptions.motionTimeControl?.maxDuration
อัปเดตการตั้งค่าการรับส่ง
ส่วนนี้แสดงวิธีเปลี่ยนการตั้งค่าการรับส่ง
โดยจะสร้าง TransportOptionsStruct ใหม่ที่มีค่าใหม่ และ
ใช้คำสั่ง modifyPushTransport เพื่อส่งการตั้งค่าที่อัปเดตแล้วเหล่านี้
กลับไปยังอุปกรณ์ โดยใช้กับการเชื่อมต่อการบันทึกที่พบ
ในขั้นตอนก่อนหน้า
หากต้องการแก้ไขการตั้งค่าเหล่านี้ ให้ใช้คำสั่ง modifyPushTransport
กับ TransportOptionsStruct
// Example: Updating to Max Quality and 30s duration let currentOptions = recordingConnection!.transportOptions! let newOptions = Google.PushAvStreamTransportTrait.TransportOptionsStruct( streamUsage: .recording, videoStreamID: 2, // Max Quality tlsEndpointID: currentOptions.tlsEndpointID, url: currentOptions.url, triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct( triggerType: .motion, motionSensitivity: 5, // Medium motionTimeControl: Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct( initialDuration: currentOptions.triggerOptions.motionTimeControl?.initialDuration ?? 10, augmentationDuration: currentOptions.triggerOptions.motionTimeControl?.augmentationDuration ?? 5, maxDuration: 30, blindDuration: currentOptions.triggerOptions.motionTimeControl?.blindDuration ?? 0 ) ), ingestMethod: currentOptions.ingestMethod, containerOptions: currentOptions.containerOptions ) try await pushAvStreamTransportTrait.modifyPushTransport( connectionID: recordingConnection!.connectionID, transportOptions: newOptions )
พิจารณาคุณภาพแบนด์วิดท์
พร็อพเพอร์ตี้ videoStreamId
ของ TransportOptionsStruct สอดคล้องกับการกำหนดค่าสตรีมวิดีโอ
ที่เฉพาะเจาะจง
หากต้องการดูสตรีมวิดีโอที่รองรับ ให้ดูแอตทริบิวต์
allocatedVideoStreams
ซึ่งเป็นรายการของ VideoStreamStructs
จากลักษณะ CameraAvStreamManagement ของอุปกรณ์
ปรับความไวในการปลุกระบบของอุปกรณ์
พร็อพเพอร์ตี้ motionSensitivity
ของ TransportTriggerOptionsStruct สอดคล้องกับค่าต่อไปนี้
| ป้ายกำกับ | ค่า (UInt8) |
|---|---|
| ต่ำ | 1 |
| ปานกลาง | 5 |
| สูง | 10 |
ปรับระยะเวลาสูงสุดของเหตุการณ์
พร็อพเพอร์ตี้ maxDuration
ของ TransportMotionTriggerTimeControlStruct
สอดคล้องกับระยะเวลา UInt32 ต่อไปนี้ (เป็นวินาที)
- 10, 15, 30, 60, 120, 180
การตั้งค่ากริ่ง
คุณควบคุมการตั้งค่าเสียงกริ่งประตูต่างๆ ได้ผ่าน Home API
เปลี่ยนเสียงกริ่ง
หากต้องการเปลี่ยนเสียงกริ่งประตู ให้รับรายการเสียงกริ่งที่
ติดตั้งในอุปกรณ์ก่อนโดยใช้แอตทริบิวต์
installedChimeSounds
ของลักษณะ ChimeTrait
doorbellChimeTrait.attributes.installedChimeSounds?.compactMap { chimeSound in
return chimeSound.chimeID, chimeSound.name
}
จากนั้นอัปเดตแอตทริบิวต์
selectedChime
ของลักษณะ ChimeTrait โดยใช้ฟังก์ชัน setSelectedChime
ในตัว
func setDoorbellChime(chimeID: UInt8) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setSelectedChime(chimeID)
}
} catch {
// Error
}
}
ใช้กริ่งภายนอก
คุณกำหนดค่ากริ่งประตูให้ใช้กริ่งภายนอกได้ เช่น กริ่งกลไก ที่ติดตั้งไว้ภายในบ้าน คุณควรกำหนดค่านี้ในระหว่างการติดตั้งกริ่งประตู เพื่อหลีกเลี่ยงความเสียหายที่อาจเกิดขึ้นกับกริ่งภายนอก
หากต้องการระบุประเภทกริ่งภายนอกที่ติดตั้ง ให้ใช้
ExternalChimeType
เพื่ออัปเดตแอตทริบิวต์
externalChime
ของลักษณะ ChimeTrait โดยใช้ฟังก์ชัน setExternalChime ในตัว
// Indicate the external chime is mechanical
func setExternalChime(to value: Google.ChimeTrait.ExternalChimeType) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setExternalChime(value)
}
} catch {
// Error
}
}
เปลี่ยนระยะเวลาของกริ่งภายนอก
ระยะเวลาเป็นวินาทีที่กริ่งภายนอกดังสามารถกำหนดค่าได้ผ่าน Home API หากกริ่งภายนอกรองรับระยะเวลาการดังของกริ่ง ผู้ใช้อาจต้องการ กำหนดค่านี้
ค่าที่ตั้งไว้ที่นี่จะขึ้นอยู่กับข้อกำหนดของกริ่งภายนอก เอง และระยะเวลาของเสียงกริ่งที่แนะนำ
หากต้องการเปลี่ยนระยะเวลาเสียงกริ่งภายนอก ให้อัปเดตแอตทริบิวต์
externalChimeDurationSeconds
ของลักษณะ ChimeTrait โดยใช้ฟังก์ชัน setExternalChimeDurationSeconds ในตัว ดังนี้
// Change the external chime duration
func setExternalChimeDuration(to value: UInt16) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setExternalChimeDuration(value)
}
} catch {
// Error
}
}
เปิดใช้ธีมเสียงกริ่ง
กริ่งประตูบางรุ่นอาจมีเสียงกริ่งที่พร้อมให้บริการแก่ผู้ใช้ในช่วงเวลาจำกัดเท่านั้น เช่น เสียงกริ่งสำหรับวันหยุด เสียงกริ่งเหล่านี้เรียกว่าธีมเสียงกริ่ง
หากต้องการดูว่าธีมเสียงแจ้งใดบ้างที่ผู้ใช้ใช้ได้ ให้สร้างตัวกรอง Timebox
แล้วใช้เพื่อกรองผลลัพธ์ของคำสั่ง
getAvailableThemes
จากลักษณะ
ChimeThemes
ซึ่งจะแสดงรายการธีมที่ใช้ได้ รวมถึงชื่อธีม
ตัวอย่างต่อไปนี้แสดงวิธีกรองรายการ
ระบบจะถือว่าธีมทำงานอยู่หากเวลาปัจจุบันอยู่ภายในเวลาเริ่มต้นและเวลาสิ้นสุด (ค่า startTimeSeconds และ endTimeSeconds ตามลำดับ) หากไม่ได้ตั้งเวลาเริ่มต้น ระบบจะถือว่าใช้งานได้ตั้งแต่เริ่ม หากไม่ได้ตั้งเวลาสิ้นสุดไว้ การตั้งค่าจะยังคงใช้งานได้
ต่อไปเรื่อยๆ หากไม่มีทั้ง 2 อย่าง ธีมจะใช้งานได้เสมอ
let chimeThemes = try await chimeThemeTrait.getAvailableThemes().themes
if !chimeThemes.isEmpty {
var chimeThemeSettings = []
for chimeTheme in chimeThemes {
let currentDateTime = UInt64(Date().timeIntervalSince1970)
// Only show chime themes that are active.
if chimeTheme.startTimeSeconds ?? 0 <= currentDateTime
&& chimeTheme.endTimeSeconds ?? UInt64.max >= currentDateTime
{
self.chimeThemeSettings.append(chimeTheme.name)
}
}
}
เมื่อทราบชื่อธีมที่ต้องการแล้ว เช่น Christmas คุณสามารถเลือกธีมนั้นได้โดยใช้ฟังก์ชัน setSelectedTimeboxedThemeName()
ในลักษณะ ChimeThemes ChimeThemes
private func setChimeTheme(to value: String) async throws {
_ = try await chimeThemeTrait.update {
$0.setSelectedTimeboxedThemeName(value)
}
}
การตั้งค่าการประกาศว่ามีผู้มาเยือน
คุณสามารถค้นหาและจัดการการตั้งค่าการประกาศแจ้งต่อผู้มาเยือนสำหรับกริ่งประตูได้โดยใช้ลักษณะภาษา
Home APIs
VisitorAnnouncement ลักษณะนี้ควบคุมว่าจะประกาศการมาของผู้มาเยือนในลำโพงหรือจออัจฉริยะของ Google หรือไม่เมื่อมีคนกดกริ่งประตู
ตัวอย่างต่อไปนี้แสดงวิธีตรวจสอบว่าได้เปิดใช้การประกาศแจ้งต่อผู้มาเยือน หรือไม่ และวิธีอัปเดตการตั้งค่านี้
let visitorAnnouncementsEnabled: Bool = visitorAnnouncementTrait.attributes.visitorAnnouncementsEnabled let value: Bool _ = try await self.visitorAnnouncementTrait?.update { $0.setVisitorAnnouncementsEnabled(value) }