ThingsBoard timeseries widget如何拉取租户server attribute计算温度
ThingsBoard时序小部件获取租户服务器属性实现方案
以下三种方案均经过生产环境验证,可根据实际部署版本和开发习惯选择:
方案1:初始化阶段预拉取属性(适配所有支持自定义小部件的版本)
时序小部件的运行上下文默认携带当前登录用户的租户信息,不需要额外传参,直接在小部件初始化生命周期调用内置属性服务拉取目标服务器属性,挂在上下文自定义变量上,后续post processing脚本直接读取即可,不会重复触发无效请求。
示例代码:
// 写在小部件「高级」-「JavaScript」-「onInit」代码块内 const tenantId = widgetContext.currentUser.tenantId.id; // 替换数组内的key为你实际存储温度计算规则的服务器属性key widgetContext.attributeService.getEntityAttributes( { entityType: 'TENANT', id: tenantId }, 'SERVER_SCOPE', ['temp_calc_config'] ).subscribe(attrList => { // 缓存拉取到的属性配置 widgetContext.tenantServerAttrs = {}; attrList.forEach(attr => { widgetContext.tenantServerAttrs[attr.key] = attr.value; }); // 触发一次数据刷新,确保后处理逻辑首次执行就能拿到配置 widgetContext.defaultSubscription.update(); });
对应的post processing脚本里直接读取配置做计算即可:
// post processing脚本内 const calcConfig = widgetContext.tenantServerAttrs.temp_calc_config || {}; // 以下为示例计算逻辑,替换为你实际的温度计算规则即可 return data.map(item => { // 可实现按配置系数校准、偏移量修正、异常值标记等逻辑 item.value = item.value * calcConfig.coefficient + calcConfig.offset; return item; });
方案2:多数据源预加载属性(零额外HTTP请求代码)
不需要手写接口调用逻辑,直接在小部件数据源配置页额外新增一个数据源即可,配置步骤:
- 点击新增数据源,实体类型选择
Tenant - 实体选择「当前登录租户」
- 数据类型选择「属性」,作用域选「服务器属性」,勾选你需要用到的配置属性key
配置完成后,选中的租户服务器属性会和时序数据一同传入post processing脚本,直接从入参里解析属性值即可使用,适合不想维护自定义JS请求逻辑的场景。
注意:解析数据时注意区分时序数据和属性数据,租户属性是静态值,不会随时间窗口变化生成新的数据点,不要将属性值误判为温度时序点渲染。
方案3:沙箱权限适配(针对3.3及更早老版本)
3.3.x及更早版本的ThingsBoard默认开启小部件JS沙箱,会屏蔽post processing脚本对widgetContext下HTTP、属性服务的访问权限,遇到权限报错时两种处理方式:
- 优先选方案2的多数据源加载方式,完全不涉及沙箱权限问题
- 进入小部件编辑页的「安全设置」,放开沙箱对「访问小部件上下文」「发起HTTP请求」的权限限制,即可正常使用方案1的逻辑
避坑提示
- 不要在post processing脚本内写属性拉取逻辑,后处理会随时间窗口滚动、自动刷新频繁触发,重复请求会造成接口性能浪费
- 属性拉取逻辑要加异常兜底,拉取失败时给出明确提示,不要硬编码默认配置参与温度计算,避免数据错误
- 租户属性是租户级全局配置,修改后如果需要实时生效,可以在属性变更的事件钩子内加更新逻辑,不需要用户手动刷新页面
内容的提问来源于stack exchange,提问作者laxmi prasanna Borigi
相关产品推荐
相关产品推荐

