監控 iOS 裝置狀態

在 iOS 版 Google Home API 中,您可以使用 Swift 中的Combine 架構,觀察住家狀態的變更。您可以使用任何 API 搭配 HomeDevice,觀察 Google Home API 中結構體、房間、裝置中繼資料和裝置狀態的變更。方法是訂閱發布者,以便從非同步事件中顯示值。

當集合中的任何項目新增、刪除或修改時,系統會傳回集合的最新快照。

開發人員可以將此快照與舊版副本進行比較,推斷出具體變更。Home API 中的每個父項物件類型提供的 id 欄位可用於此用途。

如何解開選用物件

如果物件為選用項目,請使用 if letguard 安全地展開物件。請勿使用 !,因為除非開發人員確定物件不會為空值,否則不應使用 !

範例中的輸入參數 structureID 已定義為 String?,表示該字串為選用,且可能為空值。這個函式會根據 structureID 中的輸入內容,找出 Structure 物件。

以下是我們建議處理選用物件的方式:

func structure(structureID: String?) -> Structure? {
    guard let structureID else { return nil }
    return structures.first { $0.id == structureID }
  }

如何使用發布商

以下是一些在 Home API 中使用發布端的基本範例。在下列範例中,必須建立 Home 的例項。

var home: Home?

在存取集合之前,請務必先展開集合,因為這不是必要步驟:

guard let home else { return nil }

追蹤結構體的變更

下列結構變更會觸發這項收集作業:

  • 住家結構體名稱
home.structures().batched()
  .compactMap { $0.first(where: { $0.id = myStructureID} }
  .removeDuplicates()
  .sink { structure in
    if let structure = structure {
      print("Structure \(structure.id) updated to \(structure.name)")
    }
  }

追蹤特定裝置的變更

裝置發生下列變更時,系統就會觸發這項收集作業:

home.devices().batched()
  .compactMap { deviceList -> HomeDevice? in
    deviceList.filter { $0.name == "Bedroom Lamp"}.first
  }
  .removeDuplicates()
  .sink { lampDevice in
    if lampDevice != nil {
      print("The bedroom lamp has changed!")
    }
  }

追蹤裝置上特定特徵的變更

使用裝置和 Google Home API 支援的任何特徵。如需完整清單,請參閱 Trait

device.types.subscribe(OnOffLightDeviceType.self)
  .compactMap { $0.matterTraits.onOffTrait }
  .removeDuplicates()
  .sink { onOffState in
    if let onOffState = onOffState {
      print("Got new state update: \(onOffState.onOff)")
    }
  }

追蹤裝置上特定類型的變更

下列裝置類型變更會觸發這項收集作業:

使用 Google Home API 支援的任何 Matter 裝置類型。如需完整清單,請參閱 DeviceType

device.types.subscribe(DimmableLightDeviceType.self)
  .compactMap { $0.matterTraits.levelControlTrait }
  .removeDuplicates()
  .sink { dimmableLightDevice in
    if let dimmableLightDevice = dimmableLightDevice
      print("Got new state update! \(levelControlTrait.currentLevel)")
    }
  }

追蹤結構體中房間的變更

以下對聊天室的變更會觸發這項收集作業:

如要追蹤裝置何時加入或離開房間,請使用 devices() 查詢

home.rooms().batched()
  .sink { rooms in
    print("Got a new updated set of rooms!")
    for room in rooms {
      print("Got room #\(room.name)")
    }
  }

訂閱事件

在 Google Home API 中,事件可用於偵測裝置狀態的變化。

self.cancellable = self.device.types.subscribe(FanDeviceType.self)
  .receive(on: DispatchQueue.main)
  .catch { error in
    Logger.error("Error getting FanDeviceType: \(error)")
    return Empty<FanDeviceType, Never>().eraseToAnyPublisher()
  }
  .sink { [weak self] fanDeviceType in
    self?.fanDeviceType = fanDeviceType
    self?.updateTileInfo()
  }
}