适用于 iOS 的相机设备指南

摄像头设备类型使用两个 trait 实现: PushAvStreamTransportTrait, 用于处理使用基于推送的协议的音频和视频串流传输;以及 WebRtcLiveViewTrait, 用于控制直播和对讲。

在使用任何功能或尝试更新属性之前,请务必检查设备是否支持属性和命令。如需了解详情,请参阅控制设备 iOS

Home API 设备类型 trait Swift 示例应用 使用场景

相机

GoogleCameraDeviceType

home.matter.6006.types.0158

用于拍摄静态图片或视频的设备。摄像头可能具有以下功能:可访问的直播、双向对讲或检测事件。

必需的 trait
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

摄像头

获取有关设备的基本信息

BasicInformation trait 包含以下信息:供应商名称、供应商 ID、产品 ID、 商品名称(包括型号信息)、软件版本、 和设备序列号:

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

获取设备与云端联系的最近时间

如需查找设备与云端联系的最近时间,请使用 lastContactTimestamp属性,该属性属于 ExtendedGeneralDiagnostics trait:

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

检查设备的连接

实际上,设备的连接是在设备类型级别进行检查的,因为某些设备支持多种设备类型。返回的状态是该设备上所有 trait 的连接状态的组合。

let lightConnectivity =
  dimmableLightDeviceType.metadata.sourceConnectivity
  .connectivityState

如果设备类型混用且没有互联网连接,则可能会观察到 partiallyOnline 状态。Matter 标准 trait 可能仍处于在线状态,但基于云端的 trait 将处于 离线状态。

开始直播

如需开始直播,请将会话描述协议 (SDP) 字符串发送 到 WebRtcLiveViewTrait trait 的 startLiveView(offerSdp:) 方法,该方法会返回三个值:

  • 会话的 SDP。
  • 会话时长(以秒为单位)。
  • 会话 ID,可用于延长或终止会话。
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
  }
}

延长直播

直播具有预设时长,超过该时长后直播会过期。如需延长有效直播的时 0}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
  }
}

开始和停止对讲

如需开始对讲,请调用 WebRtcLiveViewTrait trait 的 startTalkback(mediaSessionId:optionalArgsProvider:) 方法。 如需停止,请使用 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)")
  }
}

启用和停用录制功能

如需启用摄像头的录制功能,请将 TransportStatusEnum.Active 传递给 PushAvStreamTransportTrait trait 的 setTransportStatus(transportStatus:optionalArgsProvider:) 方法。如需停用录制功能,请将其传递给 TransportStatusEnum.Inactive。 在以下示例中,我们将这些调用封装在一个使用 Boolean 切换录制功能的调用中:

public func toggleIsRecording(isOn: Bool) {
  self.uiState = .loading

  guard let pushAvStreamTransportTrait else {
    // PushAvStreamTransportTrait not found.
    return
  }
  Task {
    do {
      try await pushAvStreamTransportTrait.setTransportStatus(
        transportStatus: isOn ? .active : .inactive)
      if isOn {
        do {
          self.player = try self.createWebRtcPlayer()
        } catch {
          // Failed to initialize WebRtcPlayer
          self.uiState = .disconnected
          return
        }
        await self.player?.initialize()
        self.uiState = .live
      } else {
        self.player = nil
        self.uiState = .off
      }
    } catch {
      // Failed to toggle onOff
    }
  }
}

启用或停用摄像头的录制功能与开启或关闭摄像头视频相同。当摄像头的视频开启时,它会进行录制(用于事件和相关剪辑)。

当录制功能停用(摄像头视频关闭)时:

检查录制功能是否已启用

如需确定摄像头的录制功能是否已启用,请检查是否有任何连接处于活动状态。以下示例定义了两个函数来执行此操作:

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
}

电池设置

您可以通过 Home API 控制各种电池设置。

设置电池用量偏好设置

通过设置能量平衡,您可以配置设备在电池续航时间和性能之间的权衡。您可以创建不同的电池配置文件,例如“延长”“平衡”和“性能”,并在它们之间切换。

此功能通过更新 currentEnergyBalance属性 的 EnergyPreference trait 来实现。该属性接受一个整数索引,该索引对应于设备 energyBalances 列表中定义的特定配置文件(例如,0 表示 EXTENDED1 表示 BALANCED2 表示 PERFORMANCE)。

currentEnergyBalancenull 值表示设备正在使用自定义配置文件。这是一个只读状态。

以下示例展示了 currentEnergyBalance 属性将使用的结构,以及使用该属性的实际代码段。

