『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 8659|回复: 11

[流程系列] nodered提取ID

[复制链接]

32

主题

146

帖子

1257

积分

金牌会员

Rank: 6Rank: 6

积分
1257
金钱
1111
HASS币
0
发表于 2021-7-7 17:55:13 | 显示全部楼层 |阅读模式
请问如何提取Device_ID?,然后根据ID导出Qty值?

QQ截图20210707175554.png
回复

使用道具 举报

77

主题

1391

帖子

2万

积分

元老级技术达人

积分
24293
金钱
22862
HASS币
290
发表于 2021-7-7 20:06:16 | 显示全部楼层
msg.payload[0].Device_ID

msg.payload[0].Qty


回复

使用道具 举报

32

主题

146

帖子

1257

积分

金牌会员

Rank: 6Rank: 6

积分
1257
金钱
1111
HASS币
0
 楼主| 发表于 2021-7-7 21:35:27 | 显示全部楼层

不好意思,忘记写一个变化了。这里数据顺序问题,msg.payload[0].Device_ID不一定相同的,所以出来的值也不一样,但Device_ID是唯一的,怎样才能保持使msg.payload[X].Device_ID==94?
回复

使用道具 举报

77

主题

1391

帖子

2万

积分

元老级技术达人

积分
24293
金钱
22862
HASS币
290
发表于 2021-7-7 22:52:06 | 显示全部楼层
这就要用函数了,大概这样吧,要调试一下看看有没有错:

for (i = 0; i < 180; i++) {
    if (msg.payload[i].Device_ID==="94") {
    msg.payload = msg.payload[i].Qty;
    }
}
return msg;
回复

使用道具 举报

32

主题

146

帖子

1257

积分

金牌会员

Rank: 6Rank: 6

积分
1257
金钱
1111
HASS币
0
 楼主| 发表于 2021-7-8 16:56:31 | 显示全部楼层
本帖最后由 chaoself 于 2021-7-8 17:00 编辑
dscao 发表于 2021-7-7 22:52
这就要用函数了,大概这样吧,要调试一下看看有没有错:

for (i = 0; i < 180; i++) {

你好,我用这个方法可以提取出此ID内的温度(Temp)了,我现在想把湿度(Hum)也提出出来如何写?这里的代码好像不能同时提取。麻烦大神看一下
var tt=msg.payload
for(let i=0;i<tt.length;i++)
{
    t=parseFloat(msg.payload.Device_ID);
    if(t==94)
    {
        var Temp=msg.payload.Qty
        var Hum=msg.payload[i+1].Qty
        msg.payload={"ZOGEL94_1Temp": parseFloat(Temp)};
        msg.payload={"ZOGEL94_1Hum": parseFloat(Hum)};
        return msg;
    }
}
return msg;
QQ截图20210708165931.png
回复

使用道具 举报

77

主题

1391

帖子

2万

积分

元老级技术达人

积分
24293
金钱
22862
HASS币
290
发表于 2021-7-8 17:32:12 | 显示全部楼层
本帖最后由 dscao 于 2021-7-8 20:20 编辑

有两个参数就要两个条件分开判断了,如果你上面的都能正确运行,修改一下程序结构应该就可以了:js语法我还不太会。


var tt=msg.payload
for(let i=0;i<tt.length;i++)
{
t=parseFloat(msg.payload[i].Device_ID);
s=msg.payload[i].channel;

if(t==94 && s=="Temp")
{
var Temp=msg.payload[i].Qty
msg2.payload.temp={"ZOGEL94_1Temp": parseFloat(Temp)};
}
if(t==94 && s=="Hum")
{
var Hum=msg.payload[i].Qty
msg2.payload.hum={"ZOGEL94_1Hum": parseFloat(Hum)};
}
}
return msg2;

回复

使用道具 举报

3

主题

321

帖子

2891

积分

论坛积极会员

积分
2891
金钱
2570
HASS币
10
发表于 2021-7-8 19:21:58 | 显示全部楼层
for(let i of msg.payload){
if(i.Device_ID == "94") msg[i.channel] = i.Qty;
}
出来的msg就会有一个hum和一个temp数值了
回复

使用道具 举报

77

主题

1391

帖子

2万

积分

元老级技术达人

积分
24293
金钱
22862
HASS币
290
发表于 2021-7-8 20:51:44 | 显示全部楼层
tcwj2008 发表于 2021-7-8 19:21
for(let i of msg.payload){
if(i.Device_ID == "94") msg = i.Qty;
}

这么简洁的代码就解决问题了呀
回复

使用道具 举报

32

主题

146

帖子

1257

积分

金牌会员

Rank: 6Rank: 6

积分
1257
金钱
1111
HASS币
0
 楼主| 发表于 2021-7-8 23:28:52 | 显示全部楼层
tcwj2008 发表于 2021-7-8 19:21
for(let i of msg.payload){
if(i.Device_ID == "94") msg = i.Qty;
}

这个代码试了,输出的180个数组,并不是ID为94的两个值
回复

使用道具 举报

32

主题

146

帖子

1257

积分

金牌会员

Rank: 6Rank: 6

积分
1257
金钱
1111
HASS币
0
 楼主| 发表于 2021-7-8 23:32:09 | 显示全部楼层
本帖最后由 chaoself 于 2021-7-8 23:34 编辑
var tt=msg.payload
for(let i=0;i<tt.length;i++)
{
    //t=parseFloat(msg.payload[i].Device_ID);
    t=msg.payload[i].Device_ID;
    s=msg.payload[i].Channel;
    if(t=="94" && s=="Temp")
    {
        var Temp=msg.payload[i].Qty;
        var Temp1={payload:{"ZOGEL94_1Temp": parseFloat(Temp)}};
    }
    if(t=="94" && s=="Humi")
    {
        var Hum=msg.payload[i].Qty;
        var Hum1={payload:{"ZOGEL94_1Hum": parseFloat(Hum)}};
        return [[Temp1,Hum1]];
    }
}

dscao 发表于 2021-7-8 17:32
有两个参数就要两个条件分开判断了,如果你上面的都能正确运行,修改一下程序结构应该就可以了:js语法我还 ...
这样修改可以输出Temp与Humi。但MQTT到HA时,只能显示1个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-23 17:49 , Processed in 0.075169 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表