Panduan perangkat bel pintu untuk iOS

Jenis perangkat Bel Pintu diimplementasikan menggunakan tiga karakteristik: PushAvStreamTransportTrait, yang menangani transpor streaming audio dan video menggunakan protokol berbasis push, WebRtcLiveViewTrait, yang memberikan kemampuan untuk mengontrol livestream dan talkback, serta CameraSnapshotTrait, yang menyediakan snapshot pratinjau yang di-cache dan pengambilan snapshot live.

Selalu periksa dukungan atribut dan perintah untuk perangkat sebelum menggunakan fitur apa pun 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

GoogleDoorbellDeviceType

home.matter.6006.types.0113

Perangkat yang diaktifkan dengan tombol di luar pintu yang menghasilkan sinyal audio dan/atau visual, yang digunakan untuk meminta perhatian seseorang yang berada di sisi lain pintu. Bel pintu mungkin dilengkapi livestream yang dapat diakses, komunikasi dua arah, atau peristiwa deteksi.

Karakteristik yang Diperlukan
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

Bel pintu

Mendapatkan informasi dasar tentang perangkat

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Karakteristik BasicInformation mencakup informasi seperti nama vendor, ID vendor, ID produk, nama produk (termasuk informasi model), dan versi software untuk perangkat:

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!

Mendapatkan nomor seri

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Untuk mendapatkan nomor seri perangkat, gunakan perintah GetSerialNumber dari karakteristik ExtendedBasicInformation. Contoh berikut menunjukkan cara menyimpan 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 ke perangkat bel pintu.

Fitur ini hanya tersedia di perangkat bel pintu. Daftar pesan yang telah ditentukan tersedia untuk aplikasi partner, yang dapat menyajikannya kepada pengguna untuk dipilih. Pesan yang telah ditentukan tidak dapat diedit oleh pengguna.

Respons Cepat diterapkan melalui karakteristik 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

Tetapkan 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 kontak cloud perangkat

Untuk menemukan waktu terbaru saat perangkat melakukan kontak dengan cloud, gunakan atribut lastContactTimestamp dari karakteristik ExtendedGeneralDiagnostics:

if let lastContactTimeStamp = extendedGeneralDiagnosticsTrait.attributes.lastContactTimestamp {
  self.lastContactTime = Date(timeIntervalSince1970: Double(lastConnectedTimeStamp))
}

Setelan jenis pemasangan kamera

Karakteristik Mount berisi setelan pemasangan kamera dan informasi status. Anda dapat membaca atribut seperti status pemasangan, jenis deteksi, dan nama jenis pemasangan. Selain itu, Anda dapat menggunakan karakteristik 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 untuk 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 karakteristik di perangkat tersebut.

let doorbellConnectivity = doorbellDeviceType.metadata.sourceConnectivity.connectivityState

Status partiallyOnline dapat diamati dalam kasus jenis perangkat campuran saat tidak ada konektivitas internet. Karakteristik standar Matter mungkin masih online karena perutean lokal, tetapi karakteristik 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

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Untuk memulai livestream, kirim string Session Description Protocol (SDP) ke metode startLiveView(offerSdp:) pada karakteristik WebRtcLiveViewTrait, yang menampilkan tiga nilai:

  • SDP untuk sesi.
  • Durasi sesi dalam 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

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Livestream memiliki durasi preset yang akan berakhir setelahnya. Untuk memperpanjang durasi streaming 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

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Untuk memulai talkback, panggil metode startTalkback(mediaSessionId:optionalArgsProvider:) pada karakteristik 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

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Menyesuaikan kualitas livestream berguna untuk mengoptimalkan penggunaan bandwidth berdasarkan konteks tampilan klien (misalnya, beralih ke resolusi yang lebih rendah saat menampilkan kotak pratinjau yang lebih kecil, tampilan petak, atau mode picture-in-picture).

Mengubah kualitas secara dinamis menggunakan karakteristik WebRtcLiveView akan secara khusus mengelola resolusi sesi livestream aktif pada klien tertentu. Hal 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 memperbarui kualitas livestream untuk perangkat:

  • Mengambil opsi kualitas yang didukung: Dapatkan resolusi streaming yang tersedia dan didukung oleh perangkat. Kode ini mengkueri karakteristik WebRtcLiveView untuk mengekspos kualitas streaming yang didukung sebagai daftar nilai QualityHint (seperti .sd, .hd, .fhd, .qhd, atau .uhd) menggunakan properti supportedQualityHints.

  • Mengubah kualitas livestream: Terapkan QualityHint yang dipilih untuk mengubah resolusi streaming livestream yang aktif (misalnya, beralih dari Definisi Standar ke Definisi Tinggi). Fungsi updateQualityHint menggunakan metode changeLiveViewQuality pada karakteristik WebRtcLiveView untuk menerapkan konfigurasi QualityHint yang 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 perekaman