// Example energyBalances list
{
  "energy_balances": [
    {
      "step": 0,
      "label": "EXTENDED"
    },
    {
      "step": 50,
      "label": "BALANCED"
    },
    {
      "step": 100,
      "label": "PERFORMANCE"
    }
  ]
}
private func setBatteryUsage(to option: UInt8) async throws {
  _ = try await energyPreferenceTrait.update {
    $0.setCurrentEnergyBalance(option)
  }
}

开启自动省电模式

如需配置此功能,请更新 currentLowPowerModeSensitivity属性 的 EnergyPreference trait。此属性使用索引来选择灵敏度级别,其中 0 通常表示 Disabled1 表示 EnabledAutomatic

private func setAutoBatterySaver(to value: Bool) async throws {
  _ = try await energyPreferenceTrait.update {
    $0.setCurrentLowPowerModeSensitivity(value ? 1 : 0)
  }
}

获取电池充电状态

如需获取设备的当前充电状态(充电、已充满电或未 充电),请使用 batChargeState 属性的 PowerSource trait。

self.chargingState = powerSourceTrait.attributes.batChargeState

var description: String
switch self.chargingState {
case .isCharging:
  description = "Charging"
case .isAtFullCharge:
  description = "Full"
case .isNotCharging:
  description = "Not Charging"
default:
  description = "Unknown"
}

获取电池电量

如需获取当前电池电量,请使用 batChargeLevel 属性的 PowerSource trait。电量为 OKWarning(低)或 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"
}

获取电源

如需确定设备正在使用的电源, 请使用 BatPresentwiredPresent 属性,这些属性属于 PowerSource trait。

if powerSourceTrait.attributes.wiredPresent ?? false {
  self.powerSourceType = .wired
} else if powerSourceTrait.attributes.batPresent ?? false {
  self.powerSourceType = .battery
} else {
  self.powerSourceType = nil
}

音频设置

您可以通过 Home API 控制各种音频设置。

开启或关闭麦克风

如需开启或关闭设备的麦克风,请使用内置的 setMicrophoneMuted 函数更新 CameraAvStreamManagementTrait trait 的 microphoneMuted 属性:

// Turn the device's microphone on or off
func setMicrophone(on: Bool) async {
  do {
    _ = try await self.cameraAvStreamManagementTrait?.update {
      $0.setMicrophoneMuted(!on)
    }
  } catch {
    // Error
  }
}

开启或关闭录音功能

如需为设备开启或关闭录音功能,请使用内置的 setRecordingMicrophoneMuted 函数更新 CameraAvStreamManagementTrait trait 的 recordingMicrophoneMuted 属性:

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

调节扬声器音量

如需调节设备的扬声器音量,请使用内置的 setSpeakerVolumeLevel函数更新CameraAvStreamManagementTraittrait 的 speakerVolumeLevel 属性:

// Adjust the camera speaker volume
func setSpeakerVolume(to value: UInt8) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setSpeakerVolumeLevel(value)
    }
  } catch {
    // Error
  }
}

活动区域设置

ZoneManagement trait 提供了一个界面,用于管理摄像头和门铃设备上的自定义感兴趣区域(活动区域)。这些区域用于将事件检测(例如人员或车辆移动)过滤到设备视野范围内的特定区域。

活动区域由用户在合作伙伴应用中配置,允许用户在摄像头视野范围内的特定区域绘制区域。然后,这些用户定义的区域会转换为此 trait 使用的结构。 如需详细了解活动区域的工作原理,请参阅 设置和使用活动区域

活动区域通常使用二维笛卡尔坐标定义。 该 trait 为顶点提供 TwoDCartesianVertexStruct,为区域定义(名称、顶点、颜色和用途)提供 TwoDCartesianZoneStruct

检查活动区域

如需显示活动区域,请检查 zones trait 的 ZoneManagement属性。

let zoneManagementTrait: Google.ZoneManagementTrait

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

添加活动区域

如需创建新区域,请使用 createTwoDCartesianZone命令。此命令采用 TwoDCartesianZoneStruct, 用于定义区域的名称、顶点、颜色和用途。

