Zum Hauptinhalt springen

grkopv-dashboard (Grafana Kostal Photovoltaic Dashboard)

Das grkopf-Dashboard-Repository beinhaltet die Dokumentation sowie alle Dateien, die zum Aufbau eines Grafana-Dashboards für Kostal Plenticore Wechselrichter mit Hilfe der Tools invafetch und invaps unter Nutzung der Docker-Images notwendig sind.

Diese Beschreibung steht in keiner Verbindung zum Unternehmen KOSTAL Solar Electric GmbH und ist kein offizielles Produkt der KOSTAL Solar Electric GmbH oder anderer Tochterunternehmen der Kostal Gruppe.

Voraussetzungen

Eine lauffähige Docker-Installation auf einem Linux-System wird vorausgesetzt. Daneben sollten Prometheus und Grafana bereits installiert und eingerichtet sein. Falls nicht, finden sich weiter unten Beispiele für Docker-Compose-Files für Prometheus und Grafana, auf eine ausführliche Erläuterung wird jedoch verzichtet.

Übersicht und erste Schritte

Für den Start müssen zunächst das Repository heruntergeladen und einige Parameter angepasst werden. Alle Schritte werden im Folgenden kommentiert und im Beispiel dargestellt.

$ git clone https://github.com/geschke/grkopv-dashboard
$ cd grkopv-dashboard

