使用 MisterHouse 调节您的暖气

作者:David Lynch

我是一名建筑师和软件顾问,我正在建造自己的房屋,而且我的妻子和我都患有过敏症。强制通风环境控制系统不利于过敏症患者。我选择使用辐射供暖。环境控制系统是家庭自动化领域中业余爱好者很少涉足的领域之一。尽管空调和热泵的控制系统并非特别复杂,但不良的控制系统可能会过早磨损昂贵的压缩机,甚至会损坏压缩机。这种直接控制环境控制系统硬件的禁忌也延伸到了那些既不容易损坏也不像更换那样昂贵的系统。

本文讨论了如何使用在 Linux 下运行的家庭控制系统来控制家庭辐射供暖系统。我在设计和实施此系统时使用了几项指导原则。我非常拥护 KISS(保持简单)原则,并且我是一名未充分利用的软件顾问,来自一个仍然认为一分钱也是钱的社区——我很廉价。我认为这是一种美德。简单胜过复杂,廉价胜过昂贵,软件替代硬件,自己动手取代购买或雇用。

区域划分

辐射供暖系统并非特别复杂。我的房子分为多个区域,每个区域都有自己的控制装置。在某种程度上,区域的控制系统与整个系统的控制装置相互作用。在辐射供暖系统中,当某个区域请求供暖时,水会被加热并循环到某个物体中,以将热量辐射到构成该区域的房间中。

系统组件

第一个系统组件是热源,并且有多种可能的供热源。我使用的是一台 144,000 BTU 壁挂式即热式天然气热水器,效率等级为 95%。这些装置的特点之一是它们是内部调节和控制的。只需抽取水即可触发电子点火。装置本身会控制其输出以匹配需求。我的装置具有一些操作预设水温以及监控其性能的能力。无论是由传统方式控制还是由家庭自动化系统控制,我的热水器本身都不需要外部控制。

Call MisterHouse to Regulate Your Heat

图 1. Takagi TkJr 144K BTUH 热水器

下一个组件是散热器——热量从分配系统进入区域的方式。在我的房子里,这是 PEX 管道,大约 16 英寸中心距,位于混凝土板内部。还有许多其他方法可以将热量从水中传递到区域,包括踢脚线、散热器和钉在楼板底面的管道。每种方法都有其自身的特性,但其中最关键的是它可以辐射到区域中的热量。混凝土楼板中带有辐射管道是向区域传递热量的更有效手段之一。带有辐射管道的混凝土楼板的最大辐射热量为每 1,000 平方英尺 50–90K BTUH,或每 1,000 平方英尺楼板 50–90K BTUH——具体取决于您愿意容忍的楼板温度。

热源和散热器的正确设计超出了本文的范围;但是,它们并非真正复杂。散热器必须能够在最极端条件下每小时提供比区域损失的热量更多的热量。热源必须能够提供至少与所有区域在最极端条件下可能需要的热量一样多的热量。在寒冷但非极端条件下,我不希望系统大部分时间都在运行;正常情况下,供暖时间约为三分之一。所有供暖系统都是过度设计的。

另一个组件是循环器。必须说服水流经系统。通常至少需要一个泵或循环器。循环系统可以以多种方式设计。我一直能够以非常划算(廉价)的价格采购小型循环器,因此我为每个区域都使用了循环器。这大大简化了系统设计的许多其他方面。它消除了对区域控制电磁阀及其控制装置的需求。它消除了对与区域控制装置分开的循环器控制装置的需求。它使得提供逐区域的故障安全超控变得更容易,并且减少了平衡系统的需要。

Call MisterHouse to Regulate Your Heat

图 2. 辐射分配歧管和循环器

系统的另一部分是闭环水分配系统。热水需要从热源输送到散热器并返回。在我的家中,这是更多的 PEX 管道,以及手动构建的歧管。

最后,是控制系统,而这正是 Linux 发挥作用的地方。

前提

必须至少有一个故障安全装置,以防止管道在家庭自动化系统发生故障时冻结。我没有针对严寒天气期间长时间断电情况的应对措施——很少有现代供暖系统能在没有电力的情况下工作。即使在长时间断电的情况下,故障安全装置也会因缺少其他电源来驱动循环器和点燃热水器而失效。故障安全是通过将传统的廉价恒温器与家庭控制系统并联在足够数量的分散区域上来实现的,以将温度维持在冰点以上。

