API Structure su iOS

È possibile accedere alle API Structure tramite le API Home per iOS.

Per utilizzare le API Structure, importa prima il pacchetto GoogleHomeSDK nella tua app:

import GoogleHomeSDK

Gestione degli errori

Alcuni metodi nelle API Home generano un HomeError, pertanto ti consigliamo di utilizzare un blocco do-catch per intercettare HomeError in queste chiamate.

Quando gestisci HomeError, controlla i campi code e message per scoprire cosa è andato storto.

Eventuali errori non gestiti causeranno l'arresto anomalo dell'app.

Per ulteriori informazioni, consulta Gestione degli errori.

API Structure

Home rappresenta il grafo della casa ed è il punto di contatto dell'API Structure. Fornisce riferimenti a strutture, stanze e dispositivi.

Structure rappresenta una struttura nel grafico della casa. Fornisce l'accesso ai metadati della struttura, come id e name.

Utilizza structures() per visualizzare tutte le strutture nel tuo account. Le strutture vengono restituite sotto forma di Query, che offre una scelta di modi per utilizzare i relativi dati:

API Descrizione
stream() Restituisce un Publisher che emette ogni oggetto singolarmente man mano che vengono apportate le modifiche.
batched() Restituisce un Publisher che emette il risultato corrente come Set di oggetti. Ogni Set emesso rappresenta lo stato attuale del grafo di oggetti.
list() Restituisce il risultato corrente come Set di oggetti.

La chiamata structures().list() potrebbe non restituire immediatamente un insieme valido di strutture. Se la tua app è reattiva e chiama stream() per iscriversi a tutte le modifiche della struttura per gestire l'interfaccia utente, dovrebbe essere restituito un elenco valido di strutture. Esistono altre situazioni in cui potrebbe essere restituito un elenco di strutture vuoto, ad esempio se lo smartphone dell'utente perde la connettività o se l'utente ha revocato le autorizzazioni per la tua app. Assicurati di gestire questi casi nella tua app.

@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)

Chiamate di esempio alla struttura

Ottenere un insieme di strutture

La chiamata a list() su un Query<Structure> restituisce l'insieme di elementi più recente:

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

Quando progetti un'app reattiva, ti consigliamo di utilizzare le chiamate batched() e stream() anziché list(), perché producono automaticamente dati quando il grafico della casa cambia.

Recupera le proprietà della struttura

Una volta ottenuto l'elenco delle strutture, puoi accedere alle relative proprietà:

// 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) ")

Trovare una struttura per nome

Se conosci il nome di una struttura, puoi accedervi anche utilizzando la proprietà name:

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

Da qui, puoi accedere a proprietà, stanze e dispositivi per ogni struttura.

Lavorare con più strutture

Per utilizzare più di una struttura, ottieni un riferimento separato per ogni struttura:

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
}

Camere

Una stanza contiene un gruppo di dispositivi. Una camera fa sempre parte di una struttura e una struttura può avere più camere. La rimozione di una stanza da una struttura non comporta la rimozione dei dispositivi al suo interno. Tuttavia, se la stanza viene eliminata, i dispositivi al suo interno vengono annullati.

Utilizza Home.rooms() per recuperare tutte le stanze dell'account, quindi roomID = device.roomID per visualizzare i dispositivi corrispondenti in ogni stanza.

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)

Chiamate di esempio con Room

Ottenere un elenco di stanze

Utilizzando la classe Home, puoi ottenere un elenco di stanze e accedere alle proprietà corrispondenti:

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) ")

Crea una stanza virtuale

Per creare una nuova stanza in un 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
}

Eliminare una stanza

In alternativa, puoi eliminare una stanza:

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

Puoi anche eliminare una camera utilizzando il relativo ID:

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
  }
}

Se una camera con dispositivi viene eliminata, i dispositivi rimarranno nella struttura, ma non saranno più assegnati a una camera.

Spostare i dispositivi in un'altra stanza

Structure ti consente anche di spostare un dispositivo in un'altra stanza:

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

Modificare il nome di una stanza

Chiama il metodo setName(_:) per modificare il nome di una stanza:

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

Quando cambi il nome di una stanza, la struttura Room originale rimane invariata e la modifica viene applicata all'oggetto Room aggiornato restituito.

elenco delle API

Una volta creata un'istanza di Home, tramite questa sono accessibili le seguenti API Structure:

API Descrizione
devices() Visualizza tutti i dispositivi visibili a questo account.
device(id:) Ottieni un Publisher per un dispositivo specificato che emette lo stato corrente e di nuovo in caso di aggiornamenti dello stato futuri.
structures() Ottieni tutte le strutture nell'Account Google. Restituisce un Query<Structure> che fornisce ulteriori opzioni di recupero e filtro.
structure(id:) Recupera la struttura con l'ID corrispondente.
rooms() Ricevi tutte le stanze nell'Account Google. Restituisce un Query<strRoom> che fornisce ulteriori opzioni di recupero e filtro.
room(id:) Ricevi un Publisher per una stanza specificata che emette lo stato corrente e di nuovo in caso di aggiornamenti dello stato futuri.

Structure ha le seguenti API:

API Descrizione
deleteRoom(id:) Elimina una stanza con l'ID stanza.
id L'ID sistema univoco della struttura.
move(device:, to:) Spostare un dispositivo in un'altra stanza della casa.
move(device:, to:) Sposta il dispositivo con l'ID specificato nella stanza con l'ID specificato.
move(devices:, to:) Sposta i dispositivi specificati nella stanza specificata.
move(devices:, to:) Sposta i dispositivi con gli ID specificati nella stanza con l'ID specificato.
name Il nome della struttura fornito dall'utente.

Room dispone delle seguenti API:

API Descrizione
id L'ID sistema univoco della camera.
name Il nome della stanza fornito dall'utente.
structureID L'ID sistema univoco della struttura a cui appartiene la camera.