以下示例展示了如何创建一个名为“Front Porch”的区域,该区域有四个顶点,颜色为鲑鱼色 (#F439A0),用于移动侦测。

import GoogleHomeSDK
import GoogleHomeTypes

func createFrontPorchZone(trait: Google.ZoneManagementTrait) async {
  // 1. Define the vertices for the zone (2D Cartesian coordinates)
  // Values are UInt16, typically scaled to the device's twoDCartesianMax.
  let vertices = [
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 260, y = 422),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1049, y = 0),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 0),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 950),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1630, y = 1349),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 880, y = 2048),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 0, y = 2048),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 638, y = 1090)
  ]

  // 2. Define the zone structure using the given SDK struct
  let newZone = Google.ZoneManagementTrait.TwoDCartesianZoneStruct(
    name: "Front Porch",
    use: [.motion], // ZoneUseEnum.motion
    vertices: vertices,
    // Color is a hex string (for example, Salmon/Pink)
    color: "#F439A0"
  )

  do {
    // 3. Execute the raw command to add the zone to the device
    // This returns the created zone's ID (UInt16).
    var newZoneID = try await trait.createTwoDCartesianZone(zone: newZone)
  } catch {
    // Error
  }
}

更新活动区域

如需更新现有区域,请使用 updateTwoDCartesianZone 命令。此命令需要 zoneId 和更新后的 TwoDCartesianZoneStruct

let zoneManagementTrait: Google.ZoneManagementTrait
let zoneID: UInt16
let zone: Google.ZoneManagementTrait.TwoDCartesianZoneStruct

do {
  _ = try await zoneManagementTrait.updateTwoDCartesianZone(
        zoneID: zoneID, zone: zone)
} catch {
  // Error
}

删除活动区域

如需移除区域,请使用 removeZone命令,并指定zoneId

let zoneManagementTrait: Google.ZoneManagementTrait
let zoneID: UInt16

do {
  _ = try await zoneManagementTrait.removeZone(zoneID: zoneID)
} catch {
  // Error
}

声音事件触发器

AvStreamAnalysis trait 提供了一个界面,用于管理摄像头和门铃设备上的事件检测触发器。虽然基于视觉的触发器(例如人员或车辆)可以是特定于区域的,但与声音相关的触发器通常是设备级配置。

以下触发器类型可用于通过 EventTriggerTypeEnum进行声音检测:

模式 枚举值 说明
声音 Sound 一般声音检测。
人说话声 PersonTalking 检测语音。
狗吠声 DogBark 检测犬类发声。
玻璃破碎声 GlassBreak 检测玻璃破碎的声音。
烟雾警报器 SmokeAlarm 检测烟雾警报声,通常通过 T3 可听模式(三声短促的蜂鸣声,后跟停顿)识别。
一氧化碳警报声 CoAlarm 检测一氧化碳 (CO) 警报声,通常通过 T4 可听模式(四声短促的蜂鸣声,后跟停顿)识别。

检查声音检测状态

如需向用户显示声音检测的当前状态,您必须检查设备支持哪些功能以及设备硬件启用了哪些功能。要检查的两个属性是:

在 iOS 开发中,您通常会从设备访问 AvStreamAnalysis trait 以读取这些属性。

// Example struct to store event triggers
public struct EventTrigger: Equatable {
  public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum
  public var enabled: Bool
}

let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait

let possibleEventTriggers = avStreamAnalysisTrait.attributes.supportedEventTriggers ?? []
let enabledEventTriggers = avStreamAnalysisTrait.attributes.enabledEventTriggers ?? []

let eventTriggers [EventTrigger] = []
for trigger in possibleEventTriggers {
  self.eventTriggers.append(
    EventTrigger(
      id: trigger,
      enabled: enabledEventTriggers.contains(trigger)
    )
  )
}

更新已启用触发器的集合

如需更新已启用触发器的集合,请使用 SetOrUpdateEventDetectionTriggers 命令,该命令采用 EventTriggerEnablement 结构的列表。

// Example struct to store event triggers
public struct EventTrigger: Equatable {
  public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum
  public var enabled: Bool
}

let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait
let eventTriggers: [EventTrigger]

let enabledEventTriggers = eventTriggers.map {
  Google.AvStreamAnalysisTrait.EventTriggerEnablement(
    eventTriggerType: $0.id,
    enablementStatus: $0.enabled ? .enabled : .disabled
  )
}

try await avStreamAnalysisTrait.setOrUpdateEventDetectionTriggers(
  eventTriggerEnablements: enabledEventTriggers
)

录制模式

RecordingMode trait 提供了一个界面,用于管理摄像头和门铃设备上的视频和图片录制行为。它允许用户在连续录像、事件录像或完全停用录制(仅限实时画面)之间进行选择。

RecordingModeEnum 定义了可用的录制策略:

