嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

通过 Raspberry Pi 2 和 Node-RED 实现家庭自动化

Node-RED 是对可在 Raspberry Pi 上运行的物联网进行布线的可视工具,并允许快速对项目进行原型制造。在本教程中,我们将首先在 Raspberry Pi 2 上设置 Node-RED,再创建读取温度传感器和控制 LightwaveRF 电源插座的流程。

title

我们将假定已在网络上设置您的 Pi,并可以对其进行 SSH 访问。
请确保您的发行版是最新的:

$ sudo rpi-update

$ sudo reboot

等待 Pi 重新启动,重新登录并执行:

$ sudo apt-get update
$ sudo apt-get upgrade

硬件

我们将使用以下硬件:

  • Raspberry Pi 2 (832-6274)
  • DS18B20+ 温度传感器 (540-2805)
  • 433 MHz 发射器模块 (617-2072)
  • 试验电路板原型制造 (102-9147)
  • 跳线如这个和这个 (791-6450)
  • 4.7k 电阻器
  • LightwaveRF 电源插座(许多零售商有售)
  • 长 174mm 的实心线(用作无线板的天线)

如下图所示连接硬件:

title

在这里我们将温度传感器和无线发射器连接到 Raspberry Pi。确保它们都通电、接地、有数据连接,并连接到 Pi 的 GPIO 管座上的正确引脚。另请确保天线连接到无线模块。

设置 LightwaveRF 控制

为了控制无线电源插座,我们需要安装 wiringPi 和 lightwaverf-pi。首先安装 wiringPi:

$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build

现在测试 wiringPi 是否安装正确:

$ gpio -v
$ gpio readall

title

接下来安装 lightwaverf-pi:

$ git clone https://github.com/leachj/lightwaverf-pi.git
$ cd lightwaverf-pi
$ make
$ sudo make install

title

执行测试发送命令:
$ sudo ./send 0
这应无错误执行。接下来,尝试将 Pi 与电源插座配对,来测试无线控制:
插入电源插座,并按下侧面的按钮直至指示灯开始呈橙色/蓝色闪烁,将其置于配对模式。然后传输开启信号:
$ sudo ./send 1

插座应与 Pi 配对。状态灯将更快速地闪烁以显示已成功完成。现在应能够使用以下命令开关插座:
$ sudo ./send 1
$ sudo ./send 0

安装 Node-RED

首先我们将安装 Node.js(请注意,与之前的 Pi 板对比,此过程在 Pi 2 上有所不同):

$ curl -sL https://deb.nodesource.com/setup | sudo bash -
$ sudo apt-get install -y build-essential python-dev python-rpi.gpio nodejs

接下来安装 Node-RED:
$ sudo npm install -g node-red

启动 Node-RED:

$ node-red-pi --max-old-space-size=128

这将在 Pi 上启动 Node-RED 服务器。打开新的 Web 浏览器选项卡并导航至 Pi 的 IP 地址、端口 1880。应看到 Node-RED 环境加载并随时可用。

title

现在我们将添加一个新节点以从 Node-RED 内使用 DS18B20 温度传感器。正确操作需要两个内核模块,我们将先加载这两个模块:

$ sudo modprobe w1-gpio
$ sudo modprobe w1-therm

尽管手动加载这些模块很简单,我们还是将其配置为在启动时自动加载。通过编辑 /etc/modules 文件可执行此操作:

$ sudo nano /etc/modules

在其自己的行中添加模块的名称:

title

现在我们将安装一个节点以从 ds18b20 模块读取数据:

$ cd /usr/lib/node_modules/node-red
$ sudo npm install node-red-contrib-ds18b20 --save

接下来我们需要向 /boot/config.txt 文件添加一行:

$ sudo nano /boot/config.txt

在文件末尾添加以下行:

dtoverlay=w1-gpio,gpiopin=4

保存并编辑此文件,然后重新启动并重新登录 Pi。
现在我们要测试温度传感器是否正确连接到 Pi,并可检索数据:

$ cd /sys/bus/w1/devices
$ ls

title

您应该能够看到类似上面的内容 - 此处传感器显示为 28-000006439bd5。更改到传感器目录:

$ cd 
e.g.
$ cd 28-000006439bd5

传感器将写入信息到 w1_slave 文件,因此我们可以查看其中是否有任何数据:

$ cat w1_slave

这应显示两行。如果是,则表示传感器连接到 Pi 并为其提供数据。

构建 Node-RED 流

检查传感器节点是否正确安装,以便我们能够将温度数据写入 Node-RED:

$ node-red-pi

title

