使用 InfluxDB 和 NODE-RED 让您的数据焕发生机
作者:David G. Simmons / 产品, 用例, 开发者
2017年9月22日
导航至
将您的物联网数据放入后端系统很棒。能够查询和可视化您的物联网数据则更棒。真正地,使您的物联网数据可操作应该是物联网数据系统的最终目标。正如我们在之前的帖子中看到的,前几个步骤相对简单易行。正如我们接下来将看到的,使数据可操作同样简单且相对容易。
可视化您的数据使您能够实时查看数据并获得您可能无法获得的见解。这是物联网数据工具包中一个非常有用的工具,但仅仅在分析时查看数据是不够的。为了有用,物联网数据必须是可操作的。我即将给出的示例很简单,但很容易扩展到其他用例。我将使用我的传感器数据创建警报,然后使用这些警报使用 GlowOrb 创建视觉警报。
由于我已经从许多传感器收集了传感器数据(请参阅我之前关于该主题的帖子),因此我不会再次赘述,但您可以随意回顾一下之前的帖子以刷新记忆。
在本示例中,我还将使用 NODE-RED,因此您应该已经安装并运行了 NODE-RED,以及您的 InfluxData TICK Stack 安装。这涵盖了先决条件,让我们深入了解。
配置 NODE-RED
Node-RED 的设置和运行非常简单。使用 GlowOrb 甚至更容易。一旦我将 GlowOrb 连接到我的 WiFi,我只需访问 http://mqtt.org/GO/XXXX-YYYY/(我的 GlowOrb 的序列号),我就会得到一个完整的 NODE-RED 设置 JSON。
[
{
"id": "6f3203ca.13859c",
"type": "inject",
"z": "58595b89.4b164c",
"name": "red",
"topic": "",
"payload": "#ff0000",
"payloadType": "str",
"repeat": "",
"crontab": "",
"once": false,
"x": 170,
"y": 300,
"wires": [
[
"e3af354.bd4ccc8"
]
]
},
{
"id": "3d87bb90.0141bc",
"type": "inject",
"z": "58595b89.4b164c",
"name": "green",
"topic": "",
"payload": "#00ff00",
"payloadType": "str",
"repeat": "",
"crontab": "",
"once": false,
"x": 170,
"y": 340,
"wires": [
[
"e3af354.bd4ccc8"
]
]
},
{
"id": "b446c882.3503c8",
"type": "inject",
"z": "58595b89.4b164c",
"name": "blue",
"topic": "",
"payload": "#0000ff",
"payloadType": "str",
"repeat": "",
"crontab": "",
"once": false,
"x": 170,
"y": 380,
"wires": [
[
"e3af354.bd4ccc8"
]
]
},
{
"id": "e3af354.bd4ccc8",
"type": "mqtt out",
"z": "58595b89.4b164c",
"name": "GlowOrb XXXX-YYYY",
"topic": "iot-2/evt/command/fmt/text",
"qos": "",
"retain": "",
"broker": "3ecd43e1.c325e4",
"x": 410,
"y": 340,
"wires": [
]
},
{
"id": "ee113762.3d4e5",
"type": "mqtt in",
"z": "58595b89.4b164c",
"name": "cheerlights",
"topic": "cheerlightsRGB",
"qos": "2",
"broker": "3c0e7ff3.d2e5b8",
"x": 160,
"y": 440,
"wires": [
[
]
]
},
{
"id": "3ecd43e1.c325e4",
"type": "mqtt-broker",
"z": "",
"broker": "jit4q3.messaging.internetofthings.ibmcloud.com",
"port": "1883",
"clientid": "d:jit4q3:GlowOrbControl:XXXX-YYYY",
"usetls": false,
"compatmode": false,
"keepalive": "60",
"cleansession": true,
"willTopic": "",
"willQos": "0",
"willRetain": "false",
"willPayload": "",
"birthTopic": "",
"birthQos": "0",
"birthRetain": "false",
"birthPayload": "",
"credentials": {
"user": "use-token-auth",
"password": "cMlWUog8wY+Qp1LIyw"
}
},
{
"id": "3c0e7ff3.d2e5b8",
"type": "mqtt-broker",
"z": "",
"broker": "iot.eclipse.org",
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": true,
"keepalive": "60",
"cleansession": true,
"willTopic": "",
"willQos": "0",
"willPayload": "",
"birthTopic": "",
"birthQos": "0",
"birthPayload": ""
}
]
这是一个很大的 JSON 数据块,但如果您将其复制并粘贴到 NODE-RED Flow 中,您将得到以下内容:
点击任何一个蓝色框将把您的 GlowOrb 的颜色更改为相应的颜色。但这并不是我们想要的,因此我们将添加几个 http 端点节点,以根据 http 通知更改颜色。
我将这些 “-notice” 节点定义如下:
现在我有了用于 Kapacitor 警报的 http 端点!
设置 Kapacitor 警报
现在我已经设置了 GlowOrb,并为 http 通知设置了正确的端点,我所要做的就是设置 Kapacitor 警报!在 Chronograf 中,我导航到 “Alerts” 选项卡,然后导航到 “Alert Rules” 选项卡,并定义一个新的警报规则,然后创建一个查询。
然后定义警报何时发生(触发器)。
以及应该发生什么。
这样,每当温度读数超过 85.1º F 时,我的警报就会发送到我之前定义的 NODE-RED 端点。实际上,如果我在 NODE-RED 服务器的调试控制台中查看,我可以看到:
这表明真的很热!我应该对此做些什么。此外,我的 GlowOrb 变成了红色!成功!
优化警报
我真正想要的是能够根据温度在颜色中显示更多精度。为此,我必须编写一个自定义 TICK 脚本,如下所示:
var db = 'iotdata'
var rp = 'autogen'
var measurement = 'influxdata_sensors'
var groupBy = [*]
var whereFilter = lambda: ("location" == 'TravelingWilbury')
var name = 'relative-temp'
var idVar = name + ':{{.Group}}'
var message = ' {{ index .Fields "value" }}'
var idTag = 'alertID'
var levelTag = 'level'
var messageField = 'message'
var durationField = 'duration'
var outputDB = 'chronograf'
var outputRP = 'autogen'
var outputMeasurement = 'alerts'
var triggerType = 'relative'
var shift = 5s
0s
var crit = 0.5
var data = stream
|from()
.database(db)
.retentionPolicy(rp)
.measurement(measurement)
.groupBy(groupBy)
.where(whereFilter)
|eval(lambda: "temp_f")
.as('value')
|window()
.period(3s)
.every(1s)
.align()
var max = data
|max('value')
.as('value')
var min = data
|min('value')
.as('value')
var trigger = max
|join(min)
.as('max', 'min')
.tolerance(100ms)
|eval(lambda: float("max.value" - "min.value"))
.keep()
.as('chng')
|log()
.level('ERROR')
trigger
|influxDBOut()
.create()
.database('derived_iotdata')
.measurement('influxdata_sensors')
trigger
|alert()
.crit(lambda: abs("chng") > crit)
.stateChangesOnly()
.message(message)
.id(idVar)
.idTag(idTag)
.levelTag(levelTag)
.messageField(messageField)
.durationField(durationField)
.post('http://XXXX.com:1880/sensor-reading')
trigger
|influxDBOut()
.create()
.database(outputDB)
.retentionPolicy(outputRP)
.measurement(outputMeasurement)
.tag('alertName', name)
.tag('triggerType', triggerType)
trigger |httpOut('output')
看起来很多,但在很大程度上,我让 Chronograf 为 “相对” 警报构建了脚本,然后做了一些更改。我所做的更改是添加:
|window()
.period(3s)
.every(1s)
.align()
和
trigger
|influxDBOut()
.create()
.database(outputDB)
.retentionPolicy(outputRP)
.measurement(outputMeasurement)
.tag('alertName', name)
.tag('triggerType', triggerType)
这样,在进行比较时数据可以正确对齐,然后我添加了另一个触发器,将之前的温度、当前温度和变化值写回不同的数据库,这样我就可以监控我对温度的监控。多么元!
最后,我必须对我的 NODE-RED 脚本进行一些更改,如下所示:
我为名为 “readings” 的警报创建了一个端点(并删除了其他端点),然后为该端点创建了一个 http 响应(以便连接能够正确关闭)。响应节点只返回 HTTP 代码 204。至于 “ExtractTemp” 节点,我必须为此编写一小段 JavaScript。
var myMsg = {};
var val = myData.data.series[0].values[0][2];
node.log(val);
if(val > 90){
myMsg.payload = "#ff0000";
return myMsg;
} else if (val > 88){
myMsg.payload = "#ff4000";
return myMsg;
} else if (val > 86){
myMsg.payload = "#ff8000";
return myMsg;
} else if (val > 84){
myMsg.payload = "#ff8000";
return myMsg;
} else if (val > 82){
myMsg.payload = "#ffff00";
return myMsg;
}else if (val > 80){
myMsg.payload = "#bfff00";
return myMsg;
} else if (val > 78){
myMsg.payload = "#80ff00";
return myMsg;
} else if (val > 76){
myMsg.payload = "#40ff00";
return myMsg;
}else if (val > 74){
myMsg.payload = "#00ff00";
return myMsg;
}else if (val > 72){
myMsg.payload = "#00ff40";
return myMsg;
} else if (val > 70){
myMsg.payload = "#00ff80";
return myMsg;
} else if (val > 68){
myMsg.payload = "#00ffbf";
return myMsg;
} else if (val > 66){
myMsg.payload = "#00ffff";
return myMsg;
} else if (val > 64){
myMsg.payload = "#00bfff";
return myMsg;
} else if (val > 62){
myMsg.payload = "#0080ff";
return myMsg;
} else if (val > 60){
myMsg.payload = "#0040ff";
return myMsg;
} else if (val > 58){
myMsg.payload = "#0000ff";
return myMsg;
} else if (val > 56){
myMsg.payload = "#4000ff";
return myMsg;
} else if (val > 54){
myMsg.payload = "#8000ff";
return myMsg;
} else {
myMsg.payload = "#bf00ff";
}
return myMsg;
现在我的 GlowOrb 每 2 度增量都会改变颜色。为了简单起见,我从 W3Schools 获取了颜色。
结论
这是一个有趣的项目,使用 NODE-RED 和 InfluxDB 设置起来相对简单。我能够快速将我的传感器读数转换为数据,然后使这些数据既可以在仪表板中可见,又可以在物理世界中产生影响。这是一个简单的例子,但我可以很容易地将输出连接到伺服电机,以控制空调通风口来调节温度等等。
现在的问题是:您将控制什么?