本帖最后由 tangye 于 2021-5-26 17:58 编辑
周末在家里鼓捣 node-red,感觉还是很好用的。
耗材:
Aqara Hub M1s
小米门窗传感器
小米无线开关 - 1个手工控制小夜灯,1手工个控制净化器
小米烟雾报警器 zigbee 版本
小米温湿度传感器2代 - 1个主卧,1个次卧
小米蓝牙网关插座2代 - 连接温湿度传感器,并控制净化器开关
小米智能加湿器 jsq1 - 携带温湿度传感器放客厅
小米床头灯
小米空调伴侣2代 - 控制空调
全部接入米家+homeassistant+homekit
由于加湿器 homebridge 的插件实现比较好,无需cloud,加湿器是通过 homebridge 接入 homeassistant 的
(更新于5月26日)
两个小米开关是用的 home assistant 的自动化处理的,也可以用 node-red 的 device 功能(桃色的那个设备,这样可以复用很多逻辑,不过因为是前天做的,就没加进来)
空调是利用体感温度控制的,体感温度使用的是论坛里提到的一个算法,wiki:https://zh.wikipedia.org/zh-sg/% ... F%E6%BA%AB%E5%BA%A6
另外,使用的 home assistant 自带的 WAQI 来做空气质量监控,控制净化器
所有环境传感器:
环境传感器列表
传刚起自动化
利用 homekit 的地理围栏功能,可以实现比较好的自动化的开关,确保无人的时候,部分自动化可以不使用
5月26日:
做了一版本优化,增加了那些数字监控的稳定性逻辑,比如超过28度10分钟后,才触发什么的逻辑,本来也可以利用 stoptimer 来做,自己写了一个 js 的脚本,这样就可以用一个 function 节点,代替一堆节点了。
这里给出 function 的代码,供大家参考一下,哦对了,这里要利用到 outputCount 属性,如果有4种情况,要把 outputCount 设置为 4, 代码里的 messages 也是 4 的数组形态,为了多个输出口:
const timeout = 1000 * 600;
const payload = msg.payload;
const state = payload >= 28 ?
0 : payload >= 26 ?
1 : payload >= 23 ?
2 : 3;
const last_state = context.get("last_state") ?? -1;
const last_handler = context.get("handler");
msg.state = state;
if (state != last_state) {
context.set("last_state", state);
if (last_state == -1) {
const messages = [null, null, null, null];
messages[state] = msg;
return messages;
}
last_handler && clearTimeout(last_handler);
const handler = setTimeout(() => {
context.set("handler", undefined);
const messages = [null, null, null, null];
messages[state] = context.get("last_msg");
context.set("last_msg", undefined);
node.send(messages, false);
node.done();
}, timeout);
context.set("handler", handler);
context.set("last_msg", msg);
return;
} else if (last_handler) {
context.set("last_msg", msg);
return null;
} else {
context.set("last_msg", undefined);
const messages = [null, null, null, null];
messages[state] = msg;
return messages;
}
function 要在关闭的时候,增加回收 timer 和 context 的逻辑:
// 节点正在停止或重新部署时,将运行此处添加的代码。
const last_handler = context.get("handler");
last_handler && clearTimeout(last_handler);
context.set("handler", undefined);
context.set("last_msg", undefined);
context.set("last_state", undefined);
这个代码专门用来处理,类似于温度、湿度等数据的自动化稳定器。确保抖动的数据不至于导致不停的开关设备。目前已经用了好多天了,之前湿度经常测试不太准,某个测试点会特别低,触发打开加湿器。所以,我做了一个2min的抖动处理就解决了这个问题,空调也是,因为温度在临界值附近时,不停导致空调开关没有必要,我做了一个10min钟防抖,就没有这个情况发生了。
|