Monitorare lo stato del dispositivo su iOS

Nelle API Home per iOS, l'osservazione delle modifiche allo stato della casa è resa possibile tramite l'utilizzo del framework Combine in Swift. L'osservazione delle modifiche a strutture, stanze, metadati dei dispositivi e stato dei dispositivi nelle API Home può essere eseguita con qualsiasi API utilizzando HomeDevice. Ciò avviene sottoscrivendo i publisher che espongono i valori degli eventi asincroni.

Quando un elemento di una raccolta viene aggiunto, eliminato o modificato, viene restituita l'ultima istantanea della raccolta.

Spetta allo sviluppatore dedurre le modifiche specifiche confrontando questa istantanea con una copia precedente. A questo scopo, puoi utilizzare il campo id fornito per ogni tipo di oggetto principale nelle API Home.

Come scartare gli oggetti facoltativi

Quando un oggetto è facoltativo, utilizza if let o guard per decomprimere in sicurezza l'oggetto. Non utilizzare ! perché ! non deve mai essere utilizzato a meno che lo sviluppatore non sappia con certezza che l'oggetto non può essere nullo.

Il parametro di input structureID nell'esempio è definito come String?, il che significa che è una stringa facoltativa che può essere nulla. Questa funzione trova l'oggetto Structure in base all'input in structureID.

Ecco come ti consigliamo di gestire gli oggetti facoltativi:

func structure(structureID: String?) -> Structure? {
    guard let structureID else { return nil }
    return structures.first { $0.id == structureID }
  }

Come utilizzare gli editori

Di seguito sono riportati alcuni esempi di base di utilizzo degli editori nelle API Home. Per gli esempi seguenti, deve essere creata un'istanza di Home.

var home: Home?

Prima di accedere alle raccolte, assicurati di decomprimerle, poiché sono facoltative:

guard let home else { return nil }

Tenere traccia delle modifiche apportate a una struttura

Questa raccolta viene attivata dalle seguenti modifiche a una struttura:

  • Nome della struttura
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)")
    }
  }

Monitorare le modifiche apportate a un dispositivo specifico

Le seguenti modifiche a un dispositivo attivano questa raccolta:

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

Monitorare le modifiche a una caratteristica specifica su un dispositivo

Utilizza qualsiasi tratto supportato dal dispositivo e dalle API Home. Per un elenco completo, vedi 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)")
    }
  }

Monitorare le modifiche a un tipo specifico su un dispositivo

Le seguenti modifiche a un tipo di dispositivo attivano questa raccolta:

Utilizza qualsiasi tipo di dispositivo Matter supportato dalle API Home. Per un elenco completo, vedi 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)")
    }
  }

Monitorare le modifiche apportate a una stanza in una struttura

I seguenti cambiamenti a una stanza attivano questa raccolta:

Per monitorare quando i dispositivi vengono aggiunti o rimossi da una stanza, utilizza la query devices().

home.rooms().batched()
  .sink { rooms in
    print("Got a new updated set of rooms!")
    for room in rooms {
      print("Got room #\(room.name)")
    }
  }

Iscriviti agli eventi

Nelle API Home, gli eventi vengono utilizzati per rilevare le modifiche allo stato di un dispositivo.

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