ตรวจสอบสถานะอุปกรณ์ใน 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)")
    }
  }

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

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

ใช้อุปกรณ์ประเภทใดก็ได้ที่ MatterHome 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() คำค้นหา

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