人体感应灯控作为家庭自动化里最常见的自动化功能之一,几乎每个使用智能家居的用户都会涉及,这里对人体感应、人体存在控灯如何在 Node-Red 中实现做一些详细的实例说明
基础用法
节点 | 功能 | 备注 |
---|---|---|
注释节点 | 对流进行标注,方便维护时查看 | 仅作为标记使用,实际不参与流的执行 |
状态触发节点 | 大部分流的起始节点,如指定的设备状态发生变化将触发流 | - |
操作节点 | 大部分流的终止节点,所有设定的条件符合最终操作设备所使用 | - |
逻辑解析
1.人体感应状态从无人变为有人(第一个输出点) → 使用操作节点打开指定的灯
2.人体感应状态从有人变为无人(第二个输出点) → 使用操作节点关闭指定的灯
知识点
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.当计时器处于计时的状态 → 再次触发人体有人状态 → 向计时器发送停止消息 → 计时器终止
知识点
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.在制作流的时候我们要充分考虑所有可能发生的情况,并一一在流中增加条件来解决这些特殊情况(参照上面的补充逻辑就是一个很好的例子)