Memantau status perangkat di iOS

Di Home API untuk iOS, pengamatan perubahan status di rumah dapat dilakukan melalui penggunaan framework Combine di Swift. Mengamati perubahan pada struktur, ruangan, metadata perangkat, dan status perangkat di Home API dapat dilakukan dengan API apa pun menggunakan HomeDevice. Hal ini dilakukan dengan berlangganan ke penayang yang mengekspos nilai dari peristiwa asinkron.

Saat item dalam koleksi ditambahkan, dihapus, atau diubah, snapshot terbaru koleksi akan ditampilkan.

Developer dapat menyimpulkan perubahan tertentu dengan membandingkan snapshot ini dengan salinan yang lebih lama. Kolom id yang disediakan untuk setiap jenis objek induk di Home API dapat digunakan untuk tujuan ini.

Cara mengekstrak objek opsional

Jika objek bersifat opsional, gunakan if let atau guard untuk membuka objek dengan aman. Jangan gunakan ! karena ! tidak boleh digunakan kecuali jika developer tahu dengan pasti bahwa objek tidak boleh null.

Parameter input structureID dalam contoh ditentukan sebagai String?, yang berarti string tersebut bersifat opsional dan memiliki kemungkinan nol. Fungsi ini menemukan objek Structure berdasarkan input di structureID.

Berikut adalah cara yang kami rekomendasikan untuk menangani objek opsional:

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

Cara menggunakan penayang

Berikut adalah beberapa contoh dasar penggunaan penayang di Home API. Untuk contoh berikut, instance Home harus dibuat.

var home: Home?

Sebelum mengakses koleksi, pastikan untuk membukanya karena bersifat opsional:

guard let home else { return nil }

Melacak perubahan pada struktur

Perubahan berikut pada struktur memicu koleksi ini:

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

Melacak perubahan pada perangkat tertentu

Perubahan berikut pada perangkat akan memicu koleksi ini:

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

Melacak perubahan pada karakteristik tertentu di perangkat

Gunakan karakteristik apa pun yang didukung oleh perangkat dan Home API. Untuk mengetahui daftar lengkapnya, lihat 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)")
    }
  }

Melacak perubahan pada jenis tertentu di perangkat

Perubahan berikut pada jenis perangkat akan memicu pengumpulan ini:

Gunakan jenis perangkat Matter apa pun yang didukung oleh Home API. Untuk daftar lengkap, lihat 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)")
    }
  }

Melacak perubahan pada ruangan dalam struktur

Perubahan berikut pada ruang akan memicu koleksi ini:

Untuk melacak kapan perangkat ditambahkan atau dihapus dari ruangan, gunakan kueri devices().

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

Berlangganan peristiwa

Di Home API, peristiwa digunakan untuk mendeteksi perubahan status perangkat.

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