ThermOS项目是现成智能恒温器诸多缺点的答案。
我和妻子于2020年10月搬进了新家。天一冷,我们就意识到家里旧的供暖系统(包括一个一直开着的供暖区)的一些缺点。我们之前家里有Nest恒温器,目前的设置远没有那么方便。我们家有多个恒温器,有些有计划供暖时间表,有些有不同的时间表,有些根本没有。

是时候该换一换了,但房子有一些限制:
- 它建于 20 世纪 60 年代末,在 90 年代进行了翻修。
- 热量是水暖的(热水)。
- 它有六个加热区的六个恒温器。
- 每个恒温器(红色和白色)只有两根电线加热。

购买还是建造?
我想要对所有热区(时间表、自动化、家/客场等)进行“智能”恒温器控制。如果我想买现货,我有几种选择,但它们都有缺点:
选项1:Nest 或 Ecobee
- 很贵:没有智能恒温器可以处理多个区域,所以我每个区域都需要一个(~200美元*6 = 1200美元)。
- 这很难:我必须重新运行恒温器线才能获得臭名昭著的C wire,这使恒温器能够连续供电。电线每根在墙上长20到100英尺,可能会钉在螺柱上。
选项2:电池供电的恒温器,如Sensi WiFi恒温器
- 电池只能用一两个月。
- 在仅限电池的模式下,它不兼容HomeKit。
选项3:商用现成的恒温器,但只有一家提供(有点过分了):霍尼韦尔的TrueZONE
- 它很旧,支持不力(于2008年发布)。
- 它很贵——仅控制器就超过300美元,您需要一个RedLINK网关才能让劣质应用程序工作。
最后我的选择是…
选项4:我自己来做!
我决定建造自己的多区智能恒温器,我把它命名为ThermOS。
- 它集中在一块电路板里(你需要一个设备,而不是六个设备)。
- 它使用现有的墙内恒温器线。
- 它兼容HomeKit,具有自动化、调度、家/场景等。
- 等等等等,这…有趣吗?是的,有趣……我想。
ThermOS硬件
我知道我想用树莓派。由于它们变得如此便宜,我决定使用树莓派4型号B 2GB。我相信我可以用树莓派Zero W,但那是未来的修订。
以下是我使用的部件的完整列表:
姓名 | 数量 | 价格 |
---|---|---|
树莓派4型号B 2GB | 1 | 29.99 美元 |
树莓派4官方15W电源 | 1 | 6.99 美元 |
内陆400系点面包板 | 1 | 2.99 美元 |
Arduino的内陆8通道5V继电器模块 | 1 | 8.99 美元 |
内陆杜邦跳线20厘米(3包) | 1 | 4.99 美元 |
Mouser.com的DS18B20温度传感器(正品) | 6 | 6.00 美元 |
3 针螺丝接线板(40 件装) | 1 | 7.99 美元 |
用于树莓派的RPi GPIO终端块突破板模块 | 1 | 17.99 美元 |
鳄鱼夹测试线索(10包) | 1 | 5.89美元 |
Southwire 18/2恒温器线(50英尺) | 1 | 10.89美元 |
收缩包装 | 1 | 4.99 美元 |
可焊面包板(5包) | 1 | 11.99 美元 |
PCB安装支架(50包) | 1 | 7.99 美元 |
塑料外壳/外壳 | 1 | 27.92美元 |
我开始在draw.io上绘制硬件图表,并意识到我缺乏一些关于电路板的关键知识。我打开侧板,找到了拆卸变压器,该变压器采用120V电线,使其成为加热系统的24V。如果您的加热系统与我的系统相似,您将在塔可区阀门之间看到许多跳线。Taco上的3号端口跳过了我所有的区域阀门。这是因为无论打开/打开多少阀门,它只是控制循环泵。如果一到五个阀门的任何组合是打开的,它应该打开;如果没有阀门打开,它应该关闭……很简单!

在本质上,恒温器只是一种开关。一旦恒温器内的热敏电阻(温度传感器)检测到较低的温度,开关就会关闭并完成24V电路。这个项目不是在每个房间都有一个恒温器,而是把它们都放在炉子旁边,这样所有六区阀门都可以由一个继电器模块控制,使用八个继电器中的六个。树莓派充当恒温器的大脑,独立控制每个继电器。

