关于MistMesh规则引擎¶
所谓规则引擎是MistMesh应用层的专家系统。它将常见的物联网操作简化为一个行为模型。并通过JSON文件来改变该模型的行为模式。这样做有两个好处:
- 减少了固件开发工作量;
- 减少了固件分发和参数设置所需要的网络带宽。
由于它现在还是一个订制的软件库,未来我们考虑通过类似Profile的方式将其开源或者通过针对不同场景而提供不同的软件库的方式提升系统开发度和灵活度。
Rule设计白皮书¶
Mist rule介绍
- Mist规则是客户端(通常是coreserver实例)向Mist节点发出的请求,该节点在客户端(订阅者)和节点(提供者)之间建立了一个协议。
- 协议可用于提供数据(传感器采样)或执行动作(执行器控制)。
- 发送到设备的规则以二进制格式编码,但是coreserver支持以简化的JSON格式实现基本的感知任务和照明控制。
如下提供JSON格式实例
Rule功能块及实例介绍¶
rule根据不同的功能分成不同的块(block),下面分别介绍各个功能块的参数。
- 灯具状态上报status
{"priority": 99,
"rules": [
{"type": "status", "period": 900}
]},
priority是用来表示rule优先等级的参数,可选择值为1-98,数值越大,优先级越高。99固定给status使用。period指数据主动上报的时间间隔,单位是秒,例子中"period": 900指15分钟上报一次。- 灯具状态除了按照设定的周期定期上传,当状态改变时也会主动上传。
- 按键button block
"rules": [
{"type": "button", "state":0, "value":-1, "timeout":15},
{"type": "button", "state":1, "value":20, "timeout":14400},
{"type": "button", "state":2, "value":100, "timeout":300},
{"type": "button_settings", "sensors": ["EC1BBDFFFE2901BD", "EC1BBDFFFE2901DC"]} ]
"type": "button"指代按键规则。"state":0指代按键的键位,值可以为0-99,根据实际使用的按键键位数量来选择。"value":-1表示灯具亮度的设定值,其中0-100表示亮度百分比,-1表示熄灭,-2表示保持亮度不变。"timeout":300表示灯具亮度的维持时间,单位为秒。"type": "button_settings"表示按键的数据源。"sensors": ["EC1BBDFFFE2901BD", "EC1BBDFFFE2901DC"]表示按键的列表,该列表中最大支持3个不同的EUI编号。
- PIR(红外探测器)movement block
"rules": [
{"type": "movement", "value": 100, "timeout": 300},
{"type": "movement_settings", "sensors": ["EC1BBDFFFE2900ED", "EC1BBDFFFE29010E"]}]
"type": "movement"指代PIR规则。"value":100表示灯具亮度的设定值,其中0-100表示亮度百分比,-1表示熄灭,-2表示保持亮度不变。"timeout":300表示灯具亮度的维持时间,单位为秒。"type": "movement_settings"表示PIR的数据源。"sensors": ["EC1BBDFFFE2900ED", "EC1BBDFFFE29010E"]表示PIR的列表,该列表中最大支持3个不同的EUI编号。
- 调光dim block
"rules": [
{"type": "dim", "start": "00:00", "end": "12:00", "value": 20}]
"type": "dim"指代dim规则。"start": "00:00", "end": "12:00"表示dim规则的生效时间,该时间使用UTC坐标。例子中表示北京(UTC+8)时间8点生效,20点失效。"value":20表示灯具亮度的设定值,其中0-100表示亮度百分比,-1表示熄灭,-2表示保持亮度不变。
- 日历calendar block
"rules": [
{"type": "calendar", "day_offset": 28800, "day": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]}]
"type": "calendar"表示日历规则。"day_offset": 28800表示将一天的开始与午夜的时间对比,单位是秒,示例中28800表示北京时间0:00作为一天的开始。"day": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]表示生效的工作日。
- 默认default block
"rules": [
{"type": "default", "value": -1}]
"type": "default"表示默认规则。"value":100表示灯具亮度的设定值,其中0-100表示亮度百分比,-1表示熄灭,-2表示保持亮度不变。
- 光照illuminance block
"rules": [
{"type": "illuminance", "start": "10:00", "end": "14:00", "freshness": 300, "target": 500}]
"type": "default"表示光照规则。"start": "10:00", "end": "14:00"表示dim规则的生效时间,该时间使用UTC坐标。例子中表示北京(UTC+8)时间18点生效,22点失效。"freshness": 300表示检测lux亮度值的时间,单位为秒,推荐设定为光照传感器上传周期的2-3倍。"target": 500表示灯具亮度的目标值。
智能照明常见场景与推荐规则¶
- 展示区/前台推荐规则:
{"priority": 99,
"rules": [
{"type": "status", "period": 900}
]},
{"priority": 50,
"rules": [
{"type": "button", "state":0, "value":-1, "timeout":15},
{"type": "button", "state":1, "value":20, "timeout":14400},
{"type": "button", "state":2, "value":100, "timeout":300},
{"type": "button_settings", "sensors": ["EC1BBDFFFE2901BD", "EC1BBDFFFE2901DC"]}
]},
{"priority": 40,
"rules": [
{"type": "movement", "value": 100, "timeout": 300},
{"type": "movement_settings", "sensors": ["EC1BBDFFFE2900ED", "EC1BBDFFFE29010E"]}
]},
{"priority": 30,
"rules": [
{"type": "calendar", "day_offset": 28800, "day": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]},
{"type": "dim", "start": "00:00", "end": "12:00", "value": 20}
]},
{"priority": 10,
"rules": [
{"type": "default", "value": -1}
]}
- 上述rule能实现如下功能
- 每隔15分钟或者灯具亮度改变后,上传灯具亮度信息到后台;
- 三个按键正常对应 关闭15秒,20%低亮4小时,100%全亮5分钟;
- PIR红外探测器感应到人体移动,灯光100%全亮起5分钟;
- 工作日上午8:00到晚上20:00,灯光默认保持20%低亮度;
- 其它时间,灯光默认熄灭。
- 会议室/办公室推荐规则:
{"priority": 50,
"rules": [
{"type": "button", "state":0, "value":-1, "timeout":15},
{"type": "button", "state":1, "value":20, "timeout":14400},
{"type": "button", "state":2, "value":100, "timeout":300},
{"type": "button_settings", "sensors": ["EC1BBDFFFE2901BD", "EC1BBDFFFE2901DC"]}
]},
{"priority": 40,
"rules": [
{"type": "movement", "value": 100, "timeout": 300},
{"type": "movement_settings", "sensors": ["EC1BBDFFFE2900ED", "EC1BBDFFFE29010E"]}
]},
{"priority": 10,
"rules": [
{"type": "default", "value": -1}
]}
- 上述rule能实现如下功能
- 三个按键正常对应 关闭15秒,20%低亮4小时(投影模式),100%全亮5分钟;
- PIR红外探测器感应到人体移动,灯光100%全亮起5分钟;
- 其它时间,灯光默认熄灭。
- 走廊区/公共区推荐规则:
{"priority": 99,
"rules": [
{"type": "status", "period": 900}
]},
{"priority": 50,
"rules": [
{"type": "button", "state":0, "value":-1, "timeout":15},
{"type": "button", "state":1, "value":20, "timeout":14400},
{"type": "button", "state":2, "value":100, "timeout":180},
{"type": "button_settings", "sensors": ["EC1BBDFFFE2901BD", "EC1BBDFFFE2901DC"]}
]},
{"priority": 40,
"rules": [
{"type": "movement", "value": 100, "timeout": 180},
{"type": "movement_settings", "sensors": ["EC1BBDFFFE2900ED", "EC1BBDFFFE29010E"]}
]},
{"priority": 10,
"rules": [
{"type": "default", "value": -1}
]}
- 上述rule能实现如下功能
- 每隔15分钟或者灯具亮度改变后,上传灯具亮度信息到后台;
- 三个按键正常对应 关闭15秒,20%低亮4小时(投影模式),100%全亮3分钟;
- PIR红外探测器感应到人体移动,灯光100%全亮起3分钟;
- 其它时间,灯光默认熄灭。
- 窗帘推荐规则:
{"priority": 50,
"rules": [
{"type": "button", "state":0, "value":0, "timeout":5},
{"type": "button", "state":1, "value":-1, "timeout":5},
{"type": "button", "state":2, "value":100, "timeout":5},
{"type": "button_settings", "sensors": ["EC1BBDFFFE2901DD"]}
]},
{"priority": 40,
"rules": [
{"type": "button", "state":0, "value":20, "timeout":5},
{"type": "button", "state":1, "value":100, "timeout":5},
{"type": "button", "state":2, "value":0, "timeout":5},
{"type": "button_settings", "sensors": ["EC1BBDFFFE2901E3"]}
]},
{"priority": 30,
"rules": [
{"type": "default", "value": -2}
]}
- 上述rule能实现如下功能
- 按键”EC1BBDFFFE2901DD”可以实现全闭、停止、全开三个功能;
- 按键”EC1BBDFFFE2901E3”可以实现展开20%、全开、全闭三个功能;
- 窗帘默认保持原样。
Rule设计应用技巧¶
规则需要注意优先级和超时之间的关系。
如果有多个按键的键值设定不同,则用不同的 period 参数区分,示例如下
{"priority": 40,
"rules": [
{"type": "button", "state":0, "value":20, "timeout":5},
{"type": "button", "state":1, "value":100, "timeout":5},
{"type": "button", "state":2, "value":0, "timeout":5},
{"type": "button_settings", "sensors": ["EC1BBDFFFE2901E3"]}
]},
{"priority": 50,
"rules": [
{"type": "button", "state":0, "value":0, "timeout":5},
{"type": "button", "state":1, "value":-1, "timeout":5},
{"type": "button", "state":2, "value":100, "timeout":5},
{"type": "button_settings", "sensors": ["EC1BBDFFFE2901DD"]}
需要注意高优先级button生效期间,低优先级button无法响应。
常见问题¶
- 为何要使用一个预定义的设备模型?
在分布式嵌入式系统中,维护多种设备的多种场景。而以一种场景指的是系统行为(代码)和参数(存储),如果将这些都通过空口进行传输,大量挤占业务通讯带宽,不适用窄带物联网。多种场景意味着多种固件版本和对应的升级维护工作。而一个预定义的设备模型可以最大限度地减少这些带宽损失和维护成本。