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

 找回密码
 立即注册
查看: 7237|回复: 9

[流程系列] 请教NR-如何计算时间差 谢谢

[复制链接]

21

主题

162

帖子

2150

积分

论坛DIY达人

积分
2150
金钱
1983
HASS币
30
发表于 2020-11-18 22:09:25 | 显示全部楼层 |阅读模式
研究了快2个礼拜还是基础太差搞不定,来请教大佬。谢谢mqtt接收到的信息:
{"Time":"2020-11-18T22:02:02","Switch1":"OFF","Switch2":"OFF","BH1750":{"Illuminance":23}}
想用上面的时间减去现在的时间得到时间差,得出比如30秒还是xx天前
思路如下:
首先提取mqtt接收到的时间,把时间格式化后作为函数计算,但是输出的结果一直报错。
函数如下:
var end = msg.payload;   // 把上面处理好的时间定义为end
flow.set("endTime", end);
var now = new Date();   // 获取现在时间
flow.set("startTime", now);
msg.payload = flow.get("endTime") - flow.get("startTime");
return msg;

[
    {
        "id": "626419e.d192ee8",
        "type": "json",
        "z": "97e6cc8.406613",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": true,
        "x": 450,
        "y": 1080,
        "wires": [
            [
                "ae737359.9fd91"
            ]
        ]
    },
    {
        "id": "ae737359.9fd91",
        "type": "function",
        "z": "97e6cc8.406613",
        "name": "",
        "func": "msg.payload = msg.payload.Time\n\nreturn msg;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 590,
        "y": 1080,
        "wires": [
            [
                "4e19d992.eea4d8"
            ]
        ]
    },
    {
        "id": "4e19d992.eea4d8",
        "type": "change",
        "z": "97e6cc8.406613",
        "name": "",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "T",
                "fromt": "str",
                "to": " ",
                "tot": "str"
            },
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "-",
                "fromt": "str",
                "to": "/",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 740,
        "y": 1080,
        "wires": [
            [
                "15c9257c.975feb"
            ]
        ]
    },
    {
        "id": "15c9257c.975feb",
        "type": "function",
        "z": "97e6cc8.406613",
        "name": "",
        "func": "var end = msg.payload;   // current time\nflow.set("endTime", end);\nvar now = new Date();   // current time\nflow.set("startTime", now);\nmsg.payload = flow.get("endTime") - flow.get("startTime");\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 910,
        "y": 1080,
        "wires": [
            [
                "1e2918f.ff8cbe7"
            ]
        ]
    },
    {
        "id": "1e2918f.ff8cbe7",
        "type": "debug",
        "z": "97e6cc8.406613",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 1050,
        "y": 1080,
        "wires": []
    },
    {
        "id": "b901838f.f7287",
        "type": "mqtt in",
        "z": "97e6cc8.406613",
        "name": "",
        "topic": "tele/tasmota_EF82BE/STATE",
        "qos": "2",
        "datatype": "auto",
        "broker": "36c984ba.5428ec",
        "x": 200,
        "y": 1080,
        "wires": [
            [
                "626419e.d192ee8"
            ]
        ]
    },
    {
        "id": "36c984ba.5428ec",
        "type": "mqtt-broker",
        "z": "",
        "name": "",
        "broker": "192.168.7.7",
        "port": "1883",
        "clientid": "Node-red",
        "usetls": false,
        "compatmode": false,
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "2",
        "birthPayload": "",
        "closeTopic": "",
        "closeQos": "2",
        "closePayload": "",
        "willTopic": "",
        "willQos": "2",
        "willPayload": ""
    }
]


目前照样画葫芦的看了下面2个文章还是搞不定
https://bbs.hassbian.com/thread-9481-1-1.html

https://blog.csdn.net/xinyi_jin/article/details/88047165





回复

使用道具 举报

3

主题

317

帖子

2675

积分

论坛积极会员

积分
2675
金钱
2358
HASS币
10
发表于 2020-11-19 10:51:53 | 显示全部楼层
var payload = msg.payload;   // 假设这个为类似这样的格式的时间"2020-11-18T22:02:02"
var last = (new Date(payload)).valueOf()
var now = (new Date()).valueOf();   // 获取现在时间
var ms = now - last //ms为两者之间的毫秒数

评分

参与人数 1金钱 +5 收起 理由
innx + 5 论坛有你更精彩!