反馈比可靠性更重要——区域是否在特定时刻开始供暖并不重要。重要的是,随着时间的推移,区域温度不会在当前该区域设定点的容差范围之外漂移太远。该容差至关重要。期望始终将区域温度保持在精确的 70°F 是不现实的。这样做会导致系统不断地开启和关闭。所有环境控制系统都内置了一些容差。我的系统中的主要区别在于设定点和容差都是可控的。反馈很重要,因为它使我可以使用极其廉价的方式来控制交流电源:X10 电器模块。

X10 非常普及。它易于获得且价格便宜。在许多安装中,它非常可靠,但有些则非常麻烦。反馈也很重要,因为如果一切都失败了,我的供暖系统需要引起我的注意来解决问题。

控制装置和传感器需要是经济高效的设备,易于与家庭控制计算机连接和管理——我有没有提到我很廉价?

控制系统

用于打开和关闭交流电源以控制交流设备(循环器)的 X10 电器模块是 Dallas Semiconductor DS1820 1-Wire 温度传感器。这些传感器非常便宜,并且是一种易于连接的温度感应方式。每个区域可以有一个或多个温度传感器。最终,我打算将传感器放置在区域内不同的高度,以探索辐射供暖的前提,即即使较高处的室温较低,但地板温暖的房间也会被感知为更温暖。此外,我监控每个区域的供水和回水温度。这提供了反馈,并提供了一种监控系统性能的方法。供应给每个区域的热量是供水温度和回水温度之间的差值、流速和循环时间。循环器的流速大约恒定,并且可以监控所有其他因素。这意味着可以实时监控输出和性能。

最后,需要确定人为输入——我需要能够要求我的客厅更热或更冷。这可以通过多种方式完成。

在我的第一个供暖季,使用了一个简单的 10 美元的美国恒温器来同时打开所有区域的所有循环器。在初始启动时,热水器在大约循环器启动一分钟后启动,并连续运行了大约 17 个小时。我开始恐慌,想知道我需要多大额度的贷款才能负担得起暖气。然后它停止了。在那之后,在冬季剩余的时间里,试图抓住系统运行变成了一场游戏。一旦每个区域都达到了温度,它们就很少运行了。

在第二个季节,我使用了简单的 MisterHouse Perl 脚本。更改区域的设定点涉及到对该 Perl 脚本的简单更改。它奏效了,但它不是一个人性化的用户界面。

可以安装普通的恒温器并将其连接到数字输入。有很多方法可以做到这一点,并且有相对便宜的 1-Wire 数字输入传感器。恒温器不用于设置温度;它们用作输入,以确定我是否要更改温度。我主要使用这些恒温器是因为所有用户,无论他们对计算机的熟练程度如何,都倾向于对它们感到舒适和理解,这在客房中很重要。但是,由于它们是控制系统的输入,因此它们构成请求,而不是需求,并且它们不是故障安全装置。

普通计算机用户(我的妻子和我)的用户界面是一个不断发展的 Web 界面,其中包含每个区域的状态和可更改的设置。Web 界面可以从家庭网络上的任何计算机、支持 Web 浏览器的无线 PDA 甚至远程位置使用,前提是采取了足够的安全预防措施。

环境控制系统没有任何特别时间敏感的地方。我开发嵌入式系统,有时也开发实时系统。环境控制不是实时的。这意味着控制软件对 Linux 系统的要求相对较低,并且并非特别时间关键。实际上,在我的家中,辐射供暖的热源与生活热水共享。这有利有弊,并且某些建筑规范不允许这样做。当生活和供暖需求超过热水器的容量时,例如当有人洗热水澡时,生活需求优先于供暖需求。如果供暖延迟几分钟才开始,我不太可能会注意到。但是如果我在淋浴时,我肯定会注意到,仅仅为了让供暖循环立即开始,我就被剥夺了热水。

开源的 MisterHouse 项目提供了一个功能强大且高度可编程的家庭控制系统,其功能远远超出本项目所需的功能。它在 Linux 和 Windows 上运行,并支持各种控制装置、传感器和其他硬件。它提供了一个非常强大的 Web 界面,我可以轻松地对其进行扩展以支持我的区域控制。而且,它具有诸如平面图集成之类的功能,我希望以后能够利用这些功能。已经有几个使用 MisterHouse 实现的环境控制系统。这些系统使用了昂贵的计算机可监控恒温器来控制传统的 HVAC 控制系统。在我的实现中,MisterHouse 完成了所有繁重的工作。

