hugh_jie 发表于 2023-5-16 00:12:21

分享下miot auto小爱避免重复输出和多个小爱独立响应的方法

本帖最后由 hugh_jie 于 2023-5-16 13:30 编辑

前言
感谢大神al-one提供的miot auto,让小爱的接入更方便了
在之前的使用中发现,在node-red中,如果把conversion节点作为触发器,有时候会抽风的导致间歇性重复触发流程,虽然可以通过勾选`Current state equals previous state`选项来避免,但是我家里还有几个最开始玩HA时入的遥控开关,没有反馈那种
有时候遥控会出现一次操作没有反应,需要第二次喊小爱的情况,因此这个选项就不太好勾上了,有时候喊小爱打开了,关闭的时候又是手动关闭,就导致HA里状态没有变过来,因此在node-red里面加了个白天打开了也会自动关的判断
这个时候不勾选上面哪个选项的后果就很明显了,如果正好上一次是喊了小爱打开,抽风的时候就会出现一会儿开,立马被关掉,隔一会儿又开,又立马被关掉....


避免重复
下面是我的一个小爱的指令判断流程

其中的function节点就是用来避免重复输出的
内容:var timestamp = new Date(msg.data.new_state.attributes.timestamp).getTime() / 1000;
var last_updated = new Date(msg.data.new_state.last_updated).getTime() / 1000;
var message = msg.payload;
msg.payload = message;
if ((last_updated - timestamp) > 3){
    return null;
}
if ((last_updated - timestamp) <= 3) {
    return msg;
}

就是判断新指令中的两个时间timestamp和last_updated,前者大概是小爱收到指令的时间,后者是miot auto从小爱获取到数据的时间,我的interval_seconds是3s,因此判断两者的时间差,小于3s是真正收到了指令,抽风造成的timestamp貌似是不会变的,今天没有抽风没有试成,但是我重启了一下HA,发现了连接上时输出的信息里面是这样的,因此大概可以以此来判断了
之前是想通过判断last_changed和last_updated两个时间,结果发现只判断这两个时间相等的话效果等同于勾选Current state equals previous state了

收到指令的小爱独立响应

这是我的执行动作之后的响应部分
function节点内容:
var old = new Date(msg.data.attributes.timestamp).getTime() /1000;
var now = new Date().getTime() / 1000;

msg.payload = {};
msg.payload.data = { "value": "已打开" };

if ((now - old) < 10) {
    return msg;
}
if ((now - old) >= 10) {
    return null;
}
之前使用的里面的timeSinceLastChange属性,发现不太准确,改用了attributes.timestamp,转换为时间戳,对比当前时间的时间戳,相差10s内就认为是这个小爱接收了指令,后面接个当前的小爱play_text就可以了







隔壁的王叔叔 发表于 2023-5-16 09:35:53

感谢大佬分享,就差您 的json了。:lol

hugh_jie 发表于 2023-5-16 11:01:47

隔壁的王叔叔 发表于 2023-5-16 09:35
感谢大佬分享,就差您 的json了。

中间都是些call service节点了,没啥好看的啊,这几个判断节点全是这种...
也没啥好看的呐,都得自己根据自己情况来写,当然也能用function简化,但是我懒得弄了...
页: [1]
查看完整版本: 分享下miot auto小爱避免重复输出和多个小爱独立响应的方法