Structure APIs unter iOS

Auf Gebäude-APIs kann über die Home APIs für iOS zugegriffen werden.

Wenn Sie die Structure APIs verwenden möchten, importieren Sie zuerst das GoogleHomeSDK-Paket in Ihre App:

import GoogleHomeSDK

Fehlerbehandlung

Einige Methoden in den Home APIs werfen eine HomeError. Wir empfehlen daher, einen do-catch-Block zu verwenden, um HomeError bei diesen Aufrufen zu fangen.

Prüfen Sie bei der Verarbeitung von HomeError die Felder code und message, um herauszufinden, was schiefgelaufen ist.

Alle nicht behandelten Fehler führen zum Absturz Ihrer App.

Weitere Informationen finden Sie unter Fehlerbehandlung.

Gebäude-API

Home steht für das Zuhause-Diagramm und ist der Einstiegspunkt in die Gebäude API. Sie enthält Verweise auf Gebäude, Räume und Geräte.

Structure steht für ein Gebäude in Ihrem Zuhause-Diagramm. Er bietet Zugriff auf Strukturmetadaten wie id und name.

Mit structures() können Sie alle Gebäude in Ihrem Konto abrufen. Die Strukturen werden in Form eines Query zurückgegeben, was verschiedene Möglichkeiten zur Verwendung der Daten bietet:

API Beschreibung
stream() Gibt eine Publisher zurück, die jedes Objekt einzeln ausgibt, wenn Änderungen auftreten.
batched() Gibt ein Publisher zurück, das das aktuelle Ergebnis als Set von Objekten ausgibt. Jedes gesendete Set stellt den aktuellen Status des Objektgraphs dar.
list() Gibt das aktuelle Ergebnis als Set von Objekten zurück.

Der structures().list()-Aufruf gibt möglicherweise nicht sofort eine gültige Gruppe von Gebäuden zurück. Wenn Ihre App reaktiv ist und stream() aufruft, um alle Strukturänderungen zu abonnieren, um die Benutzeroberfläche zu steuern, sollte schließlich eine gültige Liste der Strukturen zurückgegeben werden. Es gibt noch andere Situationen, in denen eine leere Strukturliste zurückgegeben werden kann, z. B. wenn die Verbindung des Smartphones des Nutzers unterbrochen wird oder der Nutzer die Berechtigungen für Ihre App widerrufen hat. Sie sollten diese Fälle in Ihrer App berücksichtigen.

@Published public private(set) var structures: [Structure] = []
private var structuresCancellable: AnyCancellable?

  self.structuresCancellable = home
    .structures()
    .batched()
    .receive(on: DispatchQueue.main)
    .map { Array($0) }
    .catch {
      Logger.error("Failed to load structures: \($0)")
      return Just([Structure]())
    }
    .assign(to: \.structures, on: self)

Beispielaufrufe für Strukturen

Gebäude abrufen

Wenn du list() für ein Query<Structure> aufrufst, wird der letzte Satz von Elementen zurückgegeben:

// Get a stream of all structures accessible to the user
let allStructuresChanges = try await self.home.structures()
let allStructures = try? await allStructuresChanges.list()

Wenn Sie eine responsive App entwerfen, sollten Sie batched()- und stream()-Aufrufe anstelle von list() verwenden, da damit automatisch Daten generiert werden, wenn sich der Zuhause-Diagramm ändert.

Gebäudeeigenschaften abrufen

Mit der Liste der Gebäude können Sie auf die zugehörigen Properties zugreifen:

// Get a stream of changes taking place on a structure.
let structureChanges = try await home.structures().list().filter { $0.id == structureID }

// Get a snapshot of the structure.
let structure = try await structureChanges.first!

// Get structure properties
print("id \(structure.id) ")
print("name \(structure.name) ")

Gebäude nach Name suchen

Wenn du den Namen eines Gebäudes kennst, kannst du auch über das Attribut name darauf zugreifen:

do {
  structure1 = try await home.structures().list().first(where: { $0.name == "Main House" })
} catch let error as HomeError {
  // Code for handling the exception
}

Von dort aus können Sie auf Unterkünfte, Zimmer und Geräte für jedes Gebäude zugreifen.

Mit mehreren Strukturen arbeiten

Wenn Sie mehrere Strukturen verwenden möchten, müssen Sie für jede Struktur einen separaten Verweis abrufen:

var structure1: Structure!
var structure2: Structure!
do {
  structure1 = try await home.structures().list().first(where: { $0.name == "Main House" })
} catch let error as HomeError {
  // Code for handling the exception
}
do {
  structure2 = try await home.structures().list().first(where: { $0.name == "Guest Cottage" })
} catch let error as HomeError {
  // Code for handling the exception
}

Zimmer

