属性下发类任务
约 1074 字大约 4 分钟
属性下发类任务
利用属性下发类任务,可以将设备单个属性或多个属性的下发操作,打包为一条快捷指令,实现随时复用。
目前支持以下几类任务动作:
静态属性下发
可以在编辑器中直接填写要下发的属性集合 JSON
代码,例如下图:
另外配合任务的定时运行机制,可以快速实现云平台对设备的各种控制指令的定时下发。例如您可以定时早晨 8:00 执行任务通知设备运行,晚上 19:00 执行任务通知设备关闭。
云函数属性下发
提供了自由度更高的云函数,来实时构造要下发给设备的属性集合。适合具有一定开发能力的用户使用,也可联系我们的技术支持提供指导。
示例:固定属性下发
这是一个最简单的例子,在云函数中构造一个固定的属性集合,效果和前边静态属性下发是相同的。云函数如下:
module.exports = function () {
var push_attributes = {
relay1: true,
relay2: false
};
return push_attributes;
}
运行以上任务后,下发到设备的属性消息是这样的:
{
"relay1": true,
"relay2": false
}
示例:读取设备当前属性实现逻辑判断
通过调用内置函数库,在云函数中可以获取设备当前的属性值,这样我们便可以根据实际需求,对属性做各种各样的逻辑判断,从而动态生成要下发给设备的属性消息。
例如,我们编写以下的云函数,在任务运行时,根据设备最近一次上报的温度值,以及用户事先设置的温度下限值,来判断是否开启或关闭继电器,将生成的消息下发给设备。这个任务我们可以设置每 5 分钟定时执行一次。
module.exports = function () {
// 读取设备当前的属性值
const attributes = Cloud.getCurrentAttributes();
var push_attributes = {};
// 根据当前温度和阈值,决定继电器状态
if (attributes.temperature > attributes.temperature_threshold) {
// 如果温度大于阈值,继电器闭合
push_attributes.relay1 = true;
} else {
// 否则,继电器断开
push_attributes.relay1 = false;
}
return push_attributes;
}
示例:实现用户设置不同的定时操作
在这个例子中,我们希望每个用户可以在 App 上控制不同温室的棉被开启时间,我们在 App 界面上放置了时间控制组件,绑定了云端私有属性 time_set
,App 界面编辑如下:
然后创建一个每隔 5 分钟运行的定时任务,编写以下云函数。
任务每次运行时,发现如果大于用户设置的时间,并且棉被没有开启,便下发消息控制电机的继电器属性 relay1
启动。
module.exports = function () {
/**
* push_attributes: 构造下发的属性对象,作为函数返回值,下发到硬件。
*/
var push_attributes = {};
const attrs = Cloud.getCurrentAttributes();
// 获取用户设置的时间
const time_set = attrs.time_set || "";
// 获取当前继电器状态
const relay1 = attrs.relay1 || false;
if (time_set && !relay1) {
// 如果用户设置了时间,并且继电器是断开状态
// 获取当前时间的日期对象
const now = new Date();
// 将用户设置的时间分割成小时和分钟
const [hours, minutes] = time_set.split(':').map(Number);
// 创建一个新的日期对象,用于表示用户设置的时间
const setTime = new Date(now.getFullYear(), now.getMonth(), now.getDate(), hours, minutes);
// 比较当前时间和用户设置的时间
if (now > setTime) {
// 如果当前时间大于用户设置的时间,则在push_attributes中放置一个字段relay=true
push_attributes.relay1 = true;
}
}
return push_attributes;
}
在这个例子中,只需控制电机启动即可,当棉被到达限位后,会上报属性实现自动关闭电机。
那么,为什么不直接用任务的每日定时模式,指定一个固定时间呢?原因有两点:
- 为了创建一个任务来管理所有温室设备,我们将任务创建到设备类型下,而每个温室设备的启动时间不同。
- 需要让每个用户可以单独设置不同温室的启动时间。