createDpKit(option?: CreateDpKitOptions)

版本要求:
@ray-js/panel-sdk≥1.7.0

描述

创建 DP 协议套件,提供功能点的结构化解析、下发拦截、节流/防抖等增强能力

参数

参数类型必填说明
否dp-kit 配置选项

返回值

类型:CreateDpKitResult
dp-kit 实例,包含 init、interceptors、destroy 等方法

引用对象

typeCreateDpKitResultcreateDpKit 的返回结果,包含一组可直接挂到 SmartDeviceModel 的拦截器, 以及初始化结构化 DP 状态所需的 `init` / `destroy` 生命周期方法。
属性类型描述
init(device: any) => void初始化设备状态,在需要搭配 useStructuredProps 时须在设备模型初始化完毕后调用
interceptorsRecord<string, any>dp-kit 默认拦截器配置
onDeviceInfoUpdated(ctx: any) => (next: (data: any) => any) => (data: any) => anydp-kit onDeviceInfoUpdated 拦截器,如需单独搭配使用时可考虑
onDpDataChange(ctx: any) => (next: (data: any) => any) => (data: any) => anydp-kit onDpDataChange 拦截器,如需单独搭配使用时可考虑
publishDps(ctx: any) => (next: (dpState: Record<string, any>, options?: SendDpOption) => any) => (dpState: Record<string, any>, options?: SendDpOption) => anydp-kit publishDps 拦截器,如需单独搭配使用时可考虑
destroy() => void销毁 dp-kit,清理 flush 定时器、节流和防抖映射等资源。
应在 SmartDeviceModel 销毁时调用(如 SdmProvider 的 useEffect cleanup 中)
typeDpValue功能点值类型,可能为 boolean、number、string
export type DpValue = boolean | number | string;

示例代码

基础用法

import { SmartDeviceModel, createDpKit } from '@ray-js/panel-sdk';

const schema = [
  { code: 'switch_1', type: 'bool' },
  { code: 'colour_data', type: 'raw' },
] as const;

const dpKit = createDpKit<typeof schema>({
  protocols: {
    colour_data: {
      parser: raw => JSON.parse(raw),
      formatter: structured => JSON.stringify(structured),
    },
  },
});

const sdm = new SmartDeviceModel<typeof schema>({
  interceptors: dpKit.interceptors,
});

await sdm.init();
dpKit.init(sdm);

带协议解析和节流

const dpKit = createDpKit<typeof schema>({
  protocols: {
    colour_data: {
      parser: raw => JSON.parse(raw),
      formatter: value => JSON.stringify(value),
    },
  },
  sendDpOption: {
    throttle: 300,
  },
});

const device = new SmartDeviceModel<typeof schema>({
  interceptors: dpKit.interceptors,
});

await device.init();
dpKit.init(device);

// 后续所有下发都会继承 300ms 节流
await device.publishDps({
  colour_data: { hue: 240, saturation: 1000, value: 1000 },
});

忽略设备上报响应

const dpKit = createDpKit<typeof schema>({
  sendDpOption: {
    immediate: true,
    ignoreDpDataResponse: {
      timeout: 5000,
      whiteDpCodes: ['switch_1'],
    },
  },
});

const device = new SmartDeviceModel<typeof schema>({
  interceptors: dpKit.interceptors,
});

搭配 hooks 使用

import { useStructuredActions, useStructuredProps } from '@ray-js/panel-sdk';

const colour = useStructuredProps(props => props.colour_data);
const actions = useStructuredActions();

actions.colour_data.set({
  hue: colour.hue,
  saturation: colour.saturation,
  value: 800,
});