结构 API

您可以通过 Home API 访问结构 API。将以下软件包导入您的应用:

import com.google.home.Home
import com.google.home.Id
import com.google.home.Structure

错误处理

Home API 中的任何方法都可能会抛出 HomeException,因此我们建议您使用 try-catch 块捕获所有调用的 HomeException

处理 HomeException 时,请检查其 codemessage 字段,了解问题所在。

任何未处理的异常都会导致应用崩溃。

如需了解详情,请参阅错误处理

示例调用

获取结构列表

初始化后,structures() 调用会返回可供您访问的结构体流:

// Get a flow of all structures accessible to the user
val allStructuresFlow: HomeObjectsFlow<Structure> = home.structures()

// Calling list() on a HomeObjectsFlow returns the first Set of elements.
val allStructures: Set<Structure> = allStructuresFlow.list()

structures() API 是一种流程,可能不会立即返回有效的结构列表。如果您的应用是响应式应用,并订阅该流以驱动界面,则最终应返回有效的结构列表。在其他情况下,系统也可能会返回空结构列表,例如,如果用户的手机连接中断或用户撤消了对应用的权限。您应务必在应用中处理这些情况。

或者,如果强烈需要使用命令式编程(而非响应式编程),则可以使用终端流操作符:

val everyStructure = withTimeout(5000) { home.structures().first { it.isNotEmpty() } }

此调用会等待通过流程传入有效的结构列表,如果未在应用指定的超时时间内收到列表,则会超时。

获取结构属性

有了结构列表,您就可以访问它们的属性:

// Get a flow on a structure. Flow emits new values on structure metadata changes: name.
val structureFlow: Flow<Structure> = home.structures().itemFlow(myStructureId)

// Get a snapshot of the structure.
val structure: Structure = structureFlow.first()

// Get structure properties
println("id ${structure.id}")
println("name ${structure.name}")

按名称查找结构

如果您知道结构的名称,也可以使用 name 属性访问它:

val myHome = home.structures().list().first { it.name == "My home" }

您可以通过该页面访问每个结构的房源、房间和设备。

处理多个结构

如需使用多个结构,请获取对每个结构的单独引用:

var structure1: Structure? = null
var structure2: Structure? = null

try {
  structure1 = home.structures().list().firstOrNull { it.name == "Main House" }
} catch (e: HomeException) {
  // Code for handling the exception
}
try {
  structure2 = home.structures().list().firstOrNull { it.name == "Guest Cottage" }
} catch (e: HomeException) {
  // Code for handling the exception
}

获取房间列表

有了结构后,您可以获取房间列表并访问相应房间的房源信息:

val allRoomsFlow: HomeObjectsFlow<Room> = structure.rooms()
val allRooms: Set<Room> = allRoomsFlow.list()
val room: Room = allRooms.first()

println("id ${room.id}")
println("name ${room.name}")

创建聊天室

如需创建新房间,请执行以下操作:

val testName = "Test Room Name"
val newRoom: Room = structure.createRoom(testName)

删除房间

或者,您也可以删除房间:

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

您也可以仅使用 ID 删除聊天室:

val roomToDelete1 = allRooms.filter { it.id == testRoomId }.firstOrNull()
structure.deleteRoom(roomToDelete1!!)

如果删除包含设备的房间,设备仍会保留在结构中,但不会再分配到房间。

将设备移至其他房间

创建结构后,您可以将设备移至该结构中的其他房间:

val room2 = structure.rooms().get(Id("room_id_other_structure"))
    val device1 = structure.devices().get(Id("device_id1"))
    structure.moveDevicesToRoom(room2!!, listOf(device1!!))

如果您只有设备 ID 和房间 ID,也可以通过以下方式移动设备:

structure.moveDevicesToRoom(Id("room_id_other_structure"), listOf(Id("device_id1")))

自动化操作

Automation API 的入口点是通过结构实现的。如需详细了解 Home API 中的自动化操作,请参阅设计自动化操作

API 列表

创建 Home 实例后,您可以通过该实例访问以下 Structure API:

API 说明
structures() 获取 Google 账号中的所有结构。返回一个 HomeObjectsFlow,用于提供进一步的检索和过滤选项。

获得 Structure 后,您可以通过它访问以下 API:

API 说明
automations() 列出属于该结构的所有自动化操作。系统只会返回通过 Home API 创建的自动化操作。
createAutomation(automation) 为结构创建自动化操作实例。
createRoom(name) 创建一个由用户指定名称的房间。
deleteAutomation(automationId) 根据 ID 删除自动化操作实例。
deleteRoom(roomId) 删除房间 ID 对应的房间。
devices() 获取结构中的所有设备。返回 HomeObjectsFlow
getAutomation(automationId) 根据 ID 获取自动化操作实例。
getSourceConnectivity(trait) 获取特定 trait 的元数据。返回 SourceConnectivity
has(trait) 检查设备是否支持当前请求的特征。
id 结构的唯一系统 ID。
moveDevicesToRoom(roomId, deviceIds) 将设备移至结构中的其他房间 ID。
name 结构的用户提供名称。
rooms() 获取结构中的所有房间。返回 HomeObjectsFlow
trait(trait) 获取 trait 属性的当前快照。

某些常见 API(例如 devices()idname)也适用于 Room