Jenis perangkat Bel Pintu diimplementasikan menggunakan dua trait:
PushAvStreamTransportTrait,
yang menangani transportasi streaming audio dan video menggunakan protokol berbasis push, dan
WebRtcLiveViewTrait,
yang memberikan kemampuan untuk mengontrol live stream dan talkback.
Selalu periksa dukungan atribut dan perintah untuk perangkat sebelum menggunakan fitur atau mencoba memperbarui atribut. Lihat Mengontrol perangkat di iOS untuk mengetahui informasi selengkapnya.
| Jenis Perangkat Home API | Sifat | Aplikasi Contoh Swift | Kasus Penggunaan |
|---|---|---|---|
|
Bel pintu
Perangkat yang diaktifkan oleh tombol di luar pintu yang menghasilkan sinyal suara dan/atau visual, yang digunakan untuk meminta perhatian seseorang yang berada di sisi lain pintu. Bel pintu mungkin memiliki fitur livestream yang dapat diakses, talkback dua arah, atau peristiwa deteksi. |
Ciri Wajib google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Bel pintu |
Mendapatkan informasi dasar tentang perangkat
Trait BasicInformation
mencakup informasi seperti nama vendor, ID vendor, ID produk,
nama produk (mencakup informasi model), dan versi software untuk perangkat:
// [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]
Mendapatkan nomor seri
Untuk mendapatkan nomor seri perangkat, gunakan perintah
GetSerialNumber dari
ExtendedBasicInformation trait.
Contoh ini menunjukkan penyimpanan nomor seri dalam variabel bernama serialNumber:
// Assuming extendedBasicInformationTrait: Google.ExtendedBasicInformationTrait let response = try await extendedBasicInformationTrait.getSerialNumber() let serialNumber = response.serialNumber
Respons Cepat
Fitur Respons Cepat memberi pengguna kemampuan untuk mengirim pesan yang telah ditentukan sebelumnya ke perangkat bel pintu.
Fitur ini hanya tersedia di perangkat bel pintu. Daftar pesan yang telah ditentukan sebelumnya tersedia untuk aplikasi partner, yang dapat menampilkannya kepada pengguna untuk dipilih. Pesan standar tidak dapat diedit oleh pengguna.
Respons Cepat diterapkan melalui trait PresetMessage.
Memutar pesan standar
Untuk memutar pesan preset, panggil metode
playPresetMessage
dengan meneruskan salah satu nilai string yang ditemukan di properti
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)")
}
}
Menyetel bahasa lisan
Menyetel bahasa lisan
Menetapkan bahasa lisan aktif perangkat ke lokalitas tertentu (misalnya, "en_US") menggunakan metode setActiveLocale dari karakteristik
LocalizationConfiguration.
// Setting the active language // Assuming localizationConfigurationTrait: Matter.LocalizationConfigurationTrait let selectedLocale = "en_US" try await localizationConfigurationTrait.update { $0.setActiveLocale(selectedLocale) }
Mendapatkan waktu terbaru saat perangkat menghubungi cloud
Untuk menemukan waktu terbaru saat perangkat terhubung dengan cloud, gunakan atribut lastContactTimestamp dari trait
ExtendedGeneralDiagnostics:
if let lastContactTimeStamp = extendedGeneralDiagnosticsTrait.attributes.lastContactTimestamp { self.lastContactTime = Date(timeIntervalSince1970: Double(lastConnectedTimeStamp)) }
Setelan jenis dudukan kamera
Trait Mount
berisi setelan dudukan kamera dan informasi status. Anda dapat membaca atribut seperti status pemasangan, jenis deteksi, dan nama jenis pemasangan.
Selain itu, Anda dapat menggunakan trait Mount untuk mengganti konfigurasi
jenis pemasangan default.
// 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) }
Memeriksa konektivitas perangkat
Konektivitas untuk perangkat sebenarnya diperiksa di tingkat jenis perangkat karena beberapa perangkat mendukung beberapa jenis perangkat. Status yang ditampilkan adalah kombinasi status konektivitas untuk semua fitur di perangkat tersebut.
let lightConnectivity = dimmableLightDeviceType.metadata.sourceConnectivity .connectivityState
Status partiallyOnline dapat diamati jika ada jenis perangkat campuran saat tidak ada konektivitas internet. Fitur standar Matter mungkin masih online karena perutean lokal, tetapi fitur berbasis cloud akan offline.
Mendapatkan alamat IP perangkat
Untuk menemukan alamat IP perangkat, gunakan atribut networkInterfaces dari
GeneralDiagnosticsTrait.
Alamat ditampilkan sebagai objek Data, yang dapat Anda format ke string IPv4 atau IPv6 standar menggunakan framework 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
}
Memulai livestream
Untuk memulai livestream, kirim string Session Description Protocol (SDP) ke metode
WebRtcLiveViewTrait
trait
startLiveView(offerSdp:), yang menampilkan tiga nilai:
- SDP untuk sesi.
- Durasi sesi dalam hitungan detik.
- ID sesi, yang dapat digunakan untuk memperpanjang atau menghentikan sesi.
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
}
}
Memperpanjang livestream
Live stream memiliki durasi preset setelah itu akan berakhir. Untuk memperpanjang durasi stream aktif, kirim permintaan perpanjangan menggunakan metode
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
}
}
Memulai dan menghentikan TalkBack
Untuk memulai talkback, panggil metode startTalkback(mediaSessionId:optionalArgsProvider:) trait
WebRtcLiveViewTrait.
Untuk berhenti, gunakan 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)")
}
}
Mengelola livestream
Menyesuaikan kualitas livestream berguna untuk mengoptimalkan penggunaan bandwidth berdasarkan konteks penayangan klien (misalnya, beralih ke resolusi yang lebih rendah saat menampilkan petak pratinjau yang lebih kecil, tampilan petak, atau mode picture-in-picture).
Mengubah kualitas secara dinamis menggunakan
WebRtcLiveView
trait secara khusus mengelola resolusi sesi livestream aktif
pada klien tertentu. Setelan ini tidak sama dengan mengonfigurasi setelan penggunaan bandwidth di seluruh perangkat secara langsung di perangkat, yang akan memengaruhi semua penonton serentak dan kualitas rekaman video historis yang disimpan ke cloud.
Contoh berikut menunjukkan cara mengambil dan mengupdate kualitas livestream untuk perangkat:
Mengambil opsi kualitas yang didukung: Dapatkan resolusi streaming yang tersedia yang didukung oleh perangkat. Kode mengkueri trait
WebRtcLiveViewuntuk mengekspos kualitas streaming yang didukung sebagai daftar nilaiQualityHint(seperti.sd,.hd,.fhd,.qhd, atau.uhd) menggunakan propertisupportedQualityHints.Mengubah kualitas livestream: Terapkan
QualityHintyang dipilih untuk mengubah resolusi streaming livestream yang aktif (misalnya, beralih dari Definisi Standar ke Definisi Tinggi). FungsiupdateQualityHintmenggunakan metodechangeLiveViewQualitytraitWebRtcLiveViewuntuk menerapkan konfigurasiQualityHintyang dipilih ke sesi media aktif.
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 } }
Mengaktifkan dan menonaktifkan kemampuan merekam
Untuk mengaktifkan kemampuan perekaman kamera, teruskan
TransportStatusEnum.Active
ke metode
setTransportStatus(transportStatus:optionalArgsProvider:)
PushAvStreamTransportTrait
trait. Untuk menonaktifkan kemampuan merekam, teruskan
TransportStatusEnum.Inactive.
Dalam contoh berikut, kita menggabungkan panggilan ini dalam satu panggilan yang menggunakan
Boolean untuk mengaktifkan/menonaktifkan kemampuan perekaman:
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
}
}
}
Mengaktifkan atau menonaktifkan kemampuan perekaman kamera sama dengan mengaktifkan atau menonaktifkan video kamera. Jika video kamera aktif, kamera akan merekam (untuk tujuan peristiwa dan klip terkait).
Jika kemampuan perekaman dinonaktifkan (video kamera nonaktif):
- Kamera masih dapat ditampilkan sebagai online sesuai dengan
connectivityStatejenis perangkat. - Livestream tidak dapat diakses, dan kamera tidak mendeteksi peristiwa cloud apa pun.
Periksa apakah kemampuan perekaman diaktifkan
Untuk menentukan apakah kemampuan perekaman kamera diaktifkan, periksa apakah ada koneksi yang aktif. Contoh berikut menentukan dua fungsi untuk melakukannya:
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
}
Setelan baterai
Berbagai setelan baterai dapat dikontrol melalui Home API.
Menyetel preferensi penggunaan baterai
Dengan menyetel keseimbangan energi, Anda dapat mengonfigurasi keseimbangan antara daya tahan baterai dan performa perangkat. Anda dapat membuat profil baterai yang berbeda, seperti "Diperpanjang", "Seimbang", dan "Performa", serta beralih di antara profil tersebut.
Fitur ini diterapkan dengan memperbarui atribut
currentEnergyBalance
dari karakteristik EnergyPreference. Atribut ini menerima indeks
bilangan bulat yang sesuai dengan profil tertentu yang ditentukan dalam
daftar energyBalances perangkat (misalnya, 0 untuk EXTENDED,
1 untuk BALANCED, dan 2 untuk PERFORMANCE).
Nilai null untuk currentEnergyBalance menunjukkan bahwa perangkat menggunakan
profil kustom. Ini adalah status hanya baca.
Berikut contoh struktur yang akan digunakan atribut currentEnergyBalance, diikuti dengan cuplikan kode sebenarnya yang menggunakan atribut tersebut.
// 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) } }
Mengaktifkan penghemat baterai otomatis
Untuk mengonfigurasi fitur ini, perbarui atribut
currentLowPowerModeSensitivity
dari sifat EnergyPreference. Atribut ini menggunakan indeks
untuk memilih tingkat sensitivitas, dengan 0 biasanya mewakili Disabled
dan 1 mewakili Enabled atau Automatic.
private func setAutoBatterySaver(to value: Bool) async throws { _ = try await energyPreferenceTrait.update { $0.setCurrentLowPowerModeSensitivity(value ? 1 : 0) } }
Mendapatkan status pengisian daya baterai
Untuk mendapatkan status pengisian daya perangkat saat ini (sedang mengisi daya, terisi daya penuh, atau tidak mengisi daya), gunakan atribut batChargeState dari karakteristik 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" }
Mendapatkan level baterai
Untuk mendapatkan level baterai saat ini, gunakan atribut
batChargeLevel
dari karakteristik
PowerSource. Levelnya adalah OK, Warning (rendah), atau 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" }
Dapatkan sumber listrik
Untuk menentukan sumber daya yang digunakan perangkat, gunakan atribut BatPresent dan wiredPresent dari karakteristik PowerSource.
if powerSourceTrait.attributes.wiredPresent ?? false { self.powerSourceType = .wired } else if powerSourceTrait.attributes.batPresent ?? false { self.powerSourceType = .battery } else { self.powerSourceType = nil }
Setelan audio
Berbagai setelan audio dapat dikontrol melalui Home API.
Mengaktifkan atau menonaktifkan mikrofon
Untuk mengaktifkan atau menonaktifkan mikrofon perangkat, perbarui atribut
microphoneMuted
dari trait CameraAvStreamManagementTrait menggunakan fungsi
setMicrophoneMuted bawaan:
// Turn the device's microphone on or off
func setMicrophone(on: Bool) async {
do {
_ = try await self.cameraAvStreamManagementTrait?.update {
$0.setMicrophoneMuted(!on)
}
} catch {
// Error
}
}
Mengaktifkan atau menonaktifkan rekaman audio
Untuk mengaktifkan atau menonaktifkan perekaman audio untuk perangkat, perbarui atribut
recordingMicrophoneMuted
dari trait CameraAvStreamManagementTrait menggunakan fungsi
setRecordingMicrophoneMuted bawaan:
// 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
}
}
Menyesuaikan volume speaker
Untuk menyesuaikan volume speaker perangkat, perbarui atribut
speakerVolumeLevel
dari trait CameraAvStreamManagementTrait menggunakan fungsi
setSpeakerVolumeLevel bawaan:
// Adjust the camera speaker volume
func setSpeakerVolume(to value: UInt8) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setSpeakerVolumeLevel(value)
}
} catch {
// Error
}
}
Setelan zona aktivitas
Trait ZoneManagement menyediakan antarmuka untuk mengelola area minat (zona aktivitas) kustom di perangkat kamera dan bel pintu.
Zona ini digunakan untuk memfilter deteksi peristiwa (seperti gerakan orang atau kendaraan) ke area tertentu dalam ruang pandang perangkat.
Zona aktivitas dikonfigurasi oleh pengguna dalam aplikasi partner, sehingga mereka dapat menggambar zona di area tertentu dalam ruang pandang kamera. Zona yang ditentukan pengguna ini kemudian diterjemahkan ke dalam struktur yang digunakan oleh trait ini. Untuk mengetahui informasi selengkapnya tentang cara kerja zona aktivitas, lihat Menyiapkan dan menggunakan Zona Aktivitas.
Zona aktivitas biasanya ditentukan menggunakan koordinat Kartesius 2D.
Trait ini menyediakan
TwoDCartesianVertexStruct untuk verteks dan
TwoDCartesianZoneStruct
untuk definisi zona (nama, verteks, warna, dan penggunaan).
Memeriksa zona aktivitas
Untuk menampilkan zona aktivitas, periksa atribut
zones
dari sifat ZoneManagement.
let zoneManagementTrait: Google.ZoneManagementTrait self.zones = zoneManagementTrait.attributes.zones ?? []
Menambahkan zona aktivitas
Untuk membuat zona baru, gunakan perintah
createTwoDCartesianZone. Perintah ini mengambil TwoDCartesianZoneStruct,
yang menentukan nama, verteks, warna, dan penggunaan zona.
Contoh berikut menunjukkan cara membuat zona bernama "Front Porch" dengan empat verteks, berwarna salmon (#F439A0), dan digunakan untuk deteksi gerakan.
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 } }
Memperbarui zona aktivitas
Untuk memperbarui zona yang ada, gunakan perintah
updateTwoDCartesianZone. Perintah ini memerlukan zoneId dan
TwoDCartesianZoneStruct yang diperbarui.
let zoneManagementTrait: Google.ZoneManagementTrait let zoneID: UInt16 let zone: Google.ZoneManagementTrait.TwoDCartesianZoneStruct do { _ = try await zoneManagementTrait.updateTwoDCartesianZone( zoneID: zoneID, zone: zone) } catch { // Error }
Menghapus zona aktivitas
Untuk menghapus zona, gunakan perintah
removeZone dengan zoneId tertentu.
let zoneManagementTrait: Google.ZoneManagementTrait let zoneID: UInt16 do { _ = try await zoneManagementTrait.removeZone(zoneID: zoneID) } catch { // Error }
Pemicu Peristiwa Suara
Trait AvStreamAnalysis menyediakan antarmuka untuk mengelola pemicu deteksi peristiwa di perangkat kamera dan bel pintu. Meskipun pemicu berbasis penglihatan (seperti orang atau kendaraan) dapat bersifat spesifik per zona, pemicu terkait suara biasanya merupakan konfigurasi tingkat perangkat.
Jenis pemicu berikut tersedia untuk deteksi suara dengan
EventTriggerTypeEnum:
| Mode | Nilai enum | Deskripsi |
|---|---|---|
| Suara | Sound |
Deteksi suara umum. |
| Orang berbicara | PersonTalking |
Mendeteksi ucapan. |
| Gonggongan | DogBark |
Mendeteksi vokalisasi. |
| Kaca pecah | GlassBreak |
Mendeteksi suara kaca pecah. |
| Alarm asap | SmokeAlarm |
Mendeteksi alarm asap, yang sering dikenali oleh pola suara T3 (tiga bunyi bip pendek diikuti dengan jeda). |
| alarm gas CO | CoAlarm |
Mendeteksi alarm karbon monoksida (CO), yang biasanya dikenali oleh pola suara T4 (empat bunyi bip pendek diikuti dengan jeda). |
Memeriksa status deteksi suara
Untuk menampilkan status deteksi suara saat ini kepada pengguna, Anda harus memeriksa apa yang didukung perangkat dan apa yang diaktifkan oleh hardware perangkat. Dua atribut yang perlu diperiksa adalah:
Dalam pengembangan iOS, Anda biasanya akan mengakses sifat AvStreamAnalysis
dari perangkat untuk membaca atribut ini.
// 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) ) ) }
Memperbarui set pemicu yang diaktifkan
Untuk memperbarui set pemicu yang diaktifkan, gunakan perintah
SetOrUpdateEventDetectionTriggers, yang menggunakan daftar struktur 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 )
Mode perekaman
Trait RecordingMode menyediakan antarmuka untuk mengelola perilaku perekaman video dan gambar di perangkat kamera dan bel pintu. Fitur ini memungkinkan pengguna memilih antara perekaman berkelanjutan, perekaman berbasis peristiwa, atau menonaktifkan perekaman sepenuhnya (Khusus Tampilan Live).
RecordingModeEnum
menentukan strategi perekaman yang tersedia:
| Mode | Nilai enum | Deskripsi |
|---|---|---|
| Disabled | Disabled |
Perekaman dinonaktifkan sepenuhnya. Digunakan terutama oleh perangkat lama. |
| CVR (Perekaman Video Nonstop) | Cvr |
Video direkam 24x7. Memerlukan langganan (misalnya, Google Home Premium. |
| EBR (Rekaman Peristiwa Penting) | Ebr |
Perekaman dipicu oleh peristiwa (orang, gerakan). Durasi video bergantung pada durasi acara dan langganan. |
| ETR (Rekaman yang Dipicu Peristiwa) | Etr |
Perekaman pratinjau singkat (misalnya, 10 detik) dipicu oleh peristiwa. |
| Tampilan Live | LiveView |
Perekaman dinonaktifkan, tetapi pengguna tetap dapat mengakses livestream. |
| Gambar Diam | Images |
Snapshot direkam, bukan video, saat peristiwa terjadi. |
Memeriksa mode perekaman
Untuk menampilkan konfigurasi perekaman saat ini, periksa atribut
dari trait RecordingMode:
supportedRecordingModes- Semua mode yang mungkinavailableRecordingModes- Mode yang dapat dipilihselectedRecordingMode- Mode aktif
// 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, ) ) } }
Mengubah mode perekaman
Sebelum memperbarui, pastikan indeks yang dipilih dari atribut supportedRecordingModes
ada di atribut availableRecordingModes.
Untuk memperbarui mode yang dipilih, gunakan fungsi setSelectedRecordingMode, dengan meneruskan indeks mode yang dipilih:
let recordingModeTrait: Google.RecordingModeTrait let recordingModeID: UInt8 _ = try await recordingModeTrait.update { $0.setSelectedRecordingMode(recordingModeID) }
Setelan lainnya
Berbagai setelan lainnya dapat dikontrol melalui Home API.
Mengaktifkan atau menonaktifkan penglihatan malam
Untuk mengaktifkan atau menonaktifkan penglihatan malam untuk kamera, gunakan TriStateAutoEnum
untuk memperbarui
atribut
nightVision
dari trait CameraAvStreamManagementTrait menggunakan fungsi
setNightVision bawaan:
// Turn night vision on or off
func setNightVision(
to value: Google.CameraAvStreamManagementTrait.TriStateAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setNightVision(value)
}
} catch {
// Error
}
}
Mengubah kecerahan LED status
Untuk mengubah kecerahan LED status, gunakan
ThreeLevelAutoEnum
untuk memperbarui atribut
statusLightBrightness
dari trait CameraAvStreamManagementTrait menggunakan fungsi
setStatusLightBrightness bawaan:
// Set the LED brightness
func setStatusLightBrightness(
to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setStatusLightBrightness(value)
}
} catch {
// Error
}
}
Mengubah area pandang kamera
Viewport kamera sama dengan fitur Zoom dan Pangkas yang dijelaskan dalam artikel dukungan Memperbesar dan mengoptimalkan video kamera Nest.
Area tampilan ditentukan dalam ViewportStruct yang berisi empat nilai, yang
digunakan sebagai koordinat area tampilan. Koordinat didefinisikan sebagai:
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
Penentuan nilai untuk ViewportStruct bergantung pada UI aplikasi dan implementasi kamera. Pada tingkat yang sangat mendasar, untuk menyetel area tampilan video
kamera, perbarui atribut
viewport
dari trait CameraAvStreamManagementTrait dengan ViewportStruct, menggunakan
fungsi setViewport bawaan.
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
}
}
}
Buat TransportOptionsStruct
Beberapa setelan memerlukan modifikasi pada properti di TransportOptionsStruct,
yang kemudian diteruskan ke opsi transportasi koneksi streaming. Untuk
Swift, struct ini harus dibuat sebelum memperbarui properti apa pun.
Gunakan fungsi bantuan ini untuk membuat struct yang akan digunakan dengan perubahan setelan berikut:
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
}
Mengaktifkan atau menonaktifkan analisis
Setiap perangkat dapat memilih untuk mengirim data analisis mendetail ke cloud Google Home secara terpisah (lihat Cloud Monitoring for Home APIs).
Untuk mengaktifkan analisis untuk perangkat, tetapkan properti
analyticsEnabled)
dari
ExtendedGeneralDiagnosticsTrait
ke true. Saat Anda menetapkan analyticsEnabled,
properti lain, logUploadEnabled, otomatis ditetapkan ke true, yang
memungkinkan file log analytics diupload ke cloud Google Home.
// Enable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
$0.setAnalyticsEnabled(true)
}
// Disable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
$0.setAnalyticsEnabled(false)
}
Konfigurasi transportasi dan perekaman
Bagian ini membahas setelan yang terkait dengan kualitas streaming kamera dan pemicuan peristiwa. Setelan ini dikelola oleh
PushAvStreamTransport
trait.
Membaca setelan transportasi
Bagian ini menunjukkan cara mengambil konfigurasi saat ini dari
perangkat kamera atau bel pintu. Layanan ini mengambil trait PushAvStreamTransport,
menemukan koneksi spesifik yang digunakan untuk perekaman, lalu mengekstrak
nilai saat ini untuk kualitas bandwidth, sensitivitas aktivasi,
dan durasi peristiwa maksimum.
// 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
Memperbarui setelan transportasi
Bagian ini menunjukkan cara mengubah setelan transportasi.
Langkah ini akan membuat TransportOptionsStruct baru yang berisi nilai baru dan
kemudian menggunakan perintah modifyPushTransport untuk mengirim setelan yang diperbarui ini
kembali ke perangkat, menerapkannya ke koneksi perekaman yang ditemukan
pada langkah sebelumnya.
Untuk mengubah setelan ini, gunakan
perintah modifyPushTransport
dengan 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 )
Menentukan kualitas bandwidth
Properti videoStreamId
dari TransportOptionsStruct sesuai dengan
konfigurasi streaming video tertentu.
Untuk mendapatkan streaming video yang didukung, lihat atribut
allocatedVideoStreams, yang merupakan daftar VideoStreamStructs.
dari trait CameraAvStreamManagement untuk perangkat.
Menyesuaikan sensitivitas aktivasi perangkat
Properti motionSensitivity
dari TransportTriggerOptionsStruct sesuai dengan
nilai berikut:
| Label | Nilai (UInt8) |
|---|---|
| Rendah | 1 |
| Sedang | 5 |
| Tinggi | 10 |
Menyesuaikan durasi peristiwa maksimum
Properti maxDuration
dari TransportMotionTriggerTimeControlStruct
sesuai dengan durasi UInt32 berikut (dalam detik):
- 10, 15, 30, 60, 120, 180
Setelan bel
Berbagai setelan bunyi bel pintu dapat dikontrol melalui Home API.
Mengubah suara bel
Untuk mengubah suara bel pintu, pertama-tama dapatkan daftar suara bel yang diinstal di perangkat, menggunakan atribut
installedChimeSounds
dari sifat ChimeTrait:
doorbellChimeTrait.attributes.installedChimeSounds?.compactMap { chimeSound in
return chimeSound.chimeID, chimeSound.name
}
Kemudian, update atribut
selectedChime
dari trait ChimeTrait menggunakan fungsi setSelectedChime
bawaan:
func setDoorbellChime(chimeID: UInt8) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setSelectedChime(chimeID)
}
} catch {
// Error
}
}
Menggunakan bel eksternal
Bel pintu dapat dikonfigurasi untuk menggunakan bel eksternal, seperti bel mekanis yang dipasang di dalam rumah. Setelan ini harus dikonfigurasi selama pemasangan bel pintu untuk menghindari potensi kerusakan pada bel eksternal.
Untuk menunjukkan jenis bel eksternal yang terpasang, gunakan
ExternalChimeType
untuk memperbarui atribut
externalChime
dari trait ChimeTrait menggunakan fungsi
setExternalChime bawaan:
// Indicate the external chime is mechanical
func setExternalChime(to value: Google.ChimeTrait.ExternalChimeType) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setExternalChime(value)
}
} catch {
// Error
}
}
Mengubah durasi bel eksternal
Durasi dering bel eksternal dalam detik dapat dikonfigurasi melalui Home API. Jika bel eksternal mendukung durasi bel, pengguna mungkin ingin mengonfigurasi durasi ini.
Nilai yang ditetapkan di sini bergantung pada spesifikasi bel eksternal itu sendiri, dan durasi bel yang direkomendasikan.
Untuk mengubah durasi bunyi bel eksternal, perbarui atribut
externalChimeDurationSeconds
dari trait ChimeTrait menggunakan fungsi
setExternalChimeDurationSeconds bawaan:
// Change the external chime duration
func setExternalChimeDuration(to value: UInt16) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setExternalChimeDuration(value)
}
} catch {
// Error
}
}
Mengaktifkan tema bunyi bel
Beberapa bel pintu mungkin memiliki bel yang hanya tersedia untuk pengguna dalam waktu terbatas. Misalnya, bunyi bel khusus untuk hari libur. Ini disebut tema bunyi notifikasi.
Untuk melihat tema bel yang tersedia bagi pengguna, buat filter kotak waktu dan gunakan untuk memfilter hasil perintah
getAvailableThemes dari
trait
ChimeThemes. Tindakan ini akan menampilkan daftar tema yang tersedia, termasuk nama tema.
Contoh berikut menunjukkan cara memfilter daftar.
Tema dianggap aktif jika waktu saat ini berada dalam
waktu mulai dan berakhirnya (nilai startTimeSeconds dan endTimeSeconds,
masing-masing). Jika waktu mulai tidak ditetapkan, perangkat dianggap aktif sejak awal waktu. Jika waktu berakhir tidak ditetapkan, waktu tersebut akan terus aktif tanpa batas. Jika keduanya tidak ada, tema akan selalu aktif.
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)
}
}
}
Setelah memiliki nama tema yang diinginkan, seperti Christmas, Anda dapat
memilihnya menggunakan fungsi setSelectedTimeboxedThemeName()
pada trait ChimeThemes ChimeThemes.
private func setChimeTheme(to value: String) async throws {
_ = try await chimeThemeTrait.update {
$0.setSelectedTimeboxedThemeName(value)
}
}
Setelan pemberitahuan kedatangan tamu
Anda dapat membuat kueri dan mengelola setelan pemberitahuan kedatangan tamu untuk bel pintu menggunakan
trait
VisitorAnnouncement
Home API. Ciri ini mengontrol apakah kehadiran tamu diumumkan di speaker atau layar smart Google saat seseorang membunyikan bel pintu.
Contoh berikut menunjukkan cara memeriksa apakah pengumuman pengunjung diaktifkan, dan cara memperbarui setelan ini:
let visitorAnnouncementsEnabled: Bool = visitorAnnouncementTrait.attributes.visitorAnnouncementsEnabled let value: Bool _ = try await self.visitorAnnouncementTrait?.update { $0.setVisitorAnnouncementsEnabled(value) }