Tự host dashboard cho dữ liệu cảm biến DIY với Grafana và InfluxDB
Sau vài dự án DIY — trạm thời tiết, cảm biến độ ẩm đất, có thể cả cảm biến điện năng tiêu thụ — bạn sẽ có nhiều board khác nhau, mỗi board gửi dữ liệu một kiểu. Thay vì mở nhiều app riêng lẻ, gom tất cả vào một dashboard tự host là bước nâng cấp đáng làm tiếp theo.
Vì sao chọn InfluxDB thay vì database thông thường
InfluxDB là time-series database — được thiết kế riêng cho kiểu dữ liệu “một giá trị đo tại một thời điểm”, đúng bản chất dữ liệu cảm biến. So với việc tự lưu vào PostgreSQL/MySQL, InfluxDB nén dữ liệu tốt hơn nhiều và truy vấn theo khoảng thời gian (ví dụ “trung bình mỗi giờ trong 7 ngày qua”) nhanh và gọn hơn hẳn.
Kiến trúc tổng quan
ESP32/Arduino (MQTT) → Telegraf → InfluxDB → Grafana
- Các board tiếp tục publish dữ liệu qua MQTT như trước (xem lại bài trạm thời tiết ESP32).
- Telegraf subscribe MQTT và ghi thẳng vào InfluxDB — không cần viết code trung gian.
- Grafana đọc từ InfluxDB và vẽ dashboard.
Cấu hình Telegraf lắng nghe MQTT
# telegraf.conf
[[inputs.mqtt_consumer]]
servers = ["tcp://localhost:1883"]
topics = [
"home/weather/#",
"home/soil/#",
]
data_format = "value"
data_type = "float"
[[outputs.influxdb_v2]]
urls = ["http://localhost:8086"]
token = "$INFLUX_TOKEN"
organization = "home"
bucket = "sensors"
Với cấu hình này, mọi topic dạng home/weather/temperature, home/soil/moisture… tự động được ghi vào InfluxDB, mỗi topic trở thành một field, không cần đụng vào code firmware đã viết trước đó.
Truy vấn dữ liệu bằng Flux
InfluxDB dùng ngôn ngữ truy vấn Flux. Ví dụ lấy nhiệt độ trung bình mỗi giờ trong 24h qua:
from(bucket: "sensors")
|> range(start: -24h)
|> filter(fn: (r) => r._measurement == "home/weather/temperature")
|> aggregateWindow(every: 1h, fn: mean)
Dán query này thẳng vào một panel Grafana kiểu Time series là có ngay biểu đồ.
Dựng bằng Docker Compose
services:
influxdb:
image: influxdb:2
ports: ["8086:8086"]
volumes: ["influx-data:/var/lib/influxdb2"]
telegraf:
image: telegraf
volumes: ["./telegraf.conf:/etc/telegraf/telegraf.conf:ro"]
depends_on: [influxdb]
grafana:
image: grafana/grafana
ports: ["3000:3000"]
volumes: ["grafana-data:/var/lib/grafana"]
depends_on: [influxdb]
volumes:
influx-data:
grafana-data:
Chỉ cần docker compose up -d là có đủ cả 3 dịch vụ chạy trên cùng một Raspberry Pi hoặc mini PC ở nhà.
Thêm cảnh báo
Grafana có sẵn Alerting — có thể gửi thông báo (Telegram, email, webhook) khi giá trị vượt ngưỡng, ví dụ độ ẩm đất xuống quá thấp hoặc nhiệt độ phòng server vượt mức an toàn, mà không cần viết thêm dòng code nào trên board.
Vì sao đáng làm
Đây là bước biến các dự án cảm biến rời rạc thành một hệ thống thật sự — nơi bạn thấy được xu hướng theo thời gian (nhiệt độ tăng dần trong tuần, độ ẩm đất giảm đều sau mỗi lần tưới), thay vì chỉ xem số tức thời từng lần một.
Bình luận