MisterHouse 用 Perl 编写,并提供了允许 MisterHouse 用户轻松地合并他们自己的 Perl 例程的规定,以及一个具有针对家庭控制的功能和事件的 API。创建一段 Perl 代码并使其每分钟、每三分钟或仅在星期日满月时执行非常简单。监控或控制 1-Wire 和 X10 设备也很容易——构建一个工作系统所需的所有要素。

我喜欢用 Perl 编程,因为它简单、强大且宽容。您不需要成为 Perl 和尚即可为 MisterHouse 创建自定义脚本。MisterHouse 发行版和网站包含大量示例,其中许多示例只有几行相当简单的代码。通过 MisterHouse 可以完成大量的家庭控制,而无需进行任何编程。

我主要使用 Debian Linux,并且我专门为 MisterHouse 创建了一个 Linux Vserver(轻量级虚拟服务器)。这并非绝对必要,但它比专用机器更便宜且更容易,并且比在单台机器上运行一堆不同的守护程序更简单和更干净。我强烈推荐 Vserver;它们使配置实验变得有趣和容易。

MisterHouse 可以通过 apt 在 Debian 下安装

apt-get install misterhouse

它需要一系列 Perl 模块,并且这些依赖项应由 apt 处理。

在规划此系统时,我决定使用计算机 X10 接口 ACT TI-103,特别是因为最常见的 X10 接口 CM17 和 CM11 已知存在问题。TI-103 发送比正常 X10 信号更强的信号,并且可以接收比规范 X10 信号更弱的信号。此外,它还支持 X10 扩展寻址,允许在单个家庭中使用超过 255 个 X10 设备。不幸的是,我错误地认为 MisterHouse 会支持它。

在早期开发中,我使用了我手头的一个旧 CM11,但最终,我为 ACT TI-103 编写了一个新的 MisterHouse 驱动程序,现在它是 MisterHouse 项目的一部分。ACT TI-103 是一个不错的控制器,并且很容易与之通信——通过一些努力,您可以使用 minicom 直接操作它,因为它使用 ASCII 命令字符串。开发 TI-103 驱动程序比我的其余 MisterHouse HVAC 软件更复杂和耗时。到目前为止,它已被证明不比 CM11 更可靠或更不可靠。但是,自 MisterHouse 1.102 以来,我的 TI-103 驱动程序一直是 MisterHouse 发行版的一部分。在我这项工作进展顺利之后,Insteon 推出了一系列新的电力线设备,这些设备在许多方面都优于 X10 设备。但是,它们仍然比 X10 模块更昂贵。Neil Cherry 应该在本文发表时完成对 Insteon 的 MisterHouse 支持。

需要为控制器和传感器配置 MisterHouse。X10 控制器是通过在 MisterHouse 配置文件 /etc/misterhouse/mh.ini 中将正确的端口(例如 /dev/ttyS0)分配给正确的 X10 设备来设置的

cm11 = /dev/ttyS0

ti103 = /dev/ttyS0

您可能想要配置许多其他参数,例如纬度和经度,这将使 MisterHouse 更有用,或者如果您想根据天气报告做出供暖决策,但没有其他特定于供暖控制的参数。

Call MisterHouse to Regulate Your Heat

图 3. Radio Shack/X10 电器模块控制循环器

X10 设备在单独的配置文件 x10.mht 中设置。每个设备的参数是 X10 模块的类型、其地址、名称及其所属的组。我需要为控制每个区域循环器的每个电器模块添加一个条目。一个示例条目是

X10A, C1, Circulator1, All_Heat|Night_Setback

对于一个具有 C 房屋代码和 1 单元代码的 X10 电器模块,名为 Circulator1,包含在 All_Heat 和 Night_Setback 组中。在 MisterHouse Perl 脚本中,一种打开它的方法是使用代码集

$Circulator1 'ON';

并且可以使用以下命令关闭所有 Night_Setback 设备

&set_all($Night_Setback, 'OFF');

