使用物联网构建植物监测工具:一个适合初学者的教程

导航到

本文最初发布在The New Stack,并在此处获得授权转载。

创建一个物联网(IoT)应用程序来监控家庭植物是一个务实的起点,用于了解随时间变化的数据。这对于任何喜欢室内园艺但经常忘记定期检查植物的人来说很有用。

这个项目适合所有人,从正在科学展览会上工作的学生到监测珍奇植物苗圃的植物学家。监测家庭植物有许多方法,但这是高科技的方法——使用传感器和先进的软件系统。

对于这个项目,我们将使用InfluxDB,这是一个专门用于存储随时间出现的顺序数据的时间序列平台。在比较数据、为特定阈值创建警报以及监控物理和虚拟世界中的事件时,这非常有用。

mmonitoring a plant

完整的物料清单、面包板(带所选微控制器)的原理图以及源代码,都可以在我的Git仓库中找到。如果您想自己学习或者迫切需要让家中的植物存活,可以查看这些资料。

架构

the architecture

一个物联网传感器以定时间隔跟踪植物的健康指标。我们将其收集的数据分类为时间序列数据,因为它包含时间戳,该时间戳在存储中显示为第一列。物联网传感器生成关于植物健康的数据。然后我使用开源收集代理Telegraf和Python的客户端库来收集这些数据并将它们发送到存储层,InfluxDB。Plotly图形库提供数据可视化。我用Python编写了此项目,并使用Flask库进行路由。

入门指南

仪器

  • 要监控的植物
  • 一个Particle Boron或类似微控制器
  • 至少一个用于您植物的物联网传感器
  • 面包板
  • 跳线

我使用四个传感器生成以下五个数据点

  • 空气温度
  • 湿度
  • 光照
  • 土壤温度
  • 土壤湿度

schematics and sensors

微控制器

我使用Boron微控制器,并通过公司网站设置设备。要接收微控制器本身的数据,我通过USB线将其连接到我的笔记本电脑。微控制器的设置取决于您选择的微控制器。您的微控制器可能提供其他连接选项,包括蓝牙或通过TCP/IP的小型服务器访问。

遵循您微控制器制造商提供的说明,直到您从传感器接收到输入。您目前不需要理解这些数据;只需确保您的微控制器正在发送原始数据。

InfluxDB

登录InfluxDB。创建一个桶,这是InfluxDB存储数据的地方。我们将通过API连接到InfluxDB。下一步是[创建所需的凭据和令牌](https://docs.influxdb.org.cn/influxdb/v2.7/security/tokens/。

代码

将数据写入InfluxDB非常简单,从客户端库开始。我为此项目使用了InfluxDB的Python客户端库。下面的代码是一个示例,说明如何编写代码将微控制器传感器的原始数据发送到InfluxDB。

def write_to_influx(self,data):
	p = (influxdb_client.Point("sensor_data")
                    	.tag("user",data["user"])
                    	.tag("device_id",data["device"])                     
                    	.field(data["sensor_name"], int(data["value"])
                    	))
	self.write_api.write(bucket=self.cloud_bucket, org=self.cloud_org, record=p)
	print(p, flush=True)

标签

度量是InfluxDB中与关系数据库中的表相对应的内容。我的代码很好地使用了标签。标签不是必需的,但很有用,因为它们是元数据,使得数据更容易理解和处理。在这种情况下,它们可以指定不同的植物、设备或其他内容,具体取决于您想多么复杂。

查询数据

quering data

查询返回类似下面的表。

在我可以查询我的数据之前,我需要初始化Flight SQL客户端。

from flightsql import FlightSQLClient

然后是

# This is our flight client setup, it’s how we will query from IOX
    	# we need to remove the Https:// from our host
    	host = host.split("://")[1]
    	self.flight_client = FlightSQLClient(host=host,
                     	token=token,
                     	metadata= {'bucket-name': bucket}
        	             )

    	self.cloud_bucket = bucket
    	self.cloud_org = org

下面是一个基本的SQL查询,用于从InfluxDB检索数据。

SELECT {sensor_name}, time FROM sensor_data WHERE time > (NOW() - INTERVAL '2 HOURS') AND device_id='{deviceID}'

在我们可以检索和读取数据之前,我们必须将其转换为Pyarrow格式。下面的代码是一个包含查询和连接到Flight SQL以检索数据的函数。

def querydata(self, sensor_name, deviceID) -> DataFrame:   	

        query = self.flight_client.execute(f"SELECT {sensor_name}, time FROM sensor_data WHERE time > (NOW() - INTERVAL '2 HOURS') AND device_id='{deviceID}'")

        # Create reader to consume result
    	reader = self.flight_client.do_get(query.endpoints[0].ticket)

    	# Read all data into a pyarrow.Table
    	Table = reader.read_all()
    	print(Table)

   	# Convert to Pandas DataFrame
    	df = Table.to_pandas()
    	df = df.sort_values(by="time")
    	print(df)
    	return df

您可以通过调用前面的查询并替换您的选择(包括桶、传感器和设备)来调用此查询。返回的结果允许您绘制传入的数据。return df方法以数据框格式提取我们的数据。

数据框

Pandas数据框是二维数据结构,可以快速进行数据处理和分析。我们将数据转换为数据框,以便在Python中更容易处理。如果您喜欢其他样式,还有其他几种数据输出选项可供选择。

@app.callback(Output("store", "data"), [Input("button", "n_clicks")])
def generate_graphs(n):
# Generate graphs based upon pandas data frame. 
    df = influx.querydata( "soil_temperature", graph_default["deviceID"] )
    soil_temp_graph = px.line(df, x="time", y="soil_temperature", title="Soil Temperature")

    df = influx.querydata( "air_temperature", graph_default["deviceID"] )
    air_temp_graph= px.line(df, x="time", y="air_temperature", title="Air Temperature")

    df = influx.querydata( "humidity", graph_default["deviceID"] )
    humidity_graph= px.line(df, x="time", y="humidity", title="humidity")

    df = influx.querydata( "soil_moisture", graph_default["deviceID"] )
    soil_moisture= px.line(df, x="time", y="soil_moisture", title="Soil Moisture")

    df = influx.querydata( "light", graph_default["deviceID"] )
    light_graph= px.line(df, x="time", y="light", title="light")

绘图库期望您返回一个数据框以进行可视化。这是查询数据点的最终结果。下面的图像是硬编码的图形,用于说明数据点。不同的标签页显示不同的图形和跟踪不同的指标。这只是项目能力的一小部分。

Plant-Buddy-Dashboard

结论

请查看我围绕Plant Buddy进行的演讲,以深入了解该项目以及整个InfluxDB生态系统。我们的社区页面有其他令人兴奋的项目示例。现在开始使用InfluxDB并构建一些酷的东西吧!