来自webserver

时间:2017-04-30 05:11:23

标签: javascript node-red

我正在尝试使用节点红色来轮询我的大金热泵中的网络服务器以获取内部和外部的temeperatures,这样我就可以按照我已经配置单元的计划进行记录。

轮询值时,会返回此文本字符串

  

“RET = OK,htemp = 21.5,hhum = - ,otemp = 18.0,ERR = 0,cmpfreq = 0”

我在node-red函数中使用此代码将它们分隔为逗号

msg.payload = msg.payload.split(",");
return msg;

它返回一个包含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中。我无法弄清楚如何删除左边的文本,包括=符号,而不会在节点红色中创建错误。

至少,我希望数据是这样的:

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

2 个答案:

答案 0 :(得分:0)

根据doc,输出节点需要一个Object有效负载,其中包含要推送到InfluxDB的属性/值。

所以你需要拆分那个输入字符串,为此你第一次调用body = "\n ".join(filter(None, map(str.strip, text_nodes))) 是正确的。但是这会返回一个字符串数组,不能再使用.split(',')拆分(因此会出现错误)。

以下是分割第二级.split('=')对并将其放入对象的方法:

key=value

(带评论编辑)

答案 1 :(得分:0)

为此,您可以利用节点核心中的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