dot 速度的未来即将在您所在的城市举办的活动中出现。

加入我们在 Redis 发布活动中

如何在 Redis 中管理实时物联网传感器数据

想象一下,您是一家空调制造公司,向消费者销售数百万台智能空调。您正在构建一个集中的智能气候控制系统,该系统收集房屋的温度、压力和湿度等传感器数据,并将其发送到中央位置进行效率分析,以帮助最终用户降低电费。

这篇博文将展示这种用例的简化版本,以演示其工作原理,这样您就可以了解如何在 Redis 中管理各种实时物联网传感器数据。

我们使用的是:

  1. 一个 BME680 环境传感器 模拟智能空调并将数据发送到 Redis
  2. RedisTimeSeries 模块 向 Redis 添加时间序列功能并将数据存储为时间序列格式
  3. 带有 Redis 数据源的 Grafana 用于创建使用情况分析图表

硬件要求

软件要求

准备您的 Jetson Nano 以进行操作系统安装

按照以下 10 个步骤操作,了解所有内容是如何整合在一起的

步骤 1:获取您的传感器

市场上有各种各样的传感器,但此演示使用 Pimoroni BME680 扩展板。 BME680 是一款为移动应用程序和可穿戴设备开发的集成环境传感器,尺寸和低功耗是其关键要求。它可以测量温度、压力、湿度和室内空气质量,并且与 Raspberry Pi 和 Arduino 兼容。

步骤 2:设置您的物联网板

在此演示中,我们使用 NVIDIA Jetson Nano,这是一款小型、功能强大的计算机,供开发人员学习、探索和构建面向边缘设备的 AI 应用程序。这款设备的价格为 59 美元,本质上是一个开发人员套件,其中包含一个具有 2GB 内存的 Jetson Nano 模块,并提供 472 GFLOPS 的计算能力。此演示还应适用于其他流行的物联网设备,例如 Raspberry Pi、Arduino、Banana Pi 等。

步骤 3:连接线

BME680 可以直接插入 Jetson Nano 板,无需任何连接线。

步骤 4:让您的传感器工作

连接传感器后,建议使用 i2cdetect 运行 I2C 检测,以验证您是否看到该设备:在本例中,它显示为 76。请注意,传感器使用 I2C 或 SPI 通信协议与微控制器通信。

$ i2cdetect -r -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- 76 --

步骤 5:准备 Redis

您需要在本地笔记本电脑或云中运行一个 Redis 服务器,并且 Redis 服务器必须使用 RedisTimeSeries 模块进行编译。在此演示中,我们使用 Redis Enterprise Cloud,这是一种完全托管的云数据库服务,其中已内置并集成了 RedisTimeSeries 模块。

步骤 6:设置 Redis Enterprise Cloud

如果您是 RedisTimeSeries 的完全新手,请查看我们的 RedisTimeSeries 快速入门教程。它说明了如何开始使用 Redis Enterprise Cloud 以及如何启用 RedisTimeSeries。您将需要此实现的一些详细信息

  • Redis 数据库名称
  • Redis 数据库端点
  • 端口号
  • 默认用户密码

步骤 7:克隆项目存储库

$ git clone https://github.com/redis-developer/redis-datasets
$ cd redis-datasets/redistimeseries/realtime-sensor-jetson

从 BME680 读取传感器值相当简单,但需要您设置一些配置值。您也可以在两种不同的“模式”下运行传感器 - 有或没有气体读数。仅读取温度、压力和湿度读数可以让您更快地采样数据。

让我们首先看一下库导入和配置设置。打开一个终端窗口,创建一个文件,然后键入以下内容

import bme680
import time
import datetime
import csv
import argparse
import redis

第一个模块 bme680 允许您轻松编写从传感器读取湿度、温度和压力的 Python 代码。类似地,还有其他 Python 模块,例如 time 用于处理与时间相关的任务,redis 用于导入 Redis Python 模块,等等。我们使用 time 库在每次读取传感器之间引入一个小的延迟,以帮助确保一致的结果。

print("""read-sensor.py - Displays temperature, pressure, humidity, and gas.
Press Ctrl+C to exit!
""")

