来自网络服务器的节点红色拆分值

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