如果您有多个 X10 控制器,则可能需要为设备分配一个控制器。并且,为设备分配标签和组非常有用。mht 文件在 MisterHouse 启动时转换为 mhp(Perl 代码)文件,或者可以通过 MisterHouse 用户界面在运行的系统上重新加载它们。一旦 X10 设备正确输入到 .mht 文件中并且 MisterHouse 启动,它们就可以通过 UI 手动控制,或者可以通过 Perl 代码以编程方式控制。也可以直接从 MisterHouse Web 界面将 X10 设备添加到 MisterHouse。

MisterHouse 支持许多用户界面,包括 Tk 界面和 Telnet。但是,我使用的主要界面是内置的 MisterHouse Web 服务器。默认情况下,它应该配置为工作,并且应该在端口 8080 上。使用 Vserver 可以轻松地将其移动到标准 http 端口 80。在我的家中,浏览 mh.dlasys.net 会显示 MisterHouse 主页。

Call MisterHouse to Regulate Your Heat

图 4. DS1820 1-Wire 测试装置

我有几个可用的替代方案用于将 MisterHouse 连接到 1-Wire。MisterHouse 可以通过 1-Wire 串行接口直接与 1-Wire 设备通信,并且它们在 .mht 文件中配置,就像 X10 设备一样。我计划使用的机器之一没有足够的串行端口用于 X10 控制器和 1-Wire 串行控制器,因此我选择了 1-Wire USB 控制器。MisterHouse 当前不直接支持 1-Wire USB 控制器。但是有几种特定于 Linux 的方法可以使用 1-Wire USB 控制器。Linux 2.6 内核最近添加了对许多 1-Wire 设备和接口的支持。这将是我首选的使用方式。不幸的是,在我开发代码时,它非常新,并且文档记录不完善。有一个 1-Wire 文件系统,它将 1-Wire 设备映射到文件系统。digitemp 是一个适用于 Linux 和 Windows 的独立程序,可以从 USB 和串行接口读取 1-Wire 设备,这就是我选择使用的程序。

我的第一个实现让 digitemp 在 MisterHouse 内部轮询所有 DS1820 温度传感器。我当前的实现让 digitemp 作为外部 cron 作业轮询温度传感器,并将信息记录到 RRD 数据库中。以下 Perl 脚本创建一个 RRD 数据库,其中包含 @sensor 列表中的每个 DS1820 的条目

#!/usr/bin/perl
# Category = HVAC
@sensor = ( "28E8E30500000083", "2853327C000000D4");

my $cmd = "rrdtool create temp.rrd --start N --step 60 ";
for $i ( 0 .. $#sensor) {
 $cmd .= "DS:$sensor[$i]:GAUGE:120:30:180 ";
}
$cmd .= "RRA:MIN:0.5:60:8760 ";
$cmd .= "RRA:MAX:0.5:60:8760 ";
$cmd .= "RRA:AVERAGE:0.5:60:8760 ";
print "$cmd\n";
my $result = system($cmd);

DS:$sensor[$i] 指定数据源(每个 DS1820),30:180 是数据源的最小值和最大值,GAUGE 是适用于温度传感器的特定 RRD 数据源。有三个存档:最小值、最大值和平均值。

我住在美国,所以所有温度都以华氏度为单位;但是,digitemp 可以读取和记录摄氏度或华氏度值,并且整个系统中的所有其他值都相对于 digitemp 报告的值。

轮询是通过以下脚本完成的

#!/usr/bin/perl
# Category = HVAC

@sensor = ( { sn => "28E8E30500000083", temp => 0 },
	    { sn => "2853327C000000D4", temp => 0 });

# Read the output from digitemp
open( DIGITEMP, "digitemp_DS2490 -c /etc/digitemp.conf \
 -a -q -o\"%s:%R:%.2F\" |" );
while( <DIGITEMP> ) {
 chomp;
 if( $_ =~ /^nanosleep/i ) {
  my $now = localtime;
 } else {
  my ($dvc,$sn,$temp) = split(/:/);
  print "dvc=$dvc sn=$sn temp=$temp\n";
  $temp = 185 unless ($temp);
  for $i ( 0 .. $#sensor) {
   if ($sn eq $sensor[$i]->{sn}) {
    $sensor[$i]->{temp} = $temp ;
   }
  }
 }
}
close( DIGITEMP );
my $cmd = "rrdtool update temp.rrd N:";
for $i ( 0 .. $#sensor) {
 $cmd .= ":$sensor[$i]->{temp}";
}