打开 Web 浏览器并转至 Pi 的 IP 地址、端口 1880。应看到新节点“ds18b20”朝向左侧菜单底部。将节点拖至工作区。我们需要配置节点并告知它要使用的传感器 ID,为此,双击此节点以打开编辑窗格。应可从第一个下拉选项卡中选择设备 ID。请注意,您也可更改温度读数之间的间隔时间(默认为 1 分钟)。您需要等到间隔时间过去,直到第一条信息显示在调试控制台上,因此您可能想在测试过程中将间隔时间更改为类似 0.1 的值。

在调试节点中拖动并将两个节点连接在一起。在 Node-RED 工作区中连接多个节点时,即称为一个流。流需要先部署,才能够在服务器上运行。单击工作区右上角的“部署”按钮以部署该流。如果进行了任何更改,则需要重新部署,以使更改对服务器上运行的程序生效。

title

至此我们已使用传感器测试了基本流,我们可以构建一个更复杂的流,该流将:

  • 读取传感器温度
  • 决定是否足够冷可以打开插座(加热器)
  • 决定是否是打开插座的正确日子
  • 决定是否是打开插座的正确时刻
  • 将插座状态更改为开或关

Node-RED 捆绑许多有用的节点,其中一个是上面使用的调试节点。我们还会使用注入节点协助测试。这样只需单击节点上的按钮即可发送信息有效载荷,意味着您无需等待基于时间的数据即可测试节点。

我们将使用功能节点来实现逻辑并决定何时应打开和关闭插座。

最后,执行节点可让我们从 Node-RED 中执行外壳命令。我们将使用此节点来执行之前使用的发送命令以控制无线插座。

将执行节点拖至工作区,双击它以打开编辑器窗格,并将以下详细信息添加到“命令”字段中:

sudo //send 
e.g.
sudo /home/pi/SW/lightwaverf-pi/send

title

在“名称”字段中添加文本 - 我们使用的是“switchExec”。为节点命名有助于提高可读性,特别是更大、更复杂的流。此执行命令现在将尝试执行节点每次接收输入信息时提供的命令。我们可以在信息有效载荷内发送命令附加参数。请注意,我们的命令为何不包括之前使用的“0”或“1”参数。这是因为我们会将这些参数传递到流中的执行节点。

我们稍后将使用功能节点执行此操作,但现在我们可以使用注入节点测试执行节点是否正常运行。在两个注入节点中拖动。轮流双击每个节点并确保“有效载荷”类型为“字符串”,并在“有效载荷”字段中都各有 0 或 1。

将每个注入节点的输出连接到执行节点,顶部执行输出连接到调试节点并部署流。现在,单击任一注入节点上的按钮时,都应看到执行节点将 ‘sending command’ 写入调试控制台。还应注意到电源插座将根据单击打开和关闭。请注意,建议不要太快切换插座,否则可能导致损坏。

现在我们的无线控制工作正常,我们可以构建流并向功能节点添加自定义节点。在功能节点中拖动并如上所示对所有项目布线。

双击功能节点并向其添加以下代码:

//Control mains socket based on day, hour and temperature

//create date object
var d = new Date();
var day = d.getDay();
var hour = d.getHours();
var DAY = day;
var HOUR = hour;

//line to accept numbers in for testing
//var day = parseInt(msg.payload);

// change var DAY to 0 or 1 depending on day - we want Monday-Friday
if (day >= 1 && day <= 5) {
  DAY = 1;
}
else{
DAY = 0;
}

// change var HOUR to 0 or 1 depending on hour - we want 0700-1800
if (hour >= 7 && hour <= 17) {
  HOUR = 1;
}
else{
HOUR = 0;
}

// Format payload out to 0 or 1 depending on HOUR, DAY and temp/msg.payload - we want day/time as above and temperature setting of 23 degrees C
if (HOUR == 1 && DAY == 1 && msg.payload <= 23) {
  msg.payload = 1;
}
else{
msg.payload = 0;
}

return msg;

title

部署流。现在,电源插座可根据 Pi 读取的温度打开和关闭。我们现在要做的最后一件事是配置 Node-RED 以在启动时运行。我们将使用 PM2(Node.js 的流程管理器):

$ sudo npm install -g pm2

确定将 node-red 安装在 Pi 上的位置:

$ which node-red
$ pm2 start /node-red --node-args="max-old-space-size=128" -- -v

这将在后台启动 Node-RED。

title

有多种方式可检查 PM2 进程的状态:

$ pm2 status
$ pm2 info node-red
$ pm2 logs node-red

现在告知 PM2 在引导时启动:

$ pm2 startup

重新启动并检查一切正常。Node-RED 应按配置启动,并开始运行流。

功能节点可根据需要改变 - 尝试以不同值或不同条件进行实验。还有其他输出节点可轻松添加,如 Twitter 节点,可将其用于通知您何时打开或关闭插座。.

maker, hacker, doer