Skip to content

根据是否有人做灯控(开放区域)

前置条件

此能力需要先登录

需求

某客户开放区域为每个员工的工位安装了人体感应器,若干感应器对应一盏灯,当一组感应器均检测到人员离开,等待 30 分钟,关闭对应的灯光。

分析

需求的一个难点是建立一组人体感应器和所控制的灯间的映射关系。当任意感应器属性变化时,找出对应的所有感应器;另外一个难点是:如何判断一组感应器的属性是否为同一个值(即没有人)。

步骤一:感应器分组

首先,我们需要建立一组感应器和所控制的灯间的映射关系。我们可以在平台上为设备创建特定的属性,也可以给设备打标签。下面我们使用一种本地解决方案:万能的 Excel。

我们可以使用 Excel 创建映射关系,然后复制粘贴到字典数据源中(当然完全也可以直接在鸿图的字典里面编辑),如下图:

步骤二:获取感应器所在的组里面的全部感应器

几点说明:

  • 我们使用了产品,而不是设备,这样任意设备触发 PeopleGo 事件,我们的代码都会被执行
  • 我们通过第一次查字典操作,获取了设备的分组;然后用这个分组作为输入,再反查字典,得到了某个组里面的全部设备

步骤三:判断一组感应器的所有属性

这里我们用到一个有趣的节点:设备属性且运算。它对输入的设备组做遍历,只有当所有设备的属性值都相同时,才返回真。这个节点类似 Javascript 里面的 every 函数。

步骤四:关闭感应器所在组对应的灯光

这里需要我们再创建一个映射表,即某个感应器组关联的灯光。然后使用调用设备功能节点来关闭灯光。

步骤五:取消定时器

提示

关于为什么要记录并取消定时器请参考上一案例

要注意的是,我们不只有一个定时器,而是一个定时器集合。即每盏灯都有一个定时器。这里我们用到了变量设置的高级用法,可以对其某个进行赋值,等同于 Javascript 里面的:

js
let obj = {};
obj[key] = value;

同理,获取定时器的时候我们需要指定,然后获取对应的值。