API cấu trúc trên iOS

Bạn có thể truy cập vào API cấu trúc thông qua API Home cho iOS.

Để làm việc với các API Cấu trúc, trước tiên, hãy nhập gói GoogleHomeSDK vào ứng dụng:

import GoogleHomeSDK

Xử lý lỗi

Một số phương thức trong API Home sẽ gửi một HomeError, vì vậy, bạn nên sử dụng khối do-catch để phát hiện HomeError trên các lệnh gọi đó.

Khi xử lý HomeError, hãy kiểm tra các trường codemessage để tìm hiểu xem đã xảy ra lỗi gì.

Mọi lỗi không được xử lý sẽ khiến ứng dụng của bạn gặp sự cố.

Để biết thêm thông tin, hãy xem phần Xử lý lỗi.

Structure API

Home đại diện cho biểu đồ Trang chủ và là điểm truy cập vào API Cấu trúc. Tệp này cung cấp thông tin tham chiếu đến các cấu trúc, phòng và thiết bị.

Structure đại diện cho một cấu trúc trong biểu đồ Trang chủ. Thư viện này cung cấp quyền truy cập vào siêu dữ liệu cấu trúc như idname.

Sử dụng structures() để lấy tất cả cấu trúc trong tài khoản của bạn. Các cấu trúc được trả về dưới dạng Query, cung cấp một số cách sử dụng dữ liệu của cấu trúc:

API Mô tả
stream() Trả về một Publisher phát ra từng đối tượng riêng lẻ khi có thay đổi.
batched() Trả về một Publisher phát ra kết quả hiện tại dưới dạng Set của các đối tượng. Mỗi Set được phát ra đại diện cho trạng thái hiện tại của biểu đồ đối tượng.
list() Trả về kết quả hiện tại dưới dạng Set của các đối tượng.

Lệnh gọi structures().list() có thể không trả về ngay một tập hợp cấu trúc hợp lệ. Nếu ứng dụng của bạn có tính phản ứng và gọi stream() để đăng ký tất cả các thay đổi về cấu trúc nhằm điều khiển giao diện người dùng, thì cuối cùng, một danh sách cấu trúc hợp lệ sẽ được trả về. Có những trường hợp khác mà danh sách cấu trúc trống có thể được trả về, chẳng hạn như nếu điện thoại của người dùng mất kết nối hoặc nếu người dùng đã thu hồi quyền cho ứng dụng của bạn. Bạn phải nhớ xử lý những trường hợp này trong ứng dụng.

@Published public private(set) var structures: [Structure] = []
private var structuresCancellable: AnyCancellable?

  self.structuresCancellable = home
    .structures()
    .batched()
    .receive(on: DispatchQueue.main)
    .map { Array($0) }
    .catch {
      Logger.error("Failed to load structures: \($0)")
      return Just([Structure]())
    }
    .assign(to: \.structures, on: self)

Lệnh gọi Cấu trúc mẫu

Nhận một tập hợp cấu trúc

Việc gọi list() trên Query<Structure> sẽ trả về Tập hợp các phần tử gần đây nhất:

// Get a stream of all structures accessible to the user
let allStructuresChanges = try await self.home.structures()
let allStructures = try? await allStructuresChanges.list()

Khi thiết kế một ứng dụng phản ứng, bạn nên sử dụng lệnh gọi batched()stream() thay vì list(), vì các lệnh gọi này sẽ tự động tạo dữ liệu khi biểu đồ trang chủ thay đổi.

Lấy thuộc tính cấu trúc

Khi có danh sách cấu trúc, bạn có thể truy cập vào các thuộc tính của các cấu trúc đó:

// Get a stream of changes taking place on a structure.
let structureChanges = try await home.structures().list().filter { $0.id == structureID }

// Get a snapshot of the structure.
let structure = try await structureChanges.first!

// Get structure properties
print("id \(structure.id) ")
print("name \(structure.name) ")

Tìm cấu trúc theo tên

Nếu biết tên của một cấu trúc, bạn cũng có thể truy cập vào cấu trúc đó bằng thuộc tính name:

do {
  structure1 = try await home.structures().list().first(where: { $0.name == "Main House" })
} catch let error as HomeError {
  // Code for handling the exception
}

Từ đó, bạn có thể truy cập vào các tài sản, phòng và thiết bị cho từng cấu trúc.

Làm việc với nhiều cấu trúc

Để sử dụng nhiều cấu trúc, hãy tham chiếu riêng đến từng cấu trúc:

var structure1: Structure!
var structure2: Structure!
do {
  structure1 = try await home.structures().list().first(where: { $0.name == "Main House" })
} catch let error as HomeError {
  // Code for handling the exception
}
do {
  structure2 = try await home.structures().list().first(where: { $0.name == "Guest Cottage" })
} catch let error as HomeError {
  // Code for handling the exception
}

Rooms

