用树莓派建造一个家庭恒温器

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 2GB129.99 美元
树莓派4官方15W电源16.99 美元
内陆400系点面包板12.99 美元
Arduino的内陆8通道5V继电器模块18.99 美元
内陆杜邦跳线20厘米(3包)14.99 美元
Mouser.com的DS18B20温度传感器(正品)66.00 美元
3 针螺丝接线板(40 件装)17.99 美元
用于树莓派的RPi GPIO终端块突破板模块117.99 美元
鳄鱼夹测试线索(10包)15.89美元
Southwire 18/2恒温器线(50英尺)110.89美元
收缩包装14.99 美元
可焊面包板(5包)111.99 美元
PCB安装支架(50包)17.99 美元
塑料外壳/外壳127.92美元

我开始在draw.io上绘制硬件图表,并意识到我缺乏一些关于电路板的关键知识。我打开侧板,找到了拆卸变压器,该变压器采用120V电线,使其成为加热系统的24V。如果您的加热系统与我的系统相似,您将在塔可区阀门之间看到许多跳线。Taco上的3号端口跳过了我所有的区域阀门。这是因为无论打开/打开多少阀门,它只是控制循环泵。如果一到五个阀门的任何组合是打开的,它应该打开;如果没有阀门打开,它应该关闭……很简单!

炉子布线建筑

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

使用树莓派和Python手动设置继电器

下一个问题是如何从每个房间获得温度读数。我可以在每个房间有一个无线温度传感器,在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的“家庭”应用程序运行和控制概念验证。

ThermOS HomeKit集成
ThermOS软件架构

其余的“临时”逻辑相对简单,但我确实想强调一下我最初错过的一块。我的代码运行了几天,我正在处理硬件,这时我注意到我的继电器每隔几秒钟就会打开和关闭一次。这种“短循环”不一定有害,但它肯定没有效率。为了避免这种情况,我添加了一些阈值,以确保热开关仅在+/- 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作为HomeKit Hub

把我的ThermOS放在午餐盒里

我的概念证明相当混乱。

初始ThermOS设置

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

以下是带有支架和外壳的可焊接面包板正在进行中的样子。

正在打包的ThermOS硬件

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

安装的热操作系统

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