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

 找回密码
 立即注册
查看: 17043|回复: 12

[流程系列] 小弟在家里做了一套恒温系统自动化供大家参考一下

[复制链接]

2

主题

18

帖子

130

积分

注册会员

Rank: 2

积分
130
金钱
112
HASS币
0
发表于 2021-5-24 11:07:40 | 显示全部楼层 |阅读模式
本帖最后由 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 的

下载12.jpg (更新于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钟防抖,就没有这个情况发生了。



评分

参与人数 1金钱 +5 收起 理由
neoyang + 5

查看全部评分

回复

使用道具 举报

10

主题

97

帖子

587

积分

高级会员

Rank: 4

积分
587
金钱
490
HASS币
0
发表于 2021-5-24 14:40:17 | 显示全部楼层
这个的话一共花了多少钱,NR里边像是阳台门关闭自动化那个有个方块紫框的那个,是安装的哪个新节点?看起来像是可以定时触发获取数据,不用时间戳激活。
回复

使用道具 举报

2

主题

18

帖子

130

积分

注册会员

Rank: 2

积分
130
金钱
112
HASS币
0
 楼主| 发表于 2021-5-26 17:28:33 | 显示全部楼层
本帖最后由 tangye 于 2021-5-26 17:44 编辑
lnight 发表于 2021-5-24 14:40
这个的话一共花了多少钱,NR里边像是阳台门关闭自动化那个有个方块紫框的那个,是安装的哪个新节点?看起来 ...

紫色的是最新版本的 hassio 自带的 node-red 插件提供的,还在 alpha 阶段。用于从 device 监听触发消息的模块。因为有的设备不含实体,但是会触发消息。 下载123.jpg

评分

参与人数 1金钱 +5 收起 理由
lnight + 5 感谢楼主分享!

查看全部评分

回复

使用道具 举报

2

主题

18

帖子

130

积分

注册会员

Rank: 2

积分
130
金钱
112
HASS币
0
 楼主| 发表于 2021-5-26 17:41:14 | 显示全部楼层
tangye 发表于 2021-5-26 17:28
紫色的是最新版本的 hassio 自带的 node-red 插件提供的,还在 alpha 阶段。用于从 device 监听触发消息 ...

所有设备价格包含了运费(有某东、有品、拼夕夕、淘宝都有淘):
Aqara Hub M1s:178
小米门窗传感器: 76
小米无线开关 - 1个手工控制小夜灯,1手工个控制净化器:48 * 2
小米烟雾报警器 zigbee 版本: 145
小米温湿度传感器2代 - 1个主卧,1个次卧: 18 * 2
小米蓝牙网关插座2代 - 连接温湿度传感器,并控制净化器开关: 59
小米智能除菌加湿器 jsq1 - 携带温湿度传感器放客厅:  260
小米床头灯:169
小米空调伴侣2代 - 控制空调: 79

总共 1100 左右
回复

使用道具 举报

2

主题

291

帖子

1530

积分

论坛积极会员

积分
1530
金钱
1239
HASS币
0
发表于 2021-5-26 20:14:55 | 显示全部楼层
阳台门用的哪个开门关门器?
回复

使用道具 举报

4

主题

605

帖子

2170

积分

金牌会员

Rank: 6Rank: 6

积分
2170
金钱
1560
HASS币
20
发表于 2021-5-31 06:07:52 来自手机 | 显示全部楼层
为什么不让空调自带的恒温工作?有人在,室外温度高于某个值,一直开着就行了,变频空调压缩机会自动按需启停。温度非常稳定
回复

使用道具 举报

0

主题

40

帖子

801

积分

高级会员

Rank: 4

积分
801
金钱
761
HASS币
0
发表于 2021-5-31 11:39:27 | 显示全部楼层
// 节点正在停止或重新部署时,将运行此处添加的代码。
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);   请问老大 这段代码 怎么用 放在哪里?
回复

使用道具 举报

2

主题

18

帖子

130

积分

注册会员

Rank: 2

积分
130
金钱
112
HASS币
0
 楼主| 发表于 2021-6-3 21:11:15 | 显示全部楼层
skyflying5 发表于 2021-5-26 20:14
阳台门用的哪个开门关门器?

小米门窗传感器 1代
回复

使用道具 举报

2

主题

18

帖子

130

积分

注册会员

Rank: 2

积分
130
金钱
112
HASS币
0
 楼主| 发表于 2021-6-3 21:12:16 | 显示全部楼层
zsqduke 发表于 2021-5-31 06:07
为什么不让空调自带的恒温工作?有人在,室外温度高于某个值,一直开着就行了,变频空调压缩机会自动按需启 ...

是为了使用体感温度控制,同时空调是在客厅,我家孩子在卧室,用的卧室的温度控制的客厅的空调。
回复

使用道具 举报

2

主题

18

帖子

130

积分

注册会员

Rank: 2

积分
130
金钱
112
HASS币
0
 楼主| 发表于 2021-6-3 21:14:08 | 显示全部楼层
kukulang 发表于 2021-5-31 11:39
// 节点正在停止或重新部署时,将运行此处添加的代码。
const last_handler = context.get("handler");
la ...

abcd.png 放在这里
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-23 17:45 , Processed in 0.424007 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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