📖 Scenario: You have a Raspberry Pi collecting temperature data every minute. You want to store this data in InfluxDB, a database designed for time-series data. This project will guide you to create a simple Python script that writes temperature readings to InfluxDB and then queries the stored data.
🎯 Goal: Build a Python script that connects to InfluxDB, writes temperature data points, and retrieves the stored data to display it.
📋 What You'll Learn
Use the influxdb-client Python library to connect to InfluxDB
Create a data point with measurement, tags, fields, and timestamp
Write data points to InfluxDB
Query data points from InfluxDB
Print the queried data
💡 Why This Matters
🌍 Real World
Storing and analyzing sensor data like temperature, humidity, or CPU usage over time on a Raspberry Pi.
💼 Career
Skills in time-series databases and IoT data handling are valuable for roles in data engineering, IoT development, and system monitoring.
Progress0 / 4 steps
1
Setup InfluxDB Client Connection
Import InfluxDBClient from influxdb_client and create a client instance called client connecting to "http://localhost:8086" with token "my-token" and org "my-org".
Raspberry Pi
Hint
Use InfluxDBClient constructor with url, token, and org parameters.
2
Create Write API and Prepare Data Point
Create a write API instance called write_api from client.write_api(). Then create a data point string called point with measurement "temperature", tag location="office", field value=23.5, and current timestamp using InfluxDB line protocol format.
Raspberry Pi
Hint
Use client.write_api() to get the write API. The data point string uses the format: measurement,tag=value field=value.
3
Write Data Point to InfluxDB
Use write_api.write() to write the point to bucket "my-bucket" and org "my-org".
Raspberry Pi
Hint
Call write_api.write() with bucket, org, and record parameters.
4
Query and Print Stored Temperature Data
Create a query API instance called query_api from client.query_api(). Write a Flux query string query to select all temperature values from bucket "my-bucket" in the last 1 hour. Use query_api.query() to run the query and print each record's _time and _value.
Raspberry Pi
Hint
Use client.query_api() to get the query API. Write a Flux query string to select data from the last hour. Loop through results and print time and value.
Practice
(1/5)
1. What is the main purpose of InfluxDB when used with a Raspberry Pi?
easy
A. To run a web server for hosting websites
B. To control GPIO pins directly
C. To compile Python programs
D. To store and manage time-series data like sensor readings
Solution
Step 1: Understand InfluxDB's role
InfluxDB is designed to store time-series data, which means data points collected over time, such as sensor readings.
Step 2: Compare with other options
Running a web server, compiling Python, or controlling GPIO pins are not the main functions of InfluxDB.
Final Answer:
To store and manage time-series data like sensor readings -> Option D
Quick Check:
InfluxDB = time-series data storage [OK]
Hint: InfluxDB is for time-stamped data storage [OK]
Common Mistakes:
Confusing InfluxDB with web servers
Thinking InfluxDB compiles code
Assuming InfluxDB controls hardware pins
2. Which Python code snippet correctly writes a data point to InfluxDB on a Raspberry Pi?
easy
A. client.write_point('temperature', tags={'room':'kitchen'}, fields={'value':22.5})
B. client.write_points([{'measurement':'temperature','tags':{'room':'kitchen'},'fields':{'value':22.5}}])
C. client.write('temperature', {'room':'kitchen'}, 22.5)
D. client.insert_point('temperature', {'room':'kitchen'}, {'value':22.5})
Solution
Step 1: Recall correct method name and parameters
The InfluxDB Python client uses the method write_points to write data points, and it expects a list of dictionaries with keys 'measurement', 'tags', and 'fields'.
Step 2: Check each option
client.write_points([{'measurement':'temperature','tags':{'room':'kitchen'},'fields':{'value':22.5}}]) matches the correct method and data structure. Options B, C, and D use incorrect method names or parameter formats.
Final Answer:
client.write_points([{'measurement':'temperature','tags':{'room':'kitchen'},'fields':{'value':22.5}}]) -> Option B
Quick Check:
Use write_points with list of dicts [OK]
Hint: Use write_points with list of dicts for data [OK]
Common Mistakes:
Using wrong method names like write_point or insert_point
Passing dict instead of list of dicts
Incorrect parameter structure
3. Given this Python code on Raspberry Pi using InfluxDB client:
data = [{"measurement": "humidity", "tags": {"room": "bedroom"}, "fields": {"value": 45}}]
client.write_points(data)
result = client.query('SELECT * FROM humidity WHERE room = \'bedroom\'')
print(list(result.get_points()))
What will be the output?
medium
A. SyntaxError
B. []
C. [{'time': '...', 'room': 'bedroom', 'value': 45}]
D. None
Solution
Step 1: Understand data insertion
The code writes one data point with measurement 'humidity', tag 'room'='bedroom', and field 'value'=45. This data is stored in InfluxDB.
Step 2: Query and print results
The query selects all points from 'humidity' where 'room'='bedroom'. Since the data was just inserted, the query returns that point. Printing the list of points shows a list with one dictionary containing time, room, and value keys.
Final Answer:
[{'time': '...', 'room': 'bedroom', 'value': 45}] -> Option C
Quick Check:
Inserted data queried returns list with one point [OK]
Hint: Inserted points appear in query results as dicts [OK]
Common Mistakes:
Expecting empty list if data was inserted
Confusing syntax error with query result
Assuming None is returned from query
4. This Python code snippet on Raspberry Pi tries to write data to InfluxDB but fails:
A. Error: write_points expects a list of points; fix by wrapping data in a list
B. Error: 'fields' key missing; fix by adding 'fields' key
C. Error: 'measurement' must be a string; fix by converting to string
D. No error; code works fine
Solution
Step 1: Identify method parameter requirements
The write_points method requires a list of data points, even if only one point is written.
Step 2: Analyze given code
The code passes a single dictionary instead of a list containing that dictionary, causing an error.
Final Answer:
Error: write_points expects a list of points; fix by wrapping data in a list -> Option A
Quick Check:
write_points needs list of dicts [OK]
Hint: Always pass a list to write_points even for one point [OK]
Common Mistakes:
Passing dict instead of list to write_points
Missing 'fields' key in data point
Assuming no error occurs
5. You want to store temperature readings from multiple rooms on a Raspberry Pi using InfluxDB. Which Python code correctly writes two points with tags and fields in one call?
D. client.write_points('temperature', tags={'room': ['living', 'bedroom']}, fields={'value': [20, 22]})
Solution
Step 1: Understand data structure for multiple points
Each data point must be a dictionary with 'measurement', 'tags', and 'fields'. Multiple points are passed as a list of such dictionaries.
Step 2: Evaluate options
client.write_points([
{'measurement': 'temperature', 'tags': {'room': 'living'}, 'fields': {'value': 20}},
{'measurement': 'temperature', 'tags': {'room': 'bedroom'}, 'fields': {'value': 22}}
]) correctly uses a list of two dictionaries, each with proper tags and fields. Options A, B, and C misuse data structures or method parameters.