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'eccezione HomeError, pertanto ti consigliamo di utilizzare un blocco do-catch per rilevare HomeError in queste chiamate.

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

Qualsiasi errore non gestito causerà l'arresto anomalo dell'app.

Per saperne di più, consulta la sezione Gestione degli errori.

API Structure

Home rappresenta il grafico della casa ed è il punto di accesso all'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 ottenere tutte le strutture nel tuo account. Le strutture vengono restituite sotto forma di Query, che offre una scelta di modi per utilizzare i dati:

API Descrizione
stream() Restituisce un Publisher che emette ogni oggetto singolarmente man mano che vengono apportate modifiche.
batched() Restituisce un Publisher che emette il risultato corrente come Set di oggetti. Ogni Set emesso rappresenta lo stato attuale del grafico degli 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 abbonarsi a tutte le modifiche alla struttura per gestire l'interfaccia utente, alla fine 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 alla 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

Ottieni un insieme di strutture

Chiamare 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é queste producono automaticamente dati quando il grafico della casa cambia.

Recuperare le proprietà della struttura

Con l'elenco delle strutture a portata di mano, 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 in base al 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, sono accessibili le proprietà, le stanze e i dispositivi di ogni struttura.

Lavorare con più strutture

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

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 stanza fa sempre parte di una struttura e una struttura può avere più stanze. Se rimuovi una stanza da una struttura, i dispositivi presenti nella stanza non vengono rimossi dalla struttura. Tuttavia, se la stanza viene eliminata, i dispositivi al suo interno vengono disassegnati.

Utilizza Home.rooms() per recuperare tutte le stanze dell'account, quindi utilizza 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 di Sample Room

Ottenere un elenco di stanze

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

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 viene eliminata una stanza con dispositivi, questi rimarranno nella struttura ma non saranno più assegnati a una stanza.

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 si modifica il nome di una stanza, la struttura Room originale rimane invariata e la modifica viene riportata nell'oggetto Room aggiornato restituito.

I nomi verranno troncati se superano il limite di 60 punti di codice Unicode (caratteri) e non verranno generati errori. Gli sviluppatori sono responsabili della gestione dei nomi lunghi e, ad esempio, possono decidere se informare gli utenti che i nomi verranno troncati.

elenco delle API

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

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

L'Structure ha le seguenti API:

API Descrizione
deleteRoom(id:) Elimina una stanza con l'ID stanza.
id L'ID univoco della struttura generato dal sistema.
move(device:, to:) Spostare un dispositivo in un'altra stanza della struttura.
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 indicata.
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 ha le seguenti API:

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