在您的数据中找到隐藏的宝藏:一个物联网演示

导航至

作为InfluxData的全新物联网专家,我必须创建一个使用InfluxData堆栈的大型物联网演示。这不可避免地发生了,现在它已经完成了。我将向您详细介绍我所构建的内容、构建方式以及它的重要性。最后,您将看到可视化您的物联网数据如何让您发现您在其他情况下可能会错过的数据见解。

我所构建的内容

显然,在我加入InfluxData之前,就已经有一些关于构建此类演示的讨论,但没有人真正跟进。我们是一家以远程工作者为导向的公司,所以我想构建一个可以在公司内部分发并让远程工作者(像我一样)也能参与的演示。我想监测一些很容易感知的事物,并且它们在每个人的环境中普遍存在。我选择了温度、大气压力、湿度和光照。做起来很简单。对于实际的传感器平台,我选择了Particle.io的Photon。我以前和他们合作过很多,所以很快就能够搭建起一个可以快速运行的平台。

一般来说,Particle.io物联网项目的架构如下

Frontpage cloud diagram

您的Particle设备直接与Particle云通信,然后您的应用程序从Particle云获取数据。这显然不是我想要的,因为我显然想使用InfluxData堆栈来收集和分析数据。所以我的架构看起来是这样的

Frontpage cloud diagram3

是的,看起来一模一样。但不同的是,我使用InfluxData云来收集数据,并使用Chronograf构建可视化仪表盘。这是一个微妙但重要的区别。它给我们带来的一个好处是能够持久化数据,并查看历史数据,我喜欢这一点。趋势分析在物联网数据分析中很重要,这让我很容易就做到了。

这就是总体情况。现在,让我们深入一点,看看我是如何构建它的。

我是如何构建的

首先,我研究和收集了我想要的传感器,以及我需要的所有其他部件。以下是具体的部件

硬件构建

如果您不想把它们放在漂亮的盒子里,当然可以跳过最后两个项目,但既然我打算在公司内部分发,我认为它们应该看起来很体面,并且相当安全。现在开始构建。

这是我在构建所有东西(除了传感器)的时间延迟。在传感器构建过程中,相机出现了故障,所以我们失去了这部分内容。由于这些传感器都是基于I2C的传感器,所以我能够构建一个简单的扁平电缆来连接一切

Wiring

正如您所看到的,它只使用了两个输入引脚(D0和D1)、3.3V电源线和地线。每个传感器都有一个默认的不同的I2C地址,所以它们可以被连接到相同的引脚,并分别寻址。TSL2561实际上有3个地址,取决于您是否将其拉高、拉低或悬空——默认情况下,这是我使用的,因为它没有与BME280地址冲突。

#define TSL2561_ADDR_FLOAT        (0x39)
#define BME280_ADDRESS            (0x77)

剩下的就是将传感器装置焊接在Photon本身上,传感器就准备好了!

包装也很简单。我只是在每个项目盒子的侧面钻了一个1/2英寸的孔,放置了一个9/32英寸的橡胶网套(在Home Depot以每个0.97美元的价格购买),并将其固定在孔中。一点热胶来固定传感器装置,我就完成了。整洁包装好的传感器,准备发货!

但是等等,我没有在任何地方安装任何软件!正确!Particle.io平台的一个好处是能够通过空中传输(OTA)推送固件。我可以在Particle IDE中构建软件,然后,当每个传感器上线时,它会自动获取正确的固件并开始运行。如果以后需要更改固件,任何更改都会通过OTA机制自动写入所有设备,并且一切保持更新。

构建软件

Particle Photon 可以通过它们的在线 IDE(基于网页)或桌面 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 云中。在使用之前,必须从云中检索这个名称。由于我们不使用 GPS 定位这些设备,所以我们决定将“名称”设置为位置,如“NewYorkNY”或“ClevelandOH”等。这让我们知道设备的大致位置,但保持了其实际位置(可能是员工的住宅)的模糊性。获取名称有一个技巧

void setup() {
...
  Particle.subscribe("spark/device/name", handler);
...
}

void handler(const char *topic, const char *data) {
 myName = String(data);
 }

你必须订阅名称属性,并设置一个回调处理程序。一旦设置名称,或者设备在名称设置后上线,这个回调处理程序就会被调用,我们可以获取名称。为了保持 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只返回摄氏度温度数据,因此为了同时获得两种数据,我快速将温度转换为华氏度。再次强调,我会在获取设备名称/位置后再发送数据,但只要我有了这些信息,我就会每500毫秒发送一次读数。我真的需要每秒两次读数吗?不一定。但是我要部署十几个这样的设备,所以我们会向InfluxDB实例发送每秒24次读数,只是为了让它有事可做。

我的数据库设计——以及上面提到的line-protocol http POST的布局——是为了能够按位置和传感器ID收集所有传感器数据。我们认为这将使根据位置查找有趣事件的同时,还能让我们看到整体趋势。

为什么这很重要

当你真正能够看到你的数据时,你可以发现多么惊人的东西!

能够轻松高效地将物联网数据发送到InfluxDB是一项巨大的胜利。物联网数据时间序列数据。这是定义。为什么我要这么说?因为物联网数据是<sensor_reading>@<time>。这就是时间序列。轻松、高效、快速地将物联网数据上线对于物联网部署的成功至关重要。

一旦我将传感器上线(我仍在将其他传感器运送到线上,所以数据将会更好,更复杂),大约花了我3分钟时间构建仪表板,以便我可以看到正在发生的事情。

SafariScreenSnapz010

你会注意到压力一直在稳步下降,这正确地表明暴风雨即将来临。光照数据也证实了这一点,因为云确实在移动。当我查看图表时,我对温度和湿度图感到有些困惑。为什么温度会缓慢下降到74º,然后又急剧上升到77º?当我观察这个并思考它时,我家的中央空调启动了,我看到温度和湿度下降了。所以尽管我没有明确地监控我的空调单元,但结果证明我可以通过仪表板上的温度和湿度图表来有效地监控它何时开启和关闭。当你真正能够看到你的数据时,你可以发现多么惊人的东西!你的数据中是否隐藏着一些你因为没有看到而不知道的意外宝藏?

这就是为什么物联网数据的使用很重要。这些“啊哈!”的时刻可以导致业务流程的改变,最终导致更高的效率和巨大的成本节约。

请持续关注这个物联网演示的更新,随着我们将其扩展并作为使用InfluxData在物联网部署中的展示案例,我们将推出。整个演示将在InfluxDB云中运行,我们计划让一些数据公开,以便您可以自己访问、查看和解释这些数据。