在 iOS 设备上控制设备

本指南是 iOS 上的访问设备和设备元数据的续篇,介绍了 设备控制和访问的其他示例。

如需使用特定设备类型或特征(例如此处许多示例中使用的 Matter OnOffTrait),必须导入它们:

import GoogleHomeSDK
import GoogleHomeTypes

检查特征是否支持命令

使用特征级 supports 函数检查特定设备是否支持命令。

例如,如需检查设备是否支持 On/Off 特征的 toggle 命令,请执行以下操作:

// Check if the OnOff trait supports the toggle command.
if onOffTraitTest.supportsToggleCommand {
  print("onOffTrait supports toggle command")
} else {
  print("onOffTrait does not support stateful toggle command")
}

向设备发送命令

发送命令类似于从特征读取状态属性。如需打开或关闭设备,请使用 OnOffTrait Toggle 命令,该命令在 Google Home 生态系统数据 模型中定义为 toggle()。如果 onOfftrue,此方法会将其更改为 false;如果 onOfffalse,此方法会将其更改为 true

// Calling a command on a trait.
do {
  try await onOffTraitTest.toggle()
} catch let _ as HomeError {
  // Code for handling the exception
}

如果执行流程中检测到问题,命令可能会返回异常。作为开发者,您应使用 do-catch 块来正确 处理这些异常,并在错误可操作的情况下向用户显示详细信息。未处理的异常会停止应用运行时,并可能导致应用崩溃。

或者,使用 off()on() 命令显式设置状态:

do {
  try await onOffTraitTest.off()
  try await onOffTraitTest.on()
} catch let _ as HomeError {
  // Code for handling the exception
}

发送命令以更改状态后,一旦完成,您就可以读取状态,如读取设备状态中所述,以便在应用中处理该状态。

发送带参数的命令

某些命令可能会使用参数,例如 OnOffTraitLevelControlTrait 上的参数:

offWithEffect

// Turn off the light using the DyingLight effect.
do {
  try await onOffTraitTest.offWithEffect(
    effectIdentifier: Matter.OnOffTrait.EffectIdentifierEnum.dyingLight,
    effectVariant: 0
  )
} catch let _ as HomeError {
  // Code for handling the exception
}

moveToLevel

// Change the brightness of the light to 50%
do {
  try await levelControlTraitTest.moveToLevel(
    level: UInt8(127),
    transitionTime: 0,
    optionsMask: Matter.LevelControlTrait.OptionsBitmap(),
    optionsOverride: Matter.LevelControlTrait.OptionsBitmap()
  )
} catch let _ as HomeError {
  // Code for handling the exception
}

检查特征是否支持属性

某些设备可能支持 Matter 特征,但不支持 特定属性。例如,映射到 MatterCloud-to-cloud 设备可能不支持每个 Matter 属性。如需处理此类情况,请使用特征级 isSupported 属性检查特定设备是否支持该属性。

例如,如需检查设备是否支持 On/Off 特征的 onOff 属性,请执行以下操作:

// Check if the OnOff trait supports the onOff attribute.
if onOffTrait.attributes.$onOff.isSupported {
  print("onOffTrait supports onOff state")
} else {
  print("onOffTrait is for a command only device!")
}

某些属性在 Matter 规范或 Cloud-to-cloud smart home 架构中是可为 null 的。对于这些属性,您可以使用 isNullable 以及 isSupported 来确定属性返回的 nil 是因为设备未报告该值,还是属性的值实际上为 nil

// Check if a nullable attribute is set or is not supported.
if let deviceType = await device.types.get(OnOffLightDeviceType.self) {
  if let onOffTrait = deviceType.traits[Matter.OnOffTrait.self] {
    if onOffTrait.attributes.startUpOnOff == nil {
      if onOffTrait.attributes.$startUpOnOff.isSupported {
        print(
          "onOffTrait supports startUpOnOff and it is nil. Check the spec for the contextual meaning."
        )
      } else {
        print("onOffTrait does not support startUpOnOff!")
      }
    } else {
      print(
        "onOffTrait supports startUpOnOff and it is set to \(String(describing: onOffTrait.attributes.startUpOnOff))"
      )
    }
  }
}

更新特征属性

如果您想更改给定属性的值,但特征的任何命令都无法更改该值,则该属性可能支持显式设置其值。

属性的值是否可以更改取决于两个因素:

  • 该属性是否可写?
  • 发送特征命令后,属性的值是否会作为副作用而更改?

特征及其属性的参考文档提供了此信息。

因此,决定属性值更改方式的属性组合包括:

使用 update 函数更改属性值的示例

此示例展示了如何显式设置 DoorLockTrait.wrongCodeEntryLimit 属性的值。

如需设置属性值,请调用特征的 update函数 ,并向其传递一个用于设置新值的更新函数。最好先验证特征是否支持属性。

例如:

if doorLockTraitTest.attributes.$wrongCodeEntryLimit.isSupported {
  let _ = try await doorLockTraitTest.update {
    $0.setWrongCodeEntryLimit(3)
  }
}