dscao 发表于 2023-8-10 22:04:10

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

本帖最后由 dscao 于 2023-8-10 22:38 编辑

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

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

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



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

warning.pubTime 预警发布时间,如 2023-04-03T10:30+08:00
通过对预警时间戳的处理,可以有效的推送每一条信息且不重复。

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








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

彩云天气:
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["title"]
    alertcontent = forecast_alert["description"]
    alertpubtimestamp = forecast_alert["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["title"]
    alertcontent = forecast_alert["description"]
    alertpubtimestamp = alertpubtimestamp = new Date(forecast_alert["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,可参考自动化方案:彩云天气极端天气预警提醒的自动化示例分享




九天 发表于 2023-8-10 23:17:22

支持一下。。。:lol

zhuzhuzhu 发表于 2023-8-11 00:27:20

正想搞这个预警推送,大佬就来了;P;P;P;P;P

summersun2023 发表于 2023-8-11 15:34:16

这个能不能让小爱读出来。例如下雨前1小时播报,

Dlian 发表于 2023-8-14 15:27:23

summersun2023 发表于 2023-8-11 15:34
这个能不能让小爱读出来。例如下雨前1小时播报,

同求!!!!

Jinyu 发表于 2023-8-14 16:54:48

这个可以展示到UI里么

dscao 发表于 2023-8-14 17:10:22

summersun2023 发表于 2023-8-11 15:34
这个能不能让小爱读出来。例如下雨前1小时播报,

https://bbs.hassbian.com/forum.php?mod=redirect&goto=findpost&ptid=19320&pid=508391

可以参考这个

dscao 发表于 2023-8-14 17:11:01

Jinyu 发表于 2023-8-14 16:54
这个可以展示到UI里么

卡片中已经展示了

WeDone 发表于 2024-1-18 01:29:30

请教D大,如何用这个方法获取和风天气中的当前温度?

bingo10k 发表于 2024-1-21 18:30:27

感谢大佬分享!
页: [1] 2
查看完整版本: 天气预警的node-red函数处理方法(需安装彩云天气或和风天...