2017-04-21 71 views
0

我正在使用新的树莓派进行测试,并以节点红色开始,并且遇到障碍。功能节点 - 红色树莓

我尝试做一个循环,当一个开关被触发时结束,但当它进入while循环时,它不会重新读取“alarm”变量并无限循环。

context.data = context.data || {}; 
 
switch (msg.topic){ 
 
\t case "alarma": 
 
\t \t context.data.alarma = msg.payload; 
 
\t \t msg = null; 
 
\t \t break; 
 

 
\t case "pi/13": 
 
\t  context.data.contacto = msg.payload; 
 
\t  msg = null; 
 
\t  break; 
 
} 
 

 
if(context.data.alarma === true && context.data.contacto == 1) 
 
{ 
 

 
    while(context.data.alarma === true) 
 
    { 
 
     
 
     context.data.alarma = msg.payload; 
 
     node.send({payload:true}); 
 
    } 
 
} 
 
return {payload:"stop"};

我试图把所有的代码都在“做 - while”循环,但失败了,我也试图把整个开关模块放回同时,同样的事情。有任何想法吗?

我正在制作一个报警系统,为此我有一个开关(用于激活和停用报警)以及一个门中的联系人。如果警报被激活并且触点打开,警报响起(我返回true),如果我再次关闭触点(这不是我假装的),警报将被断开。我希望只有在警报停用开关被激活时才断开连接。如果我不关闭开关,我希望它返回true,这样警报就会继续响。我也试图引入一个延迟,所以while循环不是那么快,但仍然不起作用。我想要的是知道如何实际上循环内的变量。

谢谢!

回答

0

这是因为变量可能永远不会真正发生变化,该循环将运行得如此之紧,并且永远不会返回,因此Node-RED将无法处理任何会改变变量的消息。

也将发送消息1000与payload: true

你不应该需要循环可言,只是在是否否则返回{payload: 'stop'}(应该说是假的,而不是停下来?)

if(context.data.alarma === true && context.data.contacto == 1) 
{ 
    return {payload:true}); 
} else { 
    return {payload:"stop"}; 
} 
return {payload: true}