Ecore Home Node-Red 自动化实战系列教程 - 人体感应控灯

人体感应灯控作为家庭自动化里最常见的自动化功能之一,几乎每个使用智能家居的用户都会涉及,这里对人体感应、人体存在控灯如何在 Node-Red 中实现做一些详细的实例说明

基础用法

001

节点 功能 备注
注释节点 对流进行标注,方便维护时查看 仅作为标记使用,实际不参与流的执行
状态触发节点 大部分流的起始节点,如指定的设备状态发生变化将触发流 -
操作节点 大部分流的终止节点,所有设定的条件符合最终操作设备所使用 -

逻辑解析

1.人体感应状态从无人变为有人(第一个输出点) → 使用操作节点打开指定的灯
2.人体感应状态从有人变为无人(第二个输出点) → 使用操作节点关闭指定的灯

知识点

003

1.当状态触发节点设置好触发条件以后,该节点会产生两个输出点
2.第一输出点代表你选择的设备状态发生了变化并且 符合 你所设置的条件
3.第二输出点代表你选择的设备状态发生了变化并且 不符合 你所设置的条件
4.在此例子中,因为人体传感器的值只有 有人、无人两项,故我们可以直接将第二输出点当做无人来处理
5.节点左边带有输入点的节点一般不可以作为流的起始节点
6.所有节点设置完毕,一定要点右上角的 部署 按钮,让流生效

1.所有对设备进行的操作都需要依赖此节点来完成
2.此节点允许同时选择多个同类型设备以完成批量操作
3.此节点允许对指定的一个或多个设备添加多个操作,如:打开灯的电源 并 将灯的亮度调到100

进阶

利用状态触发节点的持续时间选项达到 xxx分钟无人 就关灯的效果

在实际的应用中,因为人体感应并不能正确识别静止不动的人,为了避免人在里面短时间内无活动导致关灯的局面,通常的做法是加一个持续时间,当无人这种状态持续一段时间后再执行关灯操作

逻辑解析

1.人体感应状态从有人变为无人人并且3分钟之内都没有再次变为有人 → 使用操作节点关闭指定的灯
2.如果在3分钟之内房间里有人又再次触发了人体传感器,那么节点会自动重置这个3分钟的计时,直到人体传感器无人这个状态维持到达3分钟以后,节点会向后发送消息到操作节点进行关灯操作

知识点

1.此节点必须是指定的设备状态发生变化才会触发内置的计时器,在例子里是人体传感器从有人变为无人
2.计时器一旦启动,再次触发人体有人状态只会让计时器重新开始计时,并不会让计时器停止
3.当使用此持续时间功能后,节点将只保留一个输出点,这里如果要同时实现开关灯,应当使用两个出发节点来对应 有人/无人 状态

使用 计时器 节点来达到 持续一段时间 再执行的效果

节点 功能 备注
计时器节点 当有任意消息发送到此节点,将启动一个计时器 计时器时间由用户来指定
Change节点 此节点用来设置、转移、修改指定的消息 Node-Red 内置功能节点

逻辑解析

1.人体感应状态从无人变为有人(第一个输出点) → 使用操作节点打开指定的灯
2.人体感应状态从有人变为无人(第二个输出点) → 启动3分钟的计时器 → 计时器结束 → 使用操作节点关闭指定的灯
3.当计时器处于计时的状态 → 再次触发人体有人状态 → 向计时器发送停止消息 → 计时器终止

知识点

007

008

1.计时器节点有多种用法,这里我们使用向计时器发送 stop 指令让其终止的功能
2.我们使用 Change 节点来设置 msg.payload 的值为 stop 并发送到 计时器 节点
3.如果不向终止计时器,只是想在再次触发人体有人状态时重置此计时器,可以无需使用 Change 节点,直接将 触发节点的第一输出口(有人状态)连接至计时器即可

使用 获取状态节点 给开灯操作增加前置条件

节点 功能 备注
获取状态节点 查询指定设备的值并按照用户指定的条件进行判断并输出结果 通常放在流程中段来进行条件过滤

逻辑解析

