Page 1 of 1

关于拦截器的使用,想要请教一下

Posted: 2025年 Dec 17日 18:08
by a93749

关于拦截器的使用,想要请教一下

(问题描述(复现步骤):实现了一个拦截器,然后设置了dp点 synchronizeDevProperty:true,保存在云端,但是每次重启面板,面板好像不会以保存在云端的数据启动,不清楚如何查看下发dp点后,保存云端怎么样才算成功.

预期结果:给低功耗设备下发dp点之后,重启面板,面板能以下发的数据显示

实际结果:给低功耗设备下发dp点之后,重启面板,面板任然以低功耗上一次上报的数据显示)

Code: Select all

 const structuredProps = useStructuredProps(state => ({
    debugInfo: state.debug_raw,
  }));

  // 获取配置参数(需要立即下发的)
  const configProps = useProps(state => ({
    far_detection: state.far_detection,
    r1threshold: state.r1th,
    r2threshold: state.r2th,
    r3threshold: state.r3th,
    mr1threshold: state.mr1th,
    mr2threshold: state.mr2th,
    mr3threshold: state.mr3th,
    lowpower: state.low_power_switch,
    battery: state.battery_percentage,
    presence: state.presence_state,
  }));

我拦截器是只对调试信息做复杂协议解析,其他的dp点都是useProps获取的,设置了立即下发,忽略上报,保存云端

Code: Select all

VM65 dev-tools.js:1 [DEVTOOLS] The current debugging basic library version is 2.30.2
service.js:5 [audit-tool] Enabling experience rating...
service.js:5 [audit-tool] Watching experience rating end. undefined
app.tsx:20 === App did mount
composeLayout.tsx:24 === App onLaunch {path: 'pages/home/index', apiCategory: 'default', query: {…}}
redux-logger.js:1  action systemInfo/initializeSystemInfo @ 17:59:55.527 (in 0.20 ms)
redux-logger.js:1  action theme/updateThemeType @ 17:59:55.528 (in 0.20 ms)
service.socket.js:1 [webshell] socket connected service
index.ts:76 Parsed Radar Data: {mr1th: 6, mr2th: 4, mr3th: 3, r1th: 8, r2th: 6, …}
view.js:5 [View] [system] [Library] Page First Render Time: 572ms
view.js:5 [View] [system] [Library] Page FMP Time: 646ms
index.tsx:448 缓存的指令: (10) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
index.tsx:442 低功耗状态: true
log.js:54 [2025/12/17 18:00:44.742] [INFO] SDM#publishDps by dp-kit: "data publish Object with Object"
log.js:54 [2025/12/17 18:00:44.745] [WARN] SDM#onDpDataChange by dp-kit: "data report Object from dp-kit"
log.js:54 [2025/12/17 18:00:44.746] [INFO] SDM#onDpDataChange by dp-kit: "[ignoreDpChangeInterceptor] ignore dp report has been enabled, trigger immediately."
log.js:54 [2025/12/17 18:00:46.268] [INFO] SDM#publishDps by dp-kit: "data publish Object with Object"
log.js:54 [2025/12/17 18:00:46.269] [WARN] SDM#onDpDataChange by dp-kit: "data report Object from dp-kit"
log.js:54 [2025/12/17 18:00:46.269] [INFO] SDM#onDpDataChange by dp-kit: "[ignoreDpChangeInterceptor] ignore dp report has been enabled, trigger immediately."
  • 相关代码:

    Code: Select all

    export const dpKit = createDpKit<SmartDeviceSchema>({
      protocols: protocols as any, 
      sendDpOption: {
        immediate: true,
        checkRepeat: true,
        ignoreDpDataResponse:{
          whiteDpCodes: ['debug_raw'],
          debug: true,      
    }, synchronizeDevProperty:true, },
    }); const deviceOptions = { interceptors: dpKit.interceptors, } as SmartDeviceModel<SmartDeviceSchema>['options'];
    下面是发dp点的代码

    Code: Select all

    const ConfigCard = ({ dpCode, label, unit = '' }) => {
      const actions = useActions();
      const dpValue = useProps((state) => state[dpCode]);
      const dpSchema = useDpSchema();
      const lastChangeRef = useRef(Date.now());
    
      const handleChange = (value: number) => {
        const now = Date.now();
    
    // 防抖:300ms内只发一次
    if (now - lastChangeRef.current < 300) return;
    lastChangeRef.current = now;
    
    // 立即下发
    actions[dpCode].set(value);
    
    // 记录到云端缓存
    addCommand(
      getLaunchOptionsSync().query.deviceId,
      JSON.stringify({ [dpCode]: value }),
      Date.now()
    );
      };
    
      return (
        <View className={styles.configCard}>
          <Text className={styles.configLabel}>
            {label}: {dpValue || 0}{unit}
          </Text>
          <Slider
            max={dpSchema[dpCode]?.property?.max || 1000}
            min={dpSchema[dpCode]?.property?.min || 0}
            value={dpValue || 0}
            step={dpSchema[dpCode]?.property?.step || 1}
            onChange={(event) => handleChange(event.detail.value)}
            activeColor="#00e5ff"
          />
        </View>
      );
    };


    Tuya MiniApp IDE 版本信息:0.10.4

    App 应用版本信息:智能生活7.0.0
    @ray-js/ray, @ray-js/panel-sdk的版本 "@ray-js/ray": "1.7.56", "@ray-js/panel-sdk": "1.13.1"

Re: 关于拦截器的使用,想要请教一下

Posted: 2025年 Dec 17日 19:10
by muhai

安装 @ray-js/panel-sdk@1.14.1 试下


Re: 关于拦截器的使用,想要请教一下

Posted: 2025年 Dec 18日 09:59
by a93749
muhai 2025年 Dec 17日 19:10

安装 @ray-js/panel-sdk@1.14.1 试下

安装了这个版本,但好像没什么变化,我今天再仔细看看相关代码,前两天没搞清楚这个究竟是怎么起作用的


Re: 关于拦截器的使用,想要请教一下

Posted: 2025年 Dec 18日 10:13
by a93749
muhai 2025年 Dec 17日 19:10

安装 @ray-js/panel-sdk@1.14.1 试下

拦截器是不是要配合useStructuredActions使用不能再使用useActions这个hook了?


Re: 关于拦截器的使用,想要请教一下

Posted: 2025年 Dec 18日 10:16
by muhai
a93749 2025年 Dec 18日 10:13
muhai 2025年 Dec 17日 19:10

安装 @ray-js/panel-sdk@1.14.1 试下

拦截器是不是要配合useStructuredActions使用不能再使用useActions这个hook了?

不是,都可以用的,如果你配置了 dp-kit 的 protocol,那就用useStructuredActions会自动根据 protocol解析raw型dp,如果用useActions取得是原始的raw字符串


Re: 关于拦截器的使用,想要请教一下

Posted: 2025年 Dec 18日 10:20
by a93749
muhai 2025年 Dec 18日 10:16
a93749 2025年 Dec 18日 10:13
muhai 2025年 Dec 17日 19:10

安装 @ray-js/panel-sdk@1.14.1 试下

拦截器是不是要配合useStructuredActions使用不能再使用useActions这个hook了?

不是,都可以用的,如果你配置了 dp-kit 的 protocol,那就用useStructuredActions会自动根据 protocol解析raw型dp,如果用useActions取得是原始的raw字符串

useActions会根据拦截器设置 sendDpOption: { synchronizeDevProperty:true} 将下发dp点保存在云端吗 已经配置了相关dp点的忽略上报


Re: 关于拦截器的使用,想要请教一下

Posted: 2025年 Dec 18日 14:03
by muhai
a93749 2025年 Dec 18日 10:20
muhai 2025年 Dec 18日 10:16
a93749 2025年 Dec 18日 10:13

拦截器是不是要配合useStructuredActions使用不能再使用useActions这个hook了?

不是,都可以用的,如果你配置了 dp-kit 的 protocol,那就用useStructuredActions会自动根据 protocol解析raw型dp,如果用useActions取得是原始的raw字符串

useActions会根据拦截器设置 sendDpOption: { synchronizeDevProperty:true} 将下发dp点保存在云端吗 已经配置了相关dp点的忽略上报

会的,你在IDE里看下,下发dp的时候,network中是否有调用s.m.dev.property.save接口的日志


Re: 关于拦截器的使用,想要请教一下

Posted: 2025年 Dec 18日 14:04
by muhai
截屏2025-12-18 14.03.55.png

可以试试IDE里的这个模版,是内置支持的


Re: 关于拦截器的使用,想要请教一下

Posted: 2025年 Dec 18日 14:18
by a93749
muhai 2025年 Dec 18日 10:16
a93749 2025年 Dec 18日 10:13
muhai 2025年 Dec 17日 19:10

安装 @ray-js/panel-sdk@1.14.1 试下

拦截器是不是要配合useStructuredActions使用不能再使用useActions这个hook了?

不是,都可以用的,如果你配置了 dp-kit 的 protocol,那就用useStructuredActions会自动根据 protocol解析raw型dp,如果用useActions取得是原始的raw字符串

synchronizeDevProperty: true, // 目前测试发现❌ 仅布尔值可能不生效 ,需要写入defaultState:{}