在 iOS 版 Google Home API 中,您可以使用 Swift 中的Combine 架構,觀察住家狀態的變更。您可以使用任何 API 搭配 HomeDevice
,觀察 Google Home API 中結構體、房間、裝置中繼資料和裝置狀態的變更。方法是訂閱發布者,以便從非同步事件中顯示值。
當集合中的任何項目新增、刪除或修改時,系統會傳回集合的最新快照。
開發人員可以將此快照與舊版副本進行比較,推斷出具體變更。Home API 中的每個父項物件類型提供的 id
欄位可用於此用途。
如何解開選用物件
如果物件為選用項目,請使用 if let
或 guard
安全地展開物件。請勿使用 !
,因為除非開發人員確定物件不會為空值,否則不應使用 !
。
範例中的輸入參數 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()
}
}