来自网络服务器的节点红色拆分值
node-red split values from webserver
我正在尝试使用 node-red 轮询我的 Daikin 热泵中的网络服务器以获取内部和外部温度,以便我可以根据我还配置了该单元的时间表记录它们。
当轮询它的值时,它 returns 这串文本
"ret=OK,htemp=21.5,hhum=-,otemp=18.0,err=0,cmpfreq=0"
我在 node-red 函数中使用此代码以逗号分隔它们
msg.payload = msg.payload.split(",");
return msg;
它 returns 一个包含 6 个字段的数组,如下所示:
array[6]
0: "ret=OK"
1: "htemp=21.5"
2: "hhum=-"
3: "otemp=18.0"
4: "err=0"
5: "cmpfreq=0"
然后由 node-red 将其放入 influxdb 中,数组的数字字段是创建的字段。
我无法分析此数据,因为它在最终出现在 influxdb 中的字段中包含文本。我无法弄清楚如何在不在 node-red 中创建错误的情况下删除 = 符号左侧的文本并包括该符号。
至少,我希望数据是这样的:
array[6]
0: "OK"
1: "21.5"
2: "-"
3: "18.0"
4: "0"
5: "0"
更好的方法是使用 = 号左侧的文本作为数组中的字段值,以便它们填充到 influxdb 中。这将使分析更容易。
它看起来像这样(为了便于阅读,额外的空格排列冒号):
array[6]
ret: "OK"
htemp: "21.5"
hhum: "-"
otemp: "18.0"
err: "0"
cmpfreq: "0"
我知道语法是基于 javascript 的,但我在这方面还不够强大,无法理解这一点。我已经弄了一天了,没有运气。
谢谢!
P.S。对于任何拥有带 Wifi 的 Daikin US7 并想通过 IP 控制它的人,我一直在使用 this repo 来获取我需要发送到网络服务器的值。
更新请求信息
InfluxDB 是 v0.10.0,webui 说是 go1.6rc1
Node-RED 是 v.0.16.2
Node-RED 正在使用 node-red-contrib-influxdb v0.1.1
当我在函数中使用这段代码时:
msg.payload = msg.payload.split(",").split("=")[0];
return msg;
我在函数输出上放置调试标签时遇到此错误:
function : (error)
"TypeError: msg.payload.split(...).split is not a function"
flow layout and error
根据 doc,输出节点需要一个包含 properties/values 要推送到 InfluxDB 的对象负载。
因此您需要拆分该输入字符串,为此您对 .split(',')
的第一次调用是正确的。但是这个 returns 一个字符串数组,不能用 .split('=')
再次拆分(因此会出现错误)。
以下是拆分 key=value
对的第二层并将它们放入对象中的方法:
var o = {}; // new empty Object that will be used for next payload
msg.payload.split(',').forEach(function(kv) { // loop on 'key=value' entries in array
var pair = kv.split('='); // split entry to isolate key and value
var key = pair[0];
var value = pair[1];
o[key] = value; // save that as new property for our Object
});
msg.payload = o; // Make that object the new payload
(编辑评论)
为此,您可以利用节点核心中的 querystring
模块。
const querystring = require('querystring');
const parsed = querystring.parse(msg.payload, ',');
// convert the numbers to numbers instead of strings
Object.keys(parsed).forEach(function (key) {
const numberValue = +parsed[key];
// if the value converted to number is Not A Number then don't change it
if (isNaN(numberValue)) return;
parsed[key] = numberValue;
});
msg.payload = parsed;
querystring.parse
的第二个参数是分隔符,check the docs for more info。
我正在尝试使用 node-red 轮询我的 Daikin 热泵中的网络服务器以获取内部和外部温度,以便我可以根据我还配置了该单元的时间表记录它们。
当轮询它的值时,它 returns 这串文本
"ret=OK,htemp=21.5,hhum=-,otemp=18.0,err=0,cmpfreq=0"
我在 node-red 函数中使用此代码以逗号分隔它们
msg.payload = msg.payload.split(",");
return msg;
它 returns 一个包含 6 个字段的数组,如下所示:
array[6]
0: "ret=OK"
1: "htemp=21.5"
2: "hhum=-"
3: "otemp=18.0"
4: "err=0"
5: "cmpfreq=0"
然后由 node-red 将其放入 influxdb 中,数组的数字字段是创建的字段。
我无法分析此数据,因为它在最终出现在 influxdb 中的字段中包含文本。我无法弄清楚如何在不在 node-red 中创建错误的情况下删除 = 符号左侧的文本并包括该符号。
至少,我希望数据是这样的:
array[6]
0: "OK"
1: "21.5"
2: "-"
3: "18.0"
4: "0"
5: "0"
更好的方法是使用 = 号左侧的文本作为数组中的字段值,以便它们填充到 influxdb 中。这将使分析更容易。
它看起来像这样(为了便于阅读,额外的空格排列冒号):
array[6]
ret: "OK"
htemp: "21.5"
hhum: "-"
otemp: "18.0"
err: "0"
cmpfreq: "0"
我知道语法是基于 javascript 的,但我在这方面还不够强大,无法理解这一点。我已经弄了一天了,没有运气。
谢谢!
P.S。对于任何拥有带 Wifi 的 Daikin US7 并想通过 IP 控制它的人,我一直在使用 this repo 来获取我需要发送到网络服务器的值。
更新请求信息
InfluxDB 是 v0.10.0,webui 说是 go1.6rc1 Node-RED 是 v.0.16.2 Node-RED 正在使用 node-red-contrib-influxdb v0.1.1
当我在函数中使用这段代码时:
msg.payload = msg.payload.split(",").split("=")[0];
return msg;
我在函数输出上放置调试标签时遇到此错误:
function : (error)
"TypeError: msg.payload.split(...).split is not a function"
flow layout and error
根据 doc,输出节点需要一个包含 properties/values 要推送到 InfluxDB 的对象负载。
因此您需要拆分该输入字符串,为此您对 .split(',')
的第一次调用是正确的。但是这个 returns 一个字符串数组,不能用 .split('=')
再次拆分(因此会出现错误)。
以下是拆分 key=value
对的第二层并将它们放入对象中的方法:
var o = {}; // new empty Object that will be used for next payload
msg.payload.split(',').forEach(function(kv) { // loop on 'key=value' entries in array
var pair = kv.split('='); // split entry to isolate key and value
var key = pair[0];
var value = pair[1];
o[key] = value; // save that as new property for our Object
});
msg.payload = o; // Make that object the new payload
(编辑评论)
为此,您可以利用节点核心中的 querystring
模块。
const querystring = require('querystring');
const parsed = querystring.parse(msg.payload, ',');
// convert the numbers to numbers instead of strings
Object.keys(parsed).forEach(function (key) {
const numberValue = +parsed[key];
// if the value converted to number is Not A Number then don't change it
if (isNaN(numberValue)) return;
parsed[key] = numberValue;
});
msg.payload = parsed;
querystring.parse
的第二个参数是分隔符,check the docs for more info。