我是node-red和IoT的新手,但目前正在开发一个项目。 基本上我的目标是为建筑工人创建一个报警系统。
我想测量高度,环境温度和安全机制的状态(锁定与否)。根据读数,系统应做出决定(如果测量值超过阈值 - 发送通知[蜂鸣器/ LED])。
逻辑如下:
我已将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 } } }
我遇到了以下问题:
我无法将多个数据提供给Node-RED。想知道是否有人可以指导我如何发送(温度,压力,机制状态[1或0]数据)到功能节点;
关于警报。基本上,要找到实际的高度,我需要进行两次高度测量。意思是,我需要以某种方式存储两个压力/温度测量值。我是否需要将测量数据存储为数组,或者有更好的方法来处理这个问题?
想知道是否有人可以指导/帮助我。
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;
答案 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