4. 设备属性更新触发动作
任务说明
本案例实现:当设备上报客户端属性更新时,ThingsBoard规则链自动捕获该事件,并触发两类动作——向设备下发RPC请求,以及发送通知邮件。你需要准备一个已注册的设备,并具备可用的SMTP邮箱配置。
实现路径
整体方案分为三步:首先在规则链中创建“属性更新”消息过滤器;其次添加“RPC下发”与“发送邮件”两个动作节点;最后通过设备SDK上报属性变更来验证链路是否生效。核心逻辑全部在ThingsBoard规则引擎中完成,无需编写后端代码。
规则链配置
进入规则链 → 新建规则链,命名为“属性更新触发动作”。添加以下节点并连线:
节点详细配置
① 过滤器节点(类型:message type filter)
// 消息类型筛选
ATTRIBUTES_UPDATED
② RPC请求节点(类型:rpc call request)
// 节点配置JSON
{
"timeout": 5000,
"method": "getStatus",
"params": "{\"requestId\": ${msg.metadata.requestId}}"
}
③ 发送邮件节点(类型:send email)
// 节点配置JSON
{
"from": "${smtpUsername}",
"to": "admin@example.com",
"subject": "设备属性更新通知",
"body": "设备 ${metadata.deviceName} 更新属性: ${msg.data}"
}
设备端模拟代码
使用Python + paho-mqtt模拟设备上报属性更新:
import paho.mqtt.client as mqtt
import json, time, random
BROKER = "your-thingsboard-host"
ACCESS_ = "YOUR_DEVICE_"
client = mqtt.Client()
client.username_pw_set(ACCESS_)
client.connect(BROKER, 1883, 60)
client.loop_start()
# 上报客户端属性
attributes = {
"temperature": round(random.uniform(20.0, 30.0), 2),
"humidity": round(random.uniform(40.0, 60.0), 2),
"timestamp": int(time.time())
}
client.publish("v1/devices/me/attributes", json.dumps(attributes), qos=1)
print("已上报属性:", attributes)
time.sleep(2)
# 订阅RPC响应
def on_message(client, userdata, msg):
print("收到RPC响应:", msg.payload.decode())
client.subscribe("v1/devices/me/rpc/response/+")
client.on_message = on_message
time.sleep(5)
client.loop_stop()
验证方法与判定标准
验证步骤:
- 在ThingsBoard中打开该规则链,点击“将此规则链设为根规则链”,或通过“设备 → 管理规则链”将设备关联到该链;
- 运行上述Python脚本,观察控制台输出“已上报属性”;
- 检查规则链节点右上角“成功”计数是否增加;
- 查看设备“最新遥测”中是否出现temperature/humidity值;
- 登录配置的收件邮箱,查看是否收到主题为“设备属性更新通知”的邮件。
判定标准:
- 规则链中“属性更新过滤器”成功计数≥1,且“RPC请求节点”与“发送邮件节点”的成功计数均≥1,表示链路完整触发;
- 设备端Python脚本能打印出RPC响应(如
{"success": true}),证明RPC请求已下发并收到设备回复; - 指定邮箱收到包含设备名称和属性数据的邮件,证明邮件动作生效。
若RPC节点失败,检查设备是否在线且已订阅RPC响应主题;若邮件未收到,检查SMTP配置及邮箱垃圾箱。