最新资讯
武汉长乐未央教育官方资讯公告。
武汉长乐未央教育官方资讯公告。
我不是仅仅因为提到了树莓派,就称这是一篇关于物联网(Internet of Things)的文章,但我敢拍着胸脯说这是一个互联网自动化(Internet Automation)项目,不需我额外动作就能解决一个小问题。
在本文中,我将会提供大量有用的外部资源,使得我们能尽快熟悉项目中所涉及的node.js和JavaScript部分。
在寒冷的冬季,我们希望用加热器来使家里/办公室处于温暖舒适的温度。然而,在封闭的环境里使用加热器会影响室内湿度。我们用加湿器解决了这个问题!文章里我将用到一个连接插座的便携式加湿器。
我的目的是根据屋内的湿度等级,能够自动调节加湿器的开关。
如果我们能实现自动控制加湿器所连接的插座(或开关),那么问题就迎刃而解了。因此,我们需要有一个能用互联网完美控制的插座。为了实现这个功能,我选用了Belkin公司互联网控制开关Wemo Switch。
(请注意:许多便携式加湿器也自带自动开关或者定时器,但我们为的是DIY。所以在此不讨论。)
IFTTT的Maker平台为我们提供了(需要注册后才能使用它们的服务):
显然我们还需要能连接树莓派的传感器。我强烈推荐使用树莓派SenseHAT而不是独立连接的传感器,SenseHAT已经集成了许多传感器,像一顶戴在树莓派上的帽子。它们还提供了丰富的Python库来读取传感器的数据。
最后,我们需要把树莓派连接到互联网。简单地把WiFi模块插在树莓派的USB端口上就能实现。当然,在树莓派上需要设置WiFi。(提示:使用Linux命令或者IDE)
因为树莓派上可以运行操作系统,比如Linux和Windows,我们很容易在上面安装Node.js。因此,node.js是我们从传感器读取数据并通过IFTTT Maker平台调用API控制Wemo Switch状态的核心骨干。
正如早先所提到的,我们还需要依赖大量SenseHAT所提供的python脚本。我们就不再介绍这些python脚本了,它们在SenseHAT API 手册里都能找到。但我们会讨论如何用node.js应用来驱动这些python脚本。
此应用分三步实现功能:
接下去我们来看每一步的具体代码:
Node.js提供了child_process的模块,它的一个方法exec能够执行操作系统的命令。这一步需要此模块来驱动python脚本。还记得吗,我们想以固定的频率来执行python脚本,因此需要在外面包装一层JavaScript的setInterval函数。
setInterval(function(){
require('child_process').exec(command, function(error, stdout, stderr) {
if (error == null) {
var data = stdout.replace("\n","");
// ... Call Stage 2
}
else {
console.log("Error occured. " + error);
}
}); child_process.exec
}, 60000); // frequency = 60 seconds
这里只是简单地比较一下上一步读取的信息。但是,你也可以在这里添加其它的功能,比如将数据存入数据库,保持最近几次读取值,判断最近几次的数值是否持续增加或减少,等等。这里我们则是基于最近一次传感器数据做出判断。
// assumption: We are looking for Temperature in Stage 1
var YOUR_API_KEY = "?????"; // obtain this from IFTTT
var wemoState = "off"; // or as defined in IFTTT Maker
if(data > 35) { // deg. Celsius is what SenseHat APIs returns
wemoState = "on";
}
// ... Call Stage 3
如上文所提到的,我们不再讨论如何创建一个IFTTT Maker API来控制某个设备的状态,或是调用另一个API。你可以参考手册或是这篇博客。
接下去,到了真正使用Node.js调用接口的时候了,我们使用node.js的https模块,它提供了request的方法。
var makerAPI_host = "maker.ifttt.com";
var makerAPI_path = "/trigger/"+wemoState+"/with/key/"+YOUR_API_KEY;
var https = require('https');
var optionsget = {
method : "GET",
host : makerAPI_host,
port : 80,
path : makerAPI_path
};
var reqGet = https.request(optionsget, function(resp) {
var str = "";
resp.setEncoding('utf8');
resp.on('data', function(d) { // data chunk
str += d;
});
resp.on('end', function() { // all data sent
console.log(str); // We are Done!
});
});
reqGet.on('error', function(e) {
error = {
message : "Error occured",
error : e
};
console.log(error);
});
reqGet.end();
或者,也可以使用第二步中的child_process.exec()方法。
var callAPI = "curl -X GET https://maker.ifttt.com/trigger/"+wemoState+"/with/key/"+YOUR_API_KEY;
require('child_process').exec(callAPI, function(error, stdout, stderr) {
if (error == null) {
console.log(stdout); // We are Done!
}
else {
console.log("Error occured. " + error);
}
}); child_process.exec