查看全部评分

回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
发表于 2020-11-19 10:47:59 | 显示全部楼层
换成时间戳减去再换回格式化时间就好了啊
Nero
回复

使用道具 举报

21

主题

162

帖子

2150

积分

论坛DIY达人

积分
2150
金钱
1983
HASS币
30
 楼主| 发表于 2020-11-19 18:43:23 | 显示全部楼层
tcwj2008 发表于 2020-11-19 10:51
var payload = msg.payload;   // 假设这个为类似这样的格式的时间"2020-11-18T22:02:02"
var last = (new  ...

感谢回复
msg.payload的时间为 2020-11-19T18:41:42

var payload = msg.payload;   // 假设这个为类似这样的格式的时间"2020-11-18T22:02:02"
var last = (new Date(payload)).valueOf()
var now = (new Date()).valueOf();   // 获取现在时间
var ms = now - last //ms为两者之间的毫秒数
return msg;


输出的结果还是 "2020-11-19T18:42:12"
回复

使用道具 举报

21

主题

162

帖子

2150

积分

论坛DIY达人

积分
2150
金钱
1983
HASS币
30
 楼主| 发表于 2020-11-19 18:44:53 | 显示全部楼层
neroxps 发表于 2020-11-19 10:47
换成时间戳减去再换回格式化时间就好了啊

版主,这个思路我理解,但是基础太差都不知道用什么函数,有参考文章吗?
回复

使用道具 举报

21

主题

162

帖子

2150

积分

论坛DIY达人

积分
2150
金钱
1983
HASS币
30
 楼主| 发表于 2020-11-19 21:02:55 | 显示全部楼层
tcwj2008 发表于 2020-11-19 10:51
var payload = msg.payload;   // 假设这个为类似这样的格式的时间"2020-11-18T22:02:02"
var last = (new  ...

搞定了!!!感谢!!!
想了一下ms的定义没有被定义到payload
加了2行就可以了  感谢!!!

msg.payload = ms/1000;
return msg;
回复

使用道具 举报

21

主题

162

帖子

2150

积分

论坛DIY达人

积分
2150
金钱
1983
HASS币
30
 楼主| 发表于 2020-11-19 22:59:11 | 显示全部楼层
本帖最后由 innx 于 2020-11-19 23:07 编辑
tcwj2008 发表于 2020-11-19 10:51
var payload = msg.payload;   // 假设这个为类似这样的格式的时间"2020-11-18T22:02:02"
var last = (new  ...
已经放弃了发现我考虑欠缺,函数没问题可以用在其他需要计算时间的地方可以参考。做这个时间差是想监控设备的,比如说设备死机了,我能知道什么时候发生的。
我用设备发出的mqtt作为触发源,设备死机后不更新数据,就一直停留在那一刻了。
是不是应该吧这个时间储存起来,用nr的每一分钟触发功能减去上一次上报的时间。

再次感谢高手的回复。

回复

使用道具 举报

3

主题

317

帖子

2675

积分

论坛积极会员

积分
2675
金钱
2358
HASS币
10
发表于 2020-11-20 11:27:30 | 显示全部楼层
innx 发表于 2020-11-19 22:59
已经放弃了发现我考虑欠缺,函数没问题可以用在其他需要计算时间的地方可以参考。做这个时间差是想监控设备 ...

是的,mqtt给的信息就存储下来时间,再用inject循环发送,用之前的代码检查时间差就可以了
回复

使用道具 举报

62

主题

749

帖子

4297

积分

论坛元老

Rank: 8Rank: 8

积分
4297
金钱
3543
HASS币
20
发表于 2021-3-19 11:24:55 | 显示全部楼层
参考你发的那个csdn的搞定了
https://bbs.hassbian.com/thread-12496-1-1.html
回复

使用道具 举报

62

主题

749

帖子

4297

积分

论坛元老

Rank: 8Rank: 8

积分
4297
金钱
3543
HASS币
20
发表于 2021-3-19 11:30:05 | 显示全部楼层
innx 发表于 2020-11-19 22:59
已经放弃了发现我考虑欠缺,函数没问题可以用在其他需要计算时间的地方可以参考。做这个时间差是想监控设备 ...

mqtt触发,记录时间
获取当前时间,做差
你就当参我那个洗衣机吧,几乎一模一样
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-15 16:18 , Processed in 0.057560 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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