下一个问题是如何从每个房间获得温度读数。我可以在每个房间有一个无线温度传感器,在Arduino或树莓派上运行,但这可能会变得昂贵和复杂。相反,我想重复使用墙上现有的恒温器线,但纯粹是为了温度传感器。
“1-wire”DS18B20温度传感器似乎符合要求:
- 它的准确度为+/- 0.5°C或0.9°F。
- 它使用“1线”协议进行数据处理。
- 最重要的是,DS18B20可以使用“parasitic power”模式,只需两根电线即可获得电力和数据。提醒一下……几乎所有的DS18B20都是假冒的。我买了一些(希望它们是真的),但当我尝试使用电源时,它们不会起作用。然后我从Mouser.com上买了真品,它们就像一个符咒一样!

从面包板和本地所有组件开始,我开始编写代码来与所有组件交互。一旦我证明了这个概念,我就在混合物中添加了现有的壁内恒温器线。我得到了与那个设置一致的读数,所以我开始让他们更精致一点。在我父亲的帮助下,我们焊接了自称“足够好”的焊料,我们焊接了三针螺丝端子(以避免传感器过热),然后将传感器连接到终端上。现在传感器可以用线螺母连接到现有的壁内布线。

我仍在“美化”我的温度传感器壁挂装置,但我经历了一些3D打印修订,我想我快到了。

ThermOS软件
像往常一样,写逻辑不是难的部分。然而,决定应用程序架构和框架是一个令人困惑的多天过程。我开始评估像PiHome这样的开源项目,但它依赖于特定的硬件,并且是用PHP编写的。我是Python的粉丝,决定从头开始,编写自己的REST API。
由于HomeKit集成如此重要,我想我最终会写一个HomeBridge插件来集成它。我没有意识到有一个名为HAP-Python的Python HomeKit框架来实现配件协议。它帮助我在30分钟内通过iPhone的“家庭”应用程序运行和控制概念验证。


其余的“临时”逻辑相对简单,但我确实想强调一下我最初错过的一块。我的代码运行了几天,我正在处理硬件,这时我注意到我的继电器每隔几秒钟就会打开和关闭一次。这种“短循环”不一定有害,但它肯定没有效率。为了避免这种情况,我添加了一些阈值,以确保热开关仅在+/- 0.5°时切换。
以下是阈值逻辑(你可以参考rubber-duck debugging):
# check that we want heat if self.target_state.value == 1: # if heat relay is already on, check if above threshold # if above, turn off .. if still below keep on if GPIO.input(self.relay_pin): if self.current_temp.value - self.target_temp.value >= 0.5: status = 'HEAT ON - TEMP IS ABOVE TOP THRESHOLD, TURNING OFF' GPIO.output(self.relay_pin, GPIO.LOW) else: status = 'HEAT ON - TEMP IS BELOW TOP THRESHOLD, KEEPING ON' GPIO.output(self.relay_pin, GPIO.HIGH) # if heat relay is not already on, check if below threshold elif not GPIO.input(self.relay_pin): if self.current_temp.value - self.target_temp.value <= -0.5: status = 'HEAT OFF - TEMP IS BELOW BOTTOM THRESHOLD, TURNING ON' GPIO.output(self.relay_pin, GPIO.HIGH) else: status = 'HEAT OFF - KEEPING OFF'

我实现了我的最终目标——能够从手机上控制所有这一切。

把我的ThermOS放在午餐盒里
我的概念证明相当混乱。

随着软件和一般硬件设计的到位,我开始想出如何以更持久和更精致的形式打包所有组件。我对永久安装的主要担忧之一是使用带有杜邦跳线的面包板。我订购了一些可焊接面包板和一个螺丝终端突破板(感谢@arduima的树莓派GPIO销)。
以下是带有支架和外壳的可焊接面包板正在进行中的样子。

在这里,安装在锅炉房里。

现在我只需要整理电线并贴上标签,然后我就可以开始将恒温器的剩余部分交换到ThermOS上。我将开始我的下一个项目:用于中央空调的ThermOS。