Untuk mengaktifkan kemampuan perekaman kamera, teruskan TransportStatusEnum.Active ke metode setTransportStatus(transportStatus:optionalArgsProvider:) pada karakteristik PushAvStreamTransportTrait. Untuk menonaktifkan kemampuan perekaman, teruskan TransportStatusEnum.Inactive. Dalam contoh berikut, kita menggabungkan panggilan ini dalam satu panggilan yang menggunakan Boolean untuk mengalihkan 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. Saat 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 connectivityState jenis perangkat.
  • Livestream tidak dapat diakses, dan kamera juga tidak mendeteksi peristiwa cloud apa pun.

Memeriksa 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
}

Mengambil snapshot kamera

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Gunakan karakteristik CameraSnapshot untuk mengambil snapshot gambar statis dari kamera. Snapshot ini berguna untuk beberapa skenario:

  • Sebagai kartu placeholder di UI saat livestream WebRTC sedang dimuat.
  • Sebagai gambar pratinjau statis yang diupgrade ke livestream setelah interaksi pengguna.
  • Sebagai kanvas latar belakang untuk menggambar dan mengonfigurasi zona aktivitas kustom.

Karakteristik CameraSnapshot menawarkan dua cara untuk mengambil snapshot, bergantung pada apakah Anda memerlukan snapshot yang di-cache untuk rendering cepat atau snapshot live on-demand.

Mendapatkan snapshot pratinjau yang di-cache

Snapshot pratinjau adalah gambar yang di-cache yang dapat diambil SDK tanpa mengaktifkan kamera. Ini adalah metode tercepat untuk mengambil gambar statis dan ideal untuk halaman ringkasan kamera atau petak dasbor.

Untuk mendapatkan snapshot pratinjau, baca atribut karakteristik 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
}

Bergantung pada konfigurasi dan aktivitas kamera, URL pratinjau mengarah ke gambar yang di-cache yang dihasilkan dari rekaman video terbaru (I-frame pertama dari fragmen video terbaru) atau snapshot yang diupload secara berkala oleh kamera.

Untuk menunjukkan keaktualan gambar, cloud Google Home menyematkan header X-Home-Image-Captured-At dalam gambar JPEG/PNG yang disajikan, yang diformat dalam UTC. Anda dapat mengurai header ini di sisi klien untuk menampilkan usia snapshot dalam aplikasi.

Mendapatkan snapshot live on-demand

Untuk perjalanan pengguna yang memerlukan tayangan live kamera saat ini—seperti menyiapkan Zona Aktivitas—Anda dapat meminta snapshot live. Memicu snapshot live akan menginstruksikan kamera untuk aktif, mengambil frame baru, dan menguploadnya ke cloud.

Untuk meminta snapshot langsung, gunakan perintah 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)")
}

Mengautentikasi permintaan snapshot

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Semua URL snapshot mengarah ke media yang aman dan memerlukan token OAuth 2.0 untuk cakupan Home API v2. Untuk mendownload dan merender gambar, token OAuth harus diinjeksikan sebagai token Bearer di header Authorization permintaan HTTP Anda.

Contoh berikut menunjukkan cara mengonfigurasi permintaan jaringan yang aman untuk mendownload snapshot:

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
  }
}

Setelan baterai

Berbagai setelan baterai dapat dikontrol melalui Home API.

Menyetel preferensi penggunaan baterai

Dengan menyetel keseimbangan energi, Anda dapat mengonfigurasi kompromi antara masa pakai baterai dan performa untuk perangkat. Anda dapat membuat berbagai profil baterai, seperti "Diperpanjang", "Seimbang", dan "Performa", serta beralih di antaranya.

Fitur ini diimplementasikan dengan memperbarui atribut currentEnergyBalance dari ciri 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 adalah 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

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Untuk mengonfigurasi fitur ini, perbarui atribut currentLowPowerModeSensitivity dari karakteristik 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

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Untuk mendapatkan status pengisian daya perangkat saat ini (mengisi daya, terisi 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"
}

Mendapatkan sumber daya

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
}

Periksa apakah baterai perlu diganti

Atribut batReplaceability menunjukkan apakah baterai tidak dapat diganti, dapat diganti oleh pengguna, atau dapat diganti oleh pabrik.

Jika baterai dapat diganti, atribut batReplacementNeeded dari karakteristik PowerSource akan memberi tahu Anda apakah baterai perlu diganti.

// Get the battery replacement status
var batteryStatus = powerSourceTrait.attributes.batReplacementNeeded

if batteryStatus {
  print("Replace the battery.")
}