这可以设置为 cron 作业,并使用 crontab 条目

*/2 * * * * root test -c /opt/mh/local/bin/temp2rrd.pl \
 && /opt/mh/local/bin/temp2rrd.pl >/dev/null

或者它可以与 MisterHouse 定期运行。

我添加了一个 Perl 例程到 mh,以定期查询 RRD 数据库,并将每个区域的当前温度与该区域的设定点(在 mh UI 代码中指定)进行比较。如果当前温度远低于设定点,则打开控制该区域循环器的 X10 模块。如果当前温度远高于设定点,则关闭 X10 模块。目前,容错是通过在每个循环中打开/关闭相应的 X10 模块来实现的,前提是当前温度超出设定点可接受的差值。最终,连接到每个区域的供水和回水的温度传感器将用于验证区域循环器是否正在运行。它们还将用于计算每个区域的实际热输出。

RRD 数据库保留历史数据,这可能有很多用途。此外,RRD 专门用于记录定期轮询的值。它具有可配置的规定来验证数据并适当地处理针对无效数据的查询。

Perl 是一种面向对象的语言,MisterHouse 利用了这一点。MisterHouse 主要管理对象。显示元素以及编程事件和操作都作用于对象。MisterHouse 已经有各种有趣的对象,但我需要一些等效于供暖区域的东西,因此我使用示例对象作为指南创建了一个 HVAC_Zone 对象。我的 HVAC_Zone 具有设定点和 delta 属性。设定点是该区域的目标温度,delta 是采取措施之前允许的偏差。HVAC_Zone 对象继承自 MisterHouse Generic_Item,因此它们会显示在 UI 中的浏览组下以及其他一些位置。区域的创建方式与上面描述的 X10 项目类似。它们可以在包含 X10 项目的同一 .mht 文件中创建,也可以在它们自己的 .mht 文件中创建。其他 HVAC 组可能是 North、Night 和 Vacation。

Call MisterHouse to Regulate Your Heat

图 5. 浏览包含单个主卧室区域的 All_HVAC 组 — 这显示了一个简单的 Web 温控器,用于增加、减少或设置每个 HVAC_Zone 对象的设定点。

一个示例条目是

HVAC_ZONE,    H1,   master_bedrm,  All_HVAC|Thermostats,     72,  2,

这将创建一个名为 master_bedrm 的 HVAC_Zone 对象,位于 All_HVAC 和 Thermostats 组中,设定点为 72,delta 为 +/- 2°。为了创建一个为每个区域显示的 Web 控件,对 MisterHouse Web 服务器进行了一些小的修改是必要的。我使用了 X10 Lamp 项目作为参考,因为它已经具有下拉列表以及用于相对更改的箭头按钮。

最后,我使用一个由 MisterHouse 定期执行的 Perl 脚本来查询每个区域内每个 DS1820 的当前温度,将其与该区域的当前设定点/delta 进行比较,如果该区域内的温度低于设定点超过 delta,则打开该区域的相应 X10 电器模块。目前,只要温度保持在设定范围以下,我就会重复尝试打开相应的循环器,并且只要温度超过设定范围,我就会重复关闭循环器。这提供了有限的容错能力。在电器模块可能已关闭时将其关闭,或者在电器模块可能已打开时将其打开,可以实现小程度的容错。在下一个供暖季之前,我希望拥有代码来使用供水和回水温度验证循环器的状态,以及在区域温度下降到低于设定点两倍以上的 delta 时发出警报。

本文资源: /article/9193

David Lynch 是一位未充分利用的软件顾问,他从事有时徒劳的尝试,以开发嵌入式和系统软件为生——通常在 Linux 下。在另一个生活中,他是一名建筑师,目前,当他不随机地打开和关闭整个房子的灯或为客户编写软件时,他会通过建造自己的房屋来消磨时间。家庭自动化将他作为软件的职业与他对建筑的兴趣结合起来,并满足了他对世界统治的渴望——至少在他自己的家中是这样。Dave 的联系方式为 dhlii@dlasys.netwww.dlasys.net

加载 Disqus 评论