Cytron Technologies
Giờ làm việc: 8:00 - 17:00
Thứ 2 - Thứ 6 (trừ ngày lễ)
Hotline 0362917357

Ở bài trước, chúng ta đã đọc biến tần qua RS485 bằng IRIV IOC MQTT Gateway, đẩy MQTT JSON lên mạng nội bộ và xem số liệu thời gian thực trên trình duyệt.
Trong khi dữ liệu thời gian thực cho chúng ta biết giá trị tức thời của biến tần, muốn kiểm tra xem tháng này sản xuất bao nhiêu kWh, pin đang làm đúng vai trò chưa, hay so sánh tuần này với tuần trước cần có dữ liệu được lưu trữ dài hạn và dashboard để phân tích.
Bài viết này hướng dẫn dựng stack Telegraf → InfluxDB → Grafana trên IRIV Pi Control (hoặc bất kỳ máy nào chạy Docker), khai thác luồng MQTT iriv/ivt/# kèm dashboard để sẵn sàng theo dõi và phân tích dữ liệu từ Biến tần năng lượng mặt trời trong thời gian dài.
Dự án mã nguồn mở: grafana-dashboard-inverter-mqtt
Bài 1 (RS485 → MQTT): Giám sát biến tần thời gian thực qua RS485

Trong bài viết này, mình chạy stack trên IRIV Pi Control cùng biến tần Deye SUN-6K-SG06LP1. Repo không giao tiếp RS485 với biến tần trực tiếp mà chỉ subscribe MQTT. Vì vậy, biến tần hybrid / off-grid / grid-tie và các hãng LuxPower, Sumry, PowMr, … đều dùng được, miễn dữ liệu đã publish MQTT theo contract topic bên dưới.