Jika baterai dapat diganti oleh pengguna, batReplacementDescription akan menjelaskan baterai, termasuk informasi seperti faktor bentuk, kimia, dan produsen pilihan.

Setelan audio

Berbagai setelan audio dapat dikontrol melalui Home API.

Mengaktifkan atau menonaktifkan mikrofon

Untuk mengaktifkan atau menonaktifkan mikrofon perangkat, perbarui atribut microphoneMuted dari karakteristik 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 rekaman audio untuk perangkat, perbarui atribut recordingMicrophoneMuted dari karakteristik 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 karakteristik 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

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Sifat ZoneManagement menyediakan antarmuka untuk mengelola region minat kustom (zona aktivitas) 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 karakteristik ini. Untuk mengetahui informasi selengkapnya tentang cara kerja zona aktivitas, lihat Menyiapkan dan menggunakan Zona Aktivitas.

Zona aktivitas biasanya ditentukan menggunakan koordinat Kartesius 2D. Karakteristik 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 karakteristik ZoneManagement.

let zoneManagementTrait: Google.ZoneManagementTrait

self.zones = zoneManagementTrait.attributes.zones ?? []

Menambahkan zona aktivitas

Untuk membuat zona baru, gunakan perintah createTwoDCartesianZone. Perintah ini menggunakan TwoDCartesianZoneStruct, yang menentukan nama, verteks, warna, dan penggunaan zona.

Contoh berikut menunjukkan cara membuat zona bernama "Teras Depan" 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 telah diupdate.

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 Deteksi Suara

Karakteristik 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 suara.
Kaca pecah GlassBreak Mendeteksi suara kaca pecah.
Alarm asap SmokeAlarm Mendeteksi alarm asap, yang sering dikenali dari pola suara T3 (tiga bunyi bip pendek diikuti dengan jeda).
alarm gas CO CoAlarm Mendeteksi alarm karbon monoksida (CO), yang biasanya dikenali dari 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 karakteristik 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 kumpulan pemicu yang diaktifkan

Untuk memperbarui kumpulan 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

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Karakteristik RecordingMode menyediakan antarmuka untuk mengelola perilaku perekaman video dan gambar di perangkat kamera dan bel pintu. Fitur ini memungkinkan pengguna memilih antara perekaman nonstop, rekaman peristiwa penting, atau menonaktifkan perekaman sepenuhnya (hanya Tayangan 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 24/7. Memerlukan langganan (misalnya, Google Home Premium.
EBR (Rekaman Peristiwa Penting) Ebr Perekaman dipicu oleh peristiwa (orang, gerakan). Durasi video bergantung pada durasi peristiwa dan langganan.
ETR (Rekaman yang Dipicu Peristiwa) Etr Rekaman pratinjau singkat (misalnya, 10 detik) yang dipicu oleh peristiwa.
Live View 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 trait RecordingMode:

// 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 mengupdate, 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 night vision

Untuk mengaktifkan atau menonaktifkan night vision pada kamera, gunakan TriStateAutoEnum untuk memperbarui atribut nightVision dari karakteristik 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 karakteristik 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

Area pandang kamera sama dengan fitur Zoom dan Pangkas yang dijelaskan dalam artikel dukungan Memperbesar dan mengoptimalkan video kamera Nest.

Area pandang ditentukan dalam ViewportStruct yang berisi empat nilai, yang digunakan sebagai koordinat area pandang. Koordinat didefinisikan sebagai:

(x1,y1) -- (x2,y1)
   |          |
(x1,y2) -- (x2,y2)

Penentuan nilai untuk ViewportStruct bergantung pada UI dan implementasi kamera aplikasi. Pada tingkat yang sangat dasar, untuk menetapkan area pandang video kamera, perbarui atribut viewport dari karakteristik 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
    }
  }

}

Membuat TransportOptionsStruct

Beberapa setelan memerlukan modifikasi pada properti di TransportOptionsStruct, yang kemudian diteruskan ke opsi transpor koneksi streaming. Untuk Swift, struct ini perlu 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 (lihat Cloud Monitoring untuk Home API).

Untuk mengaktifkan analisis untuk perangkat, tetapkan properti analyticsEnabled) dari ExtendedGeneralDiagnosticsTrait ke true. Saat Anda menetapkan analyticsEnabled, properti lain, logUploadEnabled, akan otomatis ditetapkan ke true, yang memungkinkan file log analisis 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 pemicu peristiwa. Setelan ini dikelola oleh karakteristik PushAvStreamTransport.

Membaca setelan transportasi