Im heruntergeladenen Verzeichnis befinden sich folgende Inhalte:

  • *Solar_Inverter_Dashboard-XXXXXXXXXXXX.json*: Definitionsdatei des Grafana-Dashboards. Diese Datei kann einfach in Grafana unter “Dashboards” -> “Import” importiert werden. Danach steht es in Grafana unter dem Namen “Solar Inverter Dashboard” zur Verfügung.
  • *kopv-dashboard.yml*: Docker-Compose-File für die Komponenten invafetch und invaps sowie die MariaDB-Datenbank. Diese Datei muss angepasst werden, mehr dazu siehe unten.
  • *invafetch/*: In diesem Verzeichnis befindet sich die Datei processdata.json, die zum Start von invafetch benötigt wird. Darin enthalten sind die Definitionen der Module und deren Processdata-IDs, die invafetch vom Kostal-Wechselrichter abholen und speichern soll. Per Default werden alle Processdata-Werte gesichert, abgsehen von den Modulen scb:export und scb:update. Falls nicht alle Werte ausgelesen und gespeichert werden sollen, können einzelne Processdata-IDs, aber auch vollständige Modul-IDs aus der Datei processdata.json entfernt werden.
  • *sql/*: Darin befindet sich die Definition der Tabelle solardata, die für den Betrieb notwendig ist. Beim ersten Start mittels docker compose legt MariaDB die im Docker-Compose-File definierte Datenbank an und importiert die Inhalte dieses Verzeichnisses. Innerhalb der Datei solardata.sql ist keine Anpassung notwendig.

Docker-Compose-File

Das folgende Docker-Compose-File definiert die Services zur Sammlung und Speicherung der Processdata-Werte des Inverters sowie der Bereitstellung der Metriken für Prometheus.

version: '3.7'
services:
  mariadb:
    image: mariadb:10.8
    restart: always
    volumes:
      - ./mariadb_solar/data:/var/lib/mysql
      - ./sql:/docker-entrypoint-initdb.d
    #ports:
    #  - "3307:3306"
    environment:
      MARIADB_ROOT_PASSWORD: "<ROOT PASSWORD>"
      MARIADB_DATABASE: "solardb"
      MARIADB_USER: "solardbuser"
      MARIADB_PASSWORD: "<DATABASE PASSWORD>"
  invafetch:
    image: ghcr.io/geschke/invafetch:latest
    restart: always
    volumes:
      - ./invafetch/processdata.json:/app/processdata.json
    environment:
      DBHOST: "mariadb"
      DBUSER: "solardbuser"
      DBNAME: "solardb"
      DBPASSWORD: "<DATABASE PASSWORD>"
      #DBPORT:"3307"
      INV_SERVER: "<INVERTER IP ADDRESS>"
      INV_PASSWORD: "<INVERTER PASSWORD>"
      #INV_SCHEME: "http"
      #TIME_REQUEST_DURATION_SECONDS:2
      #TIME_NEW_LOGIN_MINUTES:1
  invaps:
    image: ghcr.io/geschke/invaps:latest
    restart: always
    environment:
      DBHOST: "mariadb"
      DBUSER: "solardbuser"
      DBNAME: "solardb"
      DBPASSWORD: "<DATABASE PASSWORD>"
      #DBPORT: 3307      
      PORT: "8080"
      GIN_MODE: "release"
    ports:
      - "8090:8080"

Konfiguration der Services

Zur Konfiguration ist die Anpassung einiger Umgebungsvariablen innerhalb der einzelnen Services notwendig. Dabei müssen die Variablen, bei denen in der Beispiel-Datei Platzhalter (in Großbuchstaben) eingesetzt sind, zwingend angepasst werden, bei allen anderen Umgebungsvariablen ist eine Anpassung optional.

MariaDB

Für den Datenbank-Service namens “mariadb” wird das offizielle Docker-Image von MariaDB genutzt. Alle persistent zu speichernden Daten liegen dabei im Verzeichnis ./mariadb_solar/data. Das Mapping des Verzeichnisses ./sql auf /docker-entrypoint-initdb.d sorgt dafür, dass die Tabelle solardata, falls noch nicht vorhanden, beim Start von MariaDB angelegt wird.

Mittels MARIADB_ROOT_PASSWORD wird das Passwort für den MariaDB-Superuser-Account mit dem Namen “root” festgelegt. In der Praxis wird die Nutzung dieses Accounts zwar kaum benötigt, aber es empfiehlt sich dennoch die Wahl eines ausreichend sicheren Passworts.

Die Angaben unter MARIADB_DATABASE und MARIADB_USER können aus dem Beispiel übernommen werden, in dem Fall werden als Datenbank-Name “solardb” und für den Datenbank-Nutzer die Bezeichnung “solardbuser” gewählt. Sollten diese Angaben geändert werden, ist ebenfalls eine Änderung bei den nachfolgenden Services invafetch und invaps notwendig. In den meisten Fällen ist eine Änderung nicht notwendig, da die verwendete MariaDB-Instanz als eigenständiger Dienst ausschließlich für die Nutzung der hier beschriebenen Tools vorgesehen ist. Ebenfalls ist kein Zugriff von außerhalb erforderlich, weshalb der MariaDB-Port nicht nach außen freigegeben wird, d.h. es ist keine Option “ports:” notwendig.

In der Variablen MARIADB_PASSWORD wird das Passwort für den User MARIADB_USER festgelegt. Beim ersten Start von MariaDB werden somit die Datenbank MARIADB_DATABASE und der User MARIADB_USER mit dem Passwort MARIADB_PASSWORD angelegt, wobei der User die entsprechenden Rechte (GRANT ALL) für die Datenbank MARIADB_DATABASE erhält.

invafetch

Das Tool invafetch liest die Processdata-Werte in regelmäßigen Abständen von der Inverter-API und speichert die Ergebnisse im JSON-Format in einer MariaDB-Tabelle. Weitere Informationen finden sich im invafetch-GitHub-Repository. []()

Zunächst wird die Datei processdata.json so in den Container gemappt, dass sie invafetch beim Start zur Verfügung steht. Die weitere Konfiguration findet mittels Umgebungsvariablen statt.

In DBHOST wird der Hostname konfiguriert. Dies kann ein vollständiger Hostname (FQDN) sein, hier genügt jedoch die Angabe des Service-Namens (“mariadb“), da Docker diesen den Containern im Service-internen Netzwerk als Hostnamen zur Verfügung stellt.

In die Umgebungsvariablen DBUSER, DBNAME und DBPASSWORD werden die korrespondierenden Angaben aus der MariaDB-Konfiguration eingesetzt, dabei entspricht DBUSER dem Usernamen aus MARIADB_USER, DBNAME der Datenbank aus MARIADB_DATABASE, sowie DBPASSWORD dem in MARIADB_PASSWORD definierten Passwort.

Die Angabe von DBPORT ist nicht notwendig, da hierbei der Default-Port 3306 gewählt wird. Auch hier erfolgt der Zugriff nur im Docker-Service internen Netzwerk.

In den Variablen INV_SERVER, INV_PASSWORD und INV_SCHEME wird der Zugriff auf den Wechselrichter konfiguriert. Eine Angabe des Users ist nicht notwendig, da automatisch der fest eingestellte Username des Anlagenbetreibers zum Einsatz kommt.

Unter INV_SERVER wird der Hostname oder die IP-Adresse des Wechselrichters (ohne “http://” bzw. “https://”) eingetragen (Beispiel: “192.168.0.100“) angegeben. Der Wechselrichter muss sich im selben Netzwerk befinden bzw. für den Server, auf dem die Docker-Services laufen, zugänglich sein.

In INV_PASSWORD ist das Passwort des Anlagenbetreibers einzutragen. Dieses kann in der Web-UI des Wechselrichters geändert werden.

Die Angabe INV_SCHEME ist optional und kann ausschließlich die Werte “http” oder “https” beinhalten, wobei als Default der unverschlüsselte Zugriff mittels http zum Einsatz kommt.

In TIME_REQUEST_DURATION_SECONDS wird die Zeitspanne zwischen zwei Requests auf den Wechselrichters definiert. Invafetch holt somit im Abstand von TIME_REQUEST_DURATION_SECONDS Sekunden die Processdata-Werte vom Wechselrichter und speichert diese in der MariaDB-Datenbank. Die Default-Einstellung von TIME_REQUEST_DURATION_SECONDS beträgt drei (3) Sekunden. Dabei gilt, je niedriger die Zeitspanne, desto genauer kann die spätere Auswertung gestaltet werden. Der Wert von drei Sekunden hat sich in der Praxis bewährt, ein zu niedriger oder zu hoher Wert empfiehlt sich hingegen nicht, da einerseits die Komponenten nicht überlastet werden sollen, andererseits eine zu hohe Auflösung zu weniger genauen Metriken führt.

Die Variable TIME_NEW_LOGIN_MINUTES gibt an, nach wieviel Minuten eine neue Session zum Wechselrichter und zur Datenbank hin aufgebaut werden soll. Der Standardwert liegt hier bei zehn (10) Minuten. Da invafetch auf der (undokumentierten) REST-API des Kostal-Wechselrichters basiert, ist eine Empfehlung hier kaum möglich, in der Praxis hat sich die Angabe von zehn Minuten als stabil und funktionsfähig herausgestellt.

invaps

Das Tool invaps liest die Processdata-Werte des Wechselrichters aus der MariaDB-Datenbank und stellt diese in einem für Prometheus geeigneten Format zur Verfügung. Weitere Informationen zu invaps finden sich im invaps-GitHub-Repository.

Bei den Variablen zur Datenbank-Konfiguration gelten die gleichen Hinweise wie für invafetch. Diese Angaben können einfach übernommen werden.

Mittels PORT wird angegeben, unter welchem Port der Server für die Metriken von invaps zur Verfügung gestellt werden. Die Angabe ist optional, per Default ist der Port 8080 eingestellt. Da invaps als Docker-Container gestartet wird, muss der Port mit der “ports:“-Definition nach außen hin freigegeben werden, dabei kann auch ein anderer Port gewählt werden, der sich vom internen Port unterscheidet. Im Beispiel wird der externe Port 8090 auf den internen Port 8080 gemappt, so dass die Inverter-Metriken unter der URL http://[server][:8090]/metrics zur Verfügung gestellt werden.

Invaps setzt auf dem Gin HTTP web framework auf. Gin nutzt die Umgebungsvariable GIN_MODE zur Einrichtung des Debug-Modus, der zusätzliche, für den Betrieb nicht notwendige Ausgaben enthält. Falls GIN_MODE nicht gesetzt ist, wird der Debug-Modus aktiviert, für den Betrieb und zur Deaktivierung des Debug-Modus ist GIN_MODE=release zu setzen.

Betrieb

Der Start der Services erfolgt mit docker compose bei neueren Docker-Versionen bzw. bei älteren Varianten durch das eigenständige Binary docker-compose:

$ docker compose -f kopv-dashboard.yml up -d

Zum Beenden aller Services wird ebenfalls docker compose (bzw. docker-compose) verwendet:

$ docker compose -f kopv-dashboard.yml down

Prometheus

Das folgende Docker-Compose-File zeigt beispielhaft eine Möglichkeit, Prometheus mittels Docker zum Laufen zu bringen:

version: '3.2'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - 9090:9090
    command:
      - --config.file=/etc/prometheus/prometheus.yml
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - ./data:/prometheus

Prometheus steht daraufhin unter dem Port 9090 auf dem entsprechenden Server zur Verfügung.
Die Konfiguration von Prometheus wird in der Datei “prometheus.yml” abgebildet, der folgende Ausschnitt zeigt dies für den “solardata” genannten Job, bei dem im Abstand von 20 Sekunden der Server abgefragt wird, der die Metriken des Wechselrichters zurückgibt:

scrape_configs:
[...]
  - job_name: solardata
    scrape_interval: 20s
    static_configs:
    - targets:
      - metrics.example.com:8090
[...]

Prometheus stellt eine Web-UI zur Verfügung, mit der sich unter anderem der Status der so definierten Jobs abfragen lässt. Unter “Status” -> “Targets” findet sich eine Liste der so genannten Endpoints, die der Prometheus-Server abfragt. Dabei werden auch der aktuelle Zustand, die Labels, die Zeit der letzten Abfrage und deren Dauer angegeben.

Für weitere Informationen wird an dieser Stelle auf die Dokumentation von Prometheus verwiesen.

Grafana

Grafana kann ebenfalls als Docker-Container betrieben werden, im Folgenden ein entsprechendes Docker-Compose-File dazu:

version: '3.8'
services:
  grafana:
    image: grafana/grafana-oss:latest
    container_name: monitoring_grafana
    restart: unless-stopped
    volumes:
      - ./data:/var/lib/grafana
    user: "1000"
    environment:
      - GF_SERVER_DOMAIN=example.com
    ports:
      - "3000:3000"

Grafana wird hierbei auf dem nach außen hin freigegebenen Port 3000 gestartet, weitere Hinweise zur Installation mittels Docker sind in der Dokumentation zu Grafana zu finden.

Nach dem Import des Dashboard-Definitionsfiles und der Wahl der Datenquelle “Prometheus” sollte sich nach kurzer Zeit ein Bild ähnlich wie folgendem zeigen:

grkopv-dashboard (Grafana Kostal Photovoltaic Dashboard) 1

Das Dashboard kann entsprechend den eigenen Anforderungen angepasst werden, etwa falls bei kleineren Anlagen nur ein Gleichstrom-Eingang zur Verfügung steht oder ähnliches.