在Node-RED中实现多个输入

时间:2016-07-26 22:28:30

标签: node.js raspberry-pi iot node-red

我是node-red和IoT的新手,但目前正在开发一个项目。 基本上我的目标是为建筑工人创建一个报警系统。

我想测量高度,环境温度和安全机制的状态(锁定与否)。根据读数,系统应做出决定(如果测量值超过阈值 - 发送通知[蜂鸣器/ LED])。

逻辑如下:

  1. 打开系统时,测量初始高度(h初始值),
  2. 在特定时间段(尚未定义)之后,测量当前高度(h当前)。
  3. 当前和初始高度之间的差异将是工人的实际高度(h)。
  4. 如果海拔高度h高于2米 - 发送蜂鸣器信号。如果h小于0,则再次计算h initial和h current。
  5. 我已将TI CC2650 SensorTag连接到RPi的节点红色,并将测量值发送到节点红色作为json对象,具体取决于您希望读取的传感器读数。在我的情况下(温度和压力)我依次收到两个jsons:

    { "d": { "id": "b827ebb2b2bd.c4be84711c81.0", "tstamp": { "$date": 1469565713321 }, "json_data": { "object": 21.40625, "ambient": 27.125 } } }
    
    { "d": { "id": "b827ebb2b2bd.c4be84711c81.4", "tstamp": { "$date": 1469565713328 }, "json_data": { "pressure": 1016.36 } } }
    

    我遇到了以下问题:

    1. 我无法将多个数据提供给Node-RED。想知道是否有人可以指导我如何发送(温度,压力,机制状态[1或0]数据)到功能节点;

    2. 关于警报。基本上,要找到实际的高度,我需要进行两次高度测量。意思是,我需要以某种方式存储两个压力/温度测量值。我是否需要将测量数据存储为数组,或者有更好的方法来处理这个问题?

    3. 想知道是否有人可以指导/帮助我。

      P.S。流程的剪贴板很长,所以我决定不把它粘贴在这里,但如果有人要求可以发送它。

      非常原始的代码

      var hInit;
      var hChecked;
      var h;
      
      //p0 is the hardcoded pressure on the level of the sea
      //hardcoded for the current area
      var p0 = 1019;
      
      //extract the pressure value and the ambient temp from jsons
      tagPressure = msg.payload.json_data.pressure;
      tagTemp = msg.payload.json_data.ambient;
      
      //the formula to convert a pressure to an altitude
      
      //here it should measure the altitde (hInit) when the testbest is turned on
      
      hInit = (((Math.pow((tagTemp/p0), (1/5.257)))-1)*(tagTemp + 273.15))/0.0065;
      //hChecked is the measured altitude afterwards
      hChecked = (((Math.pow((tagTemp/p0), (1/5.257)))-1)*(tagTemp + 273.15))/0.0065;
      
      //h is the actual altitude the worker is working on
      h = hChecked - hInit;
      
      //in the case if a worker turned the testbed on 
      //when he was operating on the altitude he then
      //might go down so altitude can reduce.
      //therefore if the altitude h is < 0 we need to
      //calculate a new reference 
      
      if (h < 0) {
          hInit = (((Math.pow((tagTemp/p0), (1/5.257)))-1)*(tagTemp + 273.15))/0.0065;
          hChecked = (((Math.pow((tagTemp/p0), (1/5.257)))-1)*(tagTemp + 273.15))/0.0065;
          h = hChecked - hInit;
          return h;
      }
      
      //check current altitude
      while (h>0){
      
          if (h>2){
      
              if (lockerState == 1) {
                  msg.payload = "safe";
                  return msg;
              }
      
              else if (lockerState === 0) {
                  msg.payload = "lock your belt!";
                  //basically i want to send a 1 signal
                  //to the buzzer which is a pin on the RPI3
                  //so probably msg.payload = 1;
                  return msg;
              }
          }    
      }
      //return msg;
      

1 个答案:

答案 0 :(得分:1)

虽然Node-RED节点只有一个输入选项卡,但这并不意味着它们无法处理来自多个源的输入。

有多种选择

执行此操作的一种方法是使用其他一些消息属性来区分它们,通常是-val

或者是使用msg.topic

检查有效负载具有哪些属性

e.g。

Object.hasOwnProperty()

但更多的是基于流程编程,最好根据消息类型分解函数,使用交换节点根据消息的属性对流进行分叉。

您还应该查看有关if (msg.payload.json_data.hasOwnProperty('ambient'){ //do something with } 的Node-RED doc。这可以用于在消息之间临时存储值,以便比较它们或在计算中使用它们。

context