Bagian ini menunjukkan cara mengambil konfigurasi saat ini dari perangkat kamera atau bel pintu. Fungsi ini mengambil karakteristik 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. Skrip ini membuat TransportOptionsStruct baru yang berisi nilai baru, lalu menggunakan perintah modifyPushTransport untuk mengirim setelan yang diperbarui ini kembali ke perangkat, sehingga menerapkannya ke koneksi perekaman yang ditemukan di 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 karakteristik 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 bel pintu dapat dikontrol melalui Home API.

Mengubah suara bel

Untuk mengubah suara bel pintu, dapatkan terlebih dahulu daftar suara bel yang diinstal di perangkat, menggunakan atribut installedChimeSounds dari karakteristik ChimeTrait:

doorbellChimeTrait.attributes.installedChimeSounds?.compactMap { chimeSound in
  return chimeSound.chimeID, chimeSound.name
}

Kemudian, perbarui atribut selectedChime dari karakteristik ChimeTrait menggunakan fungsi setSelectedChime bawaan:

func setDoorbellChime(chimeID: UInt8) async {
  do {
    _ = try await doorbellChimeTrait.update {
      $0.setSelectedChime(chimeID)
    }
  } catch {
    // Error
  }
}

Menggunakan bel eksternal

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Bel pintu dapat dikonfigurasi untuk menggunakan bel eksternal, seperti bel mekanis yang dipasang di dalam rumah. Hal ini harus dikonfigurasi selama pemasangan bel pintu untuk menghindari potensi kerusakan pada bel eksternal.

Untuk menunjukkan jenis bel eksternal yang diinstal, gunakan ExternalChimeType untuk memperbarui atribut externalChime dari karakteristik 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, dalam detik, dering bel eksternal dapat dikonfigurasi melalui Home API. Jika bel eksternal mendukung durasi bel, pengguna mungkin ingin mengonfigurasinya.

Nilai yang ditetapkan di sini bergantung pada spesifikasi bel eksternal itu sendiri, dan durasi bel yang direkomendasikan.

Untuk mengubah durasi bel eksternal, perbarui atribut externalChimeDurationSeconds pada karakteristik ChimeTrait menggunakan fungsi bawaan setExternalChimeDurationSeconds:

// 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

   Diimplementasikan di Aplikasi Contoh untuk iOS   

Beberapa bel pintu mungkin memiliki bel yang hanya tersedia untuk pengguna selama waktu terbatas. Misalnya, bel khusus untuk hari libur. Ini disebut tema bel.

Untuk melihat tema bel yang tersedia bagi pengguna, buat filter kotak waktu dan gunakan untuk memfilter hasil perintah getAvailableThemes dari karakteristik 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 (masing-masing nilai startTimeSeconds dan endTimeSeconds). Jika waktu mulai tidak ditetapkan, waktu mulai dianggap aktif sejak awal. Jika waktu akhir tidak ditetapkan, eksperimen akan terus aktif tanpa batas waktu. 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 &lt;= currentDateTime
      &amp;&amp; chimeTheme.endTimeSeconds ?? UInt64.max &gt;= currentDateTime
    {
      self.chimeThemeSettings.append(chimeTheme.name)
    }
  }
}

Setelah memiliki nama tema yang diinginkan, seperti Christmas, Anda dapat memilihnya menggunakan fungsi setSelectedTimeboxedThemeName() pada karakteristik ChimeThemes ChimeThemes.

private func setChimeTheme(to value: String) async throws {
  _ = try await chimeThemeTrait.update {
    $0.setSelectedTimeboxedThemeName(value)
  }
}

Setelan pemberitahuan kedatangan tamu

Anda dapat mengkueri dan mengelola setelan pemberitahuan kedatangan tamu untuk bel pintu menggunakan karakteristik VisitorAnnouncement Home API. Sifat ini mengontrol apakah kehadiran tamu diumumkan di smart speaker atau layar smart Google saat seseorang membunyikan bel pintu.

Contoh berikut menunjukkan cara memeriksa apakah pemberitahuan kedatangan tamu diaktifkan, dan cara memperbarui setelan ini:

let visitorAnnouncementsEnabled: Bool = visitorAnnouncementTrait.attributes.visitorAnnouncementsEnabled

let value: Bool
_ = try await self.visitorAnnouncementTrait?.update {
  $0.setVisitorAnnouncementsEnabled(value)
}

Mencabut akses perangkat

Untuk menghapus bel pintu dari struktur, panggil device.decommission(). Penonaktifan akan menampilkan layar konfirmasi yang dikelola Google kepada pengguna, yang memperingatkan bahwa semua histori video 24/7, histori peristiwa, klip, dan data galeri foto wajah yang dikenali yang direkam akan dihapus secara permanen di seluruh struktur.

Untuk mengetahui petunjuk mendetail dan contoh kode, lihat Menghapus perangkat.