在您的数据中发现隐藏的瑰宝:物联网演示
作者:David G. Simmons / 产品, 用例, 开发者
2017年9月1日
导航至
作为 InfluxData 的新物联网负责人,创建一些使用 InfluxData 堆栈的大规模物联网演示似乎是理所当然的事情。这只是必须发生的事情,现在它发生了。我将全面介绍我构建的内容、构建方式以及它为何重要。最后,您将了解为什么可视化您的物联网数据可以为您提供对您可能在数据中错过的东西的全新见解。
我构建了什么
显然在我加入 InfluxData 之前,已经讨论过构建这样的演示,但没有人真正追求它。我们是一家相当注重远程办公的公司,所以我认为我会构建一个可以在整个公司分发的演示,让远程员工(像我一样)也能参与进来。我想监控一些很容易感知到的东西,并且在每个人的环境中普遍存在。我选择了温度、大气压力、湿度和光照。很容易做到。对于实际的传感器平台,我选择了 Particle.io 的 Photon。我过去曾与他们合作过很多,并且很容易快速启动并运行一些东西。
通常,Particle.io 物联网项目的架构如下
您的 Particle 设备直接与 Particle 云通信,然后您的应用程序从 Particle 云获取数据。这真的不是我想做的事情,因为我显然想使用 InfluxData 堆栈来收集和分析数据。所以我的架构看起来像这样
是的,它看起来完全相同。但与其使用 Particle 云,我不如使用 InfluxData Cloud 来收集数据,并使用 Chronograf 来构建用于可视化的仪表板。微妙但重要的区别是肯定的。它为我们提供的功能之一是能够持久保存数据并查看历史数据,我喜欢这样。趋势分析在物联网数据分析中非常重要,这让我可以非常轻松地做到这一点。
这就是高层概括。现在,为了更深入地了解,我们将看看我是如何构建它的。
我是如何构建它的
首先,我研究并收集了我想要的传感器以及我需要的所有其他部件。以下是具体部件
- Particle Photon — 传感器节点
- BME280 分线板 from Adafruit — 温度、压力和湿度传感器
- TSL2561 分线板 from Adafruit — 光照(可见光和红外光,以及勒克斯)传感器
- USB-C 墙壁电源
- 项目盒
- 电线、钻头、橡胶垫圈和热熔胶
构建硬件
如果您不想将它们放在漂亮的盒子里,当然可以跳过最后 2 项,但由于我要在公司内分发它们,我认为它们应该看起来体面且相当安全。现在开始构建。
这是我构建除传感器之外的所有东西的延时摄影。摄像头在传感器构建过程中发生故障,因此我们丢失了那部分。由于传感器都是基于 I2C 的传感器,因此我能够构建一个简单的带状电缆来连接所有东西
正如您所见,它仅使用两个输入引脚(D0 和 D1)、3.3v 电源线和接地。每个传感器默认都有不同的 I2C 地址,因此它们可以连接到相同的引脚并单独寻址。TSL2561 实际上有 3 个地址,具体取决于您是将其拉高、拉低还是保持浮动——默认地址,我使用了默认地址,因为它与 BME280 地址没有冲突。
#define TSL2561_ADDR_FLOAT (0x39)
#define BME280_ADDRESS (0x77)
剩下的就是将传感器装置焊接到 Photon 本身,传感器就可以使用了!
包装也很简单。我只是在每个项目盒的侧面钻了一个 1/2 英寸的孔,在 USB-C 连接器上放置了一个 9/32 英寸的橡胶垫圈(在 Home Depot 以每个 0.97 美元的价格购买),并将其固定在孔中。用少许热熔胶将传感器装置固定到位,我就完成了。包装整齐的传感器已准备好发货!
但是等等,我没有在任何地方安装任何软件!没错!Particle.io 平台的优点之一是能够通过无线 (OTA) 推送固件。我可以在 Particle IDE 中构建软件,然后,当每个传感器上线时,它会自动获取正确的固件并开始运行。如果我以后需要对固件进行任何更改,任何更改都会通过 OTA 机制自动写入所有设备,并且一切都保持最新状态。
构建软件
Particle Photon 可以使用他们的在线 IDE(基于 Web)或桌面 IDE 轻松编程。我选择的两个传感器都受到几个库的支持,这些库只是包含在您的程序中。 Adafruit_TSL2561_U (2.0.10) 和 Adafruit_BME280 (1.1.4) 您可以使用库管理器轻松包含它们。您还需要包含 HttpClient (0.0.5) 库,至少在我完成编写 InfluxData Arduino/Particle 库之前。
因此,为了解决容易的事情,我们当然需要包含上面提到的库,并定义一些东西作为开始。
#include <HttpClient.h>
#include "Adafruit_Sensor.h"
#include "Adafruit_BME280.h"
#define SEALEVELPRESSURE_HPA (1013.25)
PRODUCT_ID(XXXX); //This is the Particle.io product number
PRODUCT_VERSION(1);
Adafruit_BME280 bme;
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);
double temperature = 0.00;
double pressure = 0.00;
double altitude = 0.00;
double humidity = 0.00;
uint16_t broadband = 0;
uint16_t infrared = 0;
double lux = 0.00;
String myID = System.deviceID();
String myName = "";
HttpClient http;
http_header_t headers[] = {
{ "Accept" , "*/*"},
{ "User-agent", "Particle HttpClient"},
{ NULL, NULL } // NOTE: Always terminate headers will NULL
};
http_request_t request;
http_response_t response;
uint16_t ir_light;
uint16_t viz_light;
这些变量中的大多数都是不言自明的。但是,myName 变量有点棘手。在 Particle 平台上,可以为每个设备分配一个唯一的“名称”。但是,此名称并非驻留在设备本身上,而是驻留在 Particle Cloud 中。然后必须从云端检索它才能使用。由于我们不使用 GPS 来定位这些设备,因此我们决定将“名称”设置为位置,例如“NewYorkNY”或“ClevelandOH”等。这让我们大致了解设备的位置,但对其真实位置(可能是员工的家)进行了模糊处理。获取名称有一个技巧
void setup() {
...
Particle.subscribe("spark/device/name", handler);
...
}
void handler(const char *topic, const char *data) {
myName = String(data);
}
您必须订阅 name 属性,并设置一个回调处理程序。一旦设置了名称,或者在设备的名称已设置后设备上线,就会调用此回调处理程序,我们可以获取名称。在检索到设备名称/位置之前,我不会开始发送数据,以便保持 InfluxDB 实例中的数据一致。说到 InfluxDB 实例,在 setup() 函数中,我还需要初始化 http_request_t 对象并正确设置其某些参数
request.hostname = "myhost.com";
request.port = 8086;
request.path = "/write?db=iotdata";
现在所有这些设置都已完成,所有需要做的就是进入一个循环,该循环收集所有传感器读数,以 InfluxDB 的行协议格式化它们,然后发送它们。
void loop() {
getReadings();
double fTemp = temperature * 9/5 + 32;
if(myName != ""){
request.body = String::format("influxdata_sensors,id=%s,location=%s temp_c=%f,temp_f=%f,humidity=%f,pressure=%f,altitude=%f,broadband=%d,infrared=%d,lux=%f", myID.c_str(), myName.c_str(), temperature, fTemp, humidity, pressure, altitude, broadband, infrared, lux);
http.post(request, response, headers);
delay(500);
} else {
delay(5000);
}
}
BME280 仅返回 ºC 的温度数据,因此为了同时拥有两者,我快速将温度转换为 ºF。同样,在检索到设备名称/位置之前,我不会发送数据,但只要我有它,我就会继续每 500 毫秒发送一次读数。我真的需要每秒 2 个读数吗?可能不需要。但我正在部署十几个,所以我们将每秒发送 24 个读数到 InfluxDB 实例,只是为了让它有事可做。
我的数据库设计——以及因此上面的行协议 http POST 的布局——旨在使我们能够按位置和传感器 ID 收集所有传感器数据。我们认为这将使根据位置深入研究数据以查找有趣事件变得更容易,同时仍然允许我们查看总体趋势。
为何重要
当您真正看到您的数据时,您会发现多么令人惊奇的事情!
能够轻松高效地将物联网数据发送到 InfluxDB 是一个巨大的胜利。物联网数据本质上就是时间序列数据。从定义上来说。我为什么要这么说?因为物联网数据是
一旦我让传感器上线(我仍在运送其他传感器上线,因此数据会变得更好、更复杂),我花了大约 3 分钟构建仪表板,以便我可以查看发生了什么。
您会注意到压力一直在稳步下降,这正确地表明暴风雨正在逼近。光照数据证实了这一点,因为云确实在移动。当我查看图表时,我对温度和湿度图有点困惑。为什么温度缓慢下降到 74º,然后又飙升回 77º?当我观看并思考这个问题时,我的中央空调启动了,我看到温度和湿度下降了。因此,虽然我没有明确监控我的空调装置,但事实证明,我可以通过仪表板上的温度和湿度图有效地监控它何时开启和关闭。当您真正看到您的数据时,您会发现多么令人惊奇的事情!您的数据中是否隐藏着您根本没有意识到的意外瑰宝,因为您看不到它们?
这就是您如何处理物联网数据至关重要的原因。正是这些“啊哈!”时刻可以导致业务流程的改变,最终带来更高的效率和巨大的成本节约。
请继续关注此物联网演示的更新,因为我们将对其进行扩展并进一步推广,以展示在物联网部署中使用 InfluxData 的情况。整个演示将在 InfluxDB Cloud 中运行,我们计划公开访问此数据,以便您可以自己访问、查看和解释数据。