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

 找回密码
 立即注册
查看: 4110|回复: 16

[经验分享] 天气预警的node-red函数处理方法(需安装彩云天气或和风天...

[复制链接]

77

主题

1391

帖子

2万

积分

元老级技术达人

积分
24304
金钱
22873
HASS币
290
发表于 2023-8-10 22:04:10 | 显示全部楼层 |阅读模式
本帖最后由 dscao 于 2023-8-10 22:38 编辑

其实方法很多种,论坛上的大佬们也发过帖子。不过我这个步骤比较少,用很久了还算稳定,还是也分享一下方法吧,供参考。

天气实体的集成:分享一个改版彩云天气集成【v2.1】  或 和风天气完整配置版本V2.0

分享过自动化来处理彩云天气预警信息的推送,如果用node-red的话,实际上更简单、效果更好。不需要在ha中进行额外设置。
1.jpg


彩云每个天气预警中都有一个 forecast_alert.content.pubtimestamp
pubtimestamp: 发布时间,单位是 Unix 时间戳,如 1587443583

和风天气预警中有:warning.pubTime

warning.pubTime 预警发布时间,如 2023-04-03T10:30+08:00

通过对预警时间戳的处理,可以有效的推送每一条信息且不重复。

天气实体发生变化,获取预警信息的函数节点对信息进行处理,过滤已发送预警信息,处理之后向后一节点发送消息,后一节点将本次发送的预警时间保存下来,再后面处理推送流程。
2.jpg

3.jpg


4.jpg


主要就是函数节点,函数内容为:

彩云天气:
var forecast_alert = msg.data.new_state.attributes.forecast_alert.content;
var alerttitle
var alertcontent
var alertpubtimestamp
var alertpubtimeold = flow.get("alertpubtimestamp", "store")
if (typeof alertpubtimeold == 'undefined') {
    alertpubtimeold = 0;
}
msg.address = msg.data.new_state.attributes.friendly_name

for (let i = 0; i < forecast_alert.length; i++) {
    alerttitle = forecast_alert[i]["title"]
    alertcontent = forecast_alert[i]["description"]
    alertpubtimestamp = forecast_alert[i]["pubtimestamp"]
    if (parseInt(alertpubtimestamp) > parseInt(alertpubtimeold)) {
        msg.alerttitle = alerttitle
        msg.alertcontent = alertcontent
        msg.alertpubtimestamp = alertpubtimestamp
        node.send(msg);
    }

}


和风天气:
var forecast_alert = msg.data.new_state.attributes.warning;
var alerttitle
var alertcontent
var alertpubtimestamp
var alertpubtimeold = flow.get("alertpubtimestamp", "store")
if (typeof alertpubtimeold == 'undefined') {
    alertpubtimeold = 0;
}
msg.address = msg.data.new_state.attributes.friendly_name

for (let i = 0; i < forecast_alert.length; i++) {
    alerttitle = forecast_alert[i]["title"]
    alertcontent = forecast_alert[i]["description"]
    alertpubtimestamp = alertpubtimestamp = new Date(forecast_alert[i]["pubTime"]).getTime();
    if (parseInt(alertpubtimestamp) > parseInt(alertpubtimeold)) {
        msg.alerttitle = alerttitle
        msg.alertcontent = alertcontent
        msg.alertpubtimestamp = alertpubtimestamp
        node.send(msg);
    }

}


处理后输出:
msg.alerttitle 预警标题
msg.alertcontent   预警详细内容
msg.alertpubtimestamp  预警发布时间戳
msg.address  预警信息天气实体的friendly_name


相关基础设置:让node-red可持久化存储变量
如果不启用持久化存储变量,每次重启node-red后会重复推送。


如果气象台同一时间推送两条以上的消息且顺序不是按先后的话,可能会漏信息。真有这种情况就需要先进行一下排序。
// 对 forecast_alert 数组按 pubtimestamp 进行排序
forecast_alert.sort(function (a, b) {
var pubtimestampA = parseInt(a.pubtimestamp);
var pubtimestampB = parseInt(b.pubtimestamp);
return pubtimestampA - pubtimestampB;
});
// 对 forecast_alert 数组按 pubTime 进行排序
forecast_alert.sort(function (a, b) {
var pubTimeA = new Date(a.pubTime).getTime();
var pubTimeB = new Date(b.pubTime).getTime();
return pubTimeA - pubTimeB;
});




如果不使用node-red,可参考自动化方案:彩云天气极端天气预警提醒的自动化示例分享




评分

参与人数 3金钱 +13 收起 理由
mykc + 1 高手,这是高手!
dohteryrx + 2
DDDear + 10 膜拜大神!

查看全部评分

回复

使用道具 举报

18

主题

275

帖子

2333

积分

金牌会员

Rank: 6Rank: 6

积分
2333
金钱
2058
HASS币
10
发表于 2023-8-10 23:17:22 | 显示全部楼层
支持一下。。。
回复

使用道具 举报

0

主题

144

帖子

1154

积分

金牌会员

Rank: 6Rank: 6

积分
1154
金钱
1010
HASS币
0
发表于 2023-8-11 00:27:20 | 显示全部楼层
正想搞这个预警推送,大佬就来了
回复

使用道具 举报

0

主题

21

帖子

112

积分

注册会员

Rank: 2

积分
112
金钱
91
HASS币
0
发表于 2023-8-11 15:34:16 | 显示全部楼层
这个能不能让小爱读出来。例如下雨前1小时播报,
回复

使用道具 举报

3

主题

64

帖子

329

积分

中级会员

Rank: 3Rank: 3

积分
329
金钱
265
HASS币
0
发表于 2023-8-14 15:27:23 | 显示全部楼层
summersun2023 发表于 2023-8-11 15:34
这个能不能让小爱读出来。例如下雨前1小时播报,

同求!!!!
回复

使用道具 举报

0

主题

29

帖子

147

积分

注册会员

Rank: 2

积分
147
金钱
118
HASS币
0
发表于 2023-8-14 16:54:48 | 显示全部楼层
这个可以展示到UI里么
回复

使用道具 举报

77

主题

1391

帖子

2万

积分

元老级技术达人

积分
24304
金钱
22873
HASS币
290
 楼主| 发表于 2023-8-14 17:10:22 | 显示全部楼层
summersun2023 发表于 2023-8-11 15:34
这个能不能让小爱读出来。例如下雨前1小时播报,

https://bbs.hassbian.com/forum.p ... 9320&pid=508391

可以参考这个
回复

使用道具 举报

77

主题

1391

帖子

2万

积分

元老级技术达人

积分
24304
金钱
22873
HASS币
290
 楼主| 发表于 2023-8-14 17:11:01 | 显示全部楼层
Jinyu 发表于 2023-8-14 16:54
这个可以展示到UI里么

卡片中已经展示了
回复

使用道具 举报

2

主题

89

帖子

851

积分

高级会员

Rank: 4

积分
851
金钱
762
HASS币
0
发表于 2024-1-18 01:29:30 | 显示全部楼层
请教D大,如何用这个方法获取和风天气中的当前温度?
回复

使用道具 举报

0

主题

26

帖子

85

积分

注册会员

Rank: 2

积分
85
金钱
59
HASS币
0
发表于 2024-1-21 18:30:27 | 显示全部楼层
感谢大佬分享!
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 00:12 , Processed in 0.642943 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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