Hack and / - Temper Temper
如果热爱 Linux 变成了一种罪行,而我被带上法庭,我认为检方的论点会是这样的:
尊敬的法官,我只需要提交两件证据即可证明我的案件。首先,我呈上证物 A:一叠 Linux Journal 杂志,被告是该杂志的专栏作家。
你的第二件证据是什么?
尊敬的法官,被告的冰箱是由 Linux 驱动的。
(观众惊呼。) 肃静!我已经听够了!有罪!
我情不自禁。我的意思是,如果 有机会 用 Linux 驱动你的冰箱,你 为什么不 这样做呢?就我而言,我们最近为家里买了一台新冰箱,这意味着我们的备用冰箱将被送到车库,我将在那里用它来发酵啤酒。冰箱隔热良好,看起来非常适合这项任务,但我遇到的问题是,冰箱的内置恒温器最高只能达到 45–50°F 左右。为了发酵艾尔啤酒,我需要保持 60–72°F 之间的温度。
当大多数人将冰箱改装为啤酒发酵箱时,他们会从当地的啤酒商店购买专门为此目的而设计的设备。基本上,您将冰箱插入设备,将设备插入墙壁插座,然后在设备上将模拟恒温器设置为所需的温度。一个温度探头进入您的冰箱,当温度过高时,冰箱就会通电。这些设备的价格从大约 70 美元到 100 美元以上不等,具体取决于它们是模拟的还是数字的,我差点就买了一个,直到我意识到我可以用一台旧的 Linux 笔记本电脑、几个硬件和一些脚本来做同样的事情。
如果您对家庭自动化感兴趣,那么您一定熟悉 X10 家庭自动化小工具套件。基本上,您可以将灯具和电器连接到不同的 X10 小工具,然后使用遥控器打开它们的电源。甚至有一个连接到串行端口的遥控器,因此您可以从计算机控制一切。Linux 有一个名为 bottlerocket 的程序,它可以很好地与 X10 串行端口控制器配合使用,我曾经使用它来控制我的 DSL 调制解调器多年,但这又是另一篇文章的内容了。
所以,我有一台笔记本电脑,可以控制冰箱电源,但我仍然需要一个可以在 Linux 下工作且相对便宜的温度计。我发现了一款由 TEMPer 公司生产的非常棒的小型 USB 供电温度计。它体积小、价格便宜(运费不到 15 美元)、支持 -40°C 至 +120°C 的温度,并且稍加努力,它就可以在 Linux 下工作。事实证明,许多 Linux 管理员正在使用这些设备来监控他们数据中心的温度。
显然,这款温度计的旧版本显示为 USB 转串口接口;但是,包括我购买的在内的新型号,在您插入时显示为 USB 人体学接口设备
Apr 16 14:44:33 muriel kernel: [11601.992205] usb 1-1: ↪new low speed USB device using uhci_hcd and address 2 Apr 16 14:44:33 muriel kernel: [11602.182910] usb 1-1: ↪configuration #1 chosen from 1 choice Apr 16 14:44:33 muriel kernel: [11602.188481] usb 1-1: ↪New USB device found, idVendor=1130, idProduct=660c Apr 16 14:44:33 muriel kernel: [11602.188529] usb 1-1: ↪New USB device strings: Mfr=0, Product=2, SerialNumber=0 Apr 16 14:44:33 muriel kernel: [11602.188563] usb 1-1: ↪Product: PCsensor Temper Apr 16 14:44:35 muriel kernel: [11604.090148] usbcore: ↪registered new interface driver hiddev Apr 16 14:44:35 muriel kernel: [11604.119323] input: ↪PCsensor Temper as /class/input/input7 Apr 16 14:44:35 muriel kernel: [11604.140885] input,hidraw0: ↪USB HID v1.10 Keyboard [ PCsensor Temper] ↪on usb-0000:00:07.2-1 Apr 16 14:44:35 muriel kernel: [11604.170151] input: ↪PCsensor Temper as /class/input/input8 Apr 16 14:44:35 muriel kernel: [11604.188677] input,hidraw1: ↪USB HID v1.10 Device [ PCsensor Temper] ↪on usb-0000:00:07.2-1 Apr 16 14:44:35 muriel kernel: [11604.188931] usbcore: ↪registered new interface driver usbhid Apr 16 14:44:35 muriel kernel: [11604.188980] usbhid: ↪v2.6:USB HID core driver
起初,我以为我可以从这个温度计通过一些 /proc 或 /sys 接口获取温度,但不幸的是,这个温度计比这更专有。不过,Linux 社区资源丰富,快速搜索后,我找到了许多关于如何从 Linux 获取温度的指南(请参阅资源,了解我找到的最有用的指南)。基本上,您需要安装一些自定义 Perl 模块,包括一个专门为该设备创建的模块,该模块依赖于 Perl 5.10,因此您需要一个相对较新的发行版才能使其工作(我使用了最新的稳定 Debian 发行版)。
我一直认为 Debian 是打包 CPAN 模块最多的发行版,但即使是它也没有我 TEMPer 温度计所需的许多模块,所以我不得不从头开始安装它们。我提前警告您,这个过程有点乏味,它让我想起了十多年前在 Linux 上安装程序的情景。我们理所当然地认为软件包维护人员的辛勤工作是多么令人惊叹。至少我需要的第一个依赖项(libusb 的标头和一个编译 Perl 模块的构建环境)可以通过软件包获得
$ sudo apt-get install libusb-dev build-essentials
接下来,我需要使用 cpan 程序安装一些 Perl 模块。您会发现,这些模块中的许多模块都有自己的一组依赖项,因此当提示您安装依赖项时,只需告诉 cpan 程序“yes”即可。此外,您第一次运行 cpan 时,您可能需要完成初始设置程序。如果是这样,只需接受默认设置,您应该就可以正常使用了。以下是您需要运行的不同的 cpan 命令,以便安装各种模块
$ sudo cpan Bundle::CPAN $ sudo cpan ExtUtils::MakeMaker $ sudo cpan Inline::MakeMaker $ sudo cpan Device::USB $ sudo cpan Device::USB::PCSensor::HidTEMPer
接下来,我从 www.cs.unc.edu/~hays/dev/bash/temper/temper_mon.pl 下载了一个 Perl 脚本,并使其可执行。运行时,该脚本将打印来自温度计的温度。就我而言,我对其进行了修改,使其以华氏度而不是摄氏度输出
#!/usr/bin/perl use 5.010; use strict; use warnings; use Carp; use Device::USB; use Device::USB::PCSensor::HidTEMPer::Device; use Device::USB::PCSensor::HidTEMPer::NTC; use Device::USB::PCSensor::HidTEMPer::TEMPer; use lib; use Device::USB::PCSensor::HidTEMPer; my $pcsensor = Device::USB::PCSensor::HidTEMPer->new(); my @devices = $pcsensor->list_devices(); foreach my $device ( @devices ){ say $device->internal()->fahrenheit(); }
我将脚本存储在 /usr/local/sbin/temper_mon.pl 中,并运行了几次以确保其输出的温度正确。然后,我将温度计连接到一根足够长的 USB 延长线,以便伸入冰箱内部。
该过程的最后一步是编写一个脚本,该脚本将提取温度并根据温度是否在我设置的适当最大和最小温度范围内来控制冰箱的电源。我决定将最大值和最小值分开两度,这样压缩机就不会启动太多次。我还想将结果写入日志,以便我可以监控冰箱保持温度的效果。另外,我认为从ssh从世界任何地方登录我的笔记本电脑并查看温度会很酷。
当我第一次设置它时,晚上天气凉爽,所以我发现我的冰箱会降到远低于最低温度!我的解决方案是从药店购买一个 15 美元的电热垫,将其连接到另一个 X10 插座,然后将其放在冰箱底部。我认为热量会足够温和,可以在夜间保持温度,而不会像合适的空间加热器那样存在风险。我设置脚本,使其仅在温度降至最低温度以下一度时才打开加热器。我将我的脚本保存在 /usr/local/sbin/temper.pl 中
#!/usr/bin/perl use 5.010; use strict; use warnings; use Carp; use Device::USB; use Device::USB::PCSensor::HidTEMPer::Device; use Device::USB::PCSensor::HidTEMPer::NTC; use Device::USB::PCSensor::HidTEMPer::TEMPer; use lib; use Device::USB::PCSensor::HidTEMPer; my $pcsensor = Device::USB::PCSensor::HidTEMPer->new(); my @devices = $pcsensor->list_devices(); my $temp_min = 71; my $temp_max = 73; my $logfile = '/var/log/temper.log'; my $time = localtime(); my $temperature; foreach my $device ( @devices ){ $temperature = $device->internal()->fahrenheit(); } open LOG, ">> $logfile" or die "Can't open $logfile: $!\n"; # B4 = Fridge power, B5 = Heater power # turn on heater if I'm 1F below the low temp if($temperature < ($temp_min - 1)){ system('br --port /dev/ttyS0 B5 ON'); print LOG "$time\t$temperature\tHON\n"; } elsif($temperature < $temp_min){ system('br --port /dev/ttyS0 B4 OFF'); system('br --port /dev/ttyS0 B5 OFF'); print LOG "$time\t$temperature\tOFF\n"; } elsif($temperature > $temp_max){ system('br --port /dev/ttyS0 B4 ON'); print LOG "$time\t$temperature\tCON\n"; } else{ print LOG "$time\t$temperature\t\n"; } close LOG;
脚本的逻辑工作方式是,它允许温度在压缩机或加热器分别开启时自然下降或升高。仅当温度超出预设范围时,它才会使用 br 命令更改我的 X10 设备的电源状态。我将此脚本设置为每分钟使用 cron 运行一次,并且由于我记录了所有电源状态,因此很容易观察温度在极端值之间波动。我在开始时对各种范围进行了一些调整,并且使用当前的脚本,温度在低于最低温度 1°F 和高于最高温度 1°F 之间波动,这对我来说已经足够好了。如果我想要更高的精度,我总是可以将 $min 和 $max 设置得更接近。
自从系统到位以来,我已经能够成功地为我放入冰箱的第一批啤酒保持温度。如果您仔细观察图 2,您可以看到右侧架子上的小温度计。即使我的笔记本电脑很旧,它也有足够的马力可以备用,所以最终我将绘制所有温度数据的图表并通过 Apache 提供服务。如果 Bill 在这里,我确信他会告诉我将温度发到推特上。
资源
Linux 下 TEMPer 支持指南: https://wwwx.cs.unc.edu/~hays/archives/2010/03/entry_25.php
在线购买温度计的众多场所之一: www.amazon.com/TEMPer-USB-Thermometer-w-Alerts/dp/B002VA813U
TEMPer 温度计 CPAN 模块: search.cpan.org/dist/Device-USB-PCSensor-HidTEMPer
Kyle Rankin 是旧金山湾区的系统架构师,也是许多书籍的作者,包括 The Official Ubuntu Server Book、Knoppix Hacks 和 Ubuntu Hacks。他目前是北湾 Linux 用户组的主席。