定时服务
物联网 (IoT) 的核心在于联网设备间的数据交互(如遥测数据和指令传输),但实际应用中往往需要设备具备自主运行能力。
定时服务与 ESP RainMaker 的其他功能一样,完全在节点端以“服务”的形式实现。云端后台仅作为节点和客户端(如手机应用)之间的网关。
定时服务虽然复杂,但已通过 C 语言 API 进行了封装。另外,手机应用也对其进行了抽象处理。
使用场景
通过 ESP RainMaker 的定时服务,可以根据预设时间自动控制设备,提高便利性,节约能源。例如,用户可以设置晚上 6 点开灯,11 点关灯等任务,无需手动操作。无论是智能家居还是工业设备,都可以通过定时功能实现自动化,优化电量使用。
定时功能
- 在指定的确切时间执行动作。支持以下配置:
- 一次性(如:下午 6:30)
- 每周指定日重复 (如:周一、周二、周六下午 6:30)
- 每年指定月的指定日期重复(如:1 月、8 月、12 月的 20 日下午 6:30)
- 每年指定日期重复(如:每年 1 月 20 日下午 6:30)
- 在指定时间段后执行动作(如:从现在起 3 小时后)。
- 按日照时间定时(日出/日落):基于日出日落时间的天文学计算来调度设备操作,支持可配置的时间偏移(例如:日落前 30 分钟、日出时刻)。
- 为不同类型的定时服务添加自定义信息和标志,方便应用识别和区分(如:预定义定时,默认开关定时等)。
- 处理夏令时 (DST) 偏移,适用于已配置时区的情形。更多信息请参见管理夏令时章节。
定时服务依赖于时间服务。因此,必须设置并配置时间服务。否则定时服务不会触发。
参数详情
定时服务包含一个参数,该参数是对象数组。启用该功能将在节点配置中添加以下服务:
JSON 载荷(点击展开/折叠)
{
"name": "Schedule",
"params": [{
"bounds": {
"max": 5
},
"data_type": "array",
"name": "Schedules",
"properties": [
"read",
"write"
],
"type": "esp.param.schedules"
}],
"type": "esp.service.schedule",
"daylight_support": "yes"
}
定时服务的参数默认是一个空数组。max 边界表示节点可以拥有的最大定时服务数量。
daylight_support 属性用于标识设备是否支持按日照时间(日出/日落)定时。该属性可帮助客户端应用自动发现此功能。
添加新定时服务
可以通过如下格式在 setparams 中传递值来添加新的定时服务。该数值通常从客户端发送到云端,或通过本地控制直接发送到节点。
ESP RainMaker 支持三种定时任务触发类型:
- 基于时间的定时:使用
m(从零点起的分钟数)结合日期/星期模式 - 相对时间定时:使用
rsec(相对于当前时刻的秒数) - 日照时间定时:使用
sr(日出)或ss(日落)并结合地理位置数据 (v1.7.1 及以上版本可用)
JSON 载荷(点击展开/折叠)
{
"Schedule": {
"Schedules": [{
"name": "Evening",
"id": "8D36",
"operation": "add",
"triggers": [{
"d": 31,
"m": 1110
}],
"action": {
"Light": {
"power": true
}
}
}]
}
}
每个 JSON 键的详细说明
通用字段(所有定时类型)
- name (字符串):用户自定义的定时服务名称。
- id (字符串):定时服务的唯一 ID。(此 ID 仅需在给定用户中唯一,而非全局唯一)。此 ID 由客户端在添加定时服务时生成,用于后续操作。建议使用较短的 ID。
- operation (字符串):要执行的操作。可能的值为
add、remove、edit、enable和disable。 - action (对象):在给定时间要执行的实际操作。此对象的值与设置参数时传递的值相同。例如,要打开灯,将为 "Light":
{"power": true}。 - info (字符串,可选):其他附加信息或描述。
- flags (uint32,可选):通用标志(无符号整数值),可根据用户的要求使用。
- validity (对象,可选):提供定时服务适用的开始和结束时间。
- start (uint32):定时服务应生效的时间(纪元秒)。
- end (uint32):定时服务应失效的时间(纪元秒)。
触发类型
triggers 对象数组定义了执行定时服务的时间。请选择以下任意一种触发类型:
1. 基于时间的触发器(绝对时间)
- m(uint16): 从零点起的分钟数。例如,下午 6:30 = 18 × 60 + 30 = 1110。
- d(uint8,可选):天数的位图。最低有效位是星期一。
- 位模式:[ N/A | 星期日 | 星期六 | 星期五 | 星期四 | 星期三 | 星期二 | 星期一]
- 示例:
31(0b00011111) = 工作日,96(0b01100000) = 周末,127= 每天 - 值为
0表示仅触发一次
- dd(uint8,可选):日期(1–31),用 于特定日期定时。
- mm(uint16,可选):月份的位图。最低有效位是一月。
- 示例:
7(0b00000111) = 一月、二月、三月;4095(0b111111111111) = 全年所有月份 - 重要提示:如果指定了
mm,则必须同时指定yy或r。
- 示例:
- yy(uint16,可选):具体年份(例如 2023)。当使用
mm而未指定r时,必须提供。 - r(bool,可选):设为
true表示每年重复(与dd一起使用,可选mm)。当使用mm而未指定yy时,必须提供。
2. 相对触发器(从当前时间起)
- rsec(int32):从当前时间起的相对秒数。此类型不适用日期或星期设置。
3. 日照触发器(基于日出/日落)自 v1.7.1 起可用
- sr(int16):日出偏移量(单位:分钟;正值 = 日出后,负值 = 日出前,0 = 精确日出)。
- ss(int16):日落偏移量(单位:分钟;正值 = 日落后,负值 = 日落前,0 = 精确日落)。
- lat(float ):纬度(十进制度,范围 –90 到 +90,北纬为正)。
- lon(float):经度(十进制度,范围 -180 到 +180,东经为正)。
- loc(string,可选):便于识别的人类可读位置名称。
- d(unit8,可选):星期位图(与基于时间的触发器相同)。
- ts(unit32,系统自动计算):下次触发时间戳,由系统自动计算,客户端不应提供。
- 每个触发对象只能使用一种触发类型:
m、rsec或sr/ss。 - 对于基于时间的触发器:
m应与d(星期)或dd(日期)之一同时使用。 - 对于基于日期的触发器:如果指定了
mm(月份),则必须同时指定yy(年份)或r(每年重复)。 - 对于日照触发器:只能提供
sr(日出)或ss(日落)中的一个,不可同时指定。 - 日照触发器必须提供地理坐标(
lat、lon)。
一旦定时服务添加成功,获取参数时会返回一个类似以下 JSON 的值。
- 这是从节点发送到云端或手机应用的确认响应。
JSON 载荷(点击展开/折叠)
{
"Schedule": {
"Schedules": [{
"name": "Evening",
"id": "8D36",
"enabled": true,
"triggers": [{
"d": 31,
"m": 1110
}],
"action": {
"Light": {
"power": true
}
}
}]
}
}
如上示例所示,响应包含一个 enabled 键,表示定时服务现已启用。
在添加或更新定时服务时,定时服务数组中只需发送单个条目。但在查询时,节点会返回定时服务数组中的所有的定时服务信息。
其 他操作
以下所有操作均在客户端(如手机应用)上进行。
编辑
- 用于编辑定时服务所传递的值与添加新定时服务时传递的值类似。
- 指定的 ID 应与现有的定时服务匹配,同时,
operation的值应该设置为edit。 - 可以发送整个对象或仅发送已更改的元素(名称、触发方式或操作)。但是,这些键中的对象必需要完整。
- 如果当前操作是
"action":{"Light": {"power": true, "brightness":90}}; - 现在需要将亮度更改为 100;
- 应该传递
"action":{"Light": {"power": true, "brightness":100}};
而不是"action":{"Light": {"brightness":100}}。
删除
- 要删除现有定时服务,只需传递
id和operation。以下是一个示例。
JSON 载荷(点击展开/折叠)
{
"Schedule": {
"Schedules": [{
"id": "8D36",
"operation": "remove"
}]
}
}