模式 枚举值 说明
已停用 Disabled 录制功能已完全停用。主要由旧版设备使用。
CVR (连续录像) Cvr 全天候录制视频。需要订阅 (例如 Google Home Premium)。
EBR (基于事件的录制) Ebr 录制由事件(人员、移动)触发。 视频时长取决于事件时长和订阅。
ETR (事件触发的录制) Etr 由事件触发的短预览录制(例如 10 秒) 。
实时画面 LiveView 录制功能已停用,但用户仍可访问直播。
静态图片 Images 发生事件时,系统会录制快照而不是视频。

检查录制模式

如需显示当前的录制配置,请检查 RecordingMode trait 的属性:

// Example struct to store recording modes.
public struct RecordingMode: Hashable {
  public let id: UInt8
  public let mode: Google.RecordingModeTrait.RecordingModeEnum
}

let recordingModeTrait: Google.RecordingModeTrait

if let availableRecordingModes = recordingModeTrait.attributes.availableRecordingModes,
   let supportedRecordingModes = recordingModeTrait.attributes.supportedRecordingModes,
   let selectedRecordingMode = recordingModeTrait.attributes.selectedRecordingMode {

  var recordingModes: [RecordingMode] = []

  for recordingModeId in availableRecordingModes {
    guard Int(recordingModeId) < supportedRecordingModes.count,
          Int(recordingModeId) >= 0 else {
      // Out of bounds error
    }

    recordingModes.append(
      RecordingMode(
        id: recordingModeId,
        mode: supportedRecordingModes[Int(recordingModeId)].recordingMode,
      )
    )
  }
}

更改录制模式

在更新之前,请确保 supportedRecordingModes 属性中选择的索引存在于 availableRecordingModes 属性中。

如需更新所选模式,请使用 setSelectedRecordingMode 函数,并传递所选模式的索引:

let recordingModeTrait: Google.RecordingModeTrait
let recordingModeID: UInt8

_ = try await recordingModeTrait.update {
  $0.setSelectedRecordingMode(recordingModeID)
}

其他设置

您可以通过 Home API 控制各种其他设置。

更改图片方向

摄像头图片(视频)的方向可以旋转。视频只能旋转 180 度。

如需更改摄像头的图片方向,请使用内置的 setImageRotation函数更新CameraAvStreamManagementTraittrait 的 imageRotation 属性:

// Change the camera's image orientation
// Value must be 0 or 180
func setImageRotation(to value: UInt16) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setImageRotation(value)
    }
  } catch {
    // Error
  }
}

开启或关闭夜视功能

如需为摄像头开启或关闭夜视效果,请使用 TriStateAutoEnum 通过内置的 setNightVision函数更新 nightVision 属性:CameraAvStreamManagementTrait

// Turn night vision on or off
func setNightVision(
  to value: Google.CameraAvStreamManagementTrait.TriStateAutoEnum
) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setNightVision(value)
    }
  } catch {
    // Error
  }
}

更改状态 LED 的亮度

如需更改状态 LED 的亮度,请使用 ThreeLevelAutoEnum 通过内置的 setStatusLightBrightness函数更新 CameraAvStreamManagementTrait trait 的 statusLightBrightness 属性:

// Set the LED brightness
func setStatusLightBrightness(
  to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setStatusLightBrightness(value)
    }
  } catch {
    // Error
  }
}

更改摄像头视口

摄像头视口与缩放和增强 Nest 摄像头视频画面支持文章中所述的 “缩放和裁剪”功能相同。

视口在包含四个值的 ViewportStruct 中定义,这些值用作视口的坐标。坐标定义如下:

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

确定 ViewportStruct 的值取决于应用的界面和摄像头实现。在非常基本的层面上,如需设置摄像头 视频的视口,请使用 内置的 setViewport 函数,通过 ViewportStruct 更新 CameraAvStreamManagementTrait trait 的 viewport 属性。

func setCrop(x1: UInt16, y1: UInt16, x2: UInt16, y2: UInt16) {

  let viewport = Google.CameraAvStreamManagementTrait.ViewportStruct(
    x1: x1,
    y1: y1,
    x2: x2,
    y2: y2
  )

  Task {
    do {
      try await cameraAvStreamManagementTrait.update {
        $0.setViewport(viewport)
      }
    } catch {
      // Error
    }
  }

}

生成 TransportOptionsStruct

某些设置需要修改 TransportOptionsStruct 中的属性,然后将其传递到流式传输连接的传输选项中。对于 Swift,此结构体需要在更新任何属性之前生成。

