根据是否有人做灯控(开放区域)
前置条件
此能力需要先登录
需求
某客户开放区域为每个员工的工位安装了人体感应器,若干感应器对应一盏灯,当一组感应器均检测到人员离开,等待 30 分钟,关闭对应的灯光。
分析
需求的一个难点是建立一组人体感应器
和所控制的灯间的映射关系。当任意感应器属性变化时,找出对应的所有感应器;另外一个难点是:如何判断一组感应器的属性是否为同一个值(即没有人)。
步骤一:感应器分组
首先,我们需要建立一组感应器和所控制的灯间的映射关系。我们可以在平台上为设备创建特定的属性,也可以给设备打标签。下面我们使用一种本地解决方案:万能的 Excel。
我们可以使用 Excel 创建映射关系,然后复制粘贴到字典数据源
中(当然完全也可以直接在鸿图的字典里面编辑),如下图:
步骤二:获取感应器所在的组里面的全部感应器
几点说明:
- 我们使用了
产品
,而不是设备
,这样任意设备触发PeopleGo
事件,我们的代码都会被执行 - 我们通过第一次
查字典
操作,获取了设备的分组;然后用这个分组作为输入,再反查
字典,得到了某个组里面的全部设备
步骤三:判断一组感应器的所有属性
这里我们用到一个有趣的节点:设备属性且运算。它对输入的设备组做遍历,只有当所有设备的属性值都相同时,才返回真。这个节点类似 Javascript 里面的 every 函数。
步骤四:关闭感应器所在组对应的灯光
这里需要我们再创建一个映射表,即某个感应器组关联的灯光。然后使用调用设备功能
节点来关闭灯光。
步骤五:取消定时器
提示
关于为什么要记录并取消定时器请参考上一案例
要注意的是,我们不只有一个定时器,而是一个定时器集合。即每盏灯都有一个定时器。这里我们用到了变量设置的高级用法,可以对其某个键
进行赋值,等同于 Javascript 里面的:
js
let obj = {};
obj[key] = value;
同理,获取定时器的时候我们需要指定键
,然后获取对应的值。