Biến tần RS485
└─► IRIV IOC MQTT Gateway (bài 1)
└─► Mosquitto :1883
topics: iriv/ivt/# (biến tần 1)
iriv/ivt-2/# (biến tần 2, tùy chọn)
│
▼
Telegraf → InfluxDB 2.7 → Grafana :3000
│
├─ solar_raw (60 ngày, độ phân giải cao)
├─ solar_1h (~2 năm)
└─ solar_1d (vĩnh viễn — năng lượng theo ngày)| Thành phần | Vai trò |
|---|---|
| Mosquitto | Broker MQTT đã có từ bài 1 (hoặc broker sẵn có trên LAN) |
| Telegraf | Subscribe MQTT → ghi Influx; tính thêm house load / house energy |
| InfluxDB | Lưu time-series + task downsample |
| Grafana | Dashboard Flux (Overview, Electrical, Energy, …) |
Lưu ý: Service Mosquitto trong docker-compose.yml của repo Grafana đang comment mặc định, để tránh xung đột cổng 1883 với broker bạn đã chạy ở bài 1. Chỉ bỏ comment nếu máy chưa có broker nào.
| Thành phần | Ghi chú |
|---|---|
| Đã hoàn thành bài 1 (hoặc tương đương) | IRIV IOC đang publish MQTT, có thể mosquitto_sub -t "iriv/ivt/#" thấy số nhảy |
| IRIV Pi Control (khuyến nghị) | SBC chuẩn công nghiệp chạy trên Compute Module 4/5, chạy Docker 24/7 |
| Hoặc PC / Raspberry Pi / SBC khác | Cần Git, Docker Engine, plugin Compose |
| Ổ chứa dữ liệu | Nên có đủ dung lượng (SSD khuyến nghị) cho Influx dài hạn |
Trên IRIV Pi Control (hoặc host Docker của bạn):
cd ~
git clone https://github.com/vantechcorner/grafana-dashboard-inverter-mqtt.git
cd ~/grafana-dashboard-inverter-mqtt
cp .env.example .env
nano .envĐiền các biến chính (đừng để mật khẩu mặc định change-me khi mở ra ngoài LAN):
| Biến | Ý nghĩa |
|---|---|
INFLUX_USERNAME / INFLUX_PASSWORD | Tài khoản InfluxDB lần đầu init |
INFLUX_ORG | Tổ chức Influx (mặc định iriv_org) |
INFLUX_TOKEN | Token admin — Telegraf và Grafana đều dùng |
GRAFANA_ADMIN_USER / GRAFANA_ADMIN_PASSWORD | Đăng nhập Grafana :3000 |
Bảo mật: File
.envđã nằm trong.gitignore— không commit mật khẩu / token lên GitHub.
Mở telegraf/telegraf.conf, tìm khối [[inputs.mqtt_consumer]] và sửa địa chỉ broker cho khớp máy đang chạy Mosquitto:
servers = ["tcp://192.168.3.249:1883"]
topics = ["iriv/ivt/#"]Thay 192.168.3.249 bằng IP LAN thật của broker (có thể chính là IRIV Pi Control nếu Mosquitto chạy trên đó).
iriv/ivt/# khớp Base Topic bài 1.device = "sg06" → Grafana hiển thị nhãn Deye SG06. Nếu bạn đổi Base Topic / hãng khác, chỉnh topic parsing và tag device cho khớp (xem mục 9).Sau đó khởi động stack:
chmod +x scripts/*.sh influxdb/scripts/setup-buckets.sh
docker compose up -dKiểm tra container:
docker compose ps
docker compose logs -f telegrafTelegraf không báo lỗi kết nối MQTT / Influx là ổn.
Lần đầu (hoặc sau khi pull bản cập nhật có script mới):
./influxdb/scripts/setup-buckets.shScript tạo / đảm bảo:
| Bucket | Retention | Dùng cho |
|---|---|---|
solar_raw | ~60 ngày | Chuỗi realtime độ phân giải cao |
solar_1h | ~2 năm | Trung bình / last theo giờ |
solar_1d | Vĩnh viễn | Năng lượng theo ngày (dashboard Energy) |
Grafana đọc realtime từ solar_raw; các ngày đã qua ưu tiên solar_1d.
Không
sum()thô mọi mẫu*_todaytrong cả tháng — sẽ nhân đôi bộ đếm. Dashboard sẵn trong repo đã xử lý đúng: ngày hoàn tất lấysolar_1d, hôm nay lấysolar_raw.
Nếu bạn đang migrate từ layout Influx cũ, dùng ./scripts/migrate-cleanup.sh (xem note.md trong repo).
Trên trình duyệt (máy cùng LAN):
http://<IP-Pi>:3000http://<IP-Pi>:8086Đăng nhập Grafana bằng GRAFANA_ADMIN_* trong .env. Folder Solar đã được provision sẵn:
| Dashboard | Nội dung |
|---|---|
| Solar Overview | Gauge / công suất / năng lượng hôm nay |
| Solar Electrical | V, A, Hz, nhiệt độ |
| Solar Live V/A/P | Chuỗi live chi tiết |
| Solar Energy | kWh theo time picker; PV ngày/tuần/tháng/năm; ước tính chi phí & tiết kiệm |
| Solar DeyeCloud | Layout kiểu DeyeCloud (consumption / production / history) |


Trên Solar Energy, chỉ cần chọn khoảng thời gian bằng time picker của Grafana — độ phân giải cột (giờ / ngày / tháng) tự chỉnh theo cửa sổ bạn chọn. Có thể đặt giá điện ₫/kWh để xem ước tính chi phí mua lưới và tiết kiệm.
{"value": …} lên iriv/ivt/....mqtt_consumer tách topic thành tag device / component / metric, ghi field value vào measurement solar.house_derived.star) tính House load (W) và House energy today (kWh) — công thức phù hợp hệ hybrid (không lấy nhầm inverter/power làm tải nhà).solar_raw → solar_1h / solar_1d.Ví dụ mapping:
iriv/ivt/battery/power → device=sg06, component=battery, metric=power
iriv/ivt/pv/energy_today → device=sg06, component=pv, metric=energy_todayContract MQTT không đổi so với bài 1 — Home Assistant và dashboard web vẫn subscribe cùng topic.
Nếu bạn bật Grafana sau khi hệ đã chạy vài tuần / vài tháng, MQTT chỉ có dữ liệu từ lúc Telegraf lên. Lịch sử kWh ngày cũ vẫn nằm trên cloud nhà sản xuất (ví dụ DeyeCloud). Export Excel rồi import vào solar_1d để timeline Energy liền mạch.
Cách làm:
.xlsx vào thư mục deyecloud-data/ trên máy host (thư mục này đã gitignore)../scripts/backup-influxdb.sh ./backups/pre-import-$(date +%F)
python3 scripts/import-deyecloud-energy.py --dry-run
python3 scripts/import-deyecloud-energy.py --i-have-backup
Chỉ ghi kWh theo ngày vào solar_1d (lấp ngày thiếu; ngày đã có từ MQTT giữ nguyên). Không khôi phục được đường cong power / SOC từ Excel.
Chi tiết mapping cột Excel → tag Influx: xem note.md §11 trong repo.
Stack Grafana chỉ quan tâm MQTT. Điều kiện:
| Yêu cầu | Ghi chú |
|---|---|
Topic dạng base/component/metric | Ví dụ vẫn iriv/ivt/battery/soc |
Payload JSON có trường value | Chuẩn IRIV IOC MQTT Gateway |
Telegraf servers / topics / tag device khớp | Sửa telegraf.conf rồi docker compose restart telegraf |
Biến tần 2: trên gateway thứ hai đặt Base Topic iriv/ivt-2, bỏ comment khối mqtt_consumer thứ hai trong telegraf.conf, restart Telegraf, rồi chọn inverter trên biến Grafana.
Hybrid / off-grid / grid-tie không ảnh hưởng tầng này — thiếu pin thì một số panel pin trống, các panel PV / lưới / tải vẫn dùng bình thường nếu topic tương ứng có dữ liệu.
Trước migrate / import / thay đổi phá hủy:
./scripts/backup-influxdb.sh /path/to/ssd/influx-backup/pre-$(date +%F)Có thể thêm cron hàng ngày trên Pi, giữ vài bản gần nhất trên SSD. Repo Git (compose + dashboard + telegraf) chính là backup phần cấu hình.
| Hiện tượng | Việc nên kiểm tra |
|---|---|
| Grafana trống / No data | Telegraf log; broker IP trong telegraf.conf; đã có MQTT iriv/ivt/# |
| Influx có data nhưng Grafana lỗi auth | INFLUX_TOKEN / INFLUX_ORG trong .env khớp datasource |
| Grafana restart loop | Quyền thư mục data: sudo chown -R 472:472 ./grafana/data |
| Energy tháng bị “phình” số | Đừng tự sum() thô *_today trên raw — dùng dashboard sẵn / bucket solar_1d |
| Xung đột cổng 1883 | Giữ Mosquitto trong compose comment; dùng broker bài 1 |
| Import DeyeCloud ghi đè nhầm | Script mặc định --skip-existing; luôn backup trước |
Đến đây bạn đã có đủ hai tầng giám sát solar local-first:
Toàn bộ chạy trên LAN; có thể mở remote an toàn hơn bằng Tailscale / WireGuard / Cloudflared thay vì port-forward thô cổng Grafana / MQTT.
Chúc bạn thành công! Xin chào và hẹn gặp lại ở các bài mở rộng (alert Grafana, biến tần thứ hai, hoặc dashboard LCD ESP32).