使用此辅助函数生成该结构体,以便用于以下设置更改:

func getTransportOptions(
  transportOptions: Google.PushAvStreamTransportTrait.TransportOptionsStruct,
  wakeUpSensitivity: UInt8?,
  maxEventLength: UInt32?
) async throws
  -> Google.PushAvStreamTransportTrait.TransportOptionsStruct
{

  var newMotionTimeControl:
    Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct? = nil
  if let maxEventLength {
    guard let motionTimeControl = transportOptions.triggerOptions.motionTimeControl else {
      throw HomeError.failedPrecondition(
        // Error - cannot update max event length without motion time control
    }
    newMotionTimeControl =
      Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct(
        initialDuration: motionTimeControl.initialDuration,
        augmentationDuration: motionTimeControl.augmentationDuration,
        maxDuration: maxEventLength,
        blindDuration: motionTimeControl.blindDuration
      )
  }

  return Google.PushAvStreamTransportTrait.TransportOptionsStruct(
    streamUsage: .recording,
    videoStreamID: nil,
    audioStreamID: nil,
    tlsEndpointID: transportOptions.tlsEndpointID,
    url: transportOptions.url,
    triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct(
      triggerType: .motion,
      motionZones: nil,
      motionSensitivity: wakeUpSensitivity,
      motionTimeControl: newMotionTimeControl,
      maxPreRollLen: nil
    ),
    ingestMethod: .cmafIngest,
    containerOptions: Google.PushAvStreamTransportTrait.ContainerOptionsStruct(
      containerType: .cmaf,
      cmafContainerOptions: nil
    ),
    expiryTime: nil
  )
}

private func getRecordingConnection() async throws
  -> Google.PushAvStreamTransportTrait.TransportConfigurationStruct?
{
  guard let pushAvStreamTransportTrait else {
    // Error - PushAvStreamTransport trait not available
    return nil
  }

  let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations

  for connection in connections {
    guard let transportOptions = connection.transportOptions,
      transportOptions.streamUsage == .recording
    else {
      continue
    }

    return connection
  }

  return nil
}

调整设备唤醒灵敏度

设备的唤醒灵敏度用于通过降低设备可以感应活动的范围并增加检测到活动后唤醒的时间来节省电池电量。

在 Home API 中,可以使用设备 transportOptions 中的 triggerOptionsmotionSensitivity 属性进行设置。这些选项在每个设备的 PushAvStreamTransportTrait trait 中定义。

唤醒灵敏度只能设置为以下值:

  • 1 = 低
  • 5 = 中
  • 10 = 高

更新过程是使用 findTransport 命令查找有效 录制流的传输配置,然后使用 modifyPushTransport 命令使用新的灵敏度值修改配置。

modifyPushTransport 命令需要传递完整的 TransportOptionsStruct,因此您必须先从当前配置中复制现有值。如需获取执行此操作的 辅助函数,请参阅生成 TransportOptionsStruct

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

调整事件录制时长上限

事件录制时长上限是指摄像头为事件录制剪辑的时长。通过 Home API,您可以为每个设备配置此设置,使其与通过 Google Home app (GHA) 配置的时长相同,以秒为间隔:

  • 10 秒
  • 15 秒
  • 30 秒
  • 60 秒(1 分钟)
  • 120 秒(2 分钟)
  • 180 秒(3 分钟)

在 Home API 中,可以使用设备 transportOptions 中的 triggerOptionsmotionTimeControl 属性进行设置。这些选项在每个设备的 PushAvStreamTransportTrait trait 中定义。

更新过程是使用 命令查找有效 录制流的传输配置,然后使用 modifyPushTransport 命令使用新的事件时长值修改配置。findTransport

modifyPushTransport 命令需要传递完整的 TransportOptionsStruct,因此您必须先从当前配置中复制现有值。如需获取执行此操作的 辅助函数,请参阅生成 TransportOptionsStruct

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

启用或停用分析功能

每台设备都可以单独选择将详细的分析数据发送到 Google Home 云端(请参阅 Home API 的 Cloud Monitoring )。

如需为设备启用分析功能,请将 ExtendedGeneralDiagnosticsTraitanalyticsEnabled) 属性设置为 true。当您设置 analyticsEnabled 时,另一个属性 logUploadEnabled 会自动设置为 true,这允许将分析日志文件上传到 Google Home 云端。

// Enable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
  $0.setAnalyticsEnabled(true)
}

// Disable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
  $0.setAnalyticsEnabled(false)
}