A prometheus exporter for SMA Solar inverters, written in Go.
To connect to SMA inverters the exporter makes use of yasdi, which is provided by SMA. The physical connection can be done via RS232, RS485 or Powerline.
$ sma-solar-exporter -h
Usage of ./sma-solar-exporter:
-influx-bucket string
Bucket name (influx 2.x) or database/retention-policy (influx 1.8) or database (influx 1.8)
-influx-org string
Organization name (optional for influx 1.8)
-influx-token string
Token (influx 2.x) or username:password (influx 1.8) to authenticate with
-influx-url string
URL of InfluxDB server
-metric-channels string
A comma separated list of channel names which should get exposed as metric. (default "A.Ms.Amp,A.Ms.Vol,A.Ms.Watt,E-Total,GridMs.PhV.phsA,Mt.TotOpTmh,Mt.TotTmh,Pac")
-metrics-addr string
The address the metric endpoint binds to. (default ":8080")
-yasdi-config string
The path to the yasdi config file. (default "/etc/yasdi/yasdi.ini")
-yasdi-devices int
The number of inverters expected to get detected. (default 2)
-yasdi-driver int
The driver reference in yasdi-config to use.
The exporter needs a proper yasdi.ini
file which configures how the yasdi library will talk to the inverter(s).
The following example is using a usb to serial adapter which is connected to the inverters.
[DriverModules]
Driver0=yasdi_drv_serial
# Configs for serial port 1
[COM1]
Device=/dev/ttyUSB0
Media=RS485
Baudrate=1200
Protocol=SMANet
To build the exporter from source there are som requirements needed:
apt-get install -y golang-go build-essential curl unzip cmake
Afterwards the binary could be built via make:
make all
Note: This will also create a directory called
yasdi
and fetch the necessary C Library. For details have a look at theyasdi
target in Makefile.
All metrics except sma_scrape_duration_seconds
will have the following labels:
channel_name
: the original yasdi channel nameinverter_name
: the name of the inverterserial
: the serial number of the inverterunit
The exporter exposes the following metrics:
# HELP sma_actual_power Delivered active power in W
# TYPE sma_actual_power gauge
# HELP sma_dc_current DC current in A
# TYPE sma_dc_current gauge
# HELP sma_dc_power DC power
# TYPE sma_dc_power gauge
# HELP sma_dc_voltage DC voltage in V
# TYPE sma_dc_voltage gauge
# HELP sma_feeding_energy_total Total amount of feeding-in energy in kWh
# TYPE sma_feeding_energy_total gauge
# HELP sma_feeding_hours_total Total number of grid-feeding operational hours
# TYPE sma_feeding_hours_total gauge
# HELP sma_grid_phase_voltage Grid voltage on phase in V
# TYPE sma_grid_phase_voltage gauge
# HELP sma_operating_hours_total Total number of operating hours of inverter
# TYPE sma_operating_hours_total gauge
# HELP sma_scrape_duration_seconds The time needed to scrape the plant
# TYPE sma_scrape_duration_seconds histogram
Example output from cmd/exporter-simulation
:
sma_actual_power{channel_name="Pac",inverter_name="inverter 0",serial="0",unit="W"} 220
sma_actual_power{channel_name="Pac",inverter_name="inverter 1",serial="1",unit="W"} 220
sma_dc_current{channel_name="A.Ms.Amp",inverter_name="inverter 0",serial="0",unit="A"} 0.2
sma_dc_current{channel_name="A.Ms.Amp",inverter_name="inverter 1",serial="1",unit="A"} 0.2
sma_dc_power{channel_name="A.Ms.Watt",inverter_name="inverter 0",serial="0",unit="W"} 470.7999999999996
sma_dc_power{channel_name="A.Ms.Watt",inverter_name="inverter 1",serial="1",unit="W"} 470.7999999999996
sma_dc_voltage{channel_name="A.Ms.Vol",inverter_name="inverter 0",serial="0",unit="V"} 260.59999999999997
sma_dc_voltage{channel_name="A.Ms.Vol",inverter_name="inverter 1",serial="1",unit="V"} 260.59999999999997
sma_feeding_energy_total{channel_name="E-Total",inverter_name="inverter 0",serial="0",unit="kWh"} 10011
sma_feeding_energy_total{channel_name="E-Total",inverter_name="inverter 1",serial="1",unit="kWh"} 10011
sma_feeding_hours_total{channel_name="Mt.TotOpTmh",inverter_name="inverter 0",serial="0",unit="h"} 3000.0308000000023
sma_feeding_hours_total{channel_name="Mt.TotOpTmh",inverter_name="inverter 1",serial="1",unit="h"} 3000.0308000000023
sma_grid_phase_voltage{channel_name="GridMs.PhV.phsA",inverter_name="inverter 0",serial="0",unit="V"} 229.9699999999998
sma_grid_phase_voltage{channel_name="GridMs.PhV.phsA",inverter_name="inverter 1",serial="1",unit="V"} 229.9699999999998
sma_operating_hours_total{channel_name="Mt.TotTmh",inverter_name="inverter 0",serial="0",unit="h"} 2500.0308000000023
sma_operating_hours_total{channel_name="Mt.TotTmh",inverter_name="inverter 1",serial="1",unit="h"} 2500.0308000000023
sma_scrape_duration_seconds_bucket{le="0.005"} 23
sma_scrape_duration_seconds_bucket{le="0.01"} 23
sma_scrape_duration_seconds_bucket{le="0.025"} 23
sma_scrape_duration_seconds_bucket{le="0.05"} 23
sma_scrape_duration_seconds_bucket{le="0.1"} 23
sma_scrape_duration_seconds_bucket{le="0.25"} 23
sma_scrape_duration_seconds_bucket{le="0.5"} 23
sma_scrape_duration_seconds_bucket{le="1"} 23
sma_scrape_duration_seconds_bucket{le="2.5"} 23
sma_scrape_duration_seconds_bucket{le="5"} 23
sma_scrape_duration_seconds_bucket{le="10"} 23
sma_scrape_duration_seconds_bucket{le="+Inf"} 23
sma_scrape_duration_seconds_sum 0.0016648730000000003
sma_scrape_duration_seconds_count 23
There is also a grafana dashboard. It is used together with prometheus and promshift-proxy as datasources. Promshift is used to move the timestamps in prometheus queries to adjust fix the visualization of the data.