我们通过Node-RED上的运动和照明传感器对照明控制进行编程

在俄语语言的Internet上,关于诸如Node-RED这样的编程环境的文章很少本文将揭示有关该产品的窗帘的秘密,并通过为运动传感器创建照明控制算法的示例来展示,使用Node-RED以完全图形化的形式实现智能家居自动化的各种场景和规则有多么简单,而无需编写任何代码。



什么是Node-RED?


与其他大公司一样,IBM也在试图在不断发展的物联网中找到自己的市场。这通常与开源应用程序和产品的发布相关联,以普及其付费平台。例如,在IBM,付费平台是Bluemix。

Node-RED是IBM的一个开放源代码的创举,就像在站点上简单写的那样,它是一种工具,用于以新颖有趣的方式连接硬件,API和服务。

这些方法基于图形通信线路的使用,通过该图形通信线路在节点之间发送消息。因此,您可以使用鼠标简单地连接各个块,而无需使用编程。

Node-RED中的开发是通过普通的浏览器进行的,内核本身可以在各种平台上运行-PC,RPi,云等。

适用于智能家居的Node-RED


我决定尝试使用Node-RED编写用于智能家居的脚本和规则。也就是说,用于自动化。 OpenHAB与各种执行器,Web服务和传感器紧密相连。为什么我决定不在那里进行自动化?原因有几个:
-在OpenHAB中,脚本和规则是用自己的语言编写的。我不想仅仅为了一个应用程序而研究它。
-调试规则本身实际上是不可能的-如果规则不起作用,很难找出原因
-我希望规则独立于硬件,通信通道,平台以及与设备进行通信的软件本身。这样我就可以轻松切换到另一个UD平台,例如Domoticz,MajorDomo,FHEM,并随身携带我的规则,而不必在新的UD平台下重写它们。

通过运动和光线传感器进行照明控制


因此,让我们开始吧。实际上,最初的任务是简单而琐碎的:
我控制了走廊上的照明用LED点。我希望灯光在运动时亮起,并在10秒后自动关闭。

让我们把任务复杂化一点:
-灯光仅在外面昏暗时才打开
-灯光强度应取决于时间-直到晚上9点时,灯光应以全强度打开,此后仅以10%作为背光。

传感器,表演者等铁


与传感器和执行器的协议和通讯选项在此不再赘述。可以这么说,在我的智能家居中,所有这些协议都简化为一个协议-MQTT,并且已经通过它与Node-RED进行通信。
那么我有哪些传感器和执行器?
1.运动传感器。当它检测到运动时,将OPEN消息发布到主题/ myhome / state / Hall_motion,如果2秒钟内没有运动,则将其发布。
2.光传感器。它可以测量0-1000 Lux范围内的街道照明亮度。它每分钟一次在主题/ myhome / state / Lumin_Hall中以当前光照级别发布一条消息。
3.调光器控制LED灯。它已订阅主题/ myhome / command / Light_Hall / state。如果您在此处写0-指示灯将熄灭。100-以最大亮度打开。1-99-将更改光强度。对于夜间照明,强度足够1。

Node-RED中流的描述


假定您已经安装了Node-RED。如果不是,请按照上面的链接安装任何适合您的选件-在计算机,Raspberry,clowd等上。就我而言,Node-RED安装在RPi2上(我认为它甚至是Raspbian附带的,因此根本不需要安装任何东西)。此流程不需要安装任何其他库。

输入和输出


首先,我们为算法创建必要的输入和输出。这些将是订阅相关主题的MQTT客户。我们将它们从左侧的库中拖动并进行自定义。

注意:显示的块名称可以在其设置中更改。

对于光传感器,从MQTT输入创建霍尔光传感器节点:



在其配置中,足以注册MQTT代理地址和主题。



我的经纪人正在同一个平台上旋转,所以就离开本地主机。

我们为运动传感器创建“霍尔运动传感器”节点:



一切都相同,只需设置另一个主题/ myhome / state / Hall_motion。



可以看到代理的地址和参数,该节点已经接管了上一个节点,因此您无需在新节点中输入它们。

仍然需要添加MQTT Output来为LED调光器提供输出。拖放MQTT输出,并将其命名为Hall Light Dimmer。



同样,在参数中,您只需要指定所需的主题,即可将用于控制调光器的消息发送至该主题-/ myhome / command / Light_Hall / state



因此,我们为Flow获得了三个节点。



测试它们的功能不会有什么坏处。很简单
我们将Debug输出连接到Input模块。



并将Inject输入连接到输出块。



在此节点的设置中,您需要将有效负载更改为所需的灯泡亮度。例如,在这种情况下为100。



我们可以通过复制粘贴创建几个相同的Inject块,更改亮度,然后将其连接到输出,如下所示:



那也可以。现在该检查了。我们单击Deploy按钮:



在MQTT节点下,您应该看到一条小消息:



这意味着它们已连接到MQTT代理。如果一切都按计划进行,则在右侧的调试选项卡中,您应该会看到来自传感器的消息,并且如果单击“注入”节点左侧的矩形,则连接到调光器的灯的光强度应会发生变化。如果一切正常,您可以走得更远。

运动传感器照明控制电路


为简单起见,我将各个相互连接的块称为链。首先,让我们尝试建立一个简单的电路,该电路可以通过运动传感器打开灯,并在一段时间后将其关闭。为此,根据Node-RED概念,我们需要来自运动传感器的消息才能通过某些块到达调光器并具有一定的文本。首先,我们将处理光的包含。

首先,我们从来自运动传感器的所有消息中选择一条带有文本OPEN的消息-这意味着运动已经出现。为此,请使用开关块。将其连接到我们已经创建的霍尔运动传感器模块的输出。



我们将对其进行配置,以便该块仅输出文本为OPEN的消息。



从图片中可以看到,该块将比较负载和文本OPEN,如果文本匹配,则将消息发送到输出。

我们的调光器要求输入具有所需亮度0 ... 100的消息。他将无法理解OPEN文本。因此,我们使用Change块来更改消息的文本。




在此块的设置中,记下所需的更改-消息有效负载,我们更改为100-所需的照明强度。

最后,我们将其全部连接到调光器的输入:



如果启动此电路,则可以确保它起作用-灯会在运动中点亮。仍然要确保它也关闭。

为此,请使用触发单元并将其连接到运动传感器的输出。



触发块使您可以生成延迟的消息,也可以通过特定消息进行重置。我们将以这种方式进行



配置此设置意味着,当第一条消息到达时,触发器将不发送任何内容,但会启动8秒钟的延时,此后它将发送带有文本0的消息。如果触发器接收到带有OPEN文本的输入,则触发器也会被重置。对我们而言,这意味着什么?

假设运动传感器显示“打开”消息。该消息将使触发器返回到其原始状态,而没有任何反应。然后,一段时间后,运动传感器将发出“关闭”消息。此消息将开始时间延迟,此后8秒钟触发器将显示消息0。

如果在此延迟时间内OPEN消息再次到达,则触发器将再次返回其原始状态,并等待下一条消息(逻辑上将被关闭)。在这种情况下,触发器将不会显示任何消息。
也就是说,通过这种方式,我们创建了一个计时器,该计时器将用于在给定曝光后自动关闭灯光。如果我们回想一下运动传感器的描述,就会很清楚为什么在此处设置8秒,而不是由于运动传感器本身的快门速度而增加10-2秒。

仍然可以将触发输出连接到调光器,您可以启动电路进行验证。



我注意到,为简单起见,我发布了已调试链的屏幕截图。您可以使用Debug链挂起块以了解其工作原理,并且链看起来像这样:



不用担心。

您可以这样操作:



通常,通过单击“注入”块左侧的矩形,您可以在没有铁的情况下调试电路-在地铁或平板电脑上的笔记本电脑上进行调试。

根据路灯的亮度开/关电路


现在,如果街道太亮,我们需要确保不打开灯。为此,我们需要添加另一个链并略微更改主链以考虑此因素。

首先,拿起我们已经知道的开关块并将其连接到光传感器的输出。



我们将配置此单元,以使其根据当前照明从光传感器向输出之一发送消息。



上面的条件意味着,如果照度小于10 lux,则消息将发送到输出1。否则,消息将发送到输出2。请不要忘记选择



选项,以便仅将消息定向到其中一个输出。

根据操作原理,从逻辑上讲,如果消息出现在第一个(上部)输出上,则需要启用运动检测,如果在第二个输出上出现,则将其关闭。

当然,这里有1000种方法和1种方法是可能的,其中最简单的方法是简单地阻止该消息以打开来自运动传感器的光(如果它是外面的光)。我们意识到了。

需要说明的是,在Node-RED中,执行引擎是基于消息实现的。即没有消息-没有事件,没有反应。如果不同的消息异步到达,即在不同的时间点,则这强加了某些细节。例如,在这种情况下,来自光传感器的消息与来自运动传感器的消息是异步的。因此,为了考虑光传感器的影响,我们需要记住他的消息中包含的信息,然后在下次消息从运动传感器发出时应用它。

在这种情况下,可以使用上下文-一个可以在流程执行期间存储信息的字段。上下文相对于整个环境是全局的,或者是特定流的局部上下文,或者通常仅是特定块的局部上下文。

在我们的情况下,我们将使用此流本地的上下文。即变量将对该流程中的所有块可见。让我们创建一个更改块并将其连接到“光阈值检测器”的第一个输出



。考虑更改块的配置,



