rcooler/solarman_exporter

By rcooler

β€’Updated 3 months ago

A simple Prometheus exporter for SOLARMAN Smart metrics to Prometheus

Image
Internet of things
Monitoring & observability
1

878

rcooler/solarman_exporter repository overview

SolarMan 2 Prometheus

β β˜€οΈ solarman_exporter

A simple Prometheus exporter for SOLARMAN Smart (Solarman OpenAPI).
It polls Solarman Cloud on a fixed interval and exposes metrics for Prometheus + Grafana.

Jinko


⁠✨ Highlights

  • πŸ” Solarman OpenAPI token auth (password is SHA256-hashed)
  • πŸ”Ž Auto-discovery: stations β†’ station devices (or set device SNs manually)
  • ⏱️ Polling loop with caching (does not hit the API per scrape)
  • πŸ“Š Prometheus-ready metrics for Grafana dashboards
  • 🧩 Metric groups: pv, inverter, grid, battery, bms, gen, load (ups), house
  • 🐳 Docker Compose guide included (Exporter + Prometheus + Grafana)

⁠2026-04-05

  • added config/env to limit API usage (free api has limit 200k requests per year)

⁠🧩 Grouped metrics

Each group exposes:

  • solarman_<group>_metric{device_sn,key,name,unit}

Groups:

  • solarman_pv_metric
  • solarman_inverter_metric
  • solarman_grid_metric
  • solarman_battery_metric
  • solarman_bms_metric
  • solarman_gen_metric
  • solarman_load_metric β€” UPS/backup/output
  • solarman_house_metric β€” house/home consumption
⁠🧺 Generic (optional)
  • solarman_metric{device_sn,key,name,unit}

Enable/disable with --enable-generic / SOLARMAN_ENABLE_GENERIC.

⚠️ Label-heavy metrics can grow cardinality. Prefer grouped metrics + filters.


β πŸ”‘ Credentials & prerequisites

You typically need two things:

⁠1) Solarman Smart account
  • Your Solarman Smart email + password
  • Your plant/device must already be visible in the Solarman Smart app/portal
⁠2) Solarman OpenAPI access

You must request OpenAPI credentials:

  • appId
  • appSecret

These are not normally visible in the Solarman Smart UI. How to request them ⁠

⁠🧾 Device serial number (SN)

You can find the datalogger/inverter SN:

  • on the physical device sticker/label, or
  • in Solarman Smart device list (after adding it)

⁠🐳 Docker Compose

⁠🧩 docker-compose.yml

Create docker-compose.yml in the repository root:

services:
  solarman_exporter:
    image: rcooler/solarman_exporter:latest
    container_name: solarman_exporter
    restart: unless-stopped
    environment:
      # --- Solarman OpenAPI ---
      SOLARMAN_BASE_URL: "https://globalapi.solarmanpv.com"
      SOLARMAN_API_VERSION: "v1.0"
      SOLARMAN_LANGUAGE: "en"

      SOLARMAN_APP_ID: "${SOLARMAN_APP_ID}"
      SOLARMAN_APP_SECRET: "${SOLARMAN_APP_SECRET}"
      SOLARMAN_EMAIL: "${SOLARMAN_EMAIL}"

      # Use ONE of these:
      SOLARMAN_PASSWORD_SHA256: "${SOLARMAN_PASSWORD_SHA256}"
      # SOLARMAN_PASSWORD: "${SOLARMAN_PASSWORD}"

      # Optional (if auto-discovery doesn't work):
      # SOLARMAN_DEVICE_SN: "1234567890,0987654321"
      # SOLARMAN_STATION_ID: "0"

      # Exporter runtime
      SOLARMAN_POLL_INTERVAL: "160s"
      SOLARMAN_HTTP_TIMEOUT: "15s"
      SOLARMAN_YEARLY_REQUEST_LIMIT: "200000"
      SOLARMAN_DISCOVERY_REFRESH_INTERVAL: "24h"
      SOLARMAN_ENABLE_GENERIC: "true"
      SOLARMAN_EXPORTER_LOG_LEVEL: "info"
      SOLARMAN_EXPORTER_METRICS_PATH: "/metrics"
      SOLARMAN_EXPORTER_LISTEN: ":9876"

    ports:
      - "9876:9876"
⁠🧲 Prometheus scrape config

Create prometheus/prometheus.yml:

global:
  scrape_interval: 160s

scrape_configs:
  - job_name: solarman
    metrics_path: /metrics
    static_configs:
      - targets: ["solarman_exporter:9876"]

⁠🧠 Notes / Caveats

  • Solarman API payloads vary by inverter model; grouping is keyword/unit-based.
  • If you want strict non-overlapping groups, use β€œfirst match wins” logic (put totals first).
  • Label-heavy metrics can increase Prometheus cardinality; disable generic metrics if needed.

Tag summary

Content type

Image

Digest

sha256:5e1a58cc9…

Size

12.8 MB

Last updated

3 months ago

docker pull rcooler/solarman_exporter