我和我的妻子于 2020 年 10 月搬进了一个新家。天气一变冷,我们就意识到房子里旧的供暖系统的一些缺点(包括一个始终开启的供暖区域)。我们在之前的家里有 Nest 恒温器,而目前的设置远不如以前方便。我们的房子里有多个恒温器,有些有编程的加热时间表,有些有不同的时间表,有些根本没有。

房子的前主人留下了关于一些恒温器如何工作的说明。(Joseph Truncale,CC BY-SA 4.0)
是时候做出改变了,但房子有一些限制
- 它建于 1960 年代后期,并在 90 年代进行了翻修。
- 供暖方式是水暖(热水踢脚线)。
- 它有六个恒温器,用于六个供暖区域。
- 每个恒温器只有两根电线用于供暖(红色和白色)。

位于炉子上的 Taco(发音为 TAY-KO)区域阀。(Joseph Truncale,CC BY-SA 4.0)
购买还是构建?
我想要对所有供暖区域进行“智能”恒温器控制(时间表、自动化、在家/离家等)。如果我想购买现成的产品,我有几个选择,但所有这些选择都有缺点
选项 1:Nest 或 Ecobee
- 它很贵:没有智能恒温器可以处理多个区域,所以我每个区域都需要一个(约 200 美元 * 6 = 1,200 美元)。
- 它很困难:我必须重新铺设恒温器电线才能获得臭名昭著的 C 线,这使恒温器能够持续供电。电线长 20 到 100 英尺,位于墙内,并且可能钉在立柱上。
选项 2:电池供电的恒温器,例如 Sensi WiFi 恒温器
- 电池只能持续一两个月。
- 在仅使用电池模式下,它与 HomeKit 不兼容。
选项 3:商用现成恒温器,但只有一种(某种程度上):霍尼韦尔的 TrueZONE
- 它很旧,并且支持不佳(它发布于 2008 年)。
- 它很贵——仅控制器就超过 300 美元,并且您需要一个 RedLINK 网关才能使一个糟糕的应用程序工作。
获胜者是……
选项 4:构建我自己的!
我决定构建我自己的多区域智能恒温器,我将其命名为 ThermOS。
- 它集中在炉子上(您只需要一个设备,而不是六个)。
- 它使用现有的墙内恒温器电线。
- 它与 HomeKit 兼容,并具有自动化、计划、在家/离家等功能。
- 而且……它很有趣?是的,很有趣……我想。
ThermOS 硬件
我知道我想使用树莓派。由于它们变得如此便宜,我决定使用 Raspberry Pi 4 Model B 2GB。我相信我可以用 Raspberry Pi Zero W 来完成,但这将用于未来的修订版。
这是我使用的所有零件的完整列表
名称 | 数量 | 价格 |
---|---|---|
Raspberry Pi 4 Model B 2GB | 1 | $29.99 |
Raspberry Pi 4 官方 15W 电源 | 1 | $6.99 |
Inland 400 接线点面包板 | 1 | $2.99 |
用于 Arduino 的 Inland 8 通道 5V 继电器模块 | 1 | $8.99 |
Inland DuPont 跳线 20 厘米(3 件装) | 1 | $4.99 |
来自 Mouser.com 的 DS18B20 温度传感器(正品) | 6 | $6.00 |
3 针螺钉端子块(40 件装) | 1 | $7.99 |
用于 Raspberry Pi 的 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 区域阀之间有很多跳线。Taco 上的端子 3 跳过我的所有区域阀。这是因为有多少阀门打开/关闭并不重要——它只是控制循环泵。如果一到五个阀门的任意组合打开,它应该打开;如果没有阀门打开,它应该关闭……很简单!

使用一个区域的 ThermOS 架构。(Joseph Truncale,CC BY-SA 4.0)
从本质上讲,恒温器只是一种开关。一旦恒温器内部的热敏电阻(温度传感器)检测到较低的温度,开关就会关闭并完成 24V 电路。该项目不是在每个房间都安装恒温器,而是将所有恒温器都放在炉子旁边,以便所有六个区域阀都可以使用继电器模块通过八个继电器中的六个进行控制。树莓派充当恒温器的大脑,并独立控制每个继电器。

