关于在Thingsboard仪表盘添加可写入PostgreSQL的评论字段的咨询
在Thingsboard仪表盘中添加评论输入并写入PostgreSQL的解决方案
为什么Input Widget直接用不了
Input Widget的核心作用是向Thingsboard实体发送属性/遥测数据,本身不支持直接写入外部PostgreSQL数据库,所以需要通过规则链中转或自定义小部件结合API来实现需求。
方法一:通过Thingsboard规则链中转写入PostgreSQL
这是更贴合Thingsboard原生生态的方案,无需额外开发外部服务:
- 创建实体自定义属性
在目标传感器实体(或仪表板关联的实体)中,新增一个字符串类型的自定义属性(比如命名为comment),用来临时存储输入的评论内容。 - 重新配置Input Widget
编辑Input Widget,选择「发送到实体属性」模式,目标实体选你的传感器,属性键填刚才创建的comment;设置输入类型为多行文本,开启提交按钮触发发送。 - 配置规则链处理写入逻辑
- 进入规则链页面,新建或修改现有规则链,添加「实体属性更新节点」,过滤触发源为
comment属性的更新事件。 - 添加「脚本节点」,提取评论内容、传感器ID、时间戳等字段,构造SQL插入参数,示例脚本:
var comment = msg.comment; var sensorId = metadata.entityId; var ts = new Date().toISOString(); return { msg: {sensorId: sensorId, comment: comment, ts: ts}, metadata: metadata, msgType: msgType }; - 添加「PostgreSQL节点」,配置数据库连接信息(地址、用户名、密码、库名),编写插入SQL:
INSERT INTO sensor_comments (sensor_id, comment_content, create_time) VALUES ('${msg.sensorId}', '${msg.comment}', '${msg.ts}') - 依次连接各节点,确保属性更新事件能触发SQL插入操作。
- 进入规则链页面,新建或修改现有规则链,添加「实体属性更新节点」,过滤触发源为
方法二:自定义HTML小部件+API直接写入
如果需要更灵活的交互逻辑,可以用自定义HTML小部件结合自研API:
- 在PostgreSQL中创建评论表
先手动建表存储评论数据:CREATE TABLE sensor_comments ( id SERIAL PRIMARY KEY, sensor_id VARCHAR(64) NOT NULL, comment TEXT NOT NULL, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); - 编写自定义HTML小部件
在仪表盘中添加「HTML小部件」,写入以下代码(需自行实现后端API):
注:需确保自研API能处理Thingsboard的JWT认证,且配置了跨域支持(如果API和Thingsboard不同域)。<div style="padding: 10px;"> <textarea id="commentInput" rows="4" placeholder="输入评论..." style="width: 100%; margin-bottom: 8px;"></textarea> <button onclick="submitComment()" style="padding: 6px 12px;">提交评论</button> </div> <script> // 获取当前仪表板关联的传感器ID const targetSensorId = entityId; function submitComment() { const commentContent = document.getElementById('commentInput').value.trim(); if (!commentContent) return; // 调用自研API写入PostgreSQL fetch('/your-custom-api/sensor/comments', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Authorization': 'Bearer ' + localStorage.getItem('jwt_token') }, body: JSON.stringify({ sensorId: targetSensorId, comment: commentContent }) }).then(res => { if (res.ok) { document.getElementById('commentInput').value = ''; alert('评论提交成功'); } else { alert('提交失败,请重试'); } }).catch(err => console.error(err)); } </script>
排查Input Widget失败的常见问题
- 目标实体选择错误:Widget的目标实体需设置为传感器实体,而非仪表板本身。
- 权限不足:当前登录用户没有该实体的
WRITE_ATTRIBUTES权限,需在角色配置中开启。 - 属性未提前创建:没有在实体上预定义
comment属性,导致数据发送失败。
内容的提问来源于stack exchange,提问作者Brell
相关产品推荐
相关产品推荐