在这种情况下,我们使用Set规则将flow.Light_enabled变量设置为Yes。因此,我们为全局变量分配了一个值,该值可以在其他块中使用。

以相同的方式,创建第二个更改块并将其连接到第二个输出。



其配置如下:



为了找出这种检测器是否正常工作,我们可以创建一个带有Inject和Debug块的简单电路。



在设置注入阻止我们注意到,它应该发出的变量的每一个第二值flow.Light_enabled



然后,光传感器的结果可以在的调试选项卡可以容易地看出



上/总链关闭传感器上的照明光将看起来像这样



现在,利用这一效果帐户对于运动传感器的控制电路而言,将开关块插入路径的电路中以打开灯就足够了。



并将其设置为仅在我们的全局变量flow.Light_enabled设置为Yes时才跳过来自运动传感器的消息。外面很黑。



做完了!现在我们的流程如下所示:



根据时间改变灯的亮度


剩下的很少了。我们想改变LED灯的强度。如果天黑了,但时间是晚上9点之前,则灯应全功率打开。但是九点以后-仅在低功率时,如夜间照明。
为此,创建一个Inject块:



可以对其进行配置,使其在特定时间显示一条消息。每天将其设置为21:00。



同时,我们注意到它将发出一条值为1的消息。这将是我们在夜间模式下所需的背光强度。为了在照明控制电路中使用该值,我们对全局变量使用相同的技巧。创建一个change:块



并对其进行配置,以便为变量flow.Light_Brightness分配消息中的值。


要在早上返回初始亮度,请创建第二个注入块,该注入块将在早上6点执行,并给出100的亮度值。在此处连接它。



因此,变量flow.Light_brightness将在每天晚上9点分配给值1,每天早上6点分配给值100。剩下的只是将其应用在主电路中。为此,我们已经有一个Light Brightness Adjustment模块:



为此,我们只需要更改设置,使其不分配常量,而是分配flow.Light_brightness变量的值即可。



最终结果


清除了调试块的最终流程看起来很整洁。在创建时,我们仅使用Node-RED安装中的构建块。但是,flows.nodered.org上,有超过800个其他的块和库,可让您添加许多不同的内容。



对于那些对重复使用此算法感兴趣的人,我发布了用于调试的流程:



以及它的json代码,可以将其轻松导入任何版本的Node-RED中并进行测试。
[{"id":"5afd41b4.d61318","type":"switch","z":"2384634b.17767c","name":"Movement detected?","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"OPEN","vt":"str"}],"checkall":"false","outputs":1,"x":562,"y":285,"wires":[["381b0d6d.a0bd7a"]]},{"id":"35bac8e.57dd5b8","type":"trigger","z":"2384634b.17767c","op1":"5","op2":"0","op1type":"nul","op2type":"val","duration":"8","extend":false,"units":"s","reset":"OPEN","name":"Switch off delay","x":750,"y":373,"wires":[["e995e130.1e2118","af1f191f.498098"]]},{"id":"d85623d1.29b058","type":"change","z":"2384634b.17767c","name":"Light Brightness Adjustment","rules":[{"t":"set","p":"payload","pt":"msg","to":"Light_brightness","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":1013.9999389648438,"y":284.63330078125,"wires":[["e995e130.1e2118","af1f191f.498098"]]},{"id":"934ff922.ca34f","type":"inject","z":"2384634b.17767c","name":"","topic":"","payload":"OPEN","payloadType":"str","repeat":"","crontab":"","once":false,"x":258.5,"y":408,"wires":[["5afd41b4.d61318"]]},{"id":"ea0e2e99.52a6f8","type":"inject","z":"2384634b.17767c","name":"","topic":"","payload":"CLOSED","payloadType":"str","repeat":"","crontab":"","once":false,"x":269,"y":459,"wires":[["35bac8e.57dd5b8","5afd41b4.d61318"]]},{"id":"4187db59.93c2dc","type":"mqtt in","z":"2384634b.17767c","name":"Hall Light Sensor","topic":"/myhome/state/Lumin_Hall","qos":"2","broker":"bfc8eee2.a46c9","x":243,"y":146,"wires":[["c94e7c4.849f48"]]},{"id":"c94e7c4.849f48","type":"switch","z":"2384634b.17767c","name":"Light Threshold Selector","property":"payload","propertyType":"msg","rules":[{"t":"lt","v":"10","vt":"num"},{"t":"else"}],"checkall":"false","outputs":2,"x":517.3333129882812,"y":145.7166748046875,"wires":[["48e6a07a.962798"],["ca8b6623.f11c7"]]},{"id":"381b0d6d.a0bd7a","type":"switch","z":"2384634b.17767c","name":"Light Enabled?","property":"Light_enabled","propertyType":"flow","rules":[{"t":"eq","v":"Yes","vt":"str"}],"checkall":"true","outputs":1,"x":775.5,"y":285,"wires":[["d85623d1.29b058"]]},{"id":"48e6a07a.962798","type":"change","z":"2384634b.17767c","name":"Enable Light","rules":[{"t":"set","p":"Light_enabled","pt":"flow","to":"Yes","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":822,"y":109,"wires":[[]]},{"id":"ca8b6623.f11c7","type":"change","z":"2384634b.17767c","name":"Disable Light","rules":[{"t":"set","p":"Light_enabled","pt":"flow","to":"No","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":824.6666259765625,"y":177.51666259765625,"wires":[[]]},{"id":"b6ea27c1.c33cd","type":"inject","z":"2384634b.17767c","name":"","topic":"","payload":"Light_enabled","payloadType":"flow","repeat":"1","crontab":"","once":false,"x":330.5,"y":678,"wires":[["db66aec8.b3abc"]]},{"id":"db66aec8.b3abc","type":"debug","z":"2384634b.17767c","name":"Light_enabled","active":false,"console":"false","complete":"payload","x":670.5,"y":679,"wires":[]},{"id":"fa4b50b8.e6e0f","type":"inject","z":"2384634b.17767c","name":"","topic":"","payload":"5","payloadType":"num","repeat":"","crontab":"","once":false,"x":233.5,"y":212,"wires":[["c94e7c4.849f48"]]},{"id":"e7b1a39.f9e596","type":"inject","z":"2384634b.17767c","name":"","topic":"","payload":"100","payloadType":"num","repeat":"","crontab":"","once":false,"x":235,"y":266,"wires":[["c94e7c4.849f48"]]},{"id":"4b2f3c6f.de9aac","type":"mqtt in","z":"2384634b.17767c","name":"Hall Motion Sensor","topic":"/myhome/state/Hall_motion","qos":"2","broker":"87b370d1.dd497","x":247,"y":334,"wires":[["5afd41b4.d61318","35bac8e.57dd5b8"]]},{"id":"e995e130.1e2118","type":"mqtt out","z":"2384634b.17767c","name":"Hall Light Dimmer ","topic":"/myhome/command/Light_Hall/state","qos":"0","retain":"true","broker":"87b370d1.dd497","x":1310,"y":315,"wires":[]},{"id":"781e72a7.3c0abc","type":"inject","z":"2384634b.17767c","name":"Reduce Brightness at 21:00","topic":"Night Brightness","payload":"1","payloadType":"str","repeat":"","crontab":"00 21 * * *","once":false,"x":339,"y":517,"wires":[["adbf1e2e.3f5ae"]]},{"id":"aa444315.a48ad8","type":"inject","z":"2384634b.17767c","name":"Normal Brightness at 6:00","topic":"Night Brightness","payload":"50","payloadType":"num","repeat":"","crontab":"00 6 * * *","once":false,"x":349.6666259765625,"y":604.683349609375,"wires":[["adbf1e2e.3f5ae"]]},{"id":"adbf1e2e.3f5ae","type":"change","z":"2384634b.17767c","name":"Light Brightness Adjustment","rules":[{"t":"set","p":"Light_brightness","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":692,"y":554,"wires":[[]]},{"id":"af1f191f.498098","type":"debug","z":"2384634b.17767c","name":"","active":true,"console":"false","complete":"false","x":1303.5,"y":429,"wires":[]},{"id":"bfc8eee2.a46c9","type":"mqtt-broker","z":"2384634b.17767c","broker":"localhost","port":"1883","clientid":"","usetls":false,"verifyservercert":true,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willRetain":null,"willPayload":"","birthTopic":"","birthQos":"0","birthRetain":null,"birthPayload":""},{"id":"87b370d1.dd497","type":"mqtt-broker","z":"2384634b.17767c","broker":"localhost","port":"1883","clientid":"","usetls":false,"verifyservercert":true,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willRetain":null,"willPayload":"","birthTopic":"","birthQos":"0","birthRetain":null,"birthPayload":""}]


总结


在本文中,我试图演示并说明在Node-RED环境中实现日常家庭自动化算法有多么容易。我还试图展示这种编程环境的主要优点,例如:
-连接和功能的逻辑图形表示
-易于编程和调试用户脚本的便捷性
-所生成算法的硬件和平台独立性-该脚本与OpenHAB,ioBroker和与其他任何支持MQTT协议的智能家居平台。
-通过复制粘贴JSON代码以及在线平台的存在,用户可以方便地在用户之间交换现成的算法,从而可以交换成功的解决方案。

Node-RED可以做更多的事情,例如,从Internet接收天气,向Twitter发送通知或使用Nest恒温器。在此基础上,您可以创建许多其他有趣且有用的自动化算法。但是这些是以下文章的主题。

Source: https://habr.com/ru/post/zh-CN396985/


All Articles