使用InfluxDB Cloud原型设计物联网
作者:Rick Spencer / 产品,开发者
2019年9月13日
导航到
这是四部分系列的第一部分。请阅读第二部分、第三部分和第四部分。
本周早些时候,我们宣布我们已经准备好让全球开始使用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账户
有一个正常的注册流程——获得账户只需要不到一分钟。您只需确认您的电子邮件。
设置一个桶
InfluxDB上的“桶”基本上就像它的名字一样。您可以将任何您想要添加到桶中的时序数据。例如,我将发送一系列传感器数据。我稍后需要这个桶,这样我的Python代码就可以告诉InfluxDB在哪里存储数据。
转到“加载数据”屏幕的“桶”子部分。
请注意,已经创建了三个桶。_monitoring 和 _tasks 桶对于支持我们稍后将要使用的功能非常重要,所以请保留这些桶。另一方面,我通常将默认桶作为第一步删除。如果您愿意,可以将其重命名,但出于某种原因,我习惯于删除桶并创建一个新的。
使用“+ 创建桶”按钮来获取创建桶对话框。因为这是一个免费账户,所以我不会有无限制的数据保留。虽然这对我的原型来说没问题。我将简单地将保留期设置为一天。
现在我的桶已经准备好接收数据了!
获取一个令牌
有各种将数据发送到InfluxDB的好方法。通常,您将使用Telegraf将数据发送到InfluxDB。然而,还有一个干净的REST API您可以使用。这意味着您必须自己处理所有错误处理和优化,这在某些生产用例中是有意义的。对于原型,我发现使用REST API很简单,因为可以少设置一个组件。也许在未来的帖子中,我会迁移到Telegraf,因为它在树莓派上安装和运行都非常简单。
所以,我主要需要的是一个令牌。不用担心,我会在发布后立即删除这个令牌。:)
首先,我会点击左侧导航中的“加载数据”屏幕中的令牌子屏幕。
同样,有一个默认令牌可用,但我会使用“+ 生成”按钮来创建一个读写令牌。Plant Buddy不会管理我的数据库,所以它不需要完全访问权限。实际上,它只需要写入权限,但我可能想在原型中写入一些“读取”代码,所以现在我会设置为读写。
选择您想要访问的桶
同样,出于某种原因,我喜欢删除默认令牌。
现在我可以点击令牌,查看它,并将其复制到我的代码中。以防你有什么不轨的想法,我会在发布前删除令牌。:)
用于发送数据的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
数据可视化
因此,现在我们可以查看流进数据库的数据。只需在左侧导航中选择数据探索器。
然后选择您想要可视化的存储桶。对我来说这很简单,因为我只有一个存储桶。
然后您可以选择要可视化的测量值和字段。对于这个例子,我最关心的是土壤湿度水平,所以我会关注这一点。
然而,您可以查看您想要的任何数量的度量。
还有其他一些有趣的可视化选项供您选择。
所以,非常酷。基本上不需要努力,我就可以可视化我的传感器数据。
警报和通知
虽然可以可视化数据,但知道何时需要给植物浇水会更好。免费版内置了Slack警报,所以我将使用它。
首先,我需要设置Slack以接收警报。我已经有一个个人Slack服务器,所以我会直接使用它。
在Slack上设置接收webhook回调的设置有详细的说明,所以这里不再赘述。总之,您创建一个Slack应用,在Slack设置中,您会得到一个传入webhook URL。我的如下所示:https://hooks.slack.com/services/TN5S4A6L8/BN5SHN78Q/VOlsxxxxxxxxx
要使用webhook,我只需做以下操作
- 创建一组通知级别
- 为这些级别创建警报
- 如果需要,可以自定义消息
首先,从左侧导航中选择“监控与警报”。由于我没有设置任何警报,我需要开始设置。
接下来,我为检查创建一个查询。基本上,我想监控什么?我只是将读取最后的土壤湿度读数。
在构建查询后,我定义了检查。这涉及到检查的运行频率以及通知级别。InfluxDB 2.0自带内置的通知级别。如果这些不符合您的特定场景,请不要担心,您可以使用任务功能进行高度定制的交互。我将不同的通知级别从正常设置为严重。严重是指湿度读数低于100。
接下来,我创建了一个通知端点。我只是使用我从Slack应用中创建的webhook URL。
最后,我创建了通知规则本身。如您所见,我配置了在土壤湿度处于严重水平时每分钟发送一次通知。
还有其他类型的检查也很重要。例如,我可以创建一个“看门人”通知,提醒我Plant Buddy停止发送数据。
同时,如果我从土壤中拔出传感器,您可以看到土壤湿度水平崩溃。
我还如预期地在Slack上收到了通知。并且将继续每分钟收到通知,直到我解决问题。
检查和通知规则都有消息模板,您可以以不同的方式自定义它们。我将它们改为以下内容
这导致Slack中的消息更加美观。
结论
本文介绍了如何轻松愉快地使用 InfluxDB Cloud 2.0 试用版来原型化物联网设备。
- 完全无服务器。我无需管理任何基础设施。
- 非常简单。所有工具和用户界面都直观易用。
- 功能强大。我能够创建存储桶,使用 REST API,以不同方式可视化数据,甚至设置自动警报。
然而,这篇文章仅触及了 InfluxDB 2.0 功能的皮毛。我甚至没有提到 Telegraf,它使得数据收集更加健壮和强大。我没有涉及到使用标签监控多个设备。而且,我甚至没有提到 Flux,这是一种强大的查询语言,允许进行高度定制的查询和任务。