Một phòng chứa một nhóm thiết bị. Một phòng luôn là một phần của cấu trúc và một cấu trúc có thể có nhiều phòng. Việc xoá một phòng khỏi cấu trúc sẽ không xoá các thiết bị trong phòng đó khỏi cấu trúc. Tuy nhiên, nếu phòng đó bị xoá, các thiết bị trong phòng đó sẽ không được chỉ định.

Sử dụng Home.rooms() để truy xuất tất cả các phòng trong tài khoản, sau đó sử dụng roomID = device.roomID để hiển thị các thiết bị tương ứng trong mỗi phòng.

self.home.rooms().batched()
  .combineLatest(self.home.devices().batched())
  .receive(on: DispatchQueue.main)
  .catch { error in
    Logger.error("Failed to load rooms and devices: \(error)")
    return Just((Set<Room>(), Set<HomeDevice>()))
  }
  .map { rooms, devices in
    var devicesByRoom = [Room: [HomeDevice]]()
    for room in rooms where room.structureID == currentStructureID {
      devicesByRoom[room] = devices.filter { $0.roomID == room.id }
    }
    return devicesByRoom
  }.assign(to: &self.$devicesByRoom)

Lệnh gọi Room mẫu

Lấy danh sách phòng

Khi sử dụng lớp Home, bạn có thể lấy danh sách phòng và truy cập vào các thuộc tính của các phòng đó:

let allRoomsChanges = self.home.rooms()
let allRooms = try await allRoomsChanges.list()
let room = allRooms.first!
XCTAssertTrue(allRooms.contains(room))

print("id \(room.id) ")
print("name \(room.name) ")

Tạo một phòng

Cách tạo phòng mới trong Structure:

let testName = "Test Room Name"
var newRoom: Room!
do {
  newRoom = try await structure.createRoom(name: testName)
  XCTAssertNotNil(newRoom)
} catch let error as HomeError {
  // Code for handling the exception
}

Xoá phòng

Ngoài ra, bạn có thể xoá phòng theo cách sau:

val roomToDelete = structure.rooms().list().filter { it.name == "room_id1" }.firstOrNull()
    structure.deleteRoom(roomToDelete!!)

Bạn cũng có thể xoá phòng bằng mã phòng:

let roomToDelete = allRooms.first(where: { $0.id == room.id })
if let roomToDelete1 = roomToDelete {
  do {
    try await structure.deleteRoom(roomToDelete1)
  } catch let error as HomeError {
    // Code for handling the exception
  }
}

Nếu bạn xoá một phòng có thiết bị, thì các thiết bị đó vẫn sẽ nằm trong cấu trúc nhưng không còn được chỉ định cho phòng nào nữa.

Chuyển thiết bị sang một phòng khác

Structure cũng cho phép bạn di chuyển một thiết bị sang một phòng khác:

do {
  try await structure.move(device: light, to: room)
} catch let error as HomeError {
  // Code for handling the exception
}

Thay đổi tên phòng

Gọi phương thức setName(_:) để thay đổi tên của một phòng:

let updatedRoom = try await theRoom.setName("new room name")

Khi thay đổi tên của một phòng, cấu trúc Room ban đầu vẫn giữ nguyên và thay đổi được phản ánh trong đối tượng Room đã cập nhật được trả về.

Danh sách API

Sau khi tạo một thực thể của Home, bạn có thể truy cập vào các API Cấu trúc sau thông qua thực thể đó:

API Mô tả
devices() Cho phép tài khoản này xem tất cả thiết bị.
device(id:) Nhận Publisher cho một thiết bị cụ thể phát ra trạng thái hiện tại và phát lại trên mọi bản cập nhật trạng thái trong tương lai.
structures() Lấy tất cả cấu trúc trên Tài khoản Google. Trả về một Query<Structure> cung cấp các tuỳ chọn truy xuất và lọc khác.
structure(id:) Lấy cấu trúc có mã nhận dạng khớp.
rooms() Lấy tất cả phòng trên Tài khoản Google. Trả về một Query<strRoom> cung cấp các tuỳ chọn truy xuất và lọc khác.
room(id:) Nhận Publisher cho một phòng cụ thể phát ra trạng thái hiện tại và phát lại trong mọi bản cập nhật trạng thái trong tương lai.

Structure có các API sau:

API Mô tả
deleteRoom(id:) Xoá phòng có mã phòng.
id Mã nhận dạng hệ thống duy nhất của cấu trúc.
move(device:, to:) Di chuyển một thiết bị sang một phòng khác trong cấu trúc.
move(device:, to:) Di chuyển thiết bị có mã nhận dạng đã cho đến phòng có mã nhận dạng đã cho.
move(devices:, to:) Di chuyển các thiết bị đã cho đến phòng đã cho.
move(devices:, to:) Di chuyển các thiết bị có mã nhận dạng đã cho vào phòng có mã nhận dạng đã cho.
name Tên do người dùng cung cấp cho cấu trúc.

Room có các API sau:

API Mô tả
id Mã nhận dạng hệ thống duy nhất của phòng.
name Tên phòng do người dùng cung cấp.
structureID Mã nhận dạng hệ thống duy nhất của cấu trúc mà phòng thuộc về.