---
name: "SmartDevicesManager"
mode: "api"
versionRequirements:
  - { name: "@ray-js/panel-sdk", version: "1.16.0" }
title: "constructor"
summary: "多设备管理器 SmartDevicesManager 的构造说明，介绍其如何统一管理多台设备实例、全局事件路由、状态缓存以及 add、batchAdd、delete 等操作。"
---

## SmartDevicesManager

> [VERSION] @ray-js/panel-sdk >= 1.16.0

### 描述

多设备管理器：统一管理多个设备实例，负责批量初始化、全局事件路由、全局状态缓存，以及 add / batchAdd / delete 等标准化操作。 构造器本身零副作用，不会注册任何全局监听。

### 参数

`Params`

| 参数 | 类型 | 必填 | 描述 |
| --- | --- | --- | --- |
| `options` | `{ logConfig?: LogConfig }` | 否 | 配置选项 |

### 返回值

类型: `SmartDevicesManager`

SmartDevicesManager 实例

#### 方法

| 方法名 | 说明 |
| --- | --- |
| `init` | 开始监听全局事件（Ray 全局 DP/上下线等），幂等调用。 |
| `on` | 订阅多设备管理器变更事件。 SdmProvider 内部已通过 change 事件驱动多设备 Hooks 刷新；常规业务通常无需手动监听。 仅在 Provider 外部监听设备状态变化（如全局日志、非 React 组件等场景）时使用。 |
| `off` | 取消订阅多设备管理器变更事件。 需传入与 on 时相同的事件名和回调引用。 |
| `add` | 添加单个设备实例并完成初始化。 若尚未 init() 会先自动 init()，保证向后兼容。 常见场景是动态添加单台关联设备；若 deviceId 已存在则抛出错误。 |
| `batchAdd` | 批量向多设备管理器中添加设备实例。内部会先批量拉取设备信息（单次网络请求），再按 concurrency 并发初始化，支持部分失败并在返回结果中区分成功与失败列表。 每台设备都可独立配置 interceptors 与 logConfig。 |
| `delete` | 删除设备实例。 从多设备管理器中删除指定 key 对应的设备实例，自动调用该实例的 destroy() 并清理内部映射。 |
| `batchDelete` | 批量删除多设备管理器中指定 key 列表对应的设备实例，内部对每个 key 依次调用 delete({ key })，自动触发实例销毁与内部映射清理。 |
| `getDevices` | 获取所有已注册设备实例的浅拷贝，以 key 为索引。 常用于需要直接操作设备实例而非通过 Hooks 的场景，例如在事件回调中遍历所有设备。 |
| `isAllInitialized` | 检查所有已添加设备是否已初始化完成。 |
| `destroy` | 销毁多设备管理器：注销所有全局事件监听器、移除全部 change 事件订阅、销毁并清理所有设备实例与内部映射。 |

### 引用对象

##### `type` LogConfig

日志配置

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `level` | `"VERBOSE" \| "SUCCESS" \| "INFO" \| "WARN" \| "FATAL"` | 日志输出级别，默认 INFO，如果想要默认去掉每次 DP 点下发上报打印的信息时，可配置为 WARN 级别以上 |


### 示例代码

#### 创建多设备管理器

```ts
const manager = new SmartDevicesManager();
manager.init();
manager.add({ key: 'lamp1', deviceId: '1234567890' });
manager.add({ key: 'lamp2', deviceId: '1234567891' });
```
