本帖最后由 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[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,可参考自动化方案:彩云天气极端天气预警提醒的自动化示例分享