1.人体感应状态从无人变为有人(第一个输出点) → 消息经过获取状态节点,节点判断指定的照度传感器值符合需要(这里我们设置照度低于50) → 获取状态节点从第一个口输出消息到操作节点 → 使用操作节点打开指定的灯
2.人体感应状态从无人变为有人(第一个输出点) → 消息经过获取状态节点,节点判断指定的照度传感器值不符合设置的条件,即照度值高于或者等于50 → 获取状态节点从第二个口输出 → 流程结束

知识点

1.获取状态节点允许设置多个条件,并可以指定判定逻辑是所有条件都满足还是任意条件满足即可
2.在以上例子里获取状态的第二输出点并没有用上,根据需要可指定当条件不满足以后的流程或操作
3.如果并不想进行条件判断,只是需要查询指定设备的所有属性,可选择下方的 输出设备状态 功能,如此将产生 第三、第四、第五… 个输出点,具体数量依据用户添加的条件数目来定

使用 计时器 节点来实现不同条件下的动态持续时间

场景描述:有时候我们并不希望人体感应触发无人后的持续时间是固定不变的,比如日间活动较为频繁时候,为了避免很快的关灯,我们希望持续时间稍长一点来达到容错的效果,夜间偶尔起夜、喝水等等场景我们只是短暂停留,我们希望持续时间稍微短一点来达到快速关灯的效果

节点 功能 备注
时间段节点 通常用于限定允许流触发的时间段 -

逻辑解析

1.人体感应状态从有人变为无人(第二个输出点) → 时间段节点判断当前时间是否处于 9:30 - 23:59 这个区间,如果满足则(第一个输出点) → 通过 Change 节点将 msg.duration 设置为3 → 计时器节点收到消息后立刻重置并将按照3分钟的时长来重新计时 → 计时器结束,执行关灯
2.人体感应状态从有人变为无人(第二个输出点) → 时间段节点判断当前时间是否处于 9:30 - 23:59 这个区间,如果不满足则(第二个输出点) → 通过 Change 节点将 msg.duration 设置为1 → 计时器节点收到消息后立刻重置并将按照1分钟的时长来重新计时 → 计时器结束,执行关灯

知识点

1.计时器节点当收到指定的消息,这里是使用 msg.duration 并其值是非0数字时,将立刻重置计时器并重新设置计时器时长,这里我们仍然使用 Change 节点来设置此值并发送到计时器节点让他生效

使用人体感应来开灯,使用人体存维持开灯状态并控制关灯

人体传感器在某些环境下并不好用,如:入厕后坐在马桶上玩手机、躺在沙发上看电视、睡觉…,这些场景都有一个共通点:人体处于相对静止的状态,人体传感器并不能准确的判断这类场景,导致在不合适的时间关灯,体验相当糟糕,虽然可以通过增加传感器数量,增加其他附加条件,增大无人持续时间等等方式来缓解这个问题,但终究不够优雅,人体存在雷达传感器的出现,打破了这个僵局,但随之而来的问题也出现了,雷达的判定通常没有红外人体快,所以从有人到无人的状态变化时间通常会比较大,如果单纯的使用人体存在来进行灯控,体验同样也不尽人意,这里我们用 红外人体 + 人体存在的方式来进行灯控,两种传感器在互补的情况下,体验会相当不错

逻辑解析

1.我们仍然使用前面已经做好的流来进行二次扩展,因为要使用红外人体开灯,人体存在关灯,这里我们使用两个触发节点来分别对应 人体红外传感器 和 人体存在雷达传感器
2.在这个例子里除了将开灯和关灯拆分开以外,逻辑基本保持不变,需要注意的是,人体开灯的环节我们需要增加一个获取状态节点作为补充逻辑:当我们仅触发了人体传感器(一般部署在房间的入口处),而没有触发人体存在传感器的时候,会导致第二个人体存在的流永远触发不了,所以这里我们在人体传感器 状态变为无人(第二个输出点) → 获取状态节点判断人体存在是否是无人状态 → 人体存在无人则执行关灯操作

知识点

1.本例子里没有出现新的节点类型,大体逻辑遵循之前已经建立好的流
2.在制作流的时候我们要充分考虑所有可能发生的情况,并一一在流中增加条件来解决这些特殊情况(参照上面的补充逻辑就是一个很好的例子)