功能节点 - 红色覆盆子

时间:2017-04-21 08:39:17

标签: while-loop raspberry-pi node-red

我正在使用我的新Raspberry Pi进行测试,并从Node-red开始,我遇到了一个障碍。

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

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

	case "pi/13":
	    context.data.contacto = msg.payload;
	    msg = null;
	    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"};

我已经尝试将所有代码放在“do-while”循环中但是它失败了,我也尝试将整个开关块放回到while和同样的东西。有什么想法吗?

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

谢谢!

1 个答案:

答案 0 :(得分:0)

那是因为变量可能永远不会真正改变,该循环只会运行得如此严密而且永远不会返回,因此Node-RED将无法处理任何会改变变量的消息。

它还将发送带有payload: true

的1000条消息

你根本不应该需要循环,只需{if}返回return {payload: true}中的{payload: 'stop'}(这应该是假的而不是停止?)

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