属性下发规则
属性下发规则
提示
如果您还不了解什么是 ThingsCloud 消息规则,以及消息规则的创建方法,请浏览 消息规则基础。
什么是属性下发规则
属性下发规则 是 ThingsCloud 消息规则的一种。当云平台向设备端下发属性后,会触发该规则。该规则常用于在属性下发后,自动生成自定义数据下发,将平台的标准属性下发转换为设备能够识别的私有协议报文。
在实际物联网项目中,有些设备不直接接收平台的标准 JSON 属性下发格式,而是需要特定的二进制、文本或 JSON 指令。例如:
- 将开关量属性下发自动转换为 Modbus RTU 指令
- 将温度设置值转换为自定义 HEX 报文
- 将属性下发转换为模块 AT 指令
- 将属性下发转换为设备自定义的 JSON 控制指令
通过属性下发规则,可以在平台下发属性的同时,自动生成并下发对应的自定义数据消息,无需修改设备端协议。
提示
对于将开关量属性自动转换为 Modbus RTU 指令的场景,还可以使用更加快捷的 属性智能转换 功能。详细介绍请浏览 Modbus 寄存器设置 和 Modbus 云网关。
下图展示了该规则的触发位置:
提示
如果您还不了解 ThingsCloud 设备属性下发的通信规范,请浏览 设备属性。
触发的条件
属性下发规则需要同时满足以下条件才会触发:
- 平台已向设备下发属性:通过控制台、可视化看板、App 或 API 等方式,成功触发向设备下发属性的操作。
- 已创建属性下发规则:在该设备或其所属设备类型下,已创建了属性下发规则。
需要特别说明的是:
- 对于同一设备同一则下发消息,平台仅会触发一条属性下发规则。如果需要执行自定义数据下发操作,需要将该操作配置在同一条规则中。
- 在同一条规则内部,同类型操作无论配置多少个,都只会执行一个。
支持的操作
属性下发规则目前支持以下操作:
| 操作名称 | 介绍信息 |
|---|---|
| 自定义数据下发函数 | 编写 Javascript 云函数,在属性下发后动态生成自定义数据下发消息。 |
自定义数据下发函数
该操作用于在属性下发后,自动生成自定义数据下发。可通过云函数动态生成自定义数据下发的消息内容。

选项
- 云函数:动态生成下发的自定义数据消息。
- 推送方式:选择设备接入平台使用的协议,可选 MQTT 或 TCP。
- 自定义数据流:选择设备通过哪个自定义数据流接收消息,请填写在设备类型中已创建的自定义数据流标识符。
云函数参数
push_attributes:设备下发的属性集合,作为参数传入函数。
云函数返回值
object:构造下发自定义数据的消息。null:表示不下发自定义数据到设备。
下发自定义数据的消息 object 格式,根据自定义数据流的数据格式不同,分为以下几种:
HEX数据格式:
{
"type": "hex",
"msg": "02030010000185FC"
}
生成以上的自定义数据消息,云函数如下:
module.exports = function (push_attributes) {
/**
* push_attributes: 下发的属性对象,作为函数参数传入。
* data: 构造下发的自定义数据对象,下发到硬件。
*/
var data = {
"type": "hex",
"msg": "02030010000185FC"
}
return data;
}
Plaintext文本格式
{
"type": "text",
"msg": "location,1,5,6,0"
}
生成以上的自定义数据消息,云函数如下:
module.exports = function (push_attributes) {
/**
* push_attributes: 下发的属性对象,作为函数参数传入。
* data: 构造下发的自定义数据对象,下发到硬件。
*/
var data = {
"type": "text",
"msg": "location,1,5,6,0"
}
return data;
}
JSON格式
{
"type": "json",
"msg": {
"command": "openLock",
"led": "ON",
"stat": "011001"
}
}
生成以上的自定义数据消息,云函数如下:
module.exports = function (push_attributes) {
/**
* push_attributes: 下发的属性对象,作为函数参数传入。
* data: 构造下发的自定义数据对象,下发到硬件。
*/
var data = {
"type": "json",
"msg": {
"command": "openLock",
"led": "ON",
"stat": "011001"
}
}
return data;
}
示例:将开关量属性下发自动转为 Modbus RTU 06 指令
客户在项目中遇到个别 RS485 继电器不支持标准的 05 功能码(写线圈寄存器)下发控制,而是采用了 06 功能码(写入保持寄存器),这种情况下,无法直接利用平台 Modbus 智能转换来下发控制,可以创建属性下发规则,选择自定义数据下发函数操作,编写一个简单的规则云函数,如下:
function relay2Modbus06(data, addr, bool) {
if (bool === true) {
data.msg = Cloud.ModbusRTU.writeRegister(addr, 1);
} else if (bool === false) {
data.msg = Cloud.ModbusRTU.writeRegister(addr, 0);
}
}
module.exports = function (push_attributes) {
/**
* push_attributes: 下发的属性对象,作为函数参数传入。
* data: 构造下发的自定义数据对象,下发到硬件。
*/
var data = {
type: "hex",
msg: ""
}
// 设置从站地址为 1
Cloud.ModbusRTU.setUnitId(1);
// 分别检查多个继电器的开关量属性,将其转化为 Modbus RTU 06 指令。注意:仅支持一次下发一个继电器开关属性。
relay2Modbus06(data, 1, push_attributes.relay1);
relay2Modbus06(data, 2, push_attributes.relay2);
relay2Modbus06(data, 3, push_attributes.relay3);
relay2Modbus06(data, 4, push_attributes.relay4);
return data;
}
当平台向设备下发属性,例如:
{
"relay1": true
}
通过以上规则,会自动转换为以下自定义数据流消息:
01060001000119CA
为了方便调试规则云函数,建议您学习使用在线调试工具。阅读 每日调用上亿次的消息规则云函数,如何在线测试?
