使用InfluxDB Cloud原型设计物联网

导航到

这是四部分系列的第一部分。请阅读第二部分第三部分第四部分

本周早些时候,我们宣布我们已经准备好让全球开始使用InfluxDB Cloud 2.0,这是最受欢迎的时序数据库的下一版本,并投入生产。我喜欢InfluxDB,因为我加入公司是因为它使用起来既简单又有趣,同时也是一个经过实战考验的生产数据库。

InfluxDB Cloud 2.0适合监控基础设施(包括轻松监控您的Kubernetes集群),但也很受物联网项目的欢迎。这篇文章是关于我下午用InfluxDB Cloud 2.0原型设计一个物联网项目的一个项目。这里的一切都可以使用免费套餐完成。

场景

使用我在车间里随意摆放的零件和传感器,我创建了一个用于工作台植物的监控系统。我希望得到关于植物的环境信息流。我将主要关注土壤湿度水平,尽管其他传感器也可以受益于同样的处理。

传感器

为了构建传感器阵列,我在我的宝贝箱里翻来翻去,找到了一套我手头的相关传感器

原型并不美观,但它是实用的。

我使用了一个Arduino Nano克隆板作为微控制器。微控制器没有WiFi芯片,所以我只是将传感器的数据通过USB流式传输到一个Raspberry Pi 3上,该设备集成了WiFi等功能……这还有一个额外的好处,那就是让我能够轻松地使用Python来发送数据。

如果感兴趣,可以在GitHub上找到Arduino代码。再次强调,这些代码都不是针对InfluxDB的,它们都与将传感器数据传输到Raspberry Pi有关,在这个配置中,Raspberry Pi充当一种边缘网关。

结构化传感器数据的Python代码

InfluxDB使用行协议格式。这意味着我需要一些Python代码来创建正确的格式字符串发送到Influx。

有关行协议格式的优秀文档可供查阅。简要总结一下,一行有以下部分

  • 测量名称
  • 可选的标签集
  • 一系列字段及其值
  • 可选的时间戳

标签在需要区分数据来源的情况下非常有用。例如,如果我有多棵植物,我可以使用标签来区分特定的读数来自哪棵植物。对于这个原型,只有一棵植物,所以我将跳过标签。如果您不提供时间戳,数据库将为您在服务器上添加时间戳。在树莓派上添加时间戳也很简单,所以我将只做这个。

因此,我的简单行协议将是

sensorname measurement=value timestamp

我编写了一个程序,它简单地从USB端口读取,并打印出行协议。您可以在GitHub上看到整个程序(https://github.com/rickspencer3/send-usb/blob/master/plant-buddy-no-rest),但这里是有创建行协议功能的代码。

def get_line_protocol(sensor, reading, value):
	line = "{} {}={} {}"
	timestamp = str(int(datetime.datetime.now().timestamp() * 1000))
	return line.format(sensor, reading, value, timestamp)

一个示例输出如下

moisture soilMoisture=521 1568289900477

现在我已经准备好向InfluxDB写入数据了!我只需要设置一个免费账户。

获取InfluxDB账户

有一个正常的注册流程——获得账户只需要不到一分钟。您只需确认您的电子邮件。

Get started with InfluxDB Cloud

InfluxDB Cloud signup

Getting started - Free Plan

Getting started with InfluxDB Cloud

设置一个桶

InfluxDB上的“桶”基本上就像它的名字一样。您可以将任何您想要添加到桶中的时序数据。例如,我将发送一系列传感器数据。我稍后需要这个桶,这样我的Python代码就可以告诉InfluxDB在哪里存储数据。

转到“加载数据”屏幕的“桶”子部分。

InfluxDB Cloud 2.0 - load data buckets

请注意,已经创建了三个桶。_monitoring 和 _tasks 桶对于支持我们稍后将要使用的功能非常重要,所以请保留这些桶。另一方面,我通常将默认桶作为第一步删除。如果您愿意,可以将其重命名,但出于某种原因,我习惯于删除桶并创建一个新的。

使用“+ 创建桶”按钮来获取创建桶对话框。因为这是一个免费账户,所以我不会有无限制的数据保留。虽然这对我的原型来说没问题。我将简单地将保留期设置为一天。

InfluxDB Cloud 2.0 - load data buckets

InfluxDB Cloud 2.0 - create bucket

现在我的桶已经准备好接收数据了!

InfluxDB Cloud 2.0 - load data

获取一个令牌

有各种将数据发送到InfluxDB的好方法。通常,您将使用Telegraf将数据发送到InfluxDB。然而,还有一个干净的REST API您可以使用。这意味着您必须自己处理所有错误处理和优化,这在某些生产用例中是有意义的。对于原型,我发现使用REST API很简单,因为可以少设置一个组件。也许在未来的帖子中,我会迁移到Telegraf,因为它在树莓派上安装和运行都非常简单。

所以,我主要需要的是一个令牌。不用担心,我会在发布后立即删除这个令牌。:)

首先,我会点击左侧导航中的“加载数据”屏幕中的令牌子屏幕。

InfluxDB Cloud - load data screen

InfluxDB Cloud - describe token

同样,有一个默认令牌可用,但我会使用“+ 生成”按钮来创建一个读写令牌。Plant Buddy不会管理我的数据库,所以它不需要完全访问权限。实际上,它只需要写入权限,但我可能想在原型中写入一些“读取”代码,所以现在我会设置为读写。

InfluxDB Cloud - Load data tokens - generate

选择您想要访问的桶

Generate Read Write Token

同样,出于某种原因,我喜欢删除默认令牌。

InfluxDB Cloud - default token

现在我可以点击令牌,查看它,并将其复制到我的代码中。以防你有什么不轨的想法,我会在发布前删除令牌。:)

InfluxDB Cloud - summary of access permissions

用于发送数据的Python代码

现在我有了令牌,我只需要创建一个POST请求,将行协议数据发送到InfluxDB。我需要知道

  • 我的令牌
  • 我想发送数据的存储桶
  • 我的组织名称
  • 要发布的URL

既然我已经有了令牌,我就可以构建POST请求

def send_line(line):
    url = "{}api/v2/write?org={}&bucket={}&precision={}".format(influx_url, organization, bucket, precision)
    headers = {"Authorization": "Token {}".format(influx_token)}
    r = requests.post(url, data=line, headers=headers)

完整的Python模块可在GitHub上获得,链接为https://github.com/rickspencer3/send-usb/blob/master/plant-buddy。我尝试将其设置为原型设计的良好起点。

当我运行它时,我可以从输出中看到数据正在从传感器中收集并正确格式化

$ ./plant-buddy --token=tfkb-kcg22A2oHQzXXHOLRZW3ohMoXyaX_XXXXXXXXX
moisture soilMoisture=526 1568289892854
temp airTemp=028 1568289893544
humidity humidity=067 1568289894447
temp soilTemp=025 1568289895168
light light=162 1568289895809
moisture soilMoisture=522 1568289896665
temp airTemp=028 1568289897280
humidity humidity=067 1568289897942
temp soilTemp=025 1568289898565
light light=163 1568289899160
moisture soilMoisture=521 1568289900477
temp airTemp=027 1568289901420
humidity humidity=066 1568289902134
temp soilTemp=025 1568289902849

数据可视化

因此,现在我们可以查看流进数据库的数据。只需在左侧导航中选择数据探索器。

InfluxDB Cloud - Data Explorer

然后选择您想要可视化的存储桶。对我来说这很简单,因为我只有一个存储桶。

InfluxDB Could - Data Explorer PlantBuddy

然后您可以选择要可视化的测量值和字段。对于这个例子,我最关心的是土壤湿度水平,所以我会关注这一点。

Data Explorer- soil moisture levels

然而,您可以查看您想要的任何数量的度量。

Data Explorer with graph

还有其他一些有趣的可视化选项供您选择。

Data Explorer - sensor data

所以,非常酷。基本上不需要努力,我就可以可视化我的传感器数据。

警报和通知

虽然可以可视化数据,但知道何时需要给植物浇水会更好。免费版内置了Slack警报,所以我将使用它。

首先,我需要设置Slack以接收警报。我已经有一个个人Slack服务器,所以我会直接使用它。

在Slack上设置接收webhook回调的设置有详细的说明,所以这里不再赘述。总之,您创建一个Slack应用,在Slack设置中,您会得到一个传入webhook URL。我的如下所示:https://hooks.slack.com/services/TN5S4A6L8/BN5SHN78Q/VOlsxxxxxxxxx

要使用webhook,我只需做以下操作

  1. 创建一组通知级别
  2. 为这些级别创建警报
  3. 如果需要,可以自定义消息

首先,从左侧导航中选择“监控与警报”。由于我没有设置任何警报,我需要开始设置。

InfluxDB Cloud - monitoring and alerting

接下来,我为检查创建一个查询。基本上,我想监控什么?我只是将读取最后的土壤湿度读数。

InfluxDB Cloud - query for the check

在构建查询后,我定义了检查。这涉及到检查的运行频率以及通知级别。InfluxDB 2.0自带内置的通知级别。如果这些不符合您的特定场景,请不要担心,您可以使用任务功能进行高度定制的交互。我将不同的通知级别从正常设置为严重。严重是指湿度读数低于100。

InfluxDB Cloud - soil moisture check

接下来,我创建了一个通知端点。我只是使用我从Slack应用中创建的webhook URL。

InfluxDB Cloud - Create a Notification Endpoint

最后,我创建了通知规则本身。如您所见,我配置了在土壤湿度处于严重水平时每分钟发送一次通知。

Monitoring and alerting - InfluxDB

还有其他类型的检查也很重要。例如,我可以创建一个“看门人”通知,提醒我Plant Buddy停止发送数据。

同时,如果我从土壤中拔出传感器,您可以看到土壤湿度水平崩溃。

Data Explorer dashboard

我还如预期地在Slack上收到了通知。并且将继续每分钟收到通知,直到我解决问题。

Slack notifications

检查和通知规则都有消息模板,您可以以不同的方式自定义它们。我将它们改为以下内容

Soil moisture check - graph

InfluxDB Cloud - edit notification rule

这导致Slack中的消息更加美观。

Slack message

结论

本文介绍了如何轻松愉快地使用 InfluxDB Cloud 2.0 试用版来原型化物联网设备。

  • 完全无服务器。我无需管理任何基础设施。
  • 非常简单。所有工具和用户界面都直观易用。
  • 功能强大。我能够创建存储桶,使用 REST API,以不同方式可视化数据,甚至设置自动警报。

然而,这篇文章仅触及了 InfluxDB 2.0 功能的皮毛。我甚至没有提到 Telegraf,它使得数据收集更加健壮和强大。我没有涉及到使用标签监控多个设备。而且,我甚至没有提到 Flux,这是一种强大的查询语言,允许进行高度定制的查询和任务。