Ein Raum enthält eine Gruppe von Geräten. Ein Raum ist immer Teil eines Gebäudes und ein Gebäude kann mehrere Räume haben. Wenn Sie einen Raum aus einem Gebäude entfernen, werden die Geräte in diesem Raum nicht aus dem Gebäude entfernt. Wenn der Raum jedoch gelöscht wird, werden die Geräte in diesem Raum nicht mehr zugewiesen.

Verwenden Sie Home.rooms(), um alle Räume im Konto abzurufen, und dann roomID = device.roomID, um die entsprechenden Geräte in jedem Raum anzuzeigen.

self.home.rooms().batched()
  .combineLatest(self.home.devices().batched())
  .receive(on: DispatchQueue.main)
  .catch { error in
    Logger.error("Failed to load rooms and devices: \(error)")
    return Just((Set<Room>(), Set<HomeDevice>()))
  }
  .map { rooms, devices in
    var devicesByRoom = [Room: [HomeDevice]]()
    for room in rooms where room.structureID == currentStructureID {
      devicesByRoom[room] = devices.filter { $0.roomID == room.id }
    }
    return devicesByRoom
  }.assign(to: &self.$devicesByRoom)

Beispielanrufe für Gruppenbereiche

Liste der Räume abrufen

Mit der Klasse Home können Sie eine Liste der Räume abrufen und auf die zugehörigen Properties zugreifen:

let allRoomsChanges = self.home.rooms()
let allRooms = try await allRoomsChanges.list()
let room = allRooms.first!
XCTAssertTrue(allRooms.contains(room))

print("id \(room.id) ")
print("name \(room.name) ")

Chatroom erstellen

So erstellen Sie einen neuen Raum in einer Structure:

let testName = "Test Room Name"
var newRoom: Room!
do {
  newRoom = try await structure.createRoom(name: testName)
  XCTAssertNotNil(newRoom)
} catch let error as HomeError {
  // Code for handling the exception
}

Raum löschen

Alternativ können Sie einen Raum auch so löschen:

val roomToDelete = structure.rooms().list().filter { it.name == "room_id1" }.firstOrNull()
    structure.deleteRoom(roomToDelete!!)

Sie können ein Zimmer auch anhand seiner ID löschen:

let roomToDelete = allRooms.first(where: { $0.id == room.id })
if let roomToDelete1 = roomToDelete {
  do {
    try await structure.deleteRoom(roomToDelete1)
  } catch let error as HomeError {
    // Code for handling the exception
  }
}

Wenn ein Raum mit Geräten gelöscht wird, befinden sich die Geräte weiterhin im Gebäude, sind aber keinem Raum mehr zugewiesen.

Geräte in einen anderen Raum verschieben

Mit Structure können Sie auch ein Gerät in einen anderen Raum verschieben:

do {
  try await structure.move(device: light, to: room)
} catch let error as HomeError {
  // Code for handling the exception
}

API-Liste

Sobald eine Instanz von Home erstellt wurde, können Sie über diese auf die folgenden Gebäude-APIs zugreifen:

API Beschreibung
devices() Alle Geräte abrufen, die für dieses Konto sichtbar sind
device(id:) Ruft eine Publisher für ein bestimmtes Gerät ab, die den aktuellen Status und bei allen zukünftigen Statusaktualisierungen ausgibt.
structures() Alle Strukturen im Google-Konto abrufen Gibt einen Query<Structure> zurück, der weitere Abruf- und Filteroptionen bietet.
structure(id:) Rufen Sie die Struktur mit der übereinstimmenden ID ab.
rooms() Alle Räume im Google-Konto abrufen Gibt einen Query<strRoom> zurück, der weitere Abruf- und Filteroptionen bietet.
room(id:) Ruft eine Publisher für einen bestimmten Raum ab, die den aktuellen Status und bei allen zukünftigen Statusaktualisierungen ausgibt.

Structure bietet die folgenden APIs:

API Beschreibung
deleteRoom(id:) Löschen Sie einen Raum mit der Raum-ID.
id Die eindeutige System-ID des Gebäudes.
move(device:, to:) Verschieben Sie ein Gerät in einen anderen Raum im Gebäude.
move(device:, to:) Verschieben Sie das Gerät mit der angegebenen ID in den Raum mit der angegebenen ID.
move(devices:, to:) Verschiebt die angegebenen Geräte in den angegebenen Raum.
move(devices:, to:) Verschiebt die Geräte mit den angegebenen IDs in den Raum mit der angegebenen ID.
name Der vom Nutzer angegebene Name des Gebäudes.

Room hat die folgenden APIs:

API Beschreibung
id Die eindeutige System-ID des Zimmers.
name Der vom Nutzer angegebene Name des Raums.
structureID Die eindeutige System-ID des Gebäudes, zu dem das Zimmer gehört.