Temper Pi
这是不可避免的。早在树莓派发布时,我就知道我最终会用它来驱动啤酒冰箱。如果您多年来一直关注我的专栏,您就会知道三年前(请参阅我 2010 年 8 月刊的 Hack and / 专栏,标题为“Temper Temper”),我为我的啤酒发酵冰箱设置了一个温度控制器,使用 X10 串行控制器来控制冰箱和加热垫的电源,一个廉价的 TEMPer USB 温度计来测量冰箱温度,以及一个简单的 Perl 脚本。
正如最初的文章所述,一切都连接到我闲置的一台备用 Debian 笔记本电脑上,并且设置效果很好。每分钟,我的 Perl 脚本都会启动,获取温度并控制冰箱底部加热垫或冰箱本身的电源,具体取决于是否需要更暖或更冷。几个月后(请参阅我 2010 年 12 月的 Hack and / 专栏 “Working on My Temper”),我决定笔记本电脑对于这种用例来说有点过分了,所以我用一个低功耗 Pogoplug NAS 设备替换了它,该设备被修改为启动 Plugbox Linux,一个 Arch 衍生版本。从那时起,Pogoplug 一直可靠地为我的啤酒冰箱供电。
这就引出了今天的话题。我碰巧在车库的另一边有一个备用的绝缘柜,我想用作额外的发酵容量。不幸的是,柜子离冰箱太远了,我无法使用 Pogoplug 和额外的温度探头,所以我不得不找到不同的解决方案。我碰巧有一个备用的树莓派,意识到它非常适合这项工作。我只需要购买一个新的 TEMPer USB 探头,然后复制我的 Perl 脚本。我需要做的唯一重大更改是让脚本 ssh
返回到 Pogoplug,以便它可以控制 X10 设备(我只有一个 X10 串行适配器)。
对于此设置,我真的不需要任何花哨的东西。事实上,阅读本文的 Arduino 爱好者可能会说,即使是树莓派对于这样一个简单的项目来说也显得多余。我决定使用标准的 Raspbian “wheezy” Debian 发行版。这个过程已经被多次记录在案,所以我不会在这里记录它。因为我使用的是基于 Debian 的发行版,所以我想我甚至可以遵循我最初的“Temper Temper”专栏中的相同步骤。
新的 TEMPer 温度计廉价电子产品的问题在于,有时内部结构会在您不知情的情况下发生变化。显然,有不同的 USB 温度计都以 TEMPer 的名称命名,具有相同的包装和整体外观。虽然我确信它们都可以在其附带的 Windows 软件下工作,但事实证明,它们在 Linux 下需要完全不同的软件。您知道吗,我购买的第二个 TEMPer 探头结果是一个不同的版本,因此它需要一套完全不同的软件。
您可以使用 dmesg
和 lsusb
来判断您拥有哪个 TEMPer 温度计。如果 dmesg
输出如下所示
input: PCsensor Temper as
/devices/platform/orion-ehci.0/usb1/1-1/1-1.1/1-1.1:1.0/input/input0
generic-usb 0003:1130:660C.0001: input: USB HID v1.10 Keyboard
↪[ PCsensor Temper]
on usb-orion-ehci.0-1.1/input0
usb 1-1.3: new high speed USB device using orion-ehci and address 5
input: PCsensor Temper as
/devices/platform/orion-ehci.0/usb1/1-1/1-1.1/1-1.1:1.1/input/input1
generic-usb 0003:1130:660C.0002: input: USB HID v1.10 Device
↪[ PCsensor Temper] on usb-orion-ehci.0-1.1/input1
并且您在 lsusb
中看到类似这样的内容
$ lsusb
Bus 001 Device 051: ID 1130:660c Tenx Technology, Inc.
您拥有旧版本的 TEMPer 探头,您可以按照我最初的“Temper Temper”专栏中的步骤进行操作。
如果 dmesg
反而显示如下内容
[ 3.213110] usb 1-1.3: new low-speed USB device number
↪4 using dwc_otg
[ 3.339127] usb 1-1.3: New USB device found,
↪idVendor=0c45, idProduct=7401
[ 3.355218] usb 1-1.3: New USB device strings:
↪Mfr=1, Product=2, SerialNumber=0
[ 3.377771] usb 1-1.3: Product: TEMPerV1.2
[ 3.392684] usb 1-1.3: Manufacturer: RDing
[ 3.420037] input: RDing TEMPerV1.2 as
↪/devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/input/input0
[ 3.436838] generic-usb 0003:0C45:7401.0001: input:
↪USB HID v1.10 Keyboard
[RDing TEMPerV1.2] on usb-bcm2708_usb-1.3/input0
[ 3.465103] generic-usb 0003:0C45:7401.0002: hiddev0:
↪USB HID v1.10 Device
[RDing TEMPerV1.2] on usb-bcm2708_usb-1.3/input1
并且 lsusb
显示
$ lsusb
Bus 001 Device 005: ID 0c45:7401 Microdia
那么恭喜您,您拥有新的 TEMPer 探头,并且必须使用完全不同的软件。
Temper.py控制这些新型 TEMPer 探头的原始软件项目位于 http://www.isp-sl.com/pcsensor-1.0.0.tgz,但在我开始撰写本文之前,我从 Philipp Adelt 那里得知他最近更新了该项目以与 Python 配合使用。更新后的项目托管在 Github 上,网址为 https://github.com/padelt/pcsensor-temper,Python 版本位于 https://github.com/padelt/temper-python,并具有其他功能,例如多探头管理和 SNMP 支持。因此,要开始使用这个项目,我首先需要安装 git,然后安装一些 Python 库以提供 USB 支持
$ sudo apt-get install git python-usb
(请注意,项目页面还告诉您安装 python-setuptools 包和 snmp-passpersist Python 库,但由于我不打算使用 SNMP,所以我跳过了这一步。)
安装 git 后,我拉取了最新版本的 temper-python
$ git clone git://github.com/padelt/temper-python.git
Cloning into 'temper-python'...
remote: Counting objects: 17, done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 17 (delta 4), reused 15 (delta 2)
Receiving objects: 100% (17/17), 19.07 KiB, done.
Resolving deltas: 100% (4/4), done.
主 Python 程序可以在 temper-python/src/temper.py 下找到,该项目还包括一个示例 udev 规则,如果您希望非 root 用户访问 TEMPer 探头,您可以将其复制到 /etc/udev/rules.d。就我而言,我对仅 root 用户访问没有意见,所以我没有修改 udev 规则。
如果您正确安装了 python-usb 库,并且您拥有受支持的 TEMPer 设备,您应该看到如下输出
$ sudo ./temper-python/src/temper.py
Found 1 devices
Device #0: 17.6°C 63.7°F
一旦您看到这个,您就知道温度探头正在工作。我不喜欢在主目录中运行这样的系统程序,所以我决定将其复制到 /usr/local/sbin
$ sudo cp ./temper-python/src/temper.py /usr/local/sbin/
现在就我而言,我想根据这个温度输出采取行动,我意识到我旧的 temper.pl 包装脚本行不通了。虽然我当然可以稍微修改一下以使其与新的输出一起工作,但我认为一个调用 Python 脚本的 Perl 脚本只是在自找麻烦。相反,我决定用 bash 编写一个新的简单包装脚本,名为 /usr/local/sbin/temper
#!/bin/bash
TEMP_MIN="55"
TEMP_MAX="65"
LOGFILE='/var/log/temper.log'
TIME=`date +"%b %d %T"`
TEMPERATURE=`/usr/local/sbin/temper.py 2>/dev/null |
↪tail -n1 | cut -f4 -d ' ' | sed 's/.F$//'`
if [[ $TEMPERATURE == "" ]]; then
echo ERROR
exit 1
fi
# B6 = peltier cooler B7 = heater
if [[ $TEMPERATURE < $(( $TEMP_MIN - 1 )) ]]; then
ssh pogoplug "/usr/local/bin/br --port /dev/ttyUSB0 B7 ON"
ssh pogoplug "/usr/local/bin/br --port /dev/ttyUSB0 B6 OFF"
echo -e "$TIME\t$TEMPERATURE\tHON" >> $LOGFILE
elif [[ $TEMPERATURE < $TEMP_MIN ]]; then
ssh pogoplug "/usr/local/bin/br --port /dev/ttyUSB0 B6 OFF"
ssh pogoplug "/usr/local/bin/br --port /dev/ttyUSB0 B7 OFF"
echo -e "$TIME\t$TEMPERATURE\tOFF" >> $LOGFILE
elif [[ $TEMPERATURE > $TEMP_MAX ]]; then
ssh pogoplug "/usr/local/bin/br --port /dev/ttyUSB0 B6 ON"
ssh pogoplug "/usr/local/bin/br --port /dev/ttyUSB0 B7 OFF"
echo -e "$TIME\t$TEMPERATURE\tCON" >> $LOGFILE
else
echo -e "$TIME\t$TEMPERATURE\t" >> $LOGFILE
fi
虽然此脚本的逻辑与我旧的 temper.pl 类似,但我只是调用 temper.py 脚本并使用一些管道来提取我需要的温度数据。在这种情况下,我还必须 ssh
返回到我的名为“pogoplug”的机器以运行 /usr/local/bin/br(控制我的 X10 设备的 bottlerocket 软件)。这意味着我需要以 root 用户身份运行 ssh-keygen
,然后运行 ssh-copy-id
将我的公钥复制到 pogoplug 主机。如果我想用树莓派替换我现有的 Pogoplug,我可以只 apt-get install
bottlerocket,连接一个带有我的 X10 串行控制器的 USB 转串行适配器,然后直接运行 br 命令。
最后一步是设置一个 cronjob。为此,我只是在 /etc/cron.d/temper 中创建一个文件,内容如下
* * * * * root /usr/local/sbin/temper 2>/dev/null
有了这个文件,每分钟,我的脚本都会探测温度并控制我通过 Pogoplug 连接的额外 X10 设备的电源。看起来我一直在用更简单、更便宜的 Linux 机器替换这些温度探头系统。我想知道接下来会是什么?