Structure APIs unter iOS

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

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

import GoogleHomeSDK

Fehlerbehandlung

Einige Methoden in den Home APIs geben HomeError aus. Wir empfehlen daher, einen do-catch-Block zu verwenden, um HomeError bei diesen Aufrufen abzufangen.

Prüfen Sie beim Verarbeiten 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.

Structure API

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

Structure steht für eine Struktur in Ihrem Home-Diagramm. Sie bietet Zugriff auf Strukturmetadaten wie id und name.

Mit structures() können Sie alle Strukturen in Ihrem Konto abrufen. Die Strukturen werden in Form eines Query zurückgegeben, das verschiedene Möglichkeiten bietet, die Daten zu nutzen:

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

Der structures().list()-Aufruf gibt möglicherweise nicht sofort einen gültigen Satz von Strukturen zurück. Wenn Ihre App reaktiv ist und stream() aufruft, um alle Strukturänderungen für die Benutzeroberfläche zu abonnieren, sollte schließlich eine gültige Liste von Strukturen zurückgegeben werden. Es gibt auch andere Situationen, in denen eine leere Strukturliste zurückgegeben werden kann, z. B. wenn die Verbindung zum Smartphone 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)

Beispiele für Strukturaufrufe

Eine Reihe von Strukturen abrufen

Wenn Sie list() für ein Query<Structure> aufrufen, wird die letzte Gruppe 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()

Beim Entwerfen einer reaktiven App sollten Sie batched()- und stream()-Aufrufe anstelle von list() verwenden, da diese automatisch Daten erzeugen, wenn sich der Home-Graph ändert.

Struktureigenschaften abrufen

Mit der Liste der Gebäude können Sie auf die Attribute 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 anhand des Namens finden

Wenn Sie den Namen einer Struktur kennen, können Sie 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
}

Dort können Sie auf die Immobilien, Zimmer und Geräte für jede Struktur zugreifen.

Mit mehreren Strukturen arbeiten

Wenn Sie mehrere Strukturen verwenden möchten, müssen Sie für jede Struktur eine separate Referenz 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 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 in Räumen

Liste der Räume abrufen

Mit der Klasse Home können Sie eine Liste der Räume abrufen und auf die zugehörigen Attribute 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 einem 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 Chatroom 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 Zuhause, sind aber keinem Raum mehr zugewiesen.

Geräte in einen anderen Raum verschieben

Mit Structure kannst du ein Gerät auch in einen anderen Raum verschieben:

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

Name eines Raums ändern

Rufen Sie die Methode setName(_:) auf, um den Namen eines Raums zu ändern:

let updatedRoom = try await theRoom.setName("new room name")

Wenn Sie den Namen eines Raums ändern, bleibt die ursprüngliche Room-Struktur unverändert und die Änderung wird im zurückgegebenen aktualisierten Room-Objekt widergespiegelt.

Namen werden abgeschnitten, wenn sie das Limit von 60 Unicode-Codepunkten (Zeichen) überschreiten. Es werden keine Fehler ausgegeben. Entwickler sind dafür verantwortlich, lange Namen zu verarbeiten. Sie können beispielsweise entscheiden, ob sie Nutzer darüber informieren möchten, dass Namen gekürzt werden.

API-Liste

Nachdem eine Instanz von Home erstellt wurde, sind die folgenden Structure APIs darüber zugänglich:

API Beschreibung
devices() Alle Geräte abrufen, die für dieses Konto sichtbar sind.
device(id:) Ruft einen Publisher für ein bestimmtes Gerät ab, der den aktuellen Status und alle zukünftigen Statusaktualisierungen ausgibt.
structures() Alle Strukturen im Google-Konto abrufen. Gibt ein Query<Structure> zurück, das weitere Abruf- und Filteroptionen bietet.
structure(id:) Rufen Sie die Struktur mit der entsprechenden ID ab.
rooms() Alle Räume im Google-Konto abrufen. Gibt ein Query<strRoom> zurück, das weitere Abruf- und Filteroptionen bietet.
room(id:) Mit Publisher wird der aktuelle Status eines bestimmten Raums zurückgegeben. Außerdem werden Sie über zukünftige Statusänderungen informiert.

Das Structure hat die folgenden APIs:

API Beschreibung
deleteRoom(id:) Löschen Sie einen Chatroom mit der Chatroom-ID.
id Die eindeutige System-ID der Struktur.
move(device:, to:) Gerät in einen anderen Raum im Zuhause verschieben
move(device:, to:) Gerät mit der angegebenen ID in den Raum mit der angegebenen ID verschieben.
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 der Struktur.

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 der Struktur, zu der das Zimmer gehört.