使用树莓派和 Python 手动设置继电器。(Joseph Truncale,CC BY-SA 4.0)
下一个问题是如何从每个房间获取温度读数。我可以在每个房间安装一个使用 Arduino 或 Raspberry Pi 运行的无线温度传感器,但这可能会变得昂贵且复杂。相反,我想重复使用墙内现有的恒温器电线,但仅用于温度传感器。
“单线” DS18B20 温度传感器似乎符合要求
- 它的精度为 +/- 0.5°C 或 0.9°F。
- 它使用“单线”协议进行数据传输。
- 最重要的是,DS18B20 可以使用“寄生电源”模式,它只需要两根电线用于电源和数据。请注意……几乎所有的 DS18B20 都是 假冒 的。我购买了一些(希望它们是正品),但当我尝试使用寄生电源时,它们无法工作。然后我从 Mouser.com 购买了真正的产品,它们工作得非常好!

三个使用寄生电源连接在同一 GPIO 总线上的 DS18B20。(Joseph Truncale,CC BY-SA 4.0)
从面包板和所有本地组件开始,我开始编写代码来与所有组件交互。一旦我验证了概念,我就将现有的墙内恒温器电线添加到组合中。我通过该设置获得了一致的读数,所以我开始让它们更加完善。在我的 爸爸(自称“刚刚好”的焊工)的帮助下,我们将引线焊接到三针螺钉端子上(以避免传感器过热),然后将传感器连接到端子上。现在可以使用线螺母将传感器连接到现有的墙内布线。

DS18B20 使用现有电线连接到旧的恒温器位置。(Joseph Truncale,CC BY-SA 4.0)
我仍在“美化”我的温度传感器壁挂架,但我已经经历了几次 3D 打印修订,我想我差不多完成了。

我从 Nest 风格的支架开始,然后转向齐平安装风格。(Joseph Truncale,CC BY-SA 4.0)
ThermOS 软件
像往常一样,编写逻辑并不难。然而,决定应用程序架构和框架是一个令人困惑的、持续数天的过程。我首先评估像 PiHome 这样的开源项目,但它依赖于特定的硬件并且是用 PHP 编写的。我是 Python 的粉丝,并决定从头开始编写我自己的 REST API。
由于 HomeKit 集成非常重要,我想我最终会编写一个 HomeBridge 插件来集成它。我没有意识到有一个完整的 Python HomeKit 框架叫做 HAP-Python,它实现了配件协议。它帮助我在 30 分钟内运行并通过我的 iPhone 的 Home 应用程序控制了概念验证。

Apple HomeKit 集成的初始版本,在 HAP-Python 框架的帮助下。(Joseph Truncale,CC BY-SA 4.0)

ThermOS 软件架构(Joseph Truncale,CC BY-SA 4.0)
“temp”逻辑的其余部分相对简单,但我想强调一个我最初忽略的地方。我的代码运行了几天,我正在调试硬件,这时我注意到我的继电器每隔几秒钟就会打开和关闭。这种“短周期”不一定有害,但肯定效率不高。为了避免这种情况,我添加了一些阈值,以确保仅当温度为 +/- 0.5摄氏度时才切换加热。
这是阈值逻辑(您可以在注释中看到橡皮鸭调试):
# 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'

阈值允许更长时间的关闭加热。(Joseph Truncale,CC BY-SA 4.0)
我实现了我的最终目标——能够通过手机控制所有这些。

ThermOS 作为 HomeKit 集线器(Joseph Truncale,CC BY-SA 4.0)
将我的 ThermOS 放入午餐盒
我的概念验证非常混乱。

ThermOS 控制单个区域(之前)(Joseph Truncale,CC BY-SA 4.0)
软件和通用硬件设计到位后,我开始考虑如何以更永久和更完善的形式封装所有组件。永久安装的主要考虑因素之一是使用带有杜邦跳线的面包板。我订购了一些可焊接面包板和一个螺丝端子接线板(感谢@arduima提供的 Raspberry Pi GPIO 引脚)。
这是带有支架和外壳的可焊接面包板的进度情况。

(Joseph Truncale,CC BY-SA 4.0)
这是它,安装在锅炉房中。

ThermOS 已安装(Joseph Truncale,CC BY-SA 4.0)
现在我只需要整理和标记电线,然后就可以开始将剩余的恒温器切换到 ThermOS。然后我将开始我的下一个项目:用于中央空调的 ThermOS。
这篇文章最初出现在Medium上,经许可重新发布。
13 条评论