ตรวจสอบสถานะอุปกรณ์ใน iOS

ใน Home API สำหรับ iOS การสังเกตการเปลี่ยนแปลงสถานะในบ้านสามารถทำได้ ผ่านการใช้ เฟรมเวิร์ก Combine ใน Swift การสังเกตการเปลี่ยนแปลงในโครงสร้าง ห้อง ข้อมูลเมตาของอุปกรณ์ และ สถานะอุปกรณ์ใน Home API สามารถทำได้ด้วย API ใดก็ได้โดยใช้ HomeDevice ซึ่งทำได้โดยการ สมัครรับข้อมูล จาก ผู้เผยแพร่ ที่แสดงค่าจากเหตุการณ์แบบไม่พร้อมกัน

เมื่อมีการเพิ่ม ลบ หรือแก้ไขรายการใดก็ตามในคอลเล็กชัน ระบบจะแสดงผลสแนปชอตล่าสุดของคอลเล็กชัน

นักพัฒนาแอปต้องอนุมานการเปลี่ยนแปลงที่เฉพาะเจาะจงด้วยการเปรียบเทียบสแนปชอตนี้กับสำเนาที่เก่ากว่า คุณสามารถใช้ช่อง id ที่ระบุไว้สำหรับ ออบเจ็กต์ระดับบนแต่ละประเภทใน Home API เพื่อวัตถุประสงค์นี้ได้

วิธีแกะออบเจ็กต์ที่เป็นตัวเลือก

เมื่อออบเจ็กต์เป็นตัวเลือก ให้ใช้ if let หรือ guard เพื่อแกะออบเจ็กต์อย่างปลอดภัย อย่าใช้ ! เนื่องจากไม่ควรใช้ ! เว้นแต่ว่านักพัฒนาแอปจะทราบอย่างแน่นอนว่าออบเจ็กต์ไม่เป็นค่าว่าง

พารามิเตอร์อินพุต structureID ในตัวอย่างกำหนดเป็น String? ซึ่งหมายความว่าเป็นสตริงที่เป็นตัวเลือกและอาจเป็นค่าว่างได้ ฟังก์ชันนี้จะค้นหาออบเจ็กต์ Structure ตามอินพุตใน structureID

เราขอแนะนำให้คุณจัดการออบเจ็กต์ที่เป็นตัวเลือกดังนี้

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

วิธีใช้ผู้เผยแพร่

ต่อไปนี้เป็นตัวอย่างพื้นฐานบางส่วนของการทำงานกับผู้เผยแพร่ใน Home API สำหรับตัวอย่างต่อไปนี้ คุณต้องสร้างอินสแตนซ์ของ Home

var home: Home?

ก่อนเข้าถึงคอลเล็กชัน โปรดแกะคอลเล็กชันเนื่องจากเป็นตัวเลือก

guard let home else { return nil }

ติดตามการเปลี่ยนแปลงโครงสร้าง

การเปลี่ยนแปลงโครงสร้างต่อไปนี้จะเรียกใช้คอลเล็กชันนี้

  • ชื่อโครงสร้าง
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)")
    }
  }

ติดตามการเปลี่ยนแปลงอุปกรณ์ที่เฉพาะเจาะจง

การเปลี่ยนแปลงอุปกรณ์ต่อไปนี้จะเรียกใช้คอลเล็กชันนี้

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

ติดตามการเปลี่ยนแปลงลักษณะที่เฉพาะเจาะจงในอุปกรณ์

ใช้ลักษณะใดก็ได้ที่อุปกรณ์และ Home API รองรับ ดูรายการทั้งหมดได้ที่ 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)")
    }
  }

ติดตามการเปลี่ยนแปลงประเภทที่เฉพาะเจาะจงในอุปกรณ์

การเปลี่ยนแปลงประเภทอุปกรณ์ต่อไปนี้จะเรียกใช้คอลเล็กชันนี้

ใช้ประเภทอุปกรณ์ Matter ใดก็ได้ที่ Home API รองรับ ดูรายการทั้งหมดได้ที่ 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)")
    }
  }

ติดตามการเปลี่ยนแปลงห้องในโครงสร้าง

การเปลี่ยนแปลงห้องต่อไปนี้จะเรียกใช้คอลเล็กชันนี้

หากต้องการติดตามเมื่อมีการเพิ่มหรือนำอุปกรณ์ออกจากห้อง ให้ใช้การค้นหา devices() query

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

สมัครรับข้อมูลเหตุการณ์

ใน Home API ระบบจะใช้เหตุการณ์เพื่อตรวจหาการเปลี่ยนแปลงสถานะของอุปกรณ์

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