The Project Things Gateway 作为平台,使用标准化的基于 HTTP 的 API 将所有 IoT 设备整合到一个统一的框架下。我们最近 发布了 Things Gateway,我们还为想要 设置网关 并开始使用 Web of Things 的用户推出了一系列动手实践项目文章。本月早些时候,我们从 如何构建网关插件的高级概述 开始。
在这篇文章中,我们将利用到目前为止学到的知识,为网关构建一个真正的插件。这个插件将提供一个拍手感应 Web Thing,我们可以用它来控制我们的灯光和其他设备。
在本教程中,我们将使用 JavaScript 编写网关插件,目的是让我们的灯光能够通过拍手来激活。这需要麦克风作为输入,所以我将把一个麦克风插入我的网关并将其设置为一个拍手感应 Web Thing。如果你想跟着做,可以将任何基本的 USB 麦克风插入你的 Raspberry Pi。The eLinux-verified USB sound cards 都是获得麦克风输入的好选择。
我们将从评估我们想要创建什么样的麦克风插件开始,然后复制示例插件来用作代码的骨架。接下来,我们将用一些代码填充骨架,最后用网关测试插件。
概述我们的插件
我们需要考虑我们希望插件的适配器提供什么“设备”。虽然我们的插件可以提供处理多个设备的适配器,但由于我们只有一个设备:监听拍手的麦克风,所以我们可以简化工作。我们实际上是使用麦克风作为我们的“拍手传感器”设备。接下来,我们必须考虑如何执行拍手检测。在 npmjs.com 上快速搜索库,会找到 clap-detector,这是一个由 Thomas Schell 开发的开源库。我们的适配器可以包含这个库,将麦克风用作拍手传感器。
现在我们可以考虑我们的拍手传感器理念是否符合任何现有的 Web Thing 类型。Web of Things 规范的一个重要部分是,每个 Thing 都可以有一个设备类型,它告诉网关和其他 API 消费者可用的属性、操作和事件。例如,类型 dimmableLight
代表一个可以打开、关闭或调光的灯光。从 Web Thing 类型列表 看, binarySensor
及其活动和非活动状态非常适合拍手传感器拍手和静默状态。
编写代码
现在我们可以开始实施了。我们可以在安装了网关软件的任何计算机上开始开发。如果你有一个安装了 0.3.0 版本的 Raspberry Pi,你可以按照 这些说明 登录,并从 ~/mozilla-iot/gateway/src/addons
目录开始。或者,如果你按照 GitHub 项目页面上的说明 在本地安装了网关软件,则可以从该副本的 src/addons
目录开始。
第二步是将示例适配器代码的副本下载到这个 src/addons
目录,这样我们就可以编辑现有的适配器,而不是从头开始编写所有内容。在 Pi 上,我们可以确保安装了 git,然后克隆 示例适配器仓库。
cd ~/mozilla-iot/gateway/src/addons
sudo apt install git
git clone https://github.com/mozilla-iot/example-adapter
完成此步骤后,我们应该在 src/addons
中有一个示例适配器目录。现在我们可以继续使用拍手检测库更新拍手感应 binarySensor
的活动属性。我们只需要编辑示例适配器目录中的 example-plugin-adapter.js
文件。
首先,让我们删除示例适配器中的一些通用性。我们将进行大量的重命名,所以现在是时候使用编辑器的查找和替换功能了(如果你知道怎么用的话)。我们实际上只需要一个属性——传感器是否处于活动状态——所以让我们将 ExampleProperty
重命名为 ActiveProperty
。
class ActiveProperty extends Property {
我们还知道,我们希望 ExampleDevice
始终只是一个拍手传感器,所以让我们将其重命名为 ClapSensor
。请注意,我们还在 ClapSensor
的构造函数中将 ExampleProperty
更改为 ActiveProperty
,并在 addDevice
中将 ExampleDevice
更改为 ClapSensor
。
class ClapSensor extends Device {
constructor(adapter, id, deviceDescription) {
super(adapter, id);
this.name = deviceDescription.name;
this.type = deviceDescription.type;
this.description = deviceDescription.description;
for (var propertyName in deviceDescription.properties) {
var propertyDescription = deviceDescription.properties[propertyName];
var property = new ActiveProperty(this, propertyName,
propertyDescription);
this.properties.set(propertyName, property);
}
}
}
我们现在最后的修改是确保我们在加载函数中创建了一个 binarySensor
。因此,我们按照以下方式更新了 addDevice
和 loadExamplePluginAdapter
中 ExampleDevice
的使用方式
class ClapSensorAdapter extends Adapter {
// ...
addDevice(deviceId, deviceDescription) {
return new Promise((resolve, reject) => {
if (deviceId in this.devices) {
reject('Device: ' + deviceId + ' already exists.');
} else {
var device = new ClapSensor(this, deviceId, deviceDescription);
this.handleDeviceAdded(device);
resolve(device);
}
});
}
// ...
}
function loadExamplePluginAdapter(addonManager, manifest, _errorCallback) {
var adapter = new ExamplePluginAdapter(addonManager, manifest.name);
var device = new ClapSensor(adapter, 'clap-sensor-0', {
name: 'Clap Sensor',
type: 'binarySensor',
description: 'Clap Sensor',
properties: {
active: {
name: 'active',
type: 'boolean',
value: false,
},
},
});
adapter.handleDeviceAdded(device);
}
现在让我们弄清楚 clap-detector
是如何工作的。根据 clap-detector
的文档,我们必须安装 sox
和 clap-detector
,然后才能在我们的适配器中开始使用它。
cd ~/mozilla-iot/gateway/src/addons/example-adapter
sudo apt-get install sox
npm install --save clap-detector
然后,我们可以使用 其文档的 API 示例 来获取是否正在拍手。
const clapDetector = require('clap-detector');
// Start clap detection
clapDetector.start();
// Register on clap event
clapDetector.onClap(function(history) {
console.log('clapping is happening', history)
});
然后我们可以将其连接到我们的 ActiveProperty
,通过告诉它在检测到拍手时切换其状态。
var clapDetector = require('clap-detector');
// Start clap detection
clapDetector.start();
class ActiveProperty extends Property {
constructor(device, name, propertyDescription) {
super(device, name, propertyDescription);
this.unit = propertyDescription.unit;
this.description = propertyDescription.description;
this.setCachedValue(propertyDescription.value);
this.device.notifyPropertyChanged(this);
clapDetector.onClap(function() {
console.log('clap!');
this.value = !this.value;
this.setCachedValue(this.value);
this.device.notifyPropertyChanged(this);
}.bind(this));
}
// ...
}
拍手控制灯光
我们完成了这个项目的代码部分。现在我们只需要确保我们拍手感应版本的 example-adapter
安装并按我们的要求执行。首先,让我们重新启动我们的网关,确保它干净地加载我们的插件。运行 sudo systemctl restart mozilla-iot-gateway.service
并等待网关重新启动。现在我们可以通过转到网关的设置屏幕来验证插件是否正常工作。如果你在设置屏幕中没有看到插件列表,则运行 tail -n +0 -f ~/mozilla-iot/gateway/run-app.log
查看日志,以找出出了什么问题。
接下来,我们通过单击网关主页上“Thing”页面的加号来添加 ClapSensor 设备,并保存显示的名为“Clap Sensor”的 binarySensor
。
现在我们可以通过在麦克风附近拍手来测试我们的设备。如果它按预期工作,传感器应该在每次拍手时打开或关闭。否则,尝试调整 拍手传感器配置 或将你的版本与 官方 ClapSensor 代码 进行比较。
一切正常后,我们可以发挥创意,设置一个规则,每当我们拍手时打开和关闭我们的灯光。转到网关的规则页面,单击加号添加一个新规则。在底部设备列表中,选择你的拍手传感器,并将其拖动到触发器位置。选择“on”作为触发器的属性,以便它在传感器处于活动状态时触发,而不是在传感器处于非活动状态时触发。接下来,将要控制的灯光拖到规则区域的效果部分。选择要将灯光打开。如果你遇到任何问题,下面的完整规则可以供参考。现在我们可以通过拍手来打开和关闭我们的灯光。
感谢阅读!如果你想了解更多信息,请查看 Mozilla IoT 主页,以了解更多关于 Web of Things 以及如何贡献的信息!
关于 James Hobin
25 级计算机奇才,正在努力让物联网保持自由和开放。
15 条评论