try:
    sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY)
except IOError:
    sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY)

# These calibration data can safely be commented
# out, if desired.

print('Calibration data:')
for name in dir(sensor.calibration_data):

    if not name.startswith('_'):
        value = getattr(sensor.calibration_data, name)

        if isinstance(value, int):
            print('{}: {}'.format(name, value))

# These oversampling settings can be tweaked to
# change the balance between accuracy and noise in
# the data.

sensor.set_humidity_oversample(bme680.OS_2X)
sensor.set_pressure_oversample(bme680.OS_4X)
sensor.set_temperature_oversample(bme680.OS_8X)
sensor.set_filter(bme680.FILTER_SIZE_3)
sensor.set_gas_status(bme680.ENABLE_GAS_MEAS)

sensor = bme680.BME680() 命令创建了传感器的实例,我们将使用它来配置设置并获取传感器的读数。我们为湿度、压力和温度测量建立的 _oversample 设置旨在平衡准确读数和最大程度地减少噪声。过采样率越高,噪声降低幅度越大,但同时也会降低准确度。

_filter 保护传感器读数免受条件的瞬态变化的影响,例如门砰地关上会导致压力暂时变化,而 IIR 滤波器会去除这些瞬态尖峰值。

如以下代码所示,气体测量有一些可以调整的设置。可以使用 set_gas_status 启用或禁用它。如上所述,禁用它可以更快地进行其他读数。还可以更改加热板的温度以及保持该温度的时间,但如果您的气体电阻读数看起来合理,我们建议不要更改这些设置。

print('\n\nInitial reading:')
for name in dir(sensor.data):
    value = getattr(sensor.data, name)

    if not name.startswith('_'):
        print('{}: {}'.format(name, value))

sensor.set_gas_heater_temperature(320)
sensor.set_gas_heater_duration(150)
sensor.select_gas_heater_profile(0)

# Up to 10 heater profiles can be configured, each
# with their own temperature and duration.
# sensor.set_gas_heater_profile(200, 150, nb_profile=1)
# sensor.select_gas_heater_profile(1)


parser = argparse.ArgumentParser()
parser.add_argument("--port", type=int, help="redis instance port", default=6379)
parser.add_argument(
    "--password", type=int, help="redis instance password", default=None
)
parser.add_argument("--verbose", help="enable verbose output", action="store_true")
parser.add_argument("--host", type=str, help="redis instance host", default="127.0.0.1")


args = parser.parse_args()

接下来,我们定义 Redis 连接器,在其中指定 Redis 实例主机、端口和密码。如以下代码所示,以下代码定义了各种 RedisTimeSeries 密钥,例如温度密钥(TS:TEMPERATURE)、压力密钥(TS:PRESSURE)和湿度密钥(TS:HUMIDITY)。

# redis setup
redis_obj = redis.Redis(host=args.host, port=args.port, password=args.password)
temperature_key = "ts:temperature"
pressure_key = "ts:pressure"
humidity_key = "ts:humidity"

sensor.get_sensor_data() 指令从传感器获取数据并将三个变量填充为温度、湿度和压力。

接下来,通过在没有参数的情况下对 Redis 连接调用 .pipeline() 方法来构建一个“事务管道”。在内部,管道会收集传递给它的一切命令,直到调用 .execute() 方法为止。如您所见,我们使用 RedisTimeSeries 的 TS.ADD 命令来填充传感器数据结构。您可以通过此 GitHub 存储库 访问完整的代码。

步骤 8:执行脚本

在执行脚本之前,您需要导入 bme680 和 smbus Python 模块,如下所示

$ pip3 install bme680
$ pip3 install smbus

确保您提供正确的 Redis Enterprise Cloud 数据库端点、用户名和密码

$ python3 sensorloader.py --host <Redis Enterprise Cloud host> --port <port>  --password <password> 

您可以运行 monitor 命令来验证传感器数据是否正在填充,如下所示

