Panduan perangkat bel pintu untuk iOS

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

GoogleDoorbellDeviceType

home.matter.6006.types.0113

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 dapat menampilkan live stream yang mudah 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), versi software, dan nomor seri 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!
let serialNumber = basicInfoTrait.attributes.serialNumber!
// [END get_device_information]

Mendapatkan waktu terbaru saat perangkat menghubungi cloud

Untuk menemukan waktu terbaru saat perangkat terhubung dengan cloud, gunakan atribut lastContactTimestamp dari ExtendedGeneralDiagnostics trait:

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

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 Matter standar mungkin masih online karena pemilihan rute lokal, tetapi fitur berbasis cloud akan offline.

Memulai livestream

Untuk memulai livestream, kirim string Session Description Protocol (SDP) ke metode startLiveView(offerSdp:) trait 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

Livestream memiliki durasi preset yang akan berakhir setelah durasi tersebut. 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

Untuk memulai talkback, panggil metode startTalkback(mediaSessionId:optionalArgsProvider:) dari WebRtcLiveViewTrait trait. 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)")
  }
}

Mengaktifkan dan menonaktifkan kemampuan perekaman

Untuk mengaktifkan kemampuan perekaman kamera, teruskan TransportStatusEnum.Active ke metode setTransportStatus(transportStatus:optionalArgsProvider:) trait PushAvStreamTransportTrait. 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 connectivityState jenis 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 sifat 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 ini 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 trait 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 PowerSource trait. 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 trait 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 cakupan tampilan 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 sifat 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 Google Home Premium.
EBR (Rekaman Peristiwa Penting) Ebr Perekaman dipicu oleh peristiwa (orang, gerakan). Durasi video bergantung pada durasi acara dan langganan.
ETR (Event Triggered Recording) 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:

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

Menyesuaikan sensitivitas aktivasi perangkat

Sensitivitas aktif perangkat digunakan untuk menghemat baterai dengan mengurangi rentang saat perangkat dapat mendeteksi aktivitas dan meningkatkan waktu untuk aktif setelah mendeteksi aktivitas tersebut.

Di Home API, ini dapat disetel menggunakan properti motionSensitivity dari triggerOptions di transportOptions perangkat. Opsi ini ditentukan dalam trait PushAvStreamTransportTrait untuk setiap perangkat.

Sensitivitas aktivasi hanya dapat disetel ke nilai berikut:

  • 1 = Rendah
  • 5 = Sedang
  • 10 = Tinggi

Proses pembaruan adalah menemukan konfigurasi transportasi untuk streaming rekaman aktif menggunakan perintah findTransport, lalu mengubah konfigurasi dengan nilai sensitivitas baru menggunakan perintah modifyPushTransport.

Perintah modifyPushTransport memerlukan TransportOptionsStruct lengkap untuk diteruskan, jadi Anda harus menyalin nilai yang ada dari konfigurasi saat ini terlebih dahulu. Lihat Membuat TransportOptionsStruct untuk fungsi pembantu guna melakukannya.

func setWakeUpSensitivity(to value: UInt8) async {
  do {
    let connection = try await getRecordingConnection()
    guard let connection,
      let transportOptions = connection.transportOptions
    else {
      // Error - Transport options not available
      return
    }

    guard transportOptions.triggerOptions.motionSensitivity != nil else {
      // Error - Motion sensitivity not available to be updated for this device
      return
    }

    try await pushAvStreamTransportTrait.modifyPushTransport(
      connectionID: connection.connectionID,
      transportOptions: self.getTransportOptions(
        transportOptions: transportOptions,
        wakeUpSensitivity: value,
        maxEventLength: nil
      )
    )

  } catch {
    // Error
  }
}

Menyesuaikan durasi peristiwa maksimum

Durasi peristiwa maksimum adalah durasi waktu kamera akan merekam klip untuk suatu peristiwa. Melalui Home API, hal ini dapat dikonfigurasi, per perangkat, dengan panjang yang sama seperti melalui Google Home app (GHA), dalam interval detik:

  • 10 detik
  • 15 detik
  • 30 detik
  • 60 detik (1 menit)
  • 120 detik (2 menit)
  • 180 detik (3 menit)

Di Home API, ini dapat disetel menggunakan properti motionTimeControl dari triggerOptions di transportOptions perangkat. Opsi ini ditentukan dalam trait PushAvStreamTransportTrait untuk setiap perangkat.

Proses pembaruan adalah menemukan konfigurasi transportasi untuk aliran rekaman aktif menggunakan perintah findTransport, lalu mengubah konfigurasi dengan nilai panjang peristiwa baru menggunakan perintah modifyPushTransport.

Perintah modifyPushTransport memerlukan TransportOptionsStruct lengkap untuk diteruskan, jadi Anda harus menyalin nilai yang ada dari konfigurasi saat ini terlebih dahulu. Lihat Membuat TransportOptionsStruct untuk fungsi pembantu guna melakukannya.

func setMaxEventLength(to value: UInt32) async {
  do {
    let connection = try await getRecordingConnection()
    guard let connection,
      let transportOptions = connection.transportOptions
    else {
      // Error - Transport options not available
      return
    }

    guard transportOptions.triggerOptions.motionTimeControl != nil else {
      // Error - Motion time control not available to be updated for this device
      return
    }

    try await pushAvStreamTransportTrait.modifyPushTransport(
      connectionID: connection.connectionID,
      transportOptions: self.getTransportOptions(
        transportOptions: transportOptions,
        wakeUpSensitivity: nil,
        maxEventLength: value
      )
    )

  } catch {
    // Error
  }
}

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

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 trait 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.

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, waktu tersebut 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 &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 trait ChimeThemes ChimeThemes.

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