Memantau status perangkat di iOS

Di Home API untuk iOS, pengamatan perubahan status di rumah dapat dilakukan melalui penggunaan framework Combine di Swift. Pengamatan perubahan dalam 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 menampilkan nilai dari peristiwa asinkron.

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

Developer harus 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 membuka 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 yakin bahwa objek tidak boleh null.

Parameter input structureID dalam contoh ini ditentukan sebagai String?, yang berarti parameter ini adalah string yang bersifat opsional dan dapat bernilai null. Fungsi ini menemukan objek Structure berdasarkan input di structureID.

Berikut cara menangani objek opsional yang kami sarankan:

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

Cara menggunakan penayang

Berikut beberapa contoh dasar cara menggunakan 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:

  • Nama struktur
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 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 trait tertentu di perangkat

Gunakan trait apa pun yang didukung oleh perangkat dan Home API. Untuk 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 memicu koleksi ini:

  • Perubahan pada trait apa pun dalam jenis perangkat yang dihasilkan

Gunakan jenis perangkat Matter apa pun yang didukung oleh Home API. Untuk daftar lengkapnya, 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 ruangan memicu koleksi ini:

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

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
    // Error getting FanDeviceType
    return Empty<FanDeviceType, Never>().eraseToAnyPublisher()
  }
  .sink { [weak self] fanDeviceType in
    self?.fanDeviceType = fanDeviceType
    self?.updateTileInfo()
  }
}