You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ThingsBoard规则链中通过JavaScript访问新遥测数据?

ThingsBoard规则链配置与设备授权过滤方案

一、解决遥测数据无法访问的问题

你当前用Attributes Updated连接类型是错误的,这个触发节点只响应属性更新事件,遥测数据变化需要用Post Telemetry触发:

  1. 调整规则链触发节点

    • 规则链起始添加Message Type Switch节点,勾选POST_TELEMETRY类型,将其连接到你的Script节点。
    • 移除原有的Attributes Updated节点(如果不需要处理属性更新)。
  2. 在Script节点中获取遥测数据
    遥测数据直接存储在msg对象中,可直接通过键名访问。示例脚本:

    // 获取my_value遥测值
    const myValue = msg.my_value;
    // 验证值是否为true,执行后续逻辑
    if (myValue === true) {
        // 将值存入元数据,供后续节点使用
        metadata.telemetryFlag = true;
        // 返回处理后的消息
        return {msg: msg, metadata: metadata, msgType: msgType};
    }
    // 若值不符合条件,可选择终止或跳过
    return null;
    
  3. 验证配置
    发送一条my_value: true的遥测数据到设备,查看规则链的节点执行日志,确认Script节点已正确读取到遥测值。

二、实现用户设备授权过滤流程

1. 主用户授权操作与遥测写入

步骤1:设备详情页添加授权控件

在设备详情页的仪表板中添加开关/复选框widget,绑定设备的服务器端属性(例如is_authorized),并配置控件触发时向规则链发送属性更新请求。

步骤2:规则链处理授权事件

  • 添加Attributes Updated节点,筛选设备的is_authorized属性变化事件。
  • 连接到Script节点,编写逻辑处理设备名的添加/移除:
    // 获取当前设备名称
    const deviceName = entityName;
    // 获取目标授权用户ID(可从控件请求的元数据中传递)
    const targetUserId = metadata.targetUserId;
    // 获取授权状态
    const isAuthorized = msg.is_authorized;
    
    // 准备用户遥测的设备列表(先获取用户现有遥测,避免重复)
    let authorizedDevices = metadata.existingAuthorizedDevices || [];
    if (isAuthorized) {
        // 避免重复添加
        if (!authorizedDevices.includes(deviceName)) {
            authorizedDevices.push(deviceName);
        }
    } else {
        // 移除设备
        authorizedDevices = authorizedDevices.filter(name => name !== deviceName);
    }
    
    // 构造更新用户遥测的消息
    msg = {authorized_devices: authorizedDevices};
    // 设置目标用户实体信息
    metadata.entityId = targetUserId;
    metadata.entityType = "USER";
    
    return {msg: msg, metadata: metadata, msgType: msgType};
    
  • 连接Entity Service节点,设置动作为POST_TELEMETRY,实体类型选择USER,实体ID从metadata.entityId读取,完成用户遥测的更新。

2. 普通用户设备列表过滤

在普通用户的仪表板中配置设备列表widget,添加自定义过滤条件:

  1. 打开设备列表widget的数据过滤设置,选择自定义JavaScript过滤。
  2. 输入过滤表达式:
    // 检查当前用户的authorized_devices遥测是否包含当前设备名称
    const userTelemetry = currentUserTelemetry['authorized_devices'] || [];
    return userTelemetry.includes(entityName);
    
  3. 保存配置后,用户将只能看到授权列表中的设备。

注意事项

  • 确保规则链拥有用户实体的遥写权限,否则无法更新用户遥测。
  • 处理设备列表时,要注意避免重复添加设备,可在Script节点中做去重处理。
  • 若需要批量授权,可修改控件为多选框,一次性传递多个设备名到规则链。

内容的提问来源于stack exchange,提问作者Foxbat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:52:42