使用 InfluxDB Cloud 进行 IoT 原型设计
作者:Rick Spencer / 产品, 开发者
2019 年 9 月 13 日
导航至
这是四部分系列文章的第 1 部分。请阅读第 2 部分、第 3 部分和第 4 部分。
本周早些时候,我们宣布 InfluxDB Cloud 2.0(最受欢迎的时间序列数据库的下一个版本)已准备好供全球开始在生产环境中使用。我喜欢 InfluxDB,加入这家公司是因为它非常容易且有趣,同时也是一个久经考验的生产数据库。
InfluxDB Cloud 2.0 适用于监控基础设施(包括轻松监控您的 Kubernetes 集群),但在 IoT 项目中也非常受欢迎。这篇文章是关于我用一个下午编写的项目,该项目使用 InfluxDB Cloud 2.0 进行 IoT 项目的原型设计。这里的所有内容都可以通过免费套餐完成。
场景
我使用工作室里闲置的零件和传感器,为工作台上的植物创建了一个监控系统。我想要的是获取有关植物环境信息的数据流。我将主要关注土壤湿度水平,尽管其他传感器也可以从相同的处理中受益。
传感器
为了构建传感器阵列,我在我的零件箱中翻找,找到了一组我闲置的相关传感器
- 光传感器
- 空气温度/湿度传感器
- 防水温度计,适用于土壤传感器
- 土壤湿度传感器(本文的大部分重点)
原型并不美观,但它能工作。
我使用了一个 Arduino Nano 克隆板作为微控制器。该微控制器缺少 wifi 芯片,因此我只是通过 USB 将传感器数据流式传输到一个带有集成 wifi 等的 Raspberry Pi 3。这还有一个额外的好处,即允许我轻松地使用 Python 发送数据。
Arduino 代码在 GitHub 上,如果您有兴趣。同样,这些代码都不是 InfluxDB 特有的,它们都与将传感器数据传输到 Raspberry Pi 有关,Raspberry Pi 在此设置中充当某种边缘网关。
用于构建传感器数据的 Python 代码
InfluxDB 使用行协议格式。这意味着我需要一些 Python 代码来创建正确格式的字符串以发送到 Influx。
关于行协议格式,有优秀的文档可用。简要概括一下,一行包含以下部分
- 测量的名称
- 一组可选的标签
- 一组字段及其值
- 可选的时间戳
当您需要区分数据来源时,标签非常有用。例如,如果我有几株植物,我可以使用标签来区分特定读数来自哪株植物。对于这个原型,只有一株植物,所以我将跳过标签。如果您不提供时间戳,数据库将在服务器上为您添加时间戳。在 Raspberry Pi 上添加时间戳很容易,所以我将这样做。
因此,我的简单行协议将是
sensorname measurement=value timestamp
我编写了一个程序,该程序只是从 USB 端口读取数据,并打印出行协议。您可以在 GitHub 上的整个程序中看到,但这是创建行协议的函数。
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。这意味着您必须完成 Telegraf 可以为您处理的所有错误处理和优化,这在某些生产用例中是有意义的。对于原型设计,我发现使用 REST API 很简单,因为需要设置的组件少一个。也许我会在以后的文章中迁移到 Telegraf,因为它很容易安装并在 Raspberry Pi 上运行。
所以,我主要需要的是一个令牌。别担心,我会在发布后立即删除此令牌。:)
首先,我将转到左侧导航栏“加载数据”屏幕中的令牌子屏幕。
同样,有一个默认令牌可用,但我将使用 + 生成 按钮创建一个读/写令牌。Plant Buddy 不会管理我的数据库,因此它不需要完全访问权限。实际上,它只需要写入访问权限,但我可能想编写一些“读取”代码作为原型的一部分,所以现在我将其设置为读/写。
选择您要访问的存储桶
同样,无论出于何种原因,我喜欢删除默认令牌。
现在我可以单击令牌,查看它,并将其复制到我的代码中。以防万一您有不好的想法,我会在发布此内容之前删除令牌。:)
用于发送数据的 Python 代码
现在我已经有了令牌,我只需要创建一个 POST 请求来将行协议数据发送到 InfluxDB。我需要知道
- 我的令牌
- 我想在其中发送数据的存储桶
- 我的组织名称
- 要 POST 到的 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 上可用。我试图将其设置为您自己进行原型设计的良好起点。
当我运行它时,我可以从输出中看到数据正在从传感器收集并正确格式化
$ ./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。
最后,我制定了通知规则本身。您可以看到,我将其配置为在土壤湿度水平达到“紧急”状态时每分钟发送一次通知。
还有其他类型的检查也很重要。例如,我可以创建一个“deadman”通知,以在我 Plant Buddy 停止发送数据时提醒我。
同时,如果我将传感器从土壤中拔出,您可以看到土壤湿度水平骤降。
正如预期的那样,我也在 Slack 中收到了通知。并且将继续每分钟收到通知,直到我解决问题。
“检查”和“通知规则”都具有消息模板,您可以以不同的方式自定义它们。我将它们更改为以下内容
这会在 Slack 中产生更友好的消息。
结论
这篇文章介绍了使用 InfluxDB Cloud 2.0 的免费套餐进行 IoT 设备原型设计是多么容易和有趣。
- 完全无服务器。我没有任何基础设施需要管理。
- 非常简单。所有工具和用户界面都直观且易于使用。
- 功能强大。我能够创建一个存储桶,使用 REST API,以不同的方式可视化数据,甚至设置自动警报。
但是,这篇文章仅仅触及了 InfluxDB 2.0 可以做的所有事情的表面。我什至没有提到 Telegraf,它使数据收集更加强大和可靠。我没有提到使用标签来监控多个设备。而且,我什至没有提到 Flux,这种强大的查询语言允许高度自定义的查询和任务。