$ redis-cli -h redis-12929.c212.ap-south-1-1.ec2.cloud.redislabs.com -p 12929
redis-12929.c212.ap-south-1-1.ec2.cloud.redislabs.com:12929> auth <password>
OK
redis-12929.c212.ap-south-1-1.ec2.cloud.redislabs.com:12929> monitor
OK
1611046300.446452 [0 122.179.79.106:53715] "info" "server"
1611046300.450452 [0 122.179.79.106:53717] "info" "stats"
1611046300.450452 [0 122.179.79.106:53716] "info" "clients"
1611046300.486452 [0 122.179.79.106:53714] "info" "memory"
1611046300.486452 [0 122.179.79.106:53713] "info" "server"
1611046300.494452 [0 122.179.79.106:53715] "info" "memory"
1611046300.498452 [0 122.179.79.106:53717] "info" "commandstats"
1611046300.522452 [0 122.179.79.106:53716] "dbsize"
1611046301.498452 [0 122.179.79.106:53714] "info" "memory"
1611046301.498452 [0 122.179.79.106:53713] "info" "server"
1611046301.498452 [0 122.179.79.106:53715] "info" "server"
1611046301.498452 [0 122.179.79.106:53716] "info" "clients"
1611046301.498452 [0 122.179.79.106:53717] "info" "stats"
1611046301.554452 [0 122.179.79.106:53714] "info" "memory"
1611046301.562452 [0 122.179.79.106:53717] "info" "commandstats"

步骤 9:部署 Grafana

在 Grafana 中看到传感器数据绘制出来非常令人兴奋。要实现此目的,请运行以下命令

$ docker run -d -e "GF_INSTALL_PLUGINS=redis-app" -p 3000:3000 grafana/grafana

确保您在系统中运行了 Docker Engine,无论是在您的桌面系统中还是在云中。在此演示中,我已经在 Docker Desktop for Mac 上进行了测试。

将您的浏览器指向 https://<IP_ADDRESS>:3000。使用“admin”作为用户名和密码登录 Grafana 仪表板。

单击 Grafana 仪表板左侧的“数据源”选项以添加数据源。

添加数据源 选项下,搜索 Redis,Redis 数据源将显示如下

提供名称、Redis Enterprise Cloud 数据库端点和密码,然后单击 保存和测试

单击 仪表板 导入 Redis 和 Redis 流。单击这两个选项的 导入

单击 Redis 查看一个显示 Redis 数据库信息的精美 Grafana 仪表板

步骤 10:在 Grafana 中绘制 RedisTimeSeries 传感器数据

最后,让我们创建一个显示温度、压力和湿度的传感器仪表板。首先,单击左侧导航窗口中的 +。在 创建 选项下,选择 仪表板 并单击 添加新面板 按钮。

一个新窗口将打开,显示 查询 部分。从下拉菜单中选择 SensorT,选择 RedisTimeSeries 作为类型,TS.GET 作为命令,并将 ts”temperature 作为密钥。

选择 TS.GET 作为命令。

键入 ts”temperature 作为密钥。

单击 运行,然后单击 保存,如下所示

现在您可以使用您喜欢的名称保存仪表板

点击 保存。这将打开一个传感器仪表板。您可以点击 面板标题 并选择 编辑

输入 温度 并在可视化中选择 仪表

点击 应用,您应该可以看到这里显示的温度仪表板

对压力 (ts:pressure) 和湿度 (ts:humidity) 重复相同的过程,并将它们添加到仪表板中。您应该可以看到温度、湿度和压力的完整仪表板读数。看起来很棒,不是吗?

下一步

此演示展示了 RedisTimeSeries 如何将 Redis 的优点与专门构建的时间序列数据库相结合。这种组合使您可以通过有效地存储和管理 RedisTimeSeries 数据来轻松跟踪环境因素。最后,通过将 Grafana 与 RedisTimeSeries 集成,您可以创建一个有用且信息丰富的仪表板,让您能够实时放大和缩小图表。

此示例应用程序只是您可以使用 RedisTimeSeries 完成的许多酷事中的一个示例。有关更多想法,请查看以下有趣的用例

在 RedisTimeSeries 上构建您的金融应用程序

使用 Redis 数据源为 Grafana 构建的 3 个现实生活中的应用程序

使用 Redis 和 Grafana 实现实时可观察性