# SOLECTRUS > Volltext der Website solectrus.de: Dokumentation, Integrationsanleitungen und Blog des quelloffenen Photovoltaik-Dashboards SOLECTRUS. # Dokumentation --- # SOLECTRUS Dokumentation > Installation, Konfiguration und Betrieb von SOLECTRUS, dem Dashboard für die eigene Photovoltaik-Anlage. Von den Grundlagen bis zur Referenz. **SOLECTRUS** ist ein Dashboard für die eigene Photovoltaik-Anlage. Es läuft auf einem eigenen Server, als Verbund mehrerer Docker-Container. Diese Dokumentation beschreibt Installation, Konfiguration und Betrieb. Woraus SOLECTRUS besteht und was der Server können muss Dashboard, Strompreise und die Berechnung der Kosten Updates, Datensicherung, Umzug und andere typische Aufgaben Alle Dienste und ihre Umgebungsvariablen im Detail Support-Paket, Issues und Diskussionen ## Zum Einstieg Die [Architektur](/docs/grundlagen/) beschreibt, woraus SOLECTRUS besteht und was die Bestandteile tun. Der Ablauf der Installation steht unter [HELIOS](/docs/referenz/helios/#helios-installieren). ## Häufig gebraucht - [Updates installieren](/docs/anleitungen/updates/) – wie Watchtower neue Versionen einspielt - [Datensicherung](/docs/anleitungen/datensicherung/) – Konfiguration und Messwerte sichern - [Sensoren zuordnen](/docs/referenz/dashboard/sensor-konfiguration/) – welcher Messwert wo im Dashboard landet - [Protokolle lesen](/docs/anleitungen/logging/) – der erste Schritt bei jeder Fehlersuche - [Strompreise pflegen](/docs/bedienung/kosten-berechnung/) – Grundlage für Kosten und Ersparnis --- # Anleitungen > Anleitungen zu Betrieb und Konfiguration von SOLECTRUS, von Updates über Datensicherung bis zum Server-Umzug. Dazu Beiträge aus der Community. Anleitungen zu Betrieb und Konfiguration. Erledigt wird das alles in [HELIOS](/docs/referenz/helios/), also im Browser. Die wenigen Ausnahmen sind als solche gekennzeichnet. ## Rund um die Datenquellen - [Multiple Erzeuger integrieren (z.B. Balkonkraftwerk)](/docs/anleitungen/multiple-erzeuger/) - [Zusätzliche Shelly-Verbrauchszähler integrieren](/docs/anleitungen/mehrere-shelly/) - [Umstellung auf pvnode als Forecast-Anbieter](/docs/anleitungen/umstellung-pvnode/) ## Betrieb & Pflege - [Installation von Updates](/docs/anleitungen/updates/) - [Erstellen von Datensicherungen](/docs/anleitungen/datensicherung/) - [Umzug auf einen neuen Server](/docs/anleitungen/server-umzug/) - [Protokoll-Dateien](/docs/anleitungen/logging/) - [Korrektur von Messwerten in InfluxDB](/docs/anleitungen/datenkorrektur/) ## Aus der Community Von einzelnen Nutzern erstellte Anleitungen für spezielle Anwendungsfälle: - [Externe Erreichbarkeit mit einem Cloudflare Tunnel](https://github.com/larknafets/howtos/blob/main/solectrus/cloudflare.md) \ Sicherer Zugriff auf das Dashboard von unterwegs, ohne Ports am Router öffnen zu müssen. - [evcc über MQTT verbinden](https://github.com/larknafets/howtos/blob/main/solectrus/evcc.md) \ Integration von evcc (Energie-Management-System für Elektromobilität) mit SOLECTRUS. --- # Korrektur von Messwerten in InfluxDB > Fehlerhafte Messwerte per Flux-Query finden, als CSV exportieren, korrigieren und zurück in InfluxDB importieren. Ein Kollektor kann fehlerhafte Messwerte liefern, etwa der [MQTT-Collector](/docs/referenz/mqtt-collector/). Sie landen dann in InfluxDB. Solche Werte lassen sich vorab abfangen, beispielsweise mit den [Min/Max-Optionen des MQTT-Collectors](/docs/referenz/mqtt-collector/topics/#mapping_x_min). Eingerichtet werden sie in der Praxis aber erst, wenn ungewöhnliche Werte auffallen. Zu diesem Zeitpunkt liegen die fehlerhaften Daten schon in InfluxDB und verfälschen die historischen Statistiken. InfluxDB kann Messwerte nicht löschen, wohl aber überschreiben. Das Vorgehen: ## 1. Vorbereitung Vor der Korrektur eine [Sicherung der Datenbank](/docs/anleitungen/datensicherung/) erstellen. ## 2. Fehlerhafte Daten selektieren Die [Web-Oberfläche von InfluxDB](/docs/referenz/influxdb/direktzugriff/) selektiert die Daten im _Data Explorer_ auf unterschiedliche Weise. Am besten eignet sich der Script-Editor mit einer Flux-Query. [Flux](https://docs.influxdata.com/influxdb/v2/query-data/get-started/) ist die Abfragesprache von InfluxDB. Damit lassen sich Daten filtern und aggregieren. InfluxDB speichert Messwerte in folgender Hierarchie: `Bucket` > `Measurement` > `Field` > `Value`. Ein `Bucket` ist ein Container für Daten (= Datenbank), ein `Measurement` ist eine Art Tabelle, ein `Field` ist eine Spalte in dieser Tabelle und ein `Value` ist ein Eintrag in dieser Spalte. Wie genau Bucket, Measurement und Field heißen, hängt von der eigenen Konfiguration ab. Die Beispiele hier verwenden `battery` und `soc`, die Vorgabe für den Ladestand des Hausakkus. Beim SENEC-Collector heißen sie stattdessen `SENEC` und `bat_fuel_charge`. Nachschlagen lässt sich die Zuordnung in HELIOS unter _Konfiguration → Sensoren_. Hier ein Beispiel, um alle Daten zum Ladestand des Hausakkus abzurufen, die einen Wert größer 100 oder kleiner 0 aufweisen (also offensichtlich fehlerhaft sind): ``` from(bucket: "solectrus") |> range(start: 0) // Keine zeitliche Einschränkung |> filter(fn: (r) => r._measurement == "battery") |> filter(fn: (r) => r._field == "soc") |> filter(fn: (r) => r._value > 100 or r._value < 0) ``` ![Flux-Query im Data Explorer von InfluxDB](@assets/datenkorrektur/influx-query.jpeg) Für einen bestimmten Zeitraum sieht die Abfrage so aus (hier am Beispiel für Januar 2024): ``` from(bucket: "solectrus") |> range(start: 2024-01-01T00:00:00Z, stop: 2024-02-01T00:00:00Z) // Januar 2024 |> filter(fn: (r) => r._measurement == "battery") |> filter(fn: (r) => r._field == "soc") |> filter(fn: (r) => r._value > 100 or r._value < 0) ``` ## 3. Messwerte als CSV exportieren Die selektierten Messwerte lassen sich als CSV-Datei exportieren. Der zugehörige Knopf _CSV_ erscheint allerdings nur bei einer sicheren HTTPS-Verbindung. Läuft InfluxDB auf einem lokalen Server, ist die Verbindung in der Regel unverschlüsselt und der Knopf fehlt. Zumindest in Chromium-basierten Browsern (Chrome, Opera, Edge, ...) lässt sich das vorübergehend umgehen: Über die URL `chrome://flags/#unsafely-treat-insecure-origin-as-secure` die Option _Insecure origins treated as secure_ aktivieren und dort die URL der InfluxDB-Web-Oberfläche eintragen (z.B. `http://192.168.2.50:8086`). Der Browser behandelt die Verbindung dann als sicher. ![Chrome-Flags mit der Option „Insecure origins treated as secure"](@assets/datenkorrektur/chrome.jpeg) ## 4. CSV bearbeiten Die heruntergeladene CSV-Datei enthält Daten in folgender Struktur: ```csv #group,false,false,true,true,false,false,true,true #datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,double,string,string #default,\_result,,,,,,, ,result,table,\_start,\_stop,\_time,\_value,\_field,\_measurement ,,0,1970-01-01T00:00:00Z,2024-12-08T09:02:04.372836299Z,2024-09-09T06:39:56Z,140,soc,battery ,,0,1970-01-01T00:00:00Z,2024-12-08T09:02:04.372836299Z,2024-09-09T06:40:06Z,140,soc,battery ,,0,1970-01-01T00:00:00Z,2024-12-08T09:02:04.372836299Z,2024-09-09T06:40:15Z,140,soc,battery ``` Bearbeiten lässt sie sich mit einem Texteditor oder mit Excel. Zu korrigieren sind in diesem Beispiel die Werte von 140, die für einen SOC des Akkus keinen Sinn ergeben. Die Werte werden dabei **korrigiert** und **nicht gelöscht**: Sämtliche Zeilen und Spalten bleiben erhalten, denn InfluxDB kann auf diesem Weg keine Daten löschen. > **Achtung** > > > Beim Speichern der Datei darf sich die Struktur nicht ändern. Insbesondere muss das Trennzeichen ein `,` (Komma) bleiben und darf nicht durch `;` (Semikolon) ersetzt werden, was bei der Nutzung von Excel automatisch passieren kann. Ein Texteditor ist daher die sicherere Wahl als Excel. > ## 5. Korrigierte CSV-Datei re-importieren Im Menü der Web-Oberfläche lässt sich über `Load Data` > `Sources` > `Upload a CSV` die korrigierte Datei per Drag-and-Drop in den Bucket von SOLECTRUS laden. InfluxDB überschreibt dabei die vorhandenen Daten. ![CSV-Import in der Web-Oberfläche von InfluxDB](@assets/datenkorrektur/influx-import.jpeg) ## 6. Abschluss Nach dem Import zeigt der _Data Explorer_ die korrigierten Werte. Zwei Dinge fehlen dann noch, denn SOLECTRUS kennt die alten Werte weiterhin: 1. Den [Redis-Cache leeren](/docs/referenz/redis/#cache-leeren). In HELIOS gibt es dafür beim Dienst _Redis_ den Knopf **Cache leeren**. 2. Die Tageszusammenfassungen zurücksetzen. Das geht in SOLECTRUS selbst, auf der Seite _Einstellungen_ im Abschnitt _Tageszusammenfassungen_ über den Link _Zurücksetzen_. --- # Erstellen von Datensicherungen > Wie HELIOS PostgreSQL, InfluxDB und die Konfiguration sichert, wohin die Archive gehen und wie sich eine Sicherung zurückspielen lässt. Die beiden Datenbanken von SOLECTRUS sammeln Daten, die sich nicht wiederherstellen lassen: PostgreSQL die Einstellungen und Strompreise, InfluxDB die Messwerte. Regelmäßige Sicherungen sind deshalb wichtig. Sicherungen erstellt und verwaltet [HELIOS](/docs/referenz/helios/) im Bereich **Datensicherung**. ## Eine Sicherung erstellen Der Knopf _Sicherung erstellen_ startet eine Sicherung. HELIOS sichert PostgreSQL und InfluxDB und packt beides zusammen mit der Konfiguration in ein einziges Archiv. Die Sicherung läuft im Hintergrund. Kein Container wird gestoppt, SOLECTRUS bleibt währenddessen normal nutzbar. Bei größeren Datenmengen dauert das einige Minuten, die Seite lässt sich in der Zwischenzeit verlassen. ## Automatisch sichern Die automatische Sicherung ist zunächst ausgeschaltet. Zum Einschalten unter _Automatische Sicherung_ die Option **Täglich automatisch sichern** setzen und eine Uhrzeit wählen; vorgeschlagen ist 03:00 Uhr. Sie gilt in der Zeitzone, die unter _Konfiguration → Grundeinstellungen → PV-Anlage_ eingestellt ist. HELIOS bewahrt die **fünf neuesten** Sicherungen auf. Ältere entfernt es automatisch, der Speicher läuft also nicht voll. ## Wohin gesichert wird Drei Ziele stehen zur Wahl: | Ziel | Wofür | | ----------------------------- | ----------------------------------------------------------------- | | **Lokal auf diesem Host** | Einfachster Fall, die Sicherung bleibt auf demselben Gerät. | | **Externer Mount (z.B. NAS)** | Ein eingehängtes Verzeichnis, etwa eine NFS-Freigabe auf dem NAS. | | **S3-kompatibler Speicher** | AWS S3, MinIO, Backblaze B2, Wasabi und Ähnliches. | HELIOS prüft auf Knopfdruck, ob das Ziel erreichbar und beschreibbar ist. > **Nicht auf demselben Gerät belassen** > > > Eine Sicherung, die neben den Originaldaten liegt, hilft bei einem Defekt der Festplatte nicht weiter. Als Ziel eignet sich möglichst ein anderes Gerät. > ## Wiederherstellen Auch die Wiederherstellung läuft im Browser. HELIOS stoppt dafür die Dienste, spielt die Datenbanken zurück und startet alles wieder. Eine Sicherung, die woanders liegt, lässt sich vorher hochladen. Möglich ist das nur beim Ziel _Lokal auf diesem Host_. Ist ein anderes Ziel eingestellt, dieses für das Hochladen vorübergehend auf _Lokal_ umstellen. > **Warnung** > > > Beim Wiederherstellen werden die aktuellen Datenbanken **und die Konfiguration** überschrieben. HELIOS erzeugt `compose.yaml` und `.env` aus der gesicherten Konfiguration neu. Alle Messwerte, die seit der Sicherung dazugekommen sind, gehen verloren. > --- # Protokoll-Dateien > Wo die Protokolle der Dienste zu finden sind, im Browser über HELIOS oder als Support-Paket, und wie HELIOS ihre Größe von vornherein begrenzt. Die Docker-Container von SOLECTRUS schreiben Protokolle (Logs) über ihre Aktivitäten. Bei der Fehlersuche sind sie die erste Anlaufstelle. ## Protokolle lesen In [HELIOS](/docs/referenz/helios/) stehen sie unter **Dienste**. Dort lässt sich das Protokoll jedes Dienstes direkt im Browser lesen, mit Farben und laufender Aktualisierung. Wer Hilfe im [Forum](https://github.com/orgs/solectrus/discussions) sucht, schickt die passenden Ausschnitte mit. Alternativ gibt es das **Support-Paket** mit den letzten 500 Zeilen jedes Dienstes, siehe [Support](/docs/support/). ## Größe Ohne Begrenzung wachsen Protokolle immer weiter und können irgendwann den [Speicher volllaufen lassen](https://github.com/orgs/solectrus/discussions/3748). HELIOS begrenzt sie deshalb von vornherein: Jeder Dienst belegt höchstens drei Dateien zu je 10 MB, ältere Protokolle werden gelöscht. Einzustellen ist dafür nichts. --- # Zusätzliche Shelly-Verbrauchszähler integrieren > Mehrere Shelly-Geräte als benutzerdefinierte Verbraucher anlegen, um Wärmepumpe, Kühlschrank oder andere Geräte getrennt zu erfassen. Mehrere Shelly-Geräte lassen sich parallel auslesen, etwa um einzelne Verbraucher getrennt zu erfassen: die Wärmepumpe mit einem Shelly, den Kühlschrank mit einem zweiten. > **Hinweis** > > > Zur Darstellung benutzerdefinierter Verbraucher ist ein [Sponsoring-Abo](https://solectrus.de/sponsoring/) erforderlich. > ## Sensor anlegen Ein Shelly, der einen Verbraucher misst, wird am Sensor konfiguriert. Dafür in [HELIOS](/docs/referenz/helios/) unter _Konfiguration → Sensoren_ einen der benutzerdefinierten Verbraucher aktivieren (`CUSTOM_POWER_01` und folgende). Als Datenquelle dient der **Shelly-Collector**. Danach fragt HELIOS nach der IP-Adresse des Geräts und, falls nötig, nach dem Passwort. Auf Knopfdruck prüft es, ob der Shelly erreichbar ist. Zuletzt folgt die Wahl des Messwerts: die Summe oder eine einzelne Phase. Für jeden weiteren Verbraucher wiederholt sich das mit dem nächsten Sensor. > **Und die Liste _Shelly-Geräte_?** > > > Unter _Konfiguration → Datenquellen → Shelly-Geräte_ steht eine eigene Geräteliste. Sie ist für Geräte gedacht, deren Messwerte nur in der InfluxDB landen sollen, ohne Zuordnung zu einem Sensor. Für einen Verbraucher im Dashboard ist sie nicht nötig. > ## Dienste aktualisieren Zum Schluss die betroffenen Container unter _Dienste_ aktualisieren. Danach tauchen die neuen Verbraucher im Dashboard auf. Alle Geräte bedient dabei ein einziger [Shelly-Collector](/docs/referenz/shelly-collector/). Es kommt also kein Container hinzu, unabhängig von der Zahl der Geräte. --- # Multiple Erzeuger integrieren > Bis zu fünf PV-Erzeuger getrennt erfassen und zusätzlich als Summe führen, etwa mehrere Dachflächen oder ein zusätzliches Balkonkraftwerk. SOLECTRUS kann ab Version `0.20` mit mehreren Erzeugern umgehen, etwa bei einem **Balkonkraftwerk** ("Steckersolar") oder mehreren Dachflächen. > **Hinweis** > > > Zur Darstellung multipler Erzeuger ist ein [Sponsoring-Abo](https://solectrus.de/sponsoring/) erforderlich. > Bis zu fünf Erzeuger lassen sich getrennt erfassen und werden zusätzlich als Summe geführt. Das können verschiedene Dachseiten sein, Module auf einem Nebengebäude oder ein Balkonkraftwerk. In [HELIOS](/docs/referenz/helios/) stehen sie unter _Konfiguration → Sensoren_ in der Gruppe **Wechselrichter**: | Feld in HELIOS | Sensor | | ----------------------- | ----------------------------------------- | | _Gesamte PV-Erzeugung_ | `INVERTER_POWER` | | _PV-Erzeuger 1_ bis _5_ | `INVERTER_POWER_1` bis `INVERTER_POWER_5` | Jeder Erzeuger bekommt seinen Messwert zugeordnet, den Rest erledigt HELIOS. > **Achtung** > > > Die Messwerte müssen dafür in der InfluxDB auch tatsächlich ankommen. Sie müssen also zuvor z.B. über den [MQTT-Collector](/docs/referenz/mqtt-collector/) dort landen. > > Beim [SENEC-Collector](/docs/referenz/senec-collector/) gibt es eine Ausnahme: Holt er die Messwerte direkt beim Speicher ab (also nicht über die SENEC-Cloud), landen die drei Strings automatisch in der InfluxDB, benannt als `mpp1_power`, `mpp2_power` und `mpp3_power`. > ## Szenarien Welche Felder zu füllen sind, hängt davon ab, was gemessen wird. ### 1. Ein Dach, keine Differenzierung Gefüllt wird nur _Gesamte PV-Erzeugung_, die einzelnen Erzeuger bleiben leer. Das entspricht der Konfiguration, wie sie bis Version `0.19` die einzig mögliche war. ### 2. Mehrere Dachflächen Jede Fläche bekommt einen eigenen Erzeuger: _PV-Erzeuger 1_ die Ostseite, _PV-Erzeuger 2_ die Westseite und so weiter. Dazu kommt _Gesamte PV-Erzeugung_, sofern dieser Wert vorliegt. Dann bleibt für die Anfangszeit ohne getrennte Messung wenigstens die Summe erhalten. ### 3. Ein Dach und ein Balkonkraftwerk Dach und Balkonkraftwerk kommen als _PV-Erzeuger 1_ und _PV-Erzeuger 2_. _Gesamte PV-Erzeugung_ bleibt **leer**, denn diesen Wert misst niemand: Das Balkonkraftwerk hängt nicht am selben Wechselrichter. Bleibt das Feld leer, bildet SOLECTRUS die Summe selbst aus den Einzelwerten. Der Sensor des Balkonkraftwerks bekommt außerdem die Option **Das ist ein Steckersolargerät (BKW)**. Damit nimmt HELIOS den Dienst [Ingest](/docs/referenz/ingest/) mit auf, der den Hausverbrauch neu berechnet. Ohne diese Option zählt der Strom des Balkonkraftwerks nicht in den Hausverbrauch hinein. ### 4. Mehrere Dachflächen und ein Balkonkraftwerk Wie Szenario 3, nur mit mehr Erzeugern: die Dachflächen auf _PV-Erzeuger 1_ bis _4_, das Balkonkraftwerk auf _PV-Erzeuger 5_. Die Summe bleibt leer. Die BKW-Option gilt wie in Szenario 3. > **Hinweis** > > > Die getrennte Erfassung der Dachflächen setzt voraus, dass deren Einzelwerte seit Installation des ersten Erzeugers lückenlos vorliegen. Andernfalls ist Szenario 3 die bessere Wahl, ohne Differenzierung der Dachflächen. > ## Nach der Änderung In SOLECTRUS unter _Einstellungen_ die Tageszusammenfassungen zurücksetzen. Sonst zeigen die historischen Werte weiterhin die alte Aufteilung. --- # Umzug auf einen neuen Server > SOLECTRUS auf einen anderen Server umziehen, indem das Installationsverzeichnis mit Konfiguration und Datenbanken kopiert wird. Bei einem Umzug sollen keine Messwerte verloren gehen. Der sicherste Weg ist, die gesamte Installation zu kopieren. SOLECTRUS liegt in einem einzigen Verzeichnis, das alles enthält: Konfiguration, Datenbanken und die Daten von [HELIOS](/docs/referenz/helios/). > **Das geht nur im Terminal** > > > Ein Umzug ist eine der wenigen Aufgaben, für die HELIOS nichts anbietet. Die Dateien müssen von Hand vom einen Server auf den anderen kopiert werden. > ## 1. Container stoppen Auf dem alten Server, im Verzeichnis mit der `compose.yaml`: ```bash docker compose down ``` Das ist wichtig für die Datenkonsistenz. Während des Kopierens dürfen die Datenbanken nicht verändert werden. ## 2. Verzeichnis kopieren Das komplette Verzeichnis kommt auf den neuen Server, z.B. mit `rsync`: ```bash sudo rsync -a --rsync-path="sudo rsync" /pfad/zu/solectrus/ neuer-server:/pfad/zu/solectrus/ ``` Die Datenbank-Ordner gehören root. Das vordere `sudo` liest sie deshalb auf dem alten Server, das hintere (`--rsync-path`) schreibt sie auf dem neuen Server mit root-Rechten. Erst damit kann die Option `-a` Besitzer und Rechte erhalten, ohne die starten die Datenbanken auf dem neuen Server nicht. Fragt `sudo` auf dem neuen Server nach einem Passwort, bricht rsync ab. Dann hilft die Anmeldung direkt als root, also `root@neuer-server`. > **Abweichende Speicherorte** > > > Standardmäßig liegen die Datenbanken innerhalb des Installationsverzeichnisses. Wo sie tatsächlich liegen, zeigt HELIOS unter _Konfiguration → Grundeinstellungen → Speicherorte_ an (Variablen `INFLUX_VOLUME_PATH` und `DB_VOLUME_PATH`). Liegen sie außerhalb, etwa aus einer übernommenen Installation, gehören diese Verzeichnisse ebenfalls mit auf den neuen Server. > ## 3. Auf dem neuen Server starten Docker muss vorhanden sein. Fehlt es, hilft das [Installationsskript](/docs/referenz/helios/#helios-installieren), ausgeführt im kopierten Verzeichnis: Es erkennt die bestehende Installation und ergänzt nur, was fehlt, Docker eingeschlossen. Dann im kopierten Verzeichnis: ```bash docker compose up -d ``` SOLECTRUS ist nun unter der neuen IP-Adresse erreichbar, HELIOS wie gewohnt unter Port 3999. Die Messwerte bleiben erhalten, die Konfiguration ebenso. Auch die Registrierung und ein etwaiges Sponsoring gelten weiter, denn es entsteht keine neue Instanz. Es zieht dieselbe um. ## 4. Adresse anpassen Hat der neue Server eine andere Adresse, gehört sie in HELIOS unter _Konfiguration → Grundeinstellungen → Host_ eingetragen. Anschließend das Dashboard unter _Dienste_ aktualisieren. Ohne diesen Schritt zeigt SOLECTRUS weiterhin auf die alte Adresse. > **Hinweis** > > > Die [Datensicherung](/docs/anleitungen/datensicherung/) ist für einen Umzug nicht der ideale Weg. Zwar lässt sich eine Sicherung auf dem neuen Server hochladen und einspielen. Das Kopieren des Verzeichnisses ist aber einfacher, denn es überträgt die Installation im Ganzen, ohne den Umweg über Archiv und Wiederherstellung. > --- # Umstellung auf pvnode > Ablauf der Umstellung des Forecast-Collectors von Forecast.Solar oder Solcast auf pvnode, von der Registrierung bis zu den Sensoren. Diese Anleitung beschreibt die Umstellung des Forecast-Collectors von einem anderen Anbieter (Forecast.Solar oder Solcast) auf **pvnode**. ## Schritt 1: Registrierung bei pvnode 1. Kostenlosen Account bei [pvnode.com](https://pvnode.com) anlegen 2. Nach der Anmeldung zu [API Keys](https://pvnode.com/settings/api-keys) navigieren 3. Neuen API-Key erstellen und kopieren > **Tipp** > > > Die drei Tarife **Free**, **Light** und **Plus** unterscheiden sich im Kontingent der API-Anfragen und in der Reichweite der Prognose. Was sie im Einzelnen leisten, steht in der [Referenz](/docs/referenz/forecast-collector/konfiguration-pvnode/#pvnode_paid). > ## Schritt 2: Site bei pvnode anlegen In der pvnode-Web-App eine **Site** anlegen. Sie enthält den Standort der Anlage und ihre PV-Strings. Die Site bekommt eine ID, die im nächsten Schritt gebraucht wird. Das ist der empfohlene Weg, denn er nutzt die API v2. Die klassische v1-API schaltet pvnode zum **31.12.2026** ab. ## Schritt 3: Umstellung in HELIOS In [HELIOS](/docs/referenz/helios/) unter _Konfiguration → Datenquellen → Forecast-Collector_ den Anbieter **pvnode** wählen. Danach folgen der API-Key und der **pvnode-Tarif** (Free, Light oder Plus), auf der nächsten Seite die **Site-ID**. Damit ist die Anlage beschrieben. Ausrichtung, Neigung und Leistung der Dachflächen fragt HELIOS dann nicht mehr ab, denn diese Angaben stehen auf der Site. Zum Schluss den Forecast-Collector unter _Dienste_ aktualisieren. ## Schritt 4: Sensoren aktivieren pvnode liefert zwei Werte, die es bei anderen Anbietern nicht gibt: die Prognose bei wolkenlosem Himmel und die Außentemperatur. Dafür unter _Konfiguration → Sensoren_ die Sensoren **PV-Prognose (klarer Himmel)** und **Außentemperatur-Prognose** aktivieren. Measurement und Field trägt HELIOS dabei selbst ein. > **Nur ohne Site-ID** > > > Die beiden folgenden Abschnitte betreffen nur Installationen ohne **Site-ID**, die also weiterhin die v1-API nutzen. > ## Ausrichtung ohne Site-ID pvnode zählt die Grad **von Nord** (0 bis 360), Forecast.Solar dagegen **von Süd** (-180 bis 180). Süden ist also nicht mehr `0`, sondern `180`. Die Werte je Himmelsrichtung stehen in der [Referenz](/docs/referenz/forecast-collector/konfiguration-pvnode/#forecast_azimuth). HELIOS blendet für jeden Anbieter das passende Feld ein und schreibt die Konvention daneben. Eine Umrechnung entfällt damit. Eine Kontrolle des Werts bleibt sinnvoll. ## Koordinaten nicht mehr ändern Geänderte Koordinaten legen bei pvnode einen **neuen** Standort an. Im kostenlosen Tarif führt das zur Fehlermeldung `Site limit has been exceeded`. Die Koordinaten müssen also schon vor dem ersten Abruf stimmen und danach unverändert bleiben. Näheres zum Standort-Limit steht in der [Referenz](/docs/referenz/forecast-collector/konfiguration-pvnode/#standort). ## Wenn keine Prognose erscheint Manchmal ruft der Forecast-Collector die Daten laut Protokoll erfolgreich ab, im Dashboard erscheint aber nichts. Meist liegt es dann an der Groß- und Kleinschreibung: InfluxDB unterscheidet `Forecast` und `forecast`. Schreibt der Collector nach `Forecast`, das Dashboard fragt aber `forecast` ab, kommt nichts an. Die Zuordnung steht unter _Konfiguration → Sensoren_. HELIOS zeigt dort zu jedem Sensor den aktuellen Messwert. Bleibt er leer, stimmt die Zuordnung nicht. Weiter hilft das [Protokoll](/docs/anleitungen/logging/) des Forecast-Collectors. ## Weiterführende Links - [pvnode Referenz-Dokumentation](/docs/referenz/forecast-collector/konfiguration-pvnode/) - [Allgemeine Forecast-Collector Konfiguration](/docs/referenz/forecast-collector/allgemeine-konfiguration/) - [Dashboard Sensor-Konfiguration](/docs/referenz/dashboard/sensor-konfiguration/) --- # Installation von Updates > Wie Updates der Docker-Images funktionieren: von Hand per docker compose, automatisch mit Watchtower oder auf Knopfdruck in HELIOS. Die Komponenten von SOLECTRUS bekommen unabhängig voneinander Updates mit neuen Funktionen und Fehlerkorrekturen. Jede Komponente ist ein Docker-Image, dessen Version in der `compose.yaml` steht. ## Wie Updates bei Docker funktionieren Docker lädt ein Image einmal herunter und verwendet es danach immer wieder. Auch beim Tag `latest` sieht Docker von sich aus **nicht** nach, ob es inzwischen eine neuere Version gibt. Ohne Zutun läuft eine Installation vom Mai im Dezember noch mit dem Image vom Mai. Ein Update besteht deshalb aus zwei Schritten: das neue Image holen und den Container damit neu erzeugen. Ob das von Hand, über [Watchtower](/docs/referenz/watchtower/) oder in [HELIOS](/docs/referenz/helios/) geschieht, ändert an diesen beiden Schritten nichts. ## Ohne HELIOS Bei einer Installation von Hand liegen `compose.yaml` und `.env` in einem Verzeichnis auf dem Server. Ein Update erfolgt dort per SSH: 1. Login auf den Server 2. In das Verzeichnis mit `compose.yaml` und `.env` wechseln. 3. Diese beiden Befehle ausführen: ```bash docker compose pull docker compose up -d ``` `docker compose pull` lädt die neuesten Versionen der Docker-Images herunter. `docker compose up -d` erzeugt die geänderten Container neu. Das betrifft alle Dienste aus der `compose.yaml` – Dashboard, Kollektoren und die Datenbanken (InfluxDB, PostgreSQL, Redis). Wer diese Schritte nicht von Hand ausführen will, richtet [Watchtower](/docs/referenz/watchtower/) ein. Es prüft regelmäßig auf neue Versionen und übernimmt beide Schritte automatisch. ## Mit HELIOS Zu den Diensten, die [HELIOS](/docs/referenz/helios/) einrichtet und betreibt, gehört [Watchtower](/docs/referenz/watchtower/). Es prüft regelmäßig, ob es neue Versionen der Docker-Images gibt, und installiert sie automatisch. Das gilt für alle Dienste, HELIOS selbst eingeschlossen. Die Befehle von oben sind damit nicht mehr nötig. In HELIOS steht unter _Konfiguration → Grundeinstellungen → Software-Stand_ je Dienst die Wahl zwischen den Spalten **Stabil** und **Entwicklung**. Im Zweifel: Stabil. Steht mindestens ein Dienst auf _Entwicklung_, erscheint dort zusätzlich die Frage, wie oft Watchtower nach neuen Versionen suchen soll. Ansonsten prüft es täglich. Soll ein Update sofort greifen, ohne auf den nächsten Lauf von Watchtower zu warten, gibt es in HELIOS unter **Dienste** beim betreffenden Dienst den Knopf **Aktualisieren**. HELIOS lädt dann das Image neu und erzeugt den Container neu. Welche Version gerade läuft, steht in derselben Zeile. Ist das Image-Tag veraltet, weist HELIOS darauf hin und bietet ein Update an. ## Major-Upgrade von PostgreSQL Eine Ausnahme: Neue Major-Versionen von PostgreSQL (etwa 17 → 18) kann Watchtower nicht einspielen, denn dabei muss die Datenbank umgezogen werden. HELIOS bietet das Upgrade unter _Dienste_ als eigenen Schritt an. Näheres unter [PostgreSQL](/docs/referenz/postgresql/#updates). --- # Bedienung & Verständnis > Die Bedienung des Dashboards und die Rechenwege dahinter: Administrator-Zugang, Apps für unterwegs, Kosten des Stromverbrauchs und Ersparnis der Anlage. Diese Seiten erklären die Bedienung des Dashboards und die Rechenwege dahinter. - [Administrator-Zugang](/docs/bedienung/administrator/) - [Kosten durch den Stromverbrauch](/docs/bedienung/kosten-berechnung/) - [Ersparnis durch die Photovoltaikanlage](/docs/bedienung/ersparnis-berechnung/) - [Apps für Smartphone oder Tablet](/docs/bedienung/smartphone/) --- # Administrator-Zugang > Welche Einstellungen dem Administrator vorbehalten sind, wie die Anmeldung im Dashboard funktioniert und wo sich das Passwort ändern lässt. Diese Bereiche des Dashboards sind dem Administrator vorbehalten: - Strompreise, Einspeisevergütung und weitere Optionen festlegen - Sensoren benennen - Anlagennamen und Betreiber hinterlegen - Tageszusammenfassungen zurücksetzen - Zahlungsströme für die Amortisationsrechnung pflegen - Registrierung durchführen und ein [Sponsoring-Abo](https://solectrus.de/sponsoring/) abschließen Alle anderen haben nur Lesezugriff. Angemeldet wird über das Seitenmenü: ![Login-Formular des Dashboards](@assets/login-dashboard.png) Es gibt nur ein Passwort, keinen Benutzernamen und keine E-Mail-Adresse. Wer das Passwort kennt, ist Administrator. Bei Installationen, die über das Internet erreichbar sind, schützt das Passwort allein die Einstellungen. Die Messwerte selbst kann dann jeder sehen. Wer auch das verhindern will, sperrt die gesamte Oberfläche mit [`LOCKUP_CODEWORD`](/docs/referenz/dashboard/allgemeine-konfiguration/#lockup_codeword). ## Passwort festlegen Das Passwort für den Administrator-Zugang wird während der Installation festgelegt. [HELIOS](/docs/referenz/helios/) zeigt es am Ende an, es gilt für das Dashboard und für HELIOS selbst. Ändern lässt es sich in HELIOS unter _Konfiguration → Grundeinstellungen → Zugriffsschutz_. Danach braucht das Dashboard unter _Dienste_ eine Aktualisierung, damit die Änderung greift. Hinter dem Feld steckt die Umgebungsvariable `ADMIN_PASSWORD`, siehe [Referenz zum Dashboard](/docs/referenz/dashboard/allgemeine-konfiguration/). --- # Ersparnis durch die Photovoltaikanlage > Wie SOLECTRUS die Ersparnis aus dem Vergleich mit einem Szenario ohne PV-Anlage berechnet und welchen Anteil der Speicher daran hat. Die Einsparung, die der Betrieb der PV-Anlage erzielt, besteht aus zwei Komponenten: 1. Einsparung durch Reduzierung des aus dem Netz bezogenen Stroms 2. Einsparung durch Erhalt einer Einspeisevergütung für den ins Netz abgegebenen Strom SOLECTRUS berechnet die Ersparnis aus einer Gegenüberstellung zweier Szenarien: Die aktuelle Situation (also **mit** PV-Anlage) vergleicht es mit einem theoretischen Szenario ohne PV-Anlage, bei gleichem Stromverbrauch. Das sieht dann so aus (im Beispiel ein einzelnes Jahr): ![Ersparnis durch PV-Anlage](@assets/ersparnis.png) ## Berechnung der Ersparnis SOLECTRUS rechnet in drei Schritten: 1. **Mit PV-Anlage**: Zunächst zählen die Kosten, die der Bezug von Strom tatsächlich verursacht (siehe auch die Erläuterungen zur [Kosten-Berechnung](/docs/bedienung/kosten-berechnung/)). Der Betrag ist immer negativ, hier im Beispiel sind es `-386 €`. Dazu kommt die Einspeisevergütung für den Überschuss (hier `624 €`, positiv). Zusammen ergibt das den „Solarpreis" als Summe, wobei die Vorzeichen zu beachten sind (hier: `-386 € + 624 € = 238 €`). Der Solarpreis ist meist positiv, kann aber je nach gewähltem Zeitraum auch negativ sein, z.B. im Winter, wenn der Strombezug mehr kostet als die Einspeisevergütung einbringt. 2. **Ohne PV-Anlage**: Der Strom für den gesamten Verbrauch muss gekauft werden, eine Einspeisevergütung gibt es nicht. Gerechnet wird `(Hausverbrauch + Wärmepumpe + Wallbox) * Strompreis`, wobei Wärmepumpe und Wallbox nur einfließen, wenn sie konfiguriert sind. Im Beispiel ergibt sich ein Vergleichspreis (immer negativ) mit den theoretischen Strombezugskosten von `1.857 €`. Die Berechnung berücksichtigt dabei die sich im Zeitverlauf ändernden Strompreise. 3. **Vergleich**: Die mit der PV-Anlage erzielte Ersparnis ist die Differenz zwischen Solarpreis und Vergleichspreis. Im Beispiel wird gerechnet: \ `238 € - (- 1.857 €) = 2.095 €`. Das bedeutet: Mit der PV-Anlage bleiben im gewählten Zeitraum 2.095 € mehr übrig als ohne sie. Zusammengefasst lässt sich die Formel wie folgt darstellen: ``` Ersparnis (€) = (Hausverbrauch + Wärmepumpe + Wallbox - Strombezug) * Strompreis + Einspeisung * Einspeisevergütung ``` Da sich der Strompreis im Zeitverlauf üblicherweise ändert, rechnet SOLECTRUS jeden Teilzeitraum einzeln und summiert die Ergebnisse auf. ## Anteil des Speichers an der Ersparnis Zum Schluss errechnet SOLECTRUS, welchen Anteil der Stromspeicher (Akku) an der Ersparnis hat. Dafür gilt folgende Formel: ``` Ersparnis durch Akku (€) = Akkuentnahme (kWh) * Strompreis (€/kWh) - Akkubeladung (kWh) * Einspeisevergütung (€/kWh) ``` Der aus dem Akku entnommene Strom muss nicht gekauft werden, das spart den Strompreis. Für die Strommenge, die in den Akku fließt, entfällt umgekehrt die Einspeisevergütung. Die Akku-Ersparnis ist der Betrag, den der Akku gegenüber einer PV-Anlage ohne Akku einspart. Mit diesem Betrag amortisiert sich die Investition in den Akku. SOLECTRUS setzt den Betrag anschließend prozentual ins Verhältnis zur zuvor errechneten Gesamtersparnis. ## Zugrunde liegende Annahmen Diese Berechnung berücksichtigt die Anfangsinvestitionen in die PV-Anlage nicht. Wartungskosten, Versicherungsprämien und Ähnliches fließen ebenfalls nicht ein. Ebenfalls unberücksichtigt bleibt, dass der Speicher einen spürbaren Eigenverbrauch hat und den Hausverbrauch damit erhöht. Genau beziffern lässt sich dieser Effekt nicht, deshalb fließt er nicht in die Berechnung ein. --- # Kosten durch den Stromverbrauch > Wie SOLECTRUS die Stromkosten aus Netzbezug, Eigenverbrauch und den hinterlegten Strompreisen berechnet, samt der entgangenen Einspeisevergütung. SOLECTRUS berechnet die Kosten des Stromverbrauchs und unterscheidet dabei zwischen **Netzbezug** und **Eigenverbrauch**. Dargestellt wird ein beliebiger Zeitraum, etwa ein Monat oder ein Jahr. Hier ein Beispiel: ![Kostenberechnung](@assets/kosten.png) > **Hinweis** > > > Die hier beschriebene Berechnung gilt ab Version `0.16`. Frühere Versionen haben die Kosten anders dargestellt. > ## Strompreise als Grundlage Berechnungsgrundlage sind neben Netzbezug und Eigenverbrauch die eingestellten Strompreise. Auch hierzu ein Beispiel: ![Strompreise](@assets/strompreise.png) ## Opportunitätskosten Teil der Kosten ist die entgangene Einspeisevergütung (Opportunitätskosten). Sie entsteht, wenn der erzeugte Strom selbst verbraucht statt eingespeist wird. Seit Version 1.0 gehört sie fest zur Berechnung. ## Die Berechnung im Detail SOLECTRUS rechnet in mehreren Schritten: 1. Es ermittelt die Strompreise, die für den ausgewählten Zeitraum gelten – hier für ein Jahr. Hat sich der Preis darin geändert, teilt SOLECTRUS den Zeitraum in Abschnitte auf. Im Beispiel ist das der Fall: Der Strompreis bewegte sich zwischen `0,2545 €/kWh` und `0,3244 €/kWh`. Er hat sich zweimal geändert, es gab also drei Preise und damit drei Zeitabschnitte. 2. Für jeden Zeitabschnitt liest SOLECTRUS den Netzbezug in kWh aus den Messwerten, im Beispiel zusammen `1.335 kWh`. Den Eigenverbrauch bildet es aus der Differenz von Erzeugung und Einspeisung, im Beispiel `4.926 kWh`. 3. Die Netzbezugskosten ergeben sich je Zeitabschnitt aus Verbrauch mal Strompreis. Aufsummiert sind das im Beispiel `386 €`. 4. Hinzu kommt die entgangene Einspeisevergütung, also der Eigenverbrauch mal Einspeisevergütung. Im Beispiel `418 €`. 5. Die Gesamtkosten betragen damit `804 €`. ## Aufteilung auf die Verbraucher Dargestellt wurden bislang die **Gesamtkosten**, die im gewählten Zeitraum entstanden sind (im Beispiel `804 €`). Wie viel davon auf die einzelnen Verbraucher entfällt, etwa auf Haus, Wärmepumpe oder E-Auto, ermittelt der [Power-Splitter](/docs/referenz/power-splitter/). Er liefert die Aufteilung der Energiemengen, die Kosten rechnet das Dashboard daraus. > **Nur mit Sponsoring** > > > Diesen Abschnitt zeigt das Dashboard nur bei einem aktiven [Sponsoring-Abo](https://solectrus.de/sponsoring/). Ohne Abo bleiben die Gesamtkosten sichtbar, die Aufteilung auf die Verbraucher entfällt. > Der Verbrauch besteht üblicherweise aus einem Mix von Eigenverbrauch und Netzbezug. Diese Aufteilung ermittelt der Power-Splitter für jeden der großen Verbraucher und summiert sie auf. Aus dem Anteil ergeben sich die Stromkosten dieser Verbraucher, die sich aus Netzbezug und entgangener Einspeisevergütung zusammensetzen. Hier ein Beispiel für das E-Auto in einem Jahr: ![Power-Splitter](@assets/power-splitter-car.png) Das E-Auto hat etwa 2 MWh im Jahr über die Wallbox bezogen. 69 % davon stammen aus der eigenen PV-Anlage. Der kleinere rote Teil des Balkens zeigt den Netzbezug. Die Summe aus Netzbezug und entgangener Einspeisevergütung beträgt `314 €`, wobei die jeweils gültigen Strompreise berücksichtigt werden. Das sind die Stromkosten, die das E-Auto über die Wallbox verursacht hat. > **Achtung** > > > Externe Ladungen, etwa an öffentlichen Ladesäulen, bleiben unberücksichtigt, denn dafür gibt es keine Messwerte. > --- # Apps für Smartphone oder Tablet > SOLECTRUS ist eine PWA und lässt sich auf dem Home-Bildschirm ablegen. Danach läuft es im Vollbild, auf dem iPhone und iPad wie auf Android. SOLECTRUS ist eine **PWA** (Progressive Web App), also eine Webanwendung. Sie läuft auf jedem Gerät mit einem aktuellen Browser, auch auf iPhone, iPad und Android. Liegt SOLECTRUS auf dem Home-Bildschirm, blendet das Gerät die Browserumgebung aus und zeigt es im Vollbild. Eine native App für Android und iOS gibt es nicht. Geplant ist auch keine. ## iOS oder iPadOS 1. SOLECTRUS im Browser auf dem iPhone oder iPad öffnen 2. Auf das Teilen-Symbol tippen (Quadrat mit Pfeil nach oben) 3. _Zum Home-Bildschirm_ wählen und den Namen bestätigen ## Android 1. SOLECTRUS im Browser auf dem Smartphone oder Tablet öffnen 2. Auf die drei Punkte rechts oben tippen 3. _Zum Startbildschirm hinzufügen_ wählen und den Namen bestätigen --- # Architektur von SOLECTRUS > Woraus SOLECTRUS besteht: die Docker-Container vom Dashboard über die Datenbanken bis zu den Kollektoren, und was HELIOS davon verwaltet. SOLECTRUS ist **self-hosted**: Es läuft vollständig auf einem eigenen Server, meist einem kleinen Linux-Rechner im Haus. Einen SOLECTRUS-Cloud-Dienst gibt es nicht, die Anlagendaten bleiben dort, wo der Server steht. Technisch besteht SOLECTRUS aus mehreren Docker-Containern, die zusammenspielen. Einer davon nimmt eine Sonderrolle ein: **HELIOS**, eine Web-App, die alle anderen Container im Browser installiert und konfiguriert. Mehr dazu unter [HELIOS](#helios). ![Architektur von SOLECTRUS](@assets/architektur.svg) > **Direkt zur Installation** > > > Der [Ablauf der Installation](/docs/referenz/helios/#helios-installieren) ist bei HELIOS beschrieben. Diese Seite erklärt vorher, woraus SOLECTRUS besteht. > ## Die Komponenten Jede Komponente läuft in einem eigenen Docker-Container, einzeln installiert werden sie aber nicht – das erledigt HELIOS. Ein Überblick hilft trotzdem beim Lesen der Protokolle und beim Nachschlagen in der [Referenz](/docs/referenz/). Zu den Diensten gehören: - [Dashboard-App](/docs/referenz/dashboard/), der Hauptbestandteil mit der Benutzeroberfläche - [InfluxDB](/docs/referenz/influxdb/), die Zeitreihendatenbank für Messwerte - [PostgreSQL](/docs/referenz/postgresql/), die Datenbank für alle anderen Daten (z.B. Strompreise, Einstellungen und Aggregationen in Form von Tageszusammenfassungen) - [Redis](/docs/referenz/redis/), eine In-Memory-Datenbank, in der das Dashboard seinen Cache ablegt - Verschiedene _Kollektoren_, mit denen Messwerte eingesammelt werden. Der [SENEC-Collector](/docs/referenz/senec-collector/) ruft beispielsweise Daten vom SENEC-Speicher ab, der [MQTT-Collector](/docs/referenz/mqtt-collector/) holt sie von einem MQTT-Broker. Stromzähler liest der [Shelly-Collector](/docs/referenz/shelly-collector/) aus. Ein [Forecast-Collector](/docs/referenz/forecast-collector/) sagt die PV-Erzeugung voraus. - [CSV-Importer](/docs/referenz/csv-importer/), der historische Messwerte im CSV-Format einmalig nach InfluxDB überträgt. Ihn startet HELIOS nur auf Anforderung. - [Power-Splitter](/docs/referenz/power-splitter/), der die Aufteilung des Netzbezugs auf verschiedene Verbraucher berechnet - [Ingest](/docs/referenz/ingest/), der die Messwerte der Kollektoren entgegennimmt und daraus den Hausverbrauch neu berechnet - [Watchtower](/docs/referenz/watchtower/), der neue Versionen der Docker-Images einspielt Die Container sind per Docker Compose in einem Netzwerk verbunden und kommunizieren untereinander. Dazu kommt [Traefik](https://traefik.io/) als Reverse Proxy, sobald das Dashboard unter einer eigenen Domain erreichbar sein soll. Traefik holt dann auch das HTTPS-Zertifikat. Welche Kollektoren dabei sind, hängt von den angebundenen Geräten ab. HELIOS nimmt genau die auf, die zur Konfiguration passen. Den Ingest etwa nur dann, wenn ein Erzeuger als Balkonkraftwerk markiert ist, die Kollektoren auf demselben Server laufen und kein Sensor seine Werte aus einer externen Quelle bezieht. Daneben gibt es den [Tibber-Collector](/docs/referenz/tibber-collector/) für Strompreise und den [SENEC-Charger](/docs/referenz/senec-charger/) für die netzgeführte Beladung eines SENEC-Speichers. Diese beiden richtet HELIOS nicht ein, sie laufen nur in bestehenden Installationen weiter. ## HELIOS [HELIOS](/docs/referenz/helios/) ist eine Web-App, über die die gesamte Installation und Konfiguration im Browser läuft. Ein einziger Befehl im Terminal holt HELIOS auf den Server, alles Weitere geschieht in der Oberfläche: HELIOS installiert die übrigen Container, richtet sie anhand der Konfiguration ein und hält sie aktuell. HELIOS gehört dabei selbst zu den Diensten, die es verwaltet, und läuft als eigener Container mit. Die Gesamtheit aller Dienste wird durch zwei Dateien beschrieben: `compose.yaml` und `.env`. Beide schreibt HELIOS und erzeugt sie nach jeder Änderung im Browser neu. Ein manuelles Bearbeiten ist weder erforderlich noch wäre es sinnvoll, da die Dateien von HELIOS automatisch erzeugt und immer wieder überschrieben werden. ## Referenz Jede Komponente wird über Umgebungsvariablen konfiguriert. Welche davon nötig sind und welche Werte sie bekommen, leitet HELIOS aus der Konfiguration ab. Die [Referenz](/docs/referenz/) beschreibt sie dennoch alle. Dort steht, was die einzelnen Variablen bewirken und was die Dienste tun. Das hilft beim Nachvollziehen einer bestehenden Installation und bei der Fehlersuche. --- # Systemvoraussetzungen für SOLECTRUS > Ein Linux-Server, der rund um die Uhr läuft, ab 1 GB Arbeitsspeicher. Welche Geräte sich anbinden lassen und was außer Raspberry Pi in Frage kommt. SOLECTRUS braucht einen kleinen Linux-Server, der rund um die Uhr läuft. Dazu kommt die Photovoltaik-Anlage oder ein Balkonkraftwerk, deren Messwerte es einsammelt. Stromspeicher, Wärmepumpe und Wallbox sind optional. ## Linux-Server Der Server läuft unter **64-Bit-Linux**, rund um die Uhr (24/7). Prozessor-Architektur: **AMD64** oder **ARM64**. Diese Anforderungen sollte er erfüllen: | Ressource | Minimum | Empfohlen | | -------------------------- | ------- | --------- | | Arbeitsspeicher | 1 GB | 2 GB | | Freier Festplattenspeicher | 1 GB | 5 GB | Gemeint ist der gesamte Arbeitsspeicher des Servers, nicht der gerade freie. Unter 1 GB bricht die Installation ab, unter 2 GB warnt sie. Der Festplattenbedarf wächst mit der Zeit, denn die Messwerte werden dauerhaft gespeichert. Das Installationsverzeichnis gehört deshalb auf eine Platte mit ausreichend Platz. [Docker](https://www.docker.com/) muss nicht vorinstalliert sein. Fehlt es, richtet [HELIOS](/docs/referenz/helios/) es bei der Installation mit ein. Frei sein müssen außerdem diese Ports: | Port | Wofür | | :--------- | :--------------------------------------------------------------------------- | | `3999` | HELIOS | | `3000` | Dashboard (Standardwert, in HELIOS änderbar) | | `80`+`443` | Nur mit eigener Domain, für den Reverse Proxy [Traefik](https://traefik.io/) | > **Empfehlung** > > > Ein **Raspberry Pi 5** mit 8 GB RAM läuft gut. Ein Pi 3 oder 4 wird ebenfalls unterstützt. Bei einer Neuanschaffung ist ein **Mini-PC** die bessere Wahl. > > In beiden Fällen gehören die Daten auf eine **SSD**. Die Datenbanken schreiben rund um die Uhr, eine SD-Karte macht das nicht lange mit. > > Auf einem Mini-PC bietet sich **Proxmox VE** als Unterbau an. SOLECTRUS läuft dann in einem eigenen LXC-Container, getrennt von allem anderen auf dem Gerät. Eine VM braucht es dafür nicht. > ## Anbindung per MQTT [MQTT](https://de.wikipedia.org/wiki/MQTT) ist ein Nachrichtenprotokoll, kein Geräteprotokoll. Ein Gerät liest SOLECTRUS darüber nicht aus. Es braucht eine Software, die das Gerät abfragt und die Messwerte auf einem MQTT-Broker veröffentlicht. Der [MQTT-Collector](/docs/referenz/mqtt-collector/) abonniert dann die Topics des Brokers. Diese Software ist in der Regel [Home Assistant](https://www.home-assistant.io/) oder [ioBroker](https://www.iobroker.net/). Beide bringen Integrationen bzw. Adapter für Wechselrichter, Stromspeicher, Wallboxen, Wärmepumpen und E-Autos mit und können deren Messwerte per MQTT weiterreichen. Auch [evcc](https://evcc.io) veröffentlicht seine Messwerte auf einem Broker. Dort entscheidet sich also, ob ein Gerät angebunden werden kann: Gibt es dafür eine Integration oder einen Adapter, kommen die Werte auch in SOLECTRUS an. Den Broker selbst (etwa Mosquitto) braucht es zusätzlich; Home Assistant führt ihn als Add-on, ioBroker als Adapter. ## Anbindung ohne MQTT Home Assistant und ioBroker können ihre Messwerte auch ohne Broker liefern. Sie schreiben sie dann selbst in die [InfluxDB](/docs/referenz/influxdb/) von SOLECTRUS. Dafür gibt es die [Home-Assistant-Integration](https://github.com/solectrus/ha-integration) und einen [ioBroker-Adapter](https://github.com/patricknitsch/ioBroker.solectrus-influxdb) aus der Community. ## Stromspeicher von SENEC SOLECTRUS unterstützt außerdem nativ die Stromspeicher **SENEC.Home V2.1 und V3**, deren Messwerte über eine proprietäre Schnittstelle lokal ausgelesen werden. Auch der **SENEC.Home 4** wird unterstützt – per Anbindung an `mein-senec.de`. ## Shelly-Stromzähler Stromzähler von **Shelly** (z.B. Plug oder Pro 3EM) liest SOLECTRUS ebenfalls direkt aus, lokal im Netzwerk oder über die Shelly-Cloud. Siehe [Shelly-Collector](/docs/referenz/shelly-collector/). ## Installation in der Cloud SOLECTRUS muss nicht zu Hause laufen. Mit einem SENEC-Speicher ist eine **reine Cloud-Installation** möglich, bei der die Messwerte von `mein-senec.de` abgerufen werden. Ein lokaler Server ist dann überflüssig. Getestet wurde SOLECTRUS unter anderem in diesen Umgebungen: - Virtueller Server in der [Hetzner-Cloud](https://www.hetzner.com/cloud/) mit 2 vCPUs und 4 GB RAM. - Virtueller Server von [Strato](https://www.strato.de/server/linux-vserver/) mit 1 vCPU und 2 GB RAM, zusammen mit [evcc](https://evcc.io/). ## Verteilte Installation Denkbar ist auch eine Aufteilung auf zwei Server: Die Kollektoren laufen zu Hause und sammeln die Messwerte ein, Dashboard und Datenbanken laufen in der Cloud. So ist die [Live-Demo](https://demo.solectrus.de) aufgebaut. HELIOS kann das, verwaltet dabei aber jeweils **einen** Host. Es gehört also auf beide Server. Unter _Konfiguration → Grundeinstellungen → Betriebsmodus_ wird dann eingestellt, welche Dienste dort laufen: auf dem heimischen Server **Nur Kollektoren**, auf dem Cloud-Server **Nur Dashboard, Datenbanken und Zusatzdienste**. Die Kollektoren schreiben ihre Messwerte dann in die entfernte InfluxDB. > **Hinweis** > > > Das ist ein Spezialfall. Im Regelfall steht der Betriebsmodus auf **Dashboard, Datenbanken, Zusatzdienste und Kollektoren**, also alles auf einem Host. > ## Nicht unterstützte Geräte Auf diesen Geräten läuft SOLECTRUS nicht: - FritzBox - Apple TimeCapsule (geschlossenes System, Installation von Docker nicht möglich) - Alte Synology-NAS wie die DS216+ mit Linux-Kernel 3.x. Vorausgesetzt ist mindestens Kernel **4.x**. --- # Referenz zu allen Komponenten > Überblick über alle Dienste von SOLECTRUS, von den Kollektoren über die Datenbanken bis zum Dashboard, samt ihrer Umgebungsvariablen. SOLECTRUS besteht aus etlichen Komponenten, die jeweils als eigene Docker-Services betrieben werden. Konfiguriert werden sie über Umgebungsvariablen. Diese Referenz beschreibt jeden Dienst und jede seiner Variablen. > **Was davon muss eingestellt werden?** > > > Nichts davon von Hand. Die Einrichtung läuft über [HELIOS](/docs/referenz/helios/) im Browser. Aus der Konfiguration leitet HELIOS ab, welche Variablen nötig sind und welche Werte sie bekommen. > > Die Referenz erklärt, was diese Variablen bewirken. Das hilft bei der Fehlersuche und beim Verstehen einer bestehenden Installation. > ## Verwaltung Ein einziger Dienst richtet alle folgenden Komponenten ein und steuert sie: - [HELIOS](/docs/referenz/helios/): Schreibt `compose.yaml` und `.env` und steuert die Container ## Benutzeroberfläche Das browserbasierte Dashboard zeigt die Messwerte an und nimmt die Eingaben entgegen: - [Dashboard](/docs/referenz/dashboard/) ## Datensammlung (Kollektoren) Die Kollektoren sammeln die Messwerte kontinuierlich und schreiben sie in die Datenbank (InfluxDB): - [SENEC-Collector](/docs/referenz/senec-collector/) - [Tibber-Collector](/docs/referenz/tibber-collector/) - [MQTT-Collector](/docs/referenz/mqtt-collector/) - [Shelly-Collector](/docs/referenz/shelly-collector/) - [Forecast-Collector](/docs/referenz/forecast-collector/) ## Datenverarbeitung Einige Komponenten verarbeiten die gesammelten Daten weiter: - [Ingest](/docs/referenz/ingest/): Korrigiert den Hausverbrauch bei Balkonkraftwerken - [Power-Splitter](/docs/referenz/power-splitter/): Teilt den Netzbezug auf die einzelnen Verbraucher auf - [CSV-Importer](/docs/referenz/csv-importer/): Überträgt historische Messwerte einmalig nach InfluxDB ## Steuerung - [SENEC-Charger](/docs/referenz/senec-charger/): Lädt einen SENEC-Speicher zu günstigen Zeiten aus dem Netz ## Datenbanken Außerdem verwendet SOLECTRUS **drei** Datenbanken, die ebenfalls in eigenen Containern laufen: - [InfluxDB](/docs/referenz/influxdb/): Zeitreihendatenbank für Messwerte - [PostgreSQL](/docs/referenz/postgresql/): Relationale Datenbank für Einstellungen und Strompreise - [Redis](/docs/referenz/redis/): In-Memory-Datenbank für das Caching von Abfrageergebnissen ## Betrieb Dazu kommen zwei Dienste, die selbst keine Messwerte anfassen: - [Watchtower](/docs/referenz/watchtower/): Spielt neue Versionen der Docker-Images ein - [Traefik](https://traefik.io/): Reverse Proxy mit automatischem HTTPS. HELIOS richtet ihn nur ein, wenn das Dashboard unter einer eigenen Domain erreichbar sein soll. --- # Was ist der CSV-Importer? > Werkzeug, das historische Messwerte aus CSV-Dateien von SENEC, Sungrow und SolarEdge einmalig nach InfluxDB überträgt. Der **CSV-Importer** ist ein Werkzeug, das historische Messwerte im CSV-Format einmalig nach InfluxDB überträgt. Damit steht SOLECTRUS direkt nach der Installation ein Datenbestand zur Verfügung, statt erst ab dem ersten eigenen Messwert. Reichen die Daten bis zur Inbetriebnahme der PV-Anlage zurück, rechnet SOLECTRUS auch Kosten und Ersparnis für die Vergangenheit. ## Voraussetzungen - SOLECTRUS muss installiert und betriebsbereit sein - CSV-Dateien von einem der unterstützten Hersteller müssen vorliegen ## CSV-Dateien beschaffen Der CSV-Importer versteht die Datenformate der Stromspeicher und Wechselrichter von SENEC, Sungrow und SolarEdge. Die Hersteller-Portale liefern die passenden CSV-Dateien: - **SENEC:** [mein-senec.de](https://mein-senec.de) - **Sungrow:** [portaleu.isolarcloud.com](https://portaleu.isolarcloud.com) - **SolarEdge:** [monitoring.solaredge.com](https://monitoring.solaredge.com) > **Weitere Formate gesucht** > > > Der CSV-Importer wächst gern um Formate weiterer Hersteller. Dafür braucht es Beispieldaten, denn ein Format lässt sich nur anhand echter Exporte umsetzen und testen. > > Wer CSV-Dateien eines noch nicht unterstützten Herstellers beisteuern möchte, ist herzlich eingeladen, ein Issue anzulegen und am besten gleich eine Beispieldatei anzuhängen: \ > [github.com/solectrus/csv-importer/issues](https://github.com/solectrus/csv-importer/issues) > ## Quelltext Der CSV-Importer ist in Ruby implementiert, der Quelltext ist auf GitHub verfügbar: \ [github.com/solectrus/csv-importer](https://github.com/solectrus/csv-importer) --- # Ausführung des CSV-Importers > Historische Messwerte als CSV oder ZIP nach InfluxDB übertragen. Erkannt werden die Exporte von SENEC, Sungrow und SolarEdge an ihrer Kopfzeile. Der CSV-Importer läuft nur **einmalig**, er ist kein dauerhafter Dienst. ## Import starten In [HELIOS](/docs/referenz/helios/) steht er unter _Konfiguration → Datenquellen → Historische Daten importieren_. Dort werden die exportierten Dateien hochgeladen, einzeln als CSV oder gebündelt als ZIP-Archiv (empfohlen, maximal 100 MB). HELIOS entpackt sie und startet den Container. Um welches Format es sich handelt, erkennt der Importer selbst: Er liest die Kopfzeile jeder Datei und sucht darin die Spalten, die er kennt. Identische Datenpunkte werden überschrieben statt doppelt angelegt. Ein zweiter Import derselben Datei erzeugt also keine Dubletten. ## Unterstützte Formate Erwartet werden die Dateien so, wie der jeweilige Anbieter sie exportiert. Erkannt wird das Format an der Kopfzeile: | Quelle | Zeitspalte | Erkennungsmerkmal in der Kopfzeile | | :---------------------- | :--------- | :--------------------------------- | | SENEC (`mein-senec.de`) | `Uhrzeit` | `Netzbezug [kW]` bzw. `[kWh]` | | Sungrow (iSolarCloud) | `Zeit` | – | | SolarEdge (Monitoring) | `Time` | – | Beim SENEC-Export trennt ein Semikolon die Spalten, die Werte stehen in Kilowatt mit Komma als Dezimaltrennzeichen. Der Importer rechnet sie in Watt um. Die Spalte mit dem Ladestand des Speichers (`Akku Füllstand [%]`) darf fehlen. ```csv title="Beispiel (SENEC)" Uhrzeit;Stromerzeugung [kW];Netzbezug [kW];Netzeinspeisung [kW];Akku Füllstand [%] 01.03.2024 00:00:00;0,00;0,42;0,00;53,20 01.03.2024 00:05:00;0,00;0,39;0,00;52,80 ``` Die Zeitstempel liest der Importer in der Zeitzone, die `TZ` angibt. ## Nach dem Import Durch den Import kommen Messwerte aus der Vergangenheit dazu. Deshalb leert HELIOS anschließend den Redis-Cache und setzt die Tageszusammenfassungen zurück. Beides passiert automatisch. ## Umgebungsvariablen Diese Variablen wertet der CSV-Importer aus. Die sieben `INFLUX_SENSOR_*`-Variablen ordnen jeden Messwert einem Ziel in InfluxDB zu, in der Form `Measurement:Field`. Jede hat einen Standardwert, der zum SENEC-Speicher passt. Bei einem Tippfehler im Variablennamen greift dieser Standardwert. Der Import bricht dann nicht ab, sondern schreibt still auf das SENEC-Measurement. ### `INFLUX_HOST` Hostname des InfluxDB-Servers, in den der Importer die Messwerte schreibt. Läuft InfluxDB im selben Docker-Netzwerk, ist das der Name des Docker-Services, also `influxdb`. Es kann aber auch ein externer Server sein, etwa `influxdb.example.com`. Hier gehört nur der Host hin, **kein** `http://` oder `https://` und keine Portnummer. Ohne die Variable bricht der Importer beim Start ab, denn die URL, die er aus Schema, Host und Port zusammensetzt, ist dann ungültig. ```properties title="Beispiel" INFLUX_HOST=influxdb ``` > **HELIOS** > > > HELIOS setzt den Hostnamen automatisch auf den Namen des InfluxDB-Containers, also `influxdb`. Anders als die Collectoren schreibt der Importer auch bei aktivem [Ingest-Dienst](/docs/referenz/ingest/) direkt in InfluxDB. Nur bei einer externen InfluxDB fragt HELIOS den Hostnamen unter _Konfiguration → Grundeinstellungen → InfluxDB_ ab. > ### `INFLUX_SCHEMA` Schema für die Verbindung zu InfluxDB, `http` oder `https`. Standardwert ist `http`. Bei einer externen InfluxDB mit TLS gehört hier `https` hin. Ein anderer Wert lässt den Importer beim Start abbrechen. ```properties title="Beispiel" INFLUX_SCHEMA=https ``` > **HELIOS** > > > HELIOS setzt `http`, denn innerhalb des Docker-Netzwerks wird nicht verschlüsselt. Nur bei einer externen InfluxDB fragt HELIOS das Protokoll ab. > ### `INFLUX_PORT` Port für die Verbindung zu InfluxDB, eine Ganzzahl. Standardwert ist `8086`. Bei einer externen, per TLS abgesicherten InfluxDB ist es oft `443`. ```properties title="Beispiel" INFLUX_PORT=443 ``` > **HELIOS** > > > HELIOS setzt den Port automatisch: `8086`. Nur bei einer externen InfluxDB fragt HELIOS ihn ab. > ### `INFLUX_TOKEN_WRITE` Token, mit dem sich der Importer bei InfluxDB anmeldet. Er muss dort existieren und das Recht haben, in den angegebenen Bucket zu **schreiben**. Mehr braucht der Importer nicht: Er schickt Messwerte hin und liest nie etwas zurück. Alternativ liest der Importer den Token aus `INFLUX_TOKEN`. Gesetzt sein muss einer der beiden, `INFLUX_TOKEN_WRITE` hat Vorrang. Passt der Token nicht, weist InfluxDB den ersten Schreibzugriff ab und der Import bricht ab. ```properties title="Beispiel" INFLUX_TOKEN_WRITE=my-super-secret-write-token ``` > **HELIOS** > > > HELIOS gibt dem Importer den Schreib-Token, siehe [`INFLUX_TOKEN_WRITE`](/docs/referenz/helios/konfiguration/#influx_token_write). Einzustellen gibt es nichts. > ### `INFLUX_ORG` Organisation in InfluxDB, unter der die Messwerte gespeichert werden. In einer SOLECTRUS-Installation heißt sie `solectrus`. Der Name muss zu der Organisation passen, die in InfluxDB tatsächlich existiert. Sonst lehnt InfluxDB die Schreibzugriffe ab und der Import bricht ab. ```properties title="Beispiel" INFLUX_ORG=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen der vorhandenen Organisation ab. > ### `INFLUX_BUCKET` Bucket in InfluxDB, in den der Importer die Messwerte schreibt. Es muss derselbe sein, aus dem das Dashboard liest, sonst bleiben die importierten Zeiträume dort leer. In einer SOLECTRUS-Installation heißt er `solectrus`. ```properties title="Beispiel" INFLUX_BUCKET=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen des vorhandenen Buckets ab. > ### `INFLUX_SENSOR_INVERTER_POWER` Ziel für die Wechselrichterleistung. Standardwert ist `SENEC:inverter_power`. ```properties title="Beispiel" INFLUX_SENSOR_INVERTER_POWER=SENEC:inverter_power ``` > **HELIOS** > > > HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert. > ### `INFLUX_SENSOR_HOUSE_POWER` Ziel für den Hausverbrauch. Standardwert ist `SENEC:house_power`. Bei SolarEdge-Dateien steht der Hausverbrauch nicht im Export. Der Importer rechnet ihn aus Erzeugung, Netzbezug und Einspeisung aus. ```properties title="Beispiel" INFLUX_SENSOR_HOUSE_POWER=SENEC:house_power ``` > **HELIOS** > > > HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert. > ### `INFLUX_SENSOR_GRID_IMPORT_POWER` Ziel für den Netzbezug. Standardwert ist `SENEC:grid_power_plus`. ```properties title="Beispiel" INFLUX_SENSOR_GRID_IMPORT_POWER=SENEC:grid_power_plus ``` > **HELIOS** > > > HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert. > ### `INFLUX_SENSOR_GRID_EXPORT_POWER` Ziel für die Netzeinspeisung. Standardwert ist `SENEC:grid_power_minus`. ```properties title="Beispiel" INFLUX_SENSOR_GRID_EXPORT_POWER=SENEC:grid_power_minus ``` > **HELIOS** > > > HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert. > ### `INFLUX_SENSOR_BATTERY_CHARGING_POWER` Ziel für die Batterieladung. Standardwert ist `SENEC:bat_power_plus`. ```properties title="Beispiel" INFLUX_SENSOR_BATTERY_CHARGING_POWER=SENEC:bat_power_plus ``` > **HELIOS** > > > HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert. > ### `INFLUX_SENSOR_BATTERY_DISCHARGING_POWER` Ziel für die Batterieentladung. Standardwert ist `SENEC:bat_power_minus`. ```properties title="Beispiel" INFLUX_SENSOR_BATTERY_DISCHARGING_POWER=SENEC:bat_power_minus ``` > **HELIOS** > > > HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert. > ### `INFLUX_SENSOR_BATTERY_SOC` Ziel für den Ladestand des Speichers. Standardwert ist `SENEC:bat_fuel_charge`. Nur SENEC-Dateien enthalten den Ladestand, und auch dort ist die Spalte optional. Fehlt sie, überspringt der Importer den Sensor. Sungrow- und SolarEdge-Dateien liefern ihn gar nicht. ```properties title="Beispiel" INFLUX_SENSOR_BATTERY_SOC=SENEC:bat_fuel_charge ``` > **HELIOS** > > > HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert. > ### `INFLUX_OPEN_TIMEOUT` Zeitlimit für den Verbindungsaufbau zu InfluxDB, in Sekunden. Standardwert ist `30`. ```properties title="Beispiel" INFLUX_OPEN_TIMEOUT=60 ``` > **HELIOS** > > > HELIOS setzt die Variable nicht, es gilt der Standardwert. > ### `INFLUX_READ_TIMEOUT` Zeitlimit fürs Lesen von InfluxDB, in Sekunden. Standardwert ist `60`. ```properties title="Beispiel" INFLUX_READ_TIMEOUT=120 ``` > **HELIOS** > > > HELIOS setzt die Variable nicht, es gilt der Standardwert. > ### `INFLUX_WRITE_TIMEOUT` Zeitlimit fürs Schreiben nach InfluxDB, in Sekunden. Standardwert ist `30`. Der Importer schickt die Messwerte in Blöcken zu 500 Datenpunkten. Läuft ein Block in das Zeitlimit, versucht er es dreimal erneut, mit wachsender Wartezeit dazwischen. ```properties title="Beispiel" INFLUX_WRITE_TIMEOUT=60 ``` > **HELIOS** > > > HELIOS setzt die Variable nicht, es gilt der Standardwert. > ### `IMPORT_FOLDER` Ordner, in dem der Importer nach CSV-Dateien sucht, samt Unterordnern. Standardwert ist `/data`. ```properties title="Beispiel" IMPORT_FOLDER=/data ``` > **HELIOS** > > > HELIOS hängt die hochgeladenen Dateien als `/data` in den Container. Der Standardwert passt damit, HELIOS setzt die Variable nicht. > ### `IMPORT_PAUSE` Pause nach jeder importierten Datei, in Sekunden. Standardwert ist `0`, der Importer arbeitet die Dateien also ohne Unterbrechung ab. Ein größerer Wert entlastet eine InfluxDB auf schwacher Hardware, verlängert aber den Import. ```properties title="Beispiel" IMPORT_PAUSE=5 ``` > **HELIOS** > > > HELIOS setzt die Variable nicht, es gilt der Standardwert. > ### `SENEC_IGNORE` Messwerte, die der Importer **nicht** nach InfluxDB schreibt. Nötig, wenn einzelne Messwerte (etwa die Netzeinspeisung) aus einer anderen Quelle stammen. Ohne die Variable schreibt der Importer alle Messwerte. Einzutragen sind die **Field-Namen** aus der Sensor-Zuordnung, also etwa `grid_power_minus`, nicht der Sensorname `GRID_EXPORT_POWER`. Mehrere Felder werden durch Kommas getrennt, ohne Leerzeichen. Die Liste wirkt nur beim SENEC-Format, Sungrow- und SolarEdge-Dateien importiert der Importer vollständig. ```properties title="Beispiel" SENEC_IGNORE=grid_power_minus,bat_fuel_charge ``` > **HELIOS** > > > HELIOS leitet die Liste aus der Sensor-Konfiguration ab: Ein Feld landet darin, sobald eine andere Datenquelle in dasselbe Measurement und Field schreibt wie der SENEC-Collector. Einzustellen gibt es nichts. > ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `Europe/Berlin`. In dieser Zeitzone liest der Importer die Zeitstempel der CSV-Dateien. Die Portale exportieren sie ohne Zeitzonenangabe, ein falscher Wert verschiebt daher alle importierten Messwerte. Gespeichert werden sie anschließend wie immer in UTC. ```properties title="Beispiel" TZ=Europe/Rome ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`, und reicht sie an den Importer weiter. > --- # Was ist das Dashboard? > Die Web-Oberfläche von SOLECTRUS zeigt die Messwerte live und im Verlauf. Erreichbarkeit über Port 3000 und was der Dienst beim Start protokolliert. Das **Dashboard** ist die Web-Oberfläche von SOLECTRUS. Es zeigt die Messwerte an, live und im Verlauf. Erreichbar ist es über Port 3000, also beispielsweise unter `http://raspi:3000`. Der Port lässt sich in HELIOS ändern. Läuft das Dashboard unter einer eigenen Domain, veröffentlicht es keinen Port mehr, sondern liegt hinter dem Reverse Proxy. Das Dashboard greift auf alle drei Datenbanken zu: InfluxDB, PostgreSQL und Redis. ## Logging Das Dashboard schreibt ein Protokoll ins Docker-Log, das im Normalfall so aussieht: ```log SOLECTRUS Photovoltaic Dashboard Version v1.2.1, built on 2026-06-05T09:39:16+02:00 Using ruby 4.0.5 (2026-05-20 revision 64336ffd0e) +YJIT +PRISM [aarch64-linux-musl] Based on Alpine Linux 3.23.4 Copyright (C) 2020-2026 Georg Ledermann License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html ## Waiting for services... redis (172.19.0.2:6379) open Redis is up and running! influxdb (172.19.0.4:8086) open InfluxDB is up and running! postgresql (172.19.0.3:5432) open PostgreSQL is up and running! ## Preparing database... Database is ready! ## Starting Rails application... => Booting Puma => Rails 8.1.3 application starting in production => Run `bin/rails server --help` for more startup options Checked for update availability, valid for 720 minutes ───── SENSOR INITIALIZATION ────────────────────────────────────────────────── Configuration is up-to-date, no legacy conversion required ····· 19 CONFIGURED SENSORS ·················································· - Sensor CUSTOM_POWER_01 → Fridge:power - Sensor CUSTOM_POWER_02 → Dishwasher:power - Sensor GRID_EXPORT_LIMIT → SENEC:power_ratio - Sensor INVERTER_POWER_1 → SENEC:mpp1_power - Sensor INVERTER_POWER_2 → SENEC:mpp2_power - Sensor INVERTER_POWER_3 → SENEC:mpp3_power - Sensor BATTERY_CHARGING_POWER → SENEC:bat_power_plus - Sensor BATTERY_DISCHARGING_POWER → SENEC:bat_power_minus - Sensor BATTERY_SOC → SENEC:bat_fuel_charge - Sensor CASE_TEMP → SENEC:case_temp - Sensor GRID_EXPORT_POWER → SENEC:grid_power_minus - Sensor GRID_IMPORT_POWER → SENEC:grid_power_plus - Sensor HEATPUMP_POWER → Consumer:power - Sensor HOUSE_POWER → SENEC:house_power - Sensor INVERTER_POWER → SENEC:inverter_power - Sensor INVERTER_POWER_FORECAST → Forecast:watt - Sensor SYSTEM_STATUS → SENEC:current_state - Sensor WALLBOX_POWER → SENEC:wallbox_charge_power - Sensor SYSTEM_STATUS_OK → SENEC:current_state_ok HOUSE_POWER will be reduced by HEATPUMP_POWER Configuration unchanged, summaries still valid ────────────────────────────────────────────────────────────────────────────── Redis available, cache enabled [Influx::PollInterval] starting with interval=5s Puma starting in single mode... * Puma version: 8.0.2 ("Into the Arena") * Ruby version: ruby 4.0.5 (2026-05-20 revision 64336ffd0e) +YJIT +PRISM [aarch64-linux-musl] * Min threads: 3 * Max threads: 3 * Environment: production * PID: 1 * Listening on http://0.0.0.0:3000 Use Ctrl-C to stop ... ``` Fehler protokolliert das Dashboard ebenfalls. ## Quelltext SOLECTRUS ist in Ruby on Rails implementiert, der Quelltext ist auf GitHub verfügbar: \ [github.com/solectrus/solectrus](https://github.com/solectrus/solectrus) --- # Allgemeine Konfiguration des Dashboards > Alle Umgebungsvariablen des Dashboards, von der Zeitzone über die Zugänge zu den Datenbanken bis zum Farbschema. Das Dashboard wird über Umgebungsvariablen konfiguriert. ## Umgebungsvariablen ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `Europe/Berlin`. Sie bestimmt, wo ein Tag anfängt und aufhört. Diagramme, Statistiken und die Zeitraumauswahl richten sich danach. Eine falsche Zeitzone verschiebt also alle Tages- und Monatswerte. ```properties title="Beispiel" TZ=Europe/Rome ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > ### `CURRENCY` Währung für Preise, Kosten und Ersparnis, als ISO-4217-Code. Standardwert ist `EUR`. Kleinschreibung ist erlaubt, das Dashboard wandelt sie in Großbuchstaben. Version 1.2 wertet die Variable noch nicht aus. Sie wirkt erst in der Entwicklungsversion des Dashboards. ```properties title="Beispiel" CURRENCY=CHF ``` > **HELIOS** > > > HELIOS fragt die Währung unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit Euro. > ### `APP_HOST` Hostname, unter dem das Dashboard erreichbar ist. Hier gehört nur der Host hin, **kein** `http://` oder `https://` und keine Portnummer. Gesetzt wirkt die Variable als CORS-Freigabe: Nur Webseiten von diesem Ursprung dürfen Antworten des Dashboards im Browser auslesen. Der Server weist deshalb keine Anfragen ab, die Sperre setzt der Browser durch. Ohne die Variable bleibt das Auslesen für alle Ursprünge frei. ```properties title="Beispiel" APP_HOST=solectrus.example.com ``` > **HELIOS** > > > HELIOS fragt die Adresse unter _Konfiguration → Grundeinstellungen → Host_ ab. Bleibt das Feld leer, trägt HELIOS `localhost` ein. > ### `FORCE_SSL` Leitet jeden Aufruf auf HTTPS um. Erlaubt sind `true` und `false`, Standardwert ist `false`. Auf `true` gehört der Wert nur, wenn ein Reverse Proxy mit TLS-Zertifikat davorsteht. Sonst läuft die Umleitung ins Leere und das Dashboard ist nicht mehr erreichbar. ```properties title="Beispiel" FORCE_SSL=true ``` > **HELIOS** > > > HELIOS setzt den Wert automatisch: `true`, sobald es Traefik als Reverse Proxy einrichtet, sonst `false`. Einzustellen gibt es nichts. > ### `TRUSTED_PROXY_RANGES` Komma-getrennte Liste von IP-Bereichen in CIDR-Notation, die als vertrauenswürdige Proxies gelten. Ohne die Variable akzeptiert das Dashboard nur lokale und Docker-interne Adressen als Proxy. Nötig ist sie, wenn ein fremder Reverse Proxy davorsteht, etwa Cloudflare. Erst dann liest das Dashboard die echte Client-IP aus `X-Forwarded-For`, statt die des Proxys zu protokollieren. Verfügbar ab Dashboard-Version 1.1. ```properties title="Beispiel" TRUSTED_PROXY_RANGES=173.245.48.0/20,103.21.244.0/22 ``` > **HELIOS** > > > HELIOS fragt die Bereiche unter _Konfiguration → Grundeinstellungen → Eigene Domain_ ab. Das Feld erscheint erst, wenn dort eine eigene Domain eingerichtet ist. > ### `SECRET_KEY_BASE` Geheimer Schlüssel, mit dem das Dashboard die Session-Cookies signiert. Ohne ihn startet das Dashboard nicht. Erzeugt wird er etwa mit `openssl rand -hex 64`, das ergibt 128 Zeichen. Er muss geheim bleiben und sich nicht mehr ändern: Ein neuer Schlüssel entwertet alle Sessions, und wer mit [`ADMIN_PASSWORD`](#admin_password) oder [`LOCKUP_CODEWORD`](#lockup_codeword) angemeldet war, muss sich erneut anmelden. ```properties title="Beispiel" SECRET_KEY_BASE=6cce2d6cb3c86ae77f4a0471357830950b323eab4a99ee0e1b196dfd4767e6bf59c20c6404b64f66e67bdbd59aca37e9e2786d887010e16078d620e48186de88 ``` > **HELIOS** > > > HELIOS erzeugt den Schlüssel bei der Installation. Einzustellen gibt es nichts. > ### `WEB_CONCURRENCY` Anzahl der Web-Worker-Prozesse, eine Ganzzahl. Standardwert ist `0`, also ein einzelner Prozess ohne Worker. Mehr Worker bedienen mehr gleichzeitige Anfragen, brauchen aber jeweils eigenen Arbeitsspeicher. Für eine Handvoll Nutzer im Haushalt bringt das nichts. ```properties title="Beispiel" WEB_CONCURRENCY=3 ``` > **HELIOS** > > > HELIOS setzt fest `0`. Einzustellen gibt es nichts. > ### `ADMIN_PASSWORD` Passwort für den Administrator. Nur er kann sich über die Web-Oberfläche [anmelden](/docs/bedienung/administrator/) und dort Einstellungen vornehmen, etwa Strompreise pflegen. Ohne die Variable startet das Dashboard trotzdem. Eine Anmeldung als Administrator ist dann aber unmöglich, und die Strompreise bleiben unerreichbar. ```properties title="Beispiel" ADMIN_PASSWORD=my-super-secret-password ``` > **HELIOS** > > > HELIOS fragt das Passwort unter _Konfiguration → Grundeinstellungen → Zugriffsschutz_ ab und setzt die Variable immer. Bleibt das Feld leer, leitet HELIOS ein Passwort aus dem [`SECRET_KEY_BASE`](#secret_key_base) ab. > ### `INSTALLATION_DATE` Datum, an dem die PV-Anlage die ersten Erträge geliefert hat, im Format `YYYY-MM-DD`. Standardwert ist `2020-01-01`. Vor diesem Datum bietet die Navigation keine Zeiträume an. Ein zu früh gesetztes Datum füllt die Auswahl also mit leeren Jahren. ```properties title="Beispiel" INSTALLATION_DATE=2024-01-15 ``` > **HELIOS** > > > HELIOS fragt das Datum unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab. > ### `CO2_EMISSION_FACTOR` Faktor zur Berechnung der eingesparten CO₂-Menge, in g/kWh. Er beziffert, wie viel CO₂ eine Kilowattstunde aus dem Netz verursacht, entspricht also dem Strommix. Standardwert ist `401`, das ist der deutsche Strommix laut Umweltbundesamt. ```properties title="Beispiel" CO2_EMISSION_FACTOR=420 ``` > **HELIOS** > > > HELIOS fragt den Faktor unter _Konfiguration → Grundeinstellungen → CO₂-Faktor_ ab, vorbelegt mit `401`. > ### `LOCKUP_CODEWORD` Codewort, das die gesamte Web-Oberfläche sperrt. Ist es gesetzt, lässt sich das Dashboard erst nach Eingabe des Codeworts benutzen. Ohne die Variable bleibt die Oberfläche offen. Nötig ist es, wenn das Dashboard aus dem Internet erreichbar ist und niemand sonst die Messwerte sehen soll. Das Codewort ist nicht mit dem [`ADMIN_PASSWORD`](#admin_password) zu verwechseln, das nur die Einstellungen absichert. ```properties title="Beispiel" LOCKUP_CODEWORD=my-secret-codeword ``` > **HELIOS** > > > HELIOS fragt das Codewort unter _Konfiguration → Grundeinstellungen → Zugriffsschutz_ ab. > ### `FRAME_ANCESTORS` Ursprünge, die das Dashboard per `iframe` einbetten dürfen, komma-getrennt. Ohne die Variable verweigert das Dashboard jede Einbettung. Nötig ist sie, wenn das Dashboard in einer anderen Oberfläche erscheinen soll, etwa in Home Assistant. ```properties title="Beispiel" FRAME_ANCESTORS=https://example.com ``` > **HELIOS** > > > HELIOS fragt die URL unter _Konfiguration → Grundeinstellungen → Netzwerk_ ab. > ### `UI_THEME` Farbschema der Web-Oberfläche, `light` oder `dark`. Ist eines gesetzt, steht das Farbschema fest und lässt sich über die Oberfläche nicht mehr umschalten. Gedacht ist das für Displays ohne Bedienung, etwa Digital Signage. Ohne die Variable wählt der Benutzer selbst. Jeder andere Wert lässt das Dashboard beim Start abbrechen. ```properties title="Beispiel" UI_THEME=dark ``` > **HELIOS** > > > HELIOS fragt das Farbschema unter _Konfiguration → Grundeinstellungen → Farbschema_ ab, vorbelegt mit der freien Wahl durch den Benutzer. > ### `DB_HOST` Hostname des [PostgreSQL](/docs/referenz/postgresql/)-Servers. Läuft PostgreSQL im selben Docker-Netzwerk, ist das der Name des Docker-Services, also `postgresql`. ```properties title="Beispiel" DB_HOST=postgresql ``` > **HELIOS** > > > HELIOS setzt den Hostnamen automatisch auf `postgresql`. Einzustellen gibt es nichts. > ### `DB_USER` Benutzername für den Zugriff auf [PostgreSQL](/docs/referenz/postgresql/). ```properties title="Beispiel" DB_USER=postgres ``` > **HELIOS** > > > HELIOS setzt fest `postgres`. Einzustellen gibt es nichts. > ### `DB_PASSWORD` Passwort für den Zugriff auf [PostgreSQL](/docs/referenz/postgresql/). Es muss zu dem Passwort passen, mit dem die Datenbank angelegt wurde. ```properties title="Beispiel" DB_PASSWORD=my-postgres-password ``` > **HELIOS** > > > HELIOS erzeugt das Passwort bei der Installation und gibt Dashboard und Datenbank denselben Wert. Einzustellen gibt es nichts. > ### `REDIS_URL` URL für die Verbindung zu [Redis](/docs/referenz/redis/). Läuft Redis im selben Docker-Netzwerk, lautet sie `redis://redis:6379/1`. Das Dashboard hält darin seinen Cache und verteilt darüber die Live-Aktualisierung der Kacheln. Ohne Redis startet es zwar, aber die Werte aktualisieren sich nicht mehr von selbst. ```properties title="Beispiel" REDIS_URL=redis://redis:6379/1 ``` > **HELIOS** > > > HELIOS setzt fest `redis://redis:6379/1`. Einzustellen gibt es nichts. > ### `INFLUX_HOST` Hostname des [InfluxDB](/docs/referenz/influxdb/)-Servers. Läuft InfluxDB im selben Docker-Netzwerk, ist das der Name des Docker-Services, also `influxdb`. Es kann aber auch ein externer Server sein, etwa `influxdb.example.com`. ```properties title="Beispiel" INFLUX_HOST=influxdb ``` > **HELIOS** > > > HELIOS setzt den Hostnamen fest auf `influxdb`, auch bei aktivem [Ingest-Dienst](/docs/referenz/ingest/): Das Dashboard liest direkt aus InfluxDB, Ingest nimmt nur Schreibzugriffe entgegen. Eine externe InfluxDB lässt sich für das Dashboard nur außerhalb von HELIOS anbinden. > ### `INFLUX_SCHEMA` Schema für die Verbindung zu [InfluxDB](/docs/referenz/influxdb/), `http` oder `https`. Standardwert ist `http`. Bei einer externen InfluxDB mit TLS gehört hier `https` hin. ```properties title="Beispiel" INFLUX_SCHEMA=https ``` > **HELIOS** > > > HELIOS setzt fest `http`, denn innerhalb des Docker-Netzwerks wird nicht verschlüsselt. Einzustellen gibt es nichts. > ### `INFLUX_PORT` Port für die Verbindung zu [InfluxDB](/docs/referenz/influxdb/), eine Ganzzahl. Standardwert ist `8086`. Bei einer externen, per TLS abgesicherten InfluxDB ist es oft `443`. ```properties title="Beispiel" INFLUX_PORT=443 ``` > **HELIOS** > > > HELIOS setzt fest `8086`. Einzustellen gibt es nichts. > ### `INFLUX_ORG` Organisation in [InfluxDB](/docs/referenz/influxdb/), unter der die Messwerte liegen. In einer SOLECTRUS-Installation heißt sie `solectrus`. Der Name muss zu der Organisation passen, die in InfluxDB tatsächlich existiert, und zu der, in die die Collectors schreiben. Passt er nicht, liest das Dashboard ins Leere und die Kurven bleiben leer. ```properties title="Beispiel" INFLUX_ORG=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor. Einzustellen gibt es nichts. > ### `INFLUX_BUCKET` Bucket in [InfluxDB](/docs/referenz/influxdb/), aus dem das Dashboard die Messwerte liest. Eine SOLECTRUS-Installation kommt mit einem einzigen aus, er heißt `solectrus`. Der Name muss zu dem Bucket passen, in den die Collectors schreiben. Passt er nicht, bleiben die Kurven leer. ```properties title="Beispiel" INFLUX_BUCKET=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor. Einzustellen gibt es nichts. > ### `INFLUX_TOKEN` Token, mit dem sich das Dashboard bei InfluxDB anmeldet. Er muss dort existieren und das Recht haben, aus dem angegebenen Bucket zu **lesen**. Mehr braucht das Dashboard nicht: Es holt Messwerte und schreibt nie welche zurück. Passt der Token nicht, weist InfluxDB jede Abfrage ab. Das Dashboard läuft dann weiter, protokolliert aber Fehler, und die Kurven bleiben leer. ```properties title="Beispiel" INFLUX_TOKEN=my-super-secret-read-token ``` > **HELIOS** > > > HELIOS gibt dem Dashboard den Lese-Token, siehe [`INFLUX_TOKEN_READ`](/docs/referenz/helios/konfiguration/#influx_token_read). Schreib- oder Admin-Zugriff bekommt es nicht. > ### `INFLUX_POLL_INTERVAL` > **Wird ignoriert** > > > Diese Variable wird seit Dashboard-Version 1.2 ignoriert. Das Abfrageintervall ermittelt das Dashboard selbst aus dem Alter der eingehenden Messwerte. Steht sie noch in der Konfiguration, protokolliert das Dashboard beim Start eine Warnung. Sie kann ersatzlos entfallen. > ## Sensor-Konfiguration Welcher Messwert in der InfluxDB welchem Sensor des Dashboards zugeordnet wird, steht auf einer eigenen Seite: \ [Sensor-Konfiguration des Dashboards](/docs/referenz/dashboard/sensor-konfiguration/). --- # Sensor-Konfiguration des Dashboards > Welcher Messwert in der InfluxDB welchem Sensor des Dashboards zugeordnet wird, und wie die Zuordnung geschrieben wird. [InfluxDB](/docs/referenz/influxdb/) speichert die Messwerte als Zeitreihen. Jeder Messwert gehört zu einem **Measurement** und einem **Field**. SOLECTRUS abstrahiert davon und kennt stattdessen **Sensoren**, jeder mit einem eindeutigen Namen. Eine Umgebungsvariable je Sensor legt fest, wo in der InfluxDB seine Messwerte liegen. Die Zuordnung folgt einer festen Schreibweise: Measurement und Field, getrennt durch einen Doppelpunkt. Steht die PV-Erzeugung im Measurement _SENEC_ und dort im Field _inverter_power_, sieht der Eintrag so aus: ```properties INFLUX_SENSOR_INVERTER_POWER=SENEC:inverter_power ``` Measurement und Field sind **case-sensitive**: InfluxDB unterscheidet Groß- und Kleinschreibung. Zeigen zwei Sensoren auf dieselbe Stelle in der InfluxDB, setzt das Dashboard eine Warnung ins Protokoll. ## Pflicht und Standardwerte Keine dieser Variablen ist Pflicht, und keine hat einen Standardwert. Sensoren, für die keine Messwerte vorliegen (etwa mangels Wärmepumpe), bleiben einfach weg. Eine leere Zuordnung wie `INFLUX_SENSOR_HEATPUMP_POWER=` hat dieselbe Wirkung, nötig ist sie aber nicht. Was fehlt, zeigt das Dashboard nicht an. Ohne `INFLUX_SENSOR_BATTERY_SOC` gibt es keinen Ladestand, ohne `INFLUX_SENSOR_HOUSE_POWER` keinen Hausverbrauch. > **Alte Konfiguration** > > > Bis zur Einführung der Sensoren im Sommer 2024 wurde das Dashboard über feste SENEC-Messwerte konfiguriert. Solche Installationen laufen unverändert weiter. HELIOS stellt die alte Konfiguration beim Import automatisch auf Sensoren um. > ## Verfügbare Sensoren Die von SOLECTRUS unterstützten Sensoren lassen sich in verschiedene Kategorien einteilen. Jeder Sensor ist mit seiner Umgebungsvariablen verlinkt. ### Wechselrichter | Sensor-Name | Einheit | | ----------------------------------------------------- | -------------------- | | [INVERTER_POWER](#influx_sensor_inverter_power) | Watt | | [INVERTER_POWER_1](#influx_sensor_inverter_power_x) | Watt | | [INVERTER_POWER_2](#influx_sensor_inverter_power_x) | Watt | | [INVERTER_POWER_3](#influx_sensor_inverter_power_x) | Watt | | [INVERTER_POWER_4](#influx_sensor_inverter_power_x) | Watt | | [INVERTER_POWER_5](#influx_sensor_inverter_power_x) | Watt | | [GRID_IMPORT_POWER](#influx_sensor_grid_import_power) | Watt | | [GRID_EXPORT_POWER](#influx_sensor_grid_export_power) | Watt | | [GRID_EXPORT_LIMIT](#influx_sensor_grid_export_limit) | Prozent | | [CASE_TEMP](#influx_sensor_case_temp) | °C | | [SYSTEM_STATUS](#influx_sensor_system_status) | Text | | [SYSTEM_STATUS_OK](#influx_sensor_system_status_ok) | Logisch (True/False) | ### Stromspeicher | Sensor-Name | Einheit | | --------------------------------------------------------------------- | ------- | | [BATTERY_SOC](#influx_sensor_battery_soc) | Prozent | | [BATTERY_CHARGING_POWER](#influx_sensor_battery_charging_power) | Watt | | [BATTERY_DISCHARGING_POWER](#influx_sensor_battery_discharging_power) | Watt | ### Verbraucher | Sensor-Name | Einheit | | ------------------------------------------------- | ------- | | [HOUSE_POWER](#influx_sensor_house_power) | Watt | | [HEATPUMP_POWER](#influx_sensor_heatpump_power) | Watt | | [CUSTOM_POWER_01](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_02](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_03](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_04](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_05](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_06](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_07](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_08](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_09](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_10](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_11](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_12](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_13](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_14](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_15](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_16](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_17](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_18](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_19](#influx_sensor_custom_power_xx) | Watt | | [CUSTOM_POWER_20](#influx_sensor_custom_power_xx) | Watt | ### Wallbox und E-Auto | Sensor-Name | Einheit | | ------------------------------------------------------------- | -------------------- | | [WALLBOX_POWER](#influx_sensor_wallbox_power) | Watt | | [WALLBOX_CAR_CONNECTED](#influx_sensor_wallbox_car_connected) | Logisch (True/False) | | [CAR_BATTERY_SOC](#influx_sensor_car_battery_soc) | Prozent | ### Wärmepumpe | Sensor-Name | Einheit | | ------------------------------------------------------------------------- | ------- | | [HEATPUMP_HEATING_POWER](#influx_sensor_heatpump_heating_power) | Watt | | [HEATPUMP_TANK_TEMP](#influx_sensor_heatpump_tank_temp) | °C | | [HEATPUMP_TANK_TEMP_SETPOINT](#influx_sensor_heatpump_tank_temp_setpoint) | °C | | [HEATPUMP_STATUS](#influx_sensor_heatpump_status) | Text | | [OUTDOOR_TEMP](#influx_sensor_outdoor_temp) | °C | ### Prognosen | Sensor-Name | Einheit | | ----------------------------------------------------------------------------------- | ------- | | [INVERTER_POWER_FORECAST](#influx_sensor_inverter_power_forecast) | Watt | | [INVERTER_POWER_FORECAST_CLEARSKY](#influx_sensor_inverter_power_forecast_clearsky) | Watt | | [OUTDOOR_TEMP_FORECAST](#influx_sensor_outdoor_temp_forecast) | °C | ## Umgebungsvariablen Die Variablen beginnen alle mit dem Präfix `INFLUX_SENSOR_`, gefolgt vom eindeutigen Sensor-Namen. HELIOS schreibt die Zuordnungen selbst. Unter _Konfiguration → Sensoren_ wird ein Sensor aktiviert und ihm eine Quelle zugewiesen, etwa der SENEC- oder der MQTT-Collector. Measurement und Field ergeben sich daraus. Nur bei der Quelle „Externe Quelle“ fragt HELIOS beides ab, denn dann schreibt ein Programm außerhalb von SOLECTRUS in die InfluxDB. ### `INFLUX_SENSOR_INVERTER_POWER` PV-Erzeugung als Leistung des Wechselrichters, in Watt. Gemeint ist die Gesamterzeugung, also inklusive etwaiger Steckersolargeräte oder separat betriebener Wechselrichter. Gibt es keinen solchen Gesamtwert, bleibt die Variable weg. Das Dashboard addiert dann die Werte der einzelnen Wechselrichter (`INFLUX_SENSOR_INVERTER_POWER_X`) selbst. ```properties title="Beispiel" INFLUX_SENSOR_INVERTER_POWER=SENEC:inverter_power ``` > **HELIOS** > > > Als Quelle stehen der SENEC-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_INVERTER_POWER_X` Leistung eines einzelnen Erzeugers in Watt, wobei `X` für eine Zahl zwischen `1` und `5` steht. Nötig sind diese Variablen nur, wenn Messwerte für einzelne Wechselrichter oder Strings vorliegen. ```properties title="Beispiel" INFLUX_SENSOR_INVERTER_POWER_1=SENEC:mpp1_power INFLUX_SENSOR_INVERTER_POWER_2=SENEC:mpp2_power INFLUX_SENSOR_INVERTER_POWER_3=SENEC:mpp3_power INFLUX_SENSOR_INVERTER_POWER_4=balcony:power INFLUX_SENSOR_INVERTER_POWER_5= ``` > **HELIOS** > > > Als Quelle stehen der Shelly-, der MQTT-Collector und eine externe Quelle zur Wahl, für die ersten drei Erzeuger zusätzlich der SENEC-Collector. Wer einen der Erzeuger als Steckersolargerät markiert, bekommt von HELIOS zusätzlich den [Ingest-Dienst](/docs/referenz/ingest/), der den Hausverbrauch korrigiert. > ### `INFLUX_SENSOR_HOUSE_POWER` Hausverbrauch in Watt. ```properties title="Beispiel" INFLUX_SENSOR_HOUSE_POWER=SENEC:house_power ``` > **HELIOS** > > > Als Quelle stehen der SENEC-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_GRID_IMPORT_POWER` Strombezug aus dem Netz in Watt. ```properties title="Beispiel" INFLUX_SENSOR_GRID_IMPORT_POWER=SENEC:grid_power_plus ``` > **HELIOS** > > > Als Quelle stehen der SENEC-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_GRID_EXPORT_POWER` Stromabgabe ins Netz (Einspeisung) in Watt. ```properties title="Beispiel" INFLUX_SENSOR_GRID_EXPORT_POWER=SENEC:grid_power_minus ``` > **HELIOS** > > > Als Quelle stehen der SENEC-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_BATTERY_CHARGING_POWER` Ladeleistung des Stromspeichers in Watt. ```properties title="Beispiel" INFLUX_SENSOR_BATTERY_CHARGING_POWER=SENEC:bat_power_plus ``` > **HELIOS** > > > Als Quelle stehen der SENEC-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_BATTERY_DISCHARGING_POWER` Entladeleistung des Stromspeichers in Watt. ```properties title="Beispiel" INFLUX_SENSOR_BATTERY_DISCHARGING_POWER=SENEC:bat_power_minus ``` > **HELIOS** > > > Als Quelle stehen der SENEC-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_BATTERY_SOC` Ladestand des Stromspeichers in Prozent. ```properties title="Beispiel" INFLUX_SENSOR_BATTERY_SOC=SENEC:bat_fuel_charge ``` > **HELIOS** > > > Als Quelle stehen der SENEC-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_WALLBOX_POWER` Ladeleistung der Wallbox in Watt. ```properties title="Beispiel" INFLUX_SENSOR_WALLBOX_POWER=SENEC:wallbox_charge_power ``` > **HELIOS** > > > Als Quelle stehen der SENEC-, der Shelly-, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_CASE_TEMP` Gehäusetemperatur des Wechselrichters oder Stromspeichers in °C. ```properties title="Beispiel" INFLUX_SENSOR_CASE_TEMP=SENEC:case_temp ``` > **HELIOS** > > > Als Quelle stehen der SENEC-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_INVERTER_POWER_FORECAST` Prognostizierte PV-Erzeugung in Watt. ```properties title="Beispiel" INFLUX_SENSOR_INVERTER_POWER_FORECAST=Forecast:watt ``` > **HELIOS** > > > Als Quelle stehen der [Forecast-Collector](/docs/referenz/forecast-collector/) und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_INVERTER_POWER_FORECAST_CLEARSKY` Höchstmögliche PV-Erzeugung bei wolkenlosem Himmel, in Watt. Verfügbar ab Dashboard-Version 1.0. ```properties title="Beispiel" INFLUX_SENSOR_INVERTER_POWER_FORECAST_CLEARSKY=Forecast:watt_clearsky ``` > **HELIOS** > > > Als Quelle stehen der [Forecast-Collector](/docs/referenz/forecast-collector/) und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_OUTDOOR_TEMP_FORECAST` Prognostizierte Außentemperatur in °C. Verfügbar ab Dashboard-Version 1.0. ```properties title="Beispiel" INFLUX_SENSOR_OUTDOOR_TEMP_FORECAST=Forecast:temp ``` > **HELIOS** > > > Als Quelle stehen der [Forecast-Collector](/docs/referenz/forecast-collector/) und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_SYSTEM_STATUS` Systemstatus als Text, etwa eine Fehlermeldung des Wechselrichters. ```properties title="Beispiel" INFLUX_SENSOR_SYSTEM_STATUS=SENEC:current_state ``` > **HELIOS** > > > Als Quelle stehen der SENEC-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_SYSTEM_STATUS_OK` Kennzeichnung, ob der Systemstatus als „in Ordnung“ gilt. Der Wert ist logisch: `true` zeigt einen grünen Punkt, `false` einen orangefarbenen. ```properties title="Beispiel" INFLUX_SENSOR_SYSTEM_STATUS_OK=SENEC:current_state_ok ``` > **HELIOS** > > > Als Quelle stehen der SENEC-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_GRID_EXPORT_LIMIT` Einspeiseleistungsbegrenzung in Prozent. Gemeint ist nicht die Obergrenze, sondern die in einem einzelnen Moment gerade wirksame Begrenzung. Manche Wechselrichter liefern diesen Wert. ```properties title="Beispiel" INFLUX_SENSOR_GRID_EXPORT_LIMIT=SENEC:power_ratio ``` > **HELIOS** > > > Als Quelle stehen der SENEC-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_HEATPUMP_POWER` Stromverbrauch der Wärmepumpe in Watt. ```properties title="Beispiel" INFLUX_SENSOR_HEATPUMP_POWER=heatpump:power ``` > **HELIOS** > > > Als Quelle stehen der Shelly-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_HEATPUMP_HEATING_POWER` Erzeugte Wärmeleistung der Wärmepumpe in Watt. Das ist die **thermische** Leistung, die die Wärmepumpe abgibt, nicht ihr Stromverbrauch. Verfügbar ab Dashboard-Version 1.0. Zusammen mit `INFLUX_SENSOR_HEATPUMP_POWER` berechnet das Dashboard daraus die Arbeitszahl. ```properties title="Beispiel" INFLUX_SENSOR_HEATPUMP_HEATING_POWER=heatpump:heating_power ``` > **HELIOS** > > > Als Quelle stehen der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_HEATPUMP_STATUS` Status der Wärmepumpe als Text, etwa „Heizen“ oder „Warmwasser“. Verfügbar ab Dashboard-Version 1.0. ```properties title="Beispiel" INFLUX_SENSOR_HEATPUMP_STATUS=heatpump:status ``` > **HELIOS** > > > Als Quelle stehen der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_OUTDOOR_TEMP` Außentemperatur in °C, gemessen von der Wärmepumpe. Verfügbar ab Dashboard-Version 1.0. ```properties title="Beispiel" INFLUX_SENSOR_OUTDOOR_TEMP=heatpump:outdoor_temp ``` > **HELIOS** > > > Als Quelle stehen der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_HEATPUMP_TANK_TEMP` Temperatur des Warmwasserspeichers der Wärmepumpe in °C. Verfügbar ab Dashboard-Version 1.0. ```properties title="Beispiel" INFLUX_SENSOR_HEATPUMP_TANK_TEMP=heatpump:tank_temp ``` > **HELIOS** > > > Als Quelle stehen der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_HEATPUMP_TANK_TEMP_SETPOINT` Solltemperatur des Warmwasserspeichers der Wärmepumpe in °C. Verfügbar ab Dashboard-Version 1.2. ```properties title="Beispiel" INFLUX_SENSOR_HEATPUMP_TANK_TEMP_SETPOINT=heatpump:tank_temp_setpoint ``` > **HELIOS** > > > Als Quelle stehen der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_WALLBOX_CAR_CONNECTED` Kennzeichnung, ob das E-Auto an der Wallbox steckt. Der Wert ist logisch, also `true` oder `false`. ```properties title="Beispiel" INFLUX_SENSOR_WALLBOX_CAR_CONNECTED=Wallbox:car_connected ``` > **HELIOS** > > > Als Quelle stehen der SENEC-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_CAR_BATTERY_SOC` Ladestand des E-Autos in Prozent. ```properties title="Beispiel" INFLUX_SENSOR_CAR_BATTERY_SOC=Trabant:soc ``` > **HELIOS** > > > Als Quelle stehen der MQTT-Collector und eine externe Quelle zur Wahl. > ### `INFLUX_SENSOR_CUSTOM_POWER_XX` Stromverbrauch eines benutzerdefinierten Sensors in Watt, wobei `XX` für eine Zahl zwischen `01` und `20` steht. Damit lassen sich einzelne Verbraucher im Haushalt erfassen, etwa Waschmaschine oder Kühlschrank. Ein benutzerdefinierter Sensor bekommt ein eigenes Segment in der Strombilanz. ```properties title="Beispiel" INFLUX_SENSOR_CUSTOM_POWER_01=Fridge:power INFLUX_SENSOR_CUSTOM_POWER_02=Dishwasher:power INFLUX_SENSOR_CUSTOM_POWER_03=Washer:power # ... ``` > **HELIOS** > > > Als Quelle stehen der Shelly-Collector, der MQTT-Collector und eine externe Quelle zur Wahl. > ## Hausverbrauch korrigieren ### `INFLUX_EXCLUDE_FROM_HOUSE_POWER` Sensoren, deren Leistung aus dem Hausverbrauch herausgerechnet wird, als komma-getrennte Liste von Sensor-Namen. Die Namen stehen dort ohne das Präfix `INFLUX_SENSOR_`. Nötig ist das, wenn der Hausverbrauch die Leistung der Wärmepumpe, der Wallbox oder anderer Verbraucher bereits enthält. Ohne die Korrektur zählt ihre Leistung doppelt. ```properties title="Beispiel" INFLUX_EXCLUDE_FROM_HOUSE_POWER=HEATPUMP_POWER,WALLBOX_POWER ``` Auch benutzerdefinierte Sensoren gehören hierher: ```properties title="Beispiel" INFLUX_EXCLUDE_FROM_HOUSE_POWER=WALLBOX_POWER,CUSTOM_POWER_02,CUSTOM_POWER_08 ``` Ein Name, den SOLECTRUS nicht kennt, lässt das Dashboard beim Start abbrechen. Ist [`INFLUX_SENSOR_HOUSE_POWER`](#influx_sensor_house_power) nicht konfiguriert, bleibt die Variable wirkungslos. > **HELIOS** > > > HELIOS setzt die Variable selbst zusammen. Bei Wärmepumpe, Wallbox und benutzerdefinierten Sensoren gibt es unter _Konfiguration → Sensoren_ den Schalter _Aus Hausverbrauch herausrechnen_, standardmäßig aus. > --- # Was ist der Forecast-Collector? > Der Forecast-Collector holt die Ertragsprognose der PV-Anlage von Forecast.Solar, Solcast oder pvnode und schreibt sie in die InfluxDB. Der **Forecast-Collector** ermittelt den erwarteten Ertrag der PV-Anlage über die Anbieter [Forecast.Solar](https://forecast.solar), [Solcast](https://solcast.com) oder [pvnode](https://pvnode.com) und schreibt diesen in die InfluxDB. Der Ertrag ergibt sich aus Wetterdaten und der Anlagenkonfiguration. Folgende Parameter sind erforderlich: - Standort der Anlage (Längen- und Breitengrad) - Anzahl, Ausrichtung, Neigung und maximale Leistung (in kWp) der Dachflächen Jeder Anbieter rechnet mit einem eigenen Modell. Die Genauigkeit der Prognosen unterscheidet sich entsprechend. Zur Nutzung ist bei Solcast und pvnode eine (kostenfreie) Registrierung erforderlich. Bei Solcast liegen die Anlagendaten im Solcast-Portal, bei pvnode ab der API v2 ebenfalls beim Anbieter. Nur bei Forecast.Solar (und bei pvnode v1) werden sie direkt im Collector konfiguriert. Alle drei Anbieter bieten auch eine kostenpflichtige Variante an. ## Erfasste Messwerte Der Collector schreibt die folgenden Messwerte als _Field_ in das angegebene _Measurement_ der InfluxDB: | Field | Beschreibung | Anbieter | | :-------------- | :--------------------------------------------- | :------------ | | `watt` | Erwarteter Ertrag, in W | Alle | | `watt_clearsky` | Erwarteter Ertrag bei wolkenlosem Himmel, in W | nur pvnode | | `watt_nosnow` | Erwarteter Ertrag ohne Schneebedeckung, in W | nur pvnode v1 | | `temp` | Temperatur, in °C | nur pvnode | | `humidity` | Relative Luftfeuchte, in % | nur pvnode v2 | | `weather_code` | Wettercode (WMO-Standard) | nur pvnode | ## Logging Der Collector schreibt ein Protokoll ins Docker-Log, das im Normalfall so aussieht: ```log Forecast collector for SOLECTRUS, Version v0.10.0, built at 2026-07-10T09:48:01.254Z https://github.com/solectrus/forecast-collector Copyright (c) 2020-2026 Georg Ledermann, released under the MIT License Using Ruby 4.0.5 on platform x86_64-linux-musl Pulling from pvnode (v2) in Nowcast mode (every 10 min during daylight, slot-based at night) Pushing to InfluxDB at http://influxdb:8086, bucket solectrus, measurement Forecast Wait until InfluxDB is ready ... OK #1 Fetching forecast at 2026-07-13T20:01:19+02:00 0: https://api.pvnode.com/v2/forecast/site_xxxxxxxxxxxxxxxxxxxx?include=default&include=clearsky&include=weather&forecast_days=7&past_days=0 ... OK Pushing forecast to InfluxDB ... OK Sleeping until 2026-07-13 20:04:00 +0200 ... ... ``` Bei pvnode steht dort kein Intervall, denn der Collector bestimmt die Abrufzeitpunkte selbst. Bei Forecast.Solar und Solcast steht stattdessen `every seconds`. Fehler protokolliert der Collector ebenfalls, etwa wenn der Anbieter nicht erreichbar ist oder den API-Key nicht akzeptiert. ## Quelltext Der Forecast-Collector ist in Ruby implementiert, der Quelltext ist auf GitHub verfügbar: \ [github.com/solectrus/forecast-collector](https://github.com/solectrus/forecast-collector) --- # Allgemeine Konfiguration > Umgebungsvariablen, die für alle Anbieter des Forecast-Collectors gelten – Anbieterwahl, InfluxDB-Zugang und Zeitzone. Der Forecast-Collector wird über Umgebungsvariablen konfiguriert. Die Variablen auf dieser Seite gelten für jeden Anbieter. Welche weiteren nötig sind, hängt an `FORECAST_PROVIDER`: [Forecast.Solar](/docs/referenz/forecast-collector/konfiguration-forecast-solar/), [Solcast](/docs/referenz/forecast-collector/konfiguration-solcast/) oder [pvnode](/docs/referenz/forecast-collector/konfiguration-pvnode/). ## Umgebungsvariablen ### `FORECAST_PROVIDER` Anbieter, der die Ertragsprognose liefert. Erlaubt sind `forecast.solar`, `solcast` und `pvnode`. Standardwert ist `forecast.solar`. Jeder andere Wert bricht den Start ab, mit der Meldung `Unknown provider`. ```properties title="Beispiel" FORECAST_PROVIDER=pvnode ``` > **HELIOS** > > > HELIOS fragt den Anbieter unter _Konfiguration → Datenquellen → Forecast-Collector_ ab, vorbelegt mit `pvnode`. Ohne Auswahl lässt HELIOS den Collector weg. > ### `INFLUX_HOST` Hostname des InfluxDB-Servers. Läuft InfluxDB im selben Docker-Netzwerk, ist das der Name des Docker-Services, also `influxdb`. Es kann aber auch ein externer Server sein, etwa `influxdb.example.com`. ```properties title="Beispiel" INFLUX_HOST=influxdb ``` > **HELIOS** > > > HELIOS setzt den Hostnamen automatisch auf `influxdb`, auch bei aktivem [Ingest-Dienst](/docs/referenz/ingest/): Die Prognose geht am Ingest vorbei, denn sie fließt nicht in die Berechnung des Hausverbrauchs ein. Nur bei einer externen InfluxDB fragt HELIOS den Hostnamen unter _Konfiguration → Grundeinstellungen → InfluxDB_ ab. > ### `INFLUX_SCHEMA` Schema für die Verbindung zu InfluxDB, `http` oder `https`. Standardwert ist `http`. Bei einer externen InfluxDB mit TLS gehört hier `https` hin. ```properties title="Beispiel" INFLUX_SCHEMA=https ``` > **HELIOS** > > > HELIOS setzt das Schema nicht, es bleibt beim Standardwert `http`. Innerhalb des Docker-Netzwerks wird nicht verschlüsselt. Nur bei einer externen InfluxDB fragt HELIOS das Protokoll ab. > ### `INFLUX_PORT` Port für die Verbindung zu InfluxDB, eine Ganzzahl. Standardwert ist `8086`. Bei einer externen, per TLS abgesicherten InfluxDB ist es oft `443`. ```properties title="Beispiel" INFLUX_PORT=443 ``` > **HELIOS** > > > HELIOS setzt den Port nicht, es bleibt beim Standardwert `8086`. Nur bei einer externen InfluxDB fragt HELIOS ihn ab. > ### `INFLUX_TOKEN` Token, mit dem sich der Collector bei InfluxDB anmeldet. Er muss dort existieren und das Recht haben, in den angegebenen Bucket zu **schreiben**. Mehr braucht der Collector nicht: Er schickt die Prognose hin und liest nie etwas zurück. Passt der Token nicht, weist InfluxDB jeden Schreibzugriff ab. Der Collector läuft dann weiter, protokolliert aber Fehler, und im Dashboard bleibt die Prognosekurve leer. ```properties title="Beispiel" INFLUX_TOKEN=my-super-secret-write-token ``` > **HELIOS** > > > HELIOS gibt dem Collector den Schreib-Token, siehe [`INFLUX_TOKEN_WRITE`](/docs/referenz/helios/konfiguration/#influx_token_write). Lese- oder Admin-Zugriff bekommt er nicht. > ### `INFLUX_ORG` Organisation in InfluxDB, unter der die Prognose gespeichert wird. Eine Organisation ist der Mandant, dem Benutzer, Buckets und Tokens gehören. InfluxDB legt sie [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. In einer SOLECTRUS-Installation heißt sie `solectrus`. Der Name muss zu der Organisation passen, die in InfluxDB tatsächlich existiert. Ein anderer Wert benennt sie nicht um, er lässt den Collector nur ins Leere schreiben. ```properties title="Beispiel" INFLUX_ORG=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen der vorhandenen Organisation ab. > ### `INFLUX_BUCKET` Bucket in InfluxDB, in den der Collector die Prognose schreibt. Ein Bucket ist das, was anderswo die Datenbank wäre: ein benannter Speicher mit eigener Aufbewahrungsdauer. Auch ihn legt InfluxDB [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. Eine SOLECTRUS-Installation kommt mit einem einzigen aus, er heißt `solectrus`. Der Name muss zu dem Bucket passen, der in InfluxDB existiert, und zu dem, aus dem das Dashboard liest. Gibt es ihn nicht, lehnt InfluxDB die Schreibzugriffe ab. ```properties title="Beispiel" INFLUX_BUCKET=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen des vorhandenen Buckets ab. > ### `INFLUX_MEASUREMENT` Measurement in InfluxDB, unter dem die Prognose landet. Alle [Felder der Prognose](/docs/referenz/forecast-collector/) liegen in diesem einen Measurement. Standardwert ist `Forecast`. Groß- und Kleinschreibung ist dabei nicht egal: `Forecast` und `forecast` sind für InfluxDB zwei verschiedene Measurements. Ein nachträglicher Wechsel ist kaum möglich, denn die bereits geschriebenen Werte bleiben an den alten Namen gebunden — das Dashboard liest sie dort nicht mehr. ```properties title="Beispiel" INFLUX_MEASUREMENT=Forecast ``` > **HELIOS** > > > HELIOS setzt das Measurement immer, vorbelegt mit `forecast`. Ändern lässt es sich unter _Konfiguration → Datenquellen → Forecast-Collector_. > ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `UTC`. Sie betrifft ausschließlich die Zeitstempel im Protokoll des Collectors. Die Prognose selbst speichert InfluxDB immer in UTC, daran ändert `TZ` nichts. ```properties title="Beispiel" TZ=Europe/Berlin ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > --- # Konfiguration für Forecast.Solar > Umgebungsvariablen des Forecast-Collectors für den Anbieter Forecast.Solar – Standort, Dachflächen, Abfrageintervall und API-Key. Diese Seite beschreibt die Umgebungsvariablen für den Anbieter [Forecast.Solar](https://forecast.solar). Standort und Dachflächen stehen hier in der Konfiguration des Collectors, nicht beim Anbieter. Dazu kommen die [allgemeinen Einstellungen](/docs/referenz/forecast-collector/allgemeine-konfiguration/), allen voran `FORECAST_PROVIDER=forecast.solar`. ## Vollständiges Beispiel ```properties title=".env" # Anbieter FORECAST_PROVIDER=forecast.solar # Zeitzone TZ=Europe/Berlin # Standort FORECAST_LATITUDE=50.12345 FORECAST_LONGITUDE=6.12345 # Dachflächen FORECAST_CONFIGURATIONS=2 # Erste Dachfläche (nach Süden) FORECAST_0_DECLINATION=30 FORECAST_0_AZIMUTH=0 FORECAST_0_KWP=5.5 # Zweite Dachfläche (nach Westen) FORECAST_1_DECLINATION=30 FORECAST_1_AZIMUTH=90 FORECAST_1_KWP=3.9 # Abfrageintervall FORECAST_INTERVAL=900 # Optional: API-Key für kostenpflichtiges Abo # FORECAST_SOLAR_APIKEY=abc123def456 # Optional: Dämpfungsfaktoren (0 bis 1) # FORECAST_DAMPING_MORNING=0.5 # FORECAST_DAMPING_EVENING=0.5 # Optional: Horizontprofil # FORECAST_HORIZON=5,10,15,20,25,30 # Optional: Wechselrichter-Begrenzung in Kilowatt # FORECAST_INVERTER=8 # InfluxDB INFLUX_HOST=influxdb INFLUX_SCHEMA=http INFLUX_PORT=8086 INFLUX_TOKEN=my-super-secret-write-token INFLUX_ORG=solectrus INFLUX_BUCKET=solectrus INFLUX_MEASUREMENT=Forecast ``` ## Standort ### `FORECAST_LATITUDE` Breitengrad des Standorts der PV-Anlage, `-90` (Süd) bis `90` (Nord). Dezimaltrennzeichen ist der Punkt. ```properties title="Beispiel" FORECAST_LATITUDE=50.12345 ``` > **HELIOS** > > > HELIOS fragt den Breitengrad unter _Konfiguration → Datenquellen → Forecast-Collector_ ab und setzt ihn immer. > ### `FORECAST_LONGITUDE` Längengrad des Standorts der PV-Anlage, `-180` (West) bis `180` (Ost). Dezimaltrennzeichen ist der Punkt. ```properties title="Beispiel" FORECAST_LONGITUDE=6.12345 ``` > **HELIOS** > > > HELIOS fragt den Längengrad unter _Konfiguration → Datenquellen → Forecast-Collector_ ab und setzt ihn immer. > ## Dachflächen Neigung, Ausrichtung und Leistung gibt es zweimal: ohne Index als globalen Wert und mit Index je Dachfläche. Der indizierte Wert gewinnt, der globale springt für jede Dachfläche ein, die keinen eigenen hat. Bei einer einzelnen Dachfläche genügen deshalb die globalen Variablen. ### `FORECAST_CONFIGURATIONS` Anzahl der Dachflächen. Standardwert ist `1`. Für jede Dachfläche fragt der Collector Forecast.Solar einzeln ab und addiert die Prognosen. Steht hier eine zu kleine Zahl, bleiben die Angaben der übrigen Dachflächen unbeachtet — `FORECAST_1_KWP` etwa wirkt erst ab `FORECAST_CONFIGURATIONS=2`. ```properties title="Beispiel" FORECAST_CONFIGURATIONS=2 ``` > **HELIOS** > > > HELIOS fragt die Anzahl der Dachflächen unter _Konfiguration → Datenquellen → Forecast-Collector_ ab, höchstens vier. Bei einer einzelnen Dachfläche lässt HELIOS die Variable weg. Der Collector selbst kennt keine Obergrenze. > ### `FORECAST_DECLINATION` Neigung des Dachs in Grad, `0` (waagerecht) bis `90` (senkrecht). Der Wert gilt für jede Dachfläche, die keine eigene [`FORECAST_X_DECLINATION`](#forecast_x_declination) hat. Bei einer einzelnen Dachfläche ist er damit Pflicht. ```properties title="Beispiel" FORECAST_DECLINATION=30 ``` > **HELIOS** > > > HELIOS fragt die Neigung unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bei mehreren Dachflächen setzt HELIOS stattdessen die indizierten Varianten. > ### `FORECAST_AZIMUTH` Ausrichtung des Dachs in Grad, von Süden gezählt: `-180` ist Nord, `-90` Ost, `0` Süd, `90` West, `180` wieder Nord. Der Wert gilt für jede Dachfläche, die keine eigene [`FORECAST_X_AZIMUTH`](#forecast_x_azimuth) hat. Bei einer einzelnen Dachfläche ist er damit Pflicht. pvnode zählt anders, nämlich von Norden (`0` bis `360`). Wer den Anbieter wechselt, muss die Ausrichtung umrechnen. ```properties title="Beispiel" FORECAST_AZIMUTH=10 ``` > **HELIOS** > > > HELIOS fragt die Ausrichtung unter _Konfiguration → Datenquellen → Forecast-Collector_ ab, in derselben Zählweise. Den Wert für pvnode hält HELIOS getrennt davon. > ### `FORECAST_KWP` Installierte Modulleistung in Kilowatt-Peak (kWp). Der Wert gilt für jede Dachfläche, die keine eigene [`FORECAST_X_KWP`](#forecast_x_kwp) hat. Bei einer einzelnen Dachfläche ist er damit Pflicht. ```properties title="Beispiel" FORECAST_KWP=9.24 ``` > **HELIOS** > > > HELIOS fragt die Leistung unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bei mehreren Dachflächen setzt HELIOS stattdessen die indizierten Varianten. > ### `FORECAST_X_DECLINATION` Neigung der Dachfläche `X`, gezählt ab `0`. Pflicht, sobald mehr als eine Dachfläche konfiguriert ist. Fehlt sie, greift der globale Wert aus [`FORECAST_DECLINATION`](#forecast_declination). ```properties title="Beispiel" FORECAST_0_DECLINATION=27 FORECAST_1_DECLINATION=30 ``` > **HELIOS** > > > HELIOS setzt die indizierten Variablen, sobald mehr als eine Dachfläche eingetragen ist. > ### `FORECAST_X_AZIMUTH` Ausrichtung der Dachfläche `X`, gezählt ab `0`. Wertebereich wie bei [`FORECAST_AZIMUTH`](#forecast_azimuth), also von Süden gezählt. Pflicht, sobald mehr als eine Dachfläche konfiguriert ist. Fehlt sie, greift der globale Wert. ```properties title="Beispiel" FORECAST_0_AZIMUTH=0 FORECAST_1_AZIMUTH=90 ``` > **HELIOS** > > > HELIOS setzt die indizierten Variablen, sobald mehr als eine Dachfläche eingetragen ist. > ### `FORECAST_X_KWP` Modulleistung der Dachfläche `X` in kWp, gezählt ab `0`. Pflicht, sobald mehr als eine Dachfläche konfiguriert ist. Fehlt sie, greift der globale Wert aus [`FORECAST_KWP`](#forecast_kwp) — beide Dachflächen bekämen dann dieselbe Leistung. ```properties title="Beispiel" FORECAST_0_KWP=5.5 FORECAST_1_KWP=3.9 ``` > **HELIOS** > > > HELIOS setzt die indizierten Variablen, sobald mehr als eine Dachfläche eingetragen ist. > ### Weitere Variablen je Dachfläche Auch die übrigen Angaben lassen sich je Dachfläche setzen. Fehlt eine davon, greift der globale Wert ohne Index. | Variable | Entspricht | | ---------------------------- | ------------------------------------------------------- | | `FORECAST_X_LATITUDE` | [`FORECAST_LATITUDE`](#forecast_latitude) | | `FORECAST_X_LONGITUDE` | [`FORECAST_LONGITUDE`](#forecast_longitude) | | `FORECAST_X_DAMPING_MORNING` | [`FORECAST_DAMPING_MORNING`](#forecast_damping_morning) | | `FORECAST_X_DAMPING_EVENING` | [`FORECAST_DAMPING_EVENING`](#forecast_damping_evening) | | `FORECAST_X_INVERTER` | [`FORECAST_INVERTER`](#forecast_inverter) | | `FORECAST_X_HORIZON` | [`FORECAST_HORIZON`](#forecast_horizon) | Nützlich ist das etwa, wenn eine Dachfläche verschattet ist (`HORIZON`) oder an einem eigenen Wechselrichter hängt (`INVERTER`). HELIOS setzt diese Variablen nicht, sie müssen von Hand eingetragen werden. ## Abfrageintervall ### `FORECAST_INTERVAL` Abstand zwischen zwei Abfragen in Sekunden, eine positive Ganzzahl. Fehlt die Variable oder steht dort keine positive Zahl, bricht der Collector beim Start ab. Forecast.Solar begrenzt die Abfragen: kostenlos sind es 12 pro Stunde, also frühestens alle 300 Sekunden, mit Personal-Abo 60 pro Stunde und damit alle 60 Sekunden. Der Collector fragt jede Dachfläche einzeln ab, das Limit teilt sich also auf: Bei zwei Dachflächen und kostenlosem Zugang sind mindestens 600 Sekunden nötig. ```properties title="Beispiel" FORECAST_INTERVAL=900 ``` > **HELIOS** > > > HELIOS fragt das Intervall unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bleibt das Feld leer, setzt HELIOS `900`. > ## Weitere Einstellungen ### `FORECAST_DAMPING_MORNING` Dämpft die Prognose für die Morgenstunden, `0` (keine Dämpfung) bis `1`. Standardwert ist `0`. Der Collector reicht den Wert unverändert an Forecast.Solar weiter. Nützlich, wenn die Anlage morgens verschattet ist und die Prognose regelmäßig zu hoch liegt. Was der Faktor genau bewirkt, beschreibt [Forecast.Solar](https://doc.forecast.solar/damping). ```properties title="Beispiel" FORECAST_DAMPING_MORNING=0.5 ``` > **HELIOS** > > > HELIOS fragt den Faktor unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bleibt das Feld leer, setzt HELIOS die Variable nicht. > ### `FORECAST_DAMPING_EVENING` Dämpft die Prognose für die Abendstunden, `0` (keine Dämpfung) bis `1`. Standardwert ist `0`. Ansonsten gilt dasselbe wie für [`FORECAST_DAMPING_MORNING`](#forecast_damping_morning). ```properties title="Beispiel" FORECAST_DAMPING_EVENING=0.5 ``` > **HELIOS** > > > HELIOS fragt den Faktor unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bleibt das Feld leer, setzt HELIOS die Variable nicht. > ### `FORECAST_HORIZON` Horizontprofil als komma-getrennte Liste von Höhenwinkeln in Grad. Die Werte verteilen sich gleichmäßig über die 360 Grad des Horizonts. Der Collector reicht sie unverändert an Forecast.Solar weiter, dessen [Dokumentation](https://doc.forecast.solar/api#horizon) das Format beschreibt. Ohne die Variable schickt der Collector kein Profil mit. Dann gilt, was Forecast.Solar von sich aus über den Horizont annimmt. ```properties title="Beispiel" FORECAST_HORIZON=0,0,0,0,0,0,10,20,20,20,20,20 ``` > **HELIOS** > > > HELIOS fragt das Horizontprofil unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bleibt das Feld leer, setzt HELIOS die Variable nicht. > ### `FORECAST_INVERTER` Maximale Wechselrichterleistung in **Kilowatt** (kW), so erwartet es Forecast.Solar. Ein Wechselrichter mit 8 kW Ausgangsleistung bekommt also `8`, nicht `8000`. Forecast.Solar deckelt die Prognose bei diesem Wert. Ohne die Variable deckelt es nichts, und die Prognose kann über der Wechselrichterleistung liegen. ```properties title="Beispiel" FORECAST_INVERTER=8 ``` > **HELIOS** > > > HELIOS fragt die Wechselrichterleistung unter _Konfiguration → Datenquellen → Forecast-Collector_ ab, in Kilowatt. Bleibt das Feld leer, setzt HELIOS die Variable nicht. > ### `FORECAST_SOLAR_APIKEY` API-Key eines kostenpflichtigen Kontos bei Forecast.Solar. Ist er gesetzt, laufen die Abfragen über das Konto und damit unter dessen höherem Limit. Ohne die Variable nutzt der Collector den kostenlosen Zugang, der auf 12 Abfragen pro Stunde begrenzt ist. ```properties title="Beispiel" FORECAST_SOLAR_APIKEY=abc123def456 ``` > **HELIOS** > > > HELIOS fragt den API-Key unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bleibt das Feld leer, setzt HELIOS die Variable nicht. > --- # Konfiguration für pvnode > Umgebungsvariablen des Forecast-Collectors für den Anbieter pvnode, für die Site-basierte API v2 und die ältere API v1. Diese Seite beschreibt die Umgebungsvariablen für den Anbieter [pvnode](https://pvnode.com). Der Forecast-Collector unterstützt den kostenlosen wie den kostenpflichtigen pvnode-Tarif. Dazu kommen die [allgemeinen Einstellungen](/docs/referenz/forecast-collector/allgemeine-konfiguration/), allen voran `FORECAST_PROVIDER=pvnode`. ## Zwei API-Varianten Der Forecast-Collector kann pvnode auf zwei Arten ansprechen: - **v2 (Site-basiert)**: Standort und PV-Strings liegen als _Site_ in der pvnode-Web-App. Sie wird dort einmalig von Hand angelegt, der Collector kann das nicht übernehmen. In der Konfiguration steht dann nur noch die ID dieser Site als [`PVNODE_SITE_ID`](#pvnode_site_id). Die Variablen für Standort, Dachflächen und `PVNODE_EXTRA_PARAMS` sind damit wirkungslos. - **v1 (Plane-basiert)**: Standort und Dachflächen stehen vollständig in den Umgebungsvariablen des Collectors. Das ist das bisherige Verhalten. > **v1 wird abgeschaltet** > > > pvnode stellt die v1-API zum **31.12.2026** ein. Wer pvnode nutzt, sollte bis dahin auf v2 umgestellt haben. > > Der Forecast-Collector beherrscht seit [v0.10.0](https://github.com/solectrus/forecast-collector/releases/tag/v0.10.0) beide Varianten. Bestehende Installationen laufen nach einem Update unverändert weiter; die Umstellung erfolgt, sobald eine Site angelegt ist. > ## Vollständiges Beispiel ```properties title=".env" # Anbieter FORECAST_PROVIDER=pvnode # Zeitzone TZ=Europe/Berlin # pvnode-Zugangsdaten PVNODE_APIKEY=pvn_my-secret-api-key # Site-ID aktiviert die API v2 PVNODE_SITE_ID=site_xxxxxxxxxxxxxxxxxxxxxx # Optional: Tarif des kostenpflichtigen pvnode-Kontos # PVNODE_PAID=true # oder # PVNODE_PAID=nowcast # Optional: Selbst gesetztes Monatslimit für Abfragen # PVNODE_REQUEST_LIMIT=500 # InfluxDB INFLUX_HOST=influxdb INFLUX_SCHEMA=http INFLUX_PORT=8086 INFLUX_TOKEN=my-super-secret-write-token INFLUX_ORG=solectrus INFLUX_BUCKET=solectrus INFLUX_MEASUREMENT=Forecast ``` Ohne `PVNODE_SITE_ID` läuft der Collector über die API v1. Standort und Dachflächen kommen dann aus den Variablen weiter unten: ```properties title=".env (API v1)" # Standort FORECAST_LATITUDE=50.12345 FORECAST_LONGITUDE=6.12345 # Anzahl der Dachflächen FORECAST_CONFIGURATIONS=2 # Erste Dachfläche (nach Süden) FORECAST_0_DECLINATION=30 FORECAST_0_AZIMUTH=180 FORECAST_0_KWP=5.5 # Zweite Dachfläche (nach Westen) FORECAST_1_DECLINATION=30 FORECAST_1_AZIMUTH=270 FORECAST_1_KWP=3.9 # Optional: Zusätzliche API-Parameter # PVNODE_EXTRA_PARAMS=diffuse_radiation_model=perez # Optional: Zusätzliche API-Parameter je Dachfläche # PVNODE_0_EXTRA_PARAMS=snow_slide_coefficient=0.5 # PVNODE_1_EXTRA_PARAMS=snow_slide_coefficient=0.3 ``` ## Zugangsdaten ### `PVNODE_APIKEY` API-Key des pvnode-Kontos. Er wird zuvor bei pvnode erstellt: \ https://pvnode.com/settings/api-keys Der Collector schickt ihn bei jeder Abfrage mit, unter beiden API-Varianten. Ohne gültigen Key weist pvnode die Abfrage ab, und im Dashboard bleibt die Prognosekurve leer. ```properties title="Beispiel" PVNODE_APIKEY=pvn_my-secret-api-key ``` > **HELIOS** > > > HELIOS fragt den API-Key unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. > ### `PVNODE_SITE_ID` ID der Site im pvnode-Konto. Ist sie gesetzt, spricht der Collector die API **v2** an. Verfügbar ab Version `0.10.0` des Forecast-Collectors. Die Site trägt den Standort und alle PV-Strings. Deshalb sind mit einer Site-ID sämtliche Variablen für Standort und Dachflächen wirkungslos, ebenso `PVNODE_EXTRA_PARAMS`. Ohne die Variable bleibt es bei der API v1, die pvnode Ende 2026 abschaltet. ```properties title="Beispiel" PVNODE_SITE_ID=site_xxxxxxxxxxxxxxxxxxxxxx ``` > **HELIOS** > > > HELIOS fragt die Site-ID unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bleibt das Feld leer, setzt HELIOS die Variable nicht und fragt stattdessen nach Standort und Dachflächen. > ### `PVNODE_PAID` Tarif des pvnode-Kontos. Erlaubt sind `false` für den Tarif **Free**, `true` für **Light** und `nowcast` für **Plus**. Groß- und Kleinschreibung spielt keine Rolle, jeder andere Wert gilt als `false`. Standardwert ist `false`. Der Collector erkennt den Tarif nicht selbst, er richtet seinen Abrufplan nach dem eingetragenen. Steht hier ein höherer Tarif als der tatsächlich abonnierte, fragt der Collector häufiger ab, als das Konto erlaubt. Die Folge sind Fehlermeldungen oder ein vorzeitig aufgebrauchtes Monatskontingent. ```properties title="Beispiel" PVNODE_PAID=nowcast ``` > **HELIOS** > > > HELIOS fragt den Tarif unter _Konfiguration → Datenquellen → Forecast-Collector_ ab, vorbelegt mit Free. Bei Free setzt HELIOS die Variable nicht, denn der Collector nimmt den kostenlosen Tarif ohnehin an. > Die Tarife unterscheiden sich in der Reichweite der Prognose: - **Free (`false`)**: Vorhersage für den morgigen Tag - **Light (`true`)**: Vorhersage für sieben Tage, stündlich aktualisiert - **Plus (`nowcast`)**: Vorhersage für sieben Tage, tagsüber alle 10 Minuten aktualisiert, nachts stündlich Wie viele Anfragen pro Monat ein Tarif umfasst, legt pvnode fest: [Preise und Tarife](https://pvnode.com/de#pricing). ## Abfrageintervall Ein Abfrageintervall gibt es bei pvnode nicht zu konfigurieren. `FORECAST_INTERVAL` wird ignoriert, und HELIOS setzt die Variable bei pvnode gar nicht erst. Der Collector bestimmt die Abrufzeitpunkte selbst, nach den Update-Zeiten von pvnode und dem monatlichen Kontingent an Abfragen. Das Kontingent kommt aus dem Tarif, sofern nicht [`PVNODE_REQUEST_LIMIT`](#pvnode_request_limit) ein kleineres vorgibt. Im Tarif Free ist das unter der API v2 ein Abruf pro Tag. Eine einzige Abfrage genügt dort, unabhängig von der Anzahl der PV-Strings. Unter der API v1 richtet sich der Collector zusätzlich nach der Anzahl der Dachflächen und den zusätzlichen Parametern. Er fasst gleiche Parameter zusammen und deckt, wenn möglich, mit einer Abfrage zwei Dachflächen ab. Das Kontingent teilt sich dabei auf die Abfragen auf: Braucht eine Vorhersage zwei getrennte Abfragen, bleibt im Tarif Free nur jeder zweite Tag übrig. ### `PVNODE_REQUEST_LIMIT` Selbst gesetztes Monatslimit für die Anzahl der Abfragen, als positive ganze Zahl. Ohne die Variable rechnet der Collector mit dem vollen Kontingent des Tarifs. Die Variable gilt für beide API-Varianten. Nützlich ist das Limit, wenn dasselbe pvnode-Konto noch andere Anwendungen bedient, etwa evcc oder Home Assistant. Der Collector bestimmt seine Abrufzeitpunkte weiterhin selbst, legt dabei aber das kleinere Kontingent zugrunde und fragt entsprechend seltener ab. Ein Wert oberhalb des Tarifkontingents bleibt wirkungslos. Der Collector meldet ihn beim Start als Warnung im Log. ```properties title="Beispiel" PVNODE_REQUEST_LIMIT=500 ``` > **HELIOS** > > > HELIOS fragt das Anfragelimit unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bleibt das Feld leer, setzt HELIOS die Variable nicht. > ## Nur bei API v1 Alles Weitere auf dieser Seite gilt nur ohne [`PVNODE_SITE_ID`](#pvnode_site_id), also für die klassische API v1. Mit einer Site liegen Standort und Dachflächen bei pvnode, der Collector holt sie dort ab. > **v1 wird abgeschaltet** > > > Neue Installationen starten gleich mit einer Site, denn pvnode schaltet die v1-API ab (siehe [Zwei API-Varianten](#zwei-api-varianten)). > ## Standort pvnode arbeitet mit einem monatlichen **Standort-Limit** (Site-Limit), das vom Tarif abhängt. Einen Standort speichert pvnode automatisch, sobald eine Abfrage mit Koordinaten eintrifft. > **Vorsicht bei der Angabe der Koordinaten** > > > pvnode speichert Standorte auf 5 Nachkommastellen genau. Bei jeder weiteren Abfrage müssen **exakt dieselben Koordinaten** kommen, damit pvnode sie dem bekannten Standort zuordnet. > > Geänderte Koordinaten, etwa wegen eines Tippfehlers, legen bei pvnode einen neuen Standort an. Im kostenlosen Tarif meldet pvnode dann `Site limit has been exceeded`. > > Die bereits verwendeten Standorte zeigt das [pvnode Studio](https://www.pvnode.com/studio) an (Klick auf die Karte oder _Standort auswählen_ → _Bereits verwendeten Standort auswählen_). Sie werden monatlich zurückgesetzt. > ### `FORECAST_LATITUDE` Breitengrad des Standorts der PV-Anlage, `-90` (Süd) bis `90` (Nord). Dezimaltrennzeichen ist der Punkt. Pflicht, solange keine [`PVNODE_SITE_ID`](#pvnode_site_id) gesetzt ist. ```properties title="Beispiel" FORECAST_LATITUDE=50.12345 ``` > **HELIOS** > > > HELIOS fragt den Breitengrad unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Mit einer Site-ID entfällt die Frage, HELIOS setzt die Variable dann nicht. > ### `FORECAST_LONGITUDE` Längengrad des Standorts der PV-Anlage, `-180` (West) bis `180` (Ost). Dezimaltrennzeichen ist der Punkt. Pflicht, solange keine [`PVNODE_SITE_ID`](#pvnode_site_id) gesetzt ist. ```properties title="Beispiel" FORECAST_LONGITUDE=6.12345 ``` > **HELIOS** > > > HELIOS fragt den Längengrad unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Mit einer Site-ID entfällt die Frage, HELIOS setzt die Variable dann nicht. > ## Dachflächen Neigung, Ausrichtung und Leistung gibt es zweimal: ohne Index als globalen Wert und mit Index je Dachfläche. Der indizierte Wert gewinnt, der globale springt für jede Dachfläche ein, die keinen eigenen hat. Bei einer einzelnen Dachfläche genügen deshalb die globalen Variablen. ### `FORECAST_CONFIGURATIONS` Anzahl der Dachflächen. Standardwert ist `1`. Steht hier eine zu kleine Zahl, bleiben die Angaben der übrigen Dachflächen unbeachtet — `FORECAST_1_KWP` etwa wirkt erst ab `FORECAST_CONFIGURATIONS=2`. pvnode nimmt bis zu zwei Dachflächen pro Abfrage entgegen. Der Collector fasst sie zusammen, sofern ihre zusätzlichen Parameter übereinstimmen. Sonst kostet jede Dachfläche eine eigene Abfrage aus dem Monatskontingent. ```properties title="Beispiel" FORECAST_CONFIGURATIONS=2 ``` > **HELIOS** > > > HELIOS fragt die Anzahl der Dachflächen unter _Konfiguration → Datenquellen → Forecast-Collector_ ab, höchstens vier. Bei einer einzelnen Dachfläche lässt HELIOS die Variable weg. Der Collector selbst kennt keine Obergrenze. > ### `FORECAST_DECLINATION` Neigung des Dachs in Grad, `0` (waagerecht) bis `90` (senkrecht). Der Wert gilt für jede Dachfläche, die keine eigene [`FORECAST_X_DECLINATION`](#forecast_x_declination) hat. Bei einer einzelnen Dachfläche ist er damit Pflicht. ```properties title="Beispiel" FORECAST_DECLINATION=30 ``` > **HELIOS** > > > HELIOS fragt die Neigung unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bei mehreren Dachflächen setzt HELIOS stattdessen die indizierten Varianten. > ### `FORECAST_AZIMUTH` Ausrichtung des Dachs in Grad, von Norden gezählt: `0` ist Nord, `90` Ost, `180` Süd, `270` West. Der Wert gilt für jede Dachfläche, die keine eigene [`FORECAST_X_AZIMUTH`](#forecast_x_azimuth) hat. Bei einer einzelnen Dachfläche ist er damit Pflicht. Forecast.Solar zählt anders, nämlich von Süden (`-180` bis `180`). Wer von dort kommt, muss die Ausrichtung umrechnen: Aus `0` (Süd) wird `180`. Bei Solcast wiederum spielt die Ausrichtung im Collector keine Rolle, sie steht in der Anlagenkonfiguration im Solcast-Portal. ```properties title="Beispiel" FORECAST_AZIMUTH=207 ``` > **HELIOS** > > > HELIOS fragt die Ausrichtung unter _Konfiguration → Datenquellen → Forecast-Collector_ ab, in der Zählweise von pvnode. Den Wert für Forecast.Solar hält HELIOS getrennt davon, ein Anbieterwechsel rechnet also nicht um. > ### `FORECAST_KWP` Installierte Modulleistung in Kilowatt-Peak (kWp). Der Wert gilt für jede Dachfläche, die keine eigene [`FORECAST_X_KWP`](#forecast_x_kwp) hat. Bei einer einzelnen Dachfläche ist er damit Pflicht. ```properties title="Beispiel" FORECAST_KWP=9.24 ``` > **HELIOS** > > > HELIOS fragt die Leistung unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bei mehreren Dachflächen setzt HELIOS stattdessen die indizierten Varianten. > ### `FORECAST_X_DECLINATION` Neigung der Dachfläche `X`, gezählt ab `0`. Pflicht, sobald mehr als eine Dachfläche konfiguriert ist. Fehlt sie, greift der globale Wert aus [`FORECAST_DECLINATION`](#forecast_declination). ```properties title="Beispiel" FORECAST_0_DECLINATION=27 FORECAST_1_DECLINATION=30 ``` > **HELIOS** > > > HELIOS setzt die indizierten Variablen, sobald mehr als eine Dachfläche eingetragen ist. > ### `FORECAST_X_AZIMUTH` Ausrichtung der Dachfläche `X`, gezählt ab `0`. Wertebereich wie bei [`FORECAST_AZIMUTH`](#forecast_azimuth), also von Norden gezählt. Pflicht, sobald mehr als eine Dachfläche konfiguriert ist. Fehlt sie, greift der globale Wert. ```properties title="Beispiel" FORECAST_0_AZIMUTH=180 FORECAST_1_AZIMUTH=270 ``` > **HELIOS** > > > HELIOS setzt die indizierten Variablen, sobald mehr als eine Dachfläche eingetragen ist. > ### `FORECAST_X_KWP` Modulleistung der Dachfläche `X` in kWp, gezählt ab `0`. Pflicht, sobald mehr als eine Dachfläche konfiguriert ist. Fehlt sie, greift der globale Wert aus [`FORECAST_KWP`](#forecast_kwp) — beide Dachflächen bekämen dann dieselbe Leistung. ```properties title="Beispiel" FORECAST_0_KWP=5.5 FORECAST_1_KWP=3.9 ``` > **HELIOS** > > > HELIOS setzt die indizierten Variablen, sobald mehr als eine Dachfläche eingetragen ist. > ### `PVNODE_EXTRA_PARAMS` Zusätzliche Query-Parameter für die pvnode-API, im Format `key1=value1&key2=value2`, ohne führendes `?` oder `&`. Der Collector hängt sie an jede Abfrage an. Welche Parameter es gibt, steht in der [pvnode-Dokumentation](https://www.pvnode.com/docs/de/forecast#optional-parameters). Die Parameter gelten für die gesamte Abfrage, nicht für eine einzelne Dachfläche. Deshalb landen zwei Dachflächen nur dann in einer gemeinsamen Abfrage, wenn ihre Parameter übereinstimmen. ```properties title="Beispiel" PVNODE_EXTRA_PARAMS=diffuse_radiation_model=perez&snow_slide_coefficient=0.5 ``` > **HELIOS** > > > HELIOS fragt die Parameter unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bleibt das Feld leer, setzt HELIOS die Variable nicht. Mit einer Site-ID entfällt die Frage. > ### `PVNODE_X_EXTRA_PARAMS` Zusätzliche Query-Parameter für die Dachfläche `X`, gezählt ab `0`. Sie ersetzen [`PVNODE_EXTRA_PARAMS`](#pvnode_extra_params) für diese Dachfläche, sie ergänzen es nicht. Nötig ist das nur, wenn sich die Dachflächen in den Parametern unterscheiden — was sie zugleich daran hindert, sich eine Abfrage zu teilen. ```properties title="Beispiel" PVNODE_0_EXTRA_PARAMS=diffuse_radiation_model=perez PVNODE_1_EXTRA_PARAMS=snow_slide_coefficient=0.3 ``` > **HELIOS** > > > HELIOS fragt die Parameter je Dachfläche unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bleibt ein Feld leer, setzt HELIOS die Variable nicht. > --- # Konfiguration für Solcast > Umgebungsvariablen des Forecast-Collectors für den Anbieter Solcast. Mehr als API-Key und Site-IDs braucht es nicht, der Rest liegt im Solcast-Portal. Diese Seite beschreibt die Umgebungsvariablen für den Anbieter [Solcast](https://solcast.com). Sie beschränken sich auf den API-Key und die Site-IDs. Standort, Ausrichtung und Leistung der Anlage liegen im Solcast-Portal, nicht in der Konfiguration des Collectors. Dazu kommen die [allgemeinen Einstellungen](/docs/referenz/forecast-collector/allgemeine-konfiguration/), allen voran `FORECAST_PROVIDER=solcast`. ## Vollständiges Beispiel ```properties title=".env" # Anbieter FORECAST_PROVIDER=solcast # Zeitzone TZ=Europe/Berlin # Solcast-Zugangsdaten SOLCAST_APIKEY=my-solcast-api-key # Dachflächen (Site-IDs aus dem Solcast-Portal) FORECAST_CONFIGURATIONS=2 SOLCAST_0_SITE=1111-1111-1111-1111 SOLCAST_1_SITE=2222-2222-2222-2222 # Abfrageintervall (zwei Dachflächen: 2 × 8640) FORECAST_INTERVAL=17280 # InfluxDB INFLUX_HOST=influxdb INFLUX_SCHEMA=http INFLUX_PORT=8086 INFLUX_TOKEN=my-super-secret-write-token INFLUX_ORG=solectrus INFLUX_BUCKET=solectrus INFLUX_MEASUREMENT=Forecast ``` ## API-Zugang ### `SOLCAST_APIKEY` API-Key des Solcast-Kontos, im Solcast-Dashboard unter _Your API key_ zu finden. Ohne gültigen Key weist Solcast jede Abfrage ab. Der Collector läuft dann weiter, protokolliert aber Fehler, und im Dashboard bleibt die Prognosekurve leer. ```properties title="Beispiel" SOLCAST_APIKEY=my-solcast-api-key ``` > **HELIOS** > > > HELIOS fragt den API-Key unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. > ## Dachflächen Eine Dachfläche entspricht bei Solcast einer _Rooftop Site_. Ihre ID steht im Solcast-Portal, die Anlagendaten dahinter ebenfalls. Der Collector kennt nur die ID. ### `FORECAST_CONFIGURATIONS` Anzahl der Dachflächen. Standardwert ist `1`. Für jede Dachfläche fragt der Collector Solcast einzeln ab und addiert die Prognosen. Steht hier eine zu kleine Zahl, bleiben die Site-IDs der übrigen Dachflächen unbeachtet — `SOLCAST_1_SITE` etwa wirkt erst ab `FORECAST_CONFIGURATIONS=2`. ```properties title="Beispiel" FORECAST_CONFIGURATIONS=2 ``` > **HELIOS** > > > HELIOS fragt die Anzahl der Dachflächen unter _Konfiguration → Datenquellen → Forecast-Collector_ ab, nimmt für Solcast aber höchstens zwei Site-IDs entgegen. Bei einer einzelnen Dachfläche lässt HELIOS die Variable weg. Der Collector selbst kennt keine Obergrenze, im kostenlosen Tarif setzt jedoch das Abfragelimit die Grenze. > ### `SOLCAST_SITE` ID der Dachfläche bei Solcast, im Format `xxxx-xxxx-xxxx-xxxx`. Der Wert gilt für jede Dachfläche, die keine eigene [`SOLCAST_X_SITE`](#solcast_x_site) hat. Bei einer einzelnen Dachfläche ist er damit Pflicht. ```properties title="Beispiel" SOLCAST_SITE=1111-1111-1111-1111 ``` > **HELIOS** > > > HELIOS fragt die Ressourcen-ID unter _Konfiguration → Datenquellen → Forecast-Collector_ ab und setzt die Variable immer. > ### `SOLCAST_X_SITE` ID der Dachfläche `X`, gezählt ab `0`, im Format `xxxx-xxxx-xxxx-xxxx`. Pflicht, sobald mehr als eine Dachfläche konfiguriert ist. Fehlt eine der indizierten Variablen, greift [`SOLCAST_SITE`](#solcast_site). Der Collector fragt dann still dieselbe Site zweimal ab und zählt ihre Prognose doppelt. ```properties title="Beispiel" SOLCAST_0_SITE=1111-1111-1111-1111 SOLCAST_1_SITE=2222-2222-2222-2222 ``` > **HELIOS** > > > HELIOS setzt `SOLCAST_0_SITE` und `SOLCAST_1_SITE`, sobald zwei Dachflächen eingetragen sind. > ## Abfrageintervall ### `FORECAST_INTERVAL` Abstand zwischen zwei Abfragen in Sekunden, eine positive Ganzzahl. Fehlt die Variable oder steht dort keine positive Zahl, bricht der Collector beim Start ab. Solcast erlaubt im kostenlosen Tarif 10 Abfragen pro Tag, also frühestens alle 8640 Sekunden. Der Collector fragt jede Dachfläche einzeln ab, das Limit teilt sich also auf: Bei zwei Dachflächen sind mindestens 17280 Sekunden nötig. ```properties title="Beispiel" FORECAST_INTERVAL=17280 ``` > **HELIOS** > > > HELIOS fragt das Intervall unter _Konfiguration → Datenquellen → Forecast-Collector_ ab. Bleibt das Feld leer, setzt HELIOS `900` — für den kostenlosen Solcast-Tarif viel zu wenig. > --- # Was ist HELIOS? > Was HELIOS auf dem Server tut: die Installation per Skript, die drei Bereiche im Browser und die Dateien compose.yaml und .env, die es dabei schreibt. **HELIOS** ist eine Web-App, die neben SOLECTRUS auf demselben Server läuft. Sie installiert SOLECTRUS und hält die Konfiguration danach aktuell. ## HELIOS installieren Die Installation startet dieser Befehl im Terminal des Servers: ```bash curl -fsSL https://raw.githubusercontent.com/solectrus/helios/main/bootstrap/install.sh | bash ``` Das Skript geht diese Schritte durch: 1. **Docker** – Fehlt es, bietet das Skript an, es über [get.docker.com](https://get.docker.com) nachzuinstallieren. 2. **Verzeichnis** – Zur Wahl stehen `/opt/solectrus` (als `root`), `~/solectrus` und das aktuelle Verzeichnis. Dort landen `compose.yaml`, `.env` und die Daten aller Dienste, auch die Datenbanken. Für eine andere Platte: das Verzeichnis vorher anlegen, hineinwechseln und das Skript dort starten. 3. **Bestehende Installation** – Läuft SOLECTRUS auf dem Server schon, erkennt das Skript die Dienste und bietet an, HELIOS dort einzutragen, statt eine neue Installation anzulegen. 4. **Start** – Das Skript erzeugt ein Admin-Passwort, startet die Dienste und nennt am Ende die Adresse: `http://:3999`, dazu das Passwort. Es steht auch in der `.env`. Die Konfiguration folgt danach im Browser. Der Quelltext des Skripts lässt sich vorher lesen: [install.sh](https://github.com/solectrus/helios/blob/main/bootstrap/install.sh). ## Was HELIOS verwaltet SOLECTRUS besteht aus mehreren Docker-Containern, die per `docker compose` zusammenlaufen. Beschrieben werden sie in zwei Dateien: `compose.yaml` listet die Dienste, `.env` enthält die [Umgebungsvariablen](/docs/referenz/). Beide Dateien gehören HELIOS. Es erzeugt sie nach jeder Änderung an der Konfiguration komplett neu. Ansehen lassen sie sich im Browser, unter _Konfiguration_ am unteren Rand. Die Dienste selbst wissen nichts von HELIOS. Sie lesen nur ihre Umgebungsvariablen. HELIOS entscheidet lediglich, welche Variablen dabei mit welchen Werten in der `.env` landen. ## Die drei Bereiche ### Konfiguration - **Sensoren** – Welche Messwerte SOLECTRUS führt und woher sie kommen. Rund 50 Sensoren stehen zur Auswahl, von der PV-Erzeugung bis zur Wallbox. Zu jedem Sensor zeigt HELIOS den aktuellen Messwert aus der InfluxDB, so lässt sich die Zuordnung sofort prüfen. - **Datenquellen** – Woher die Messwerte kommen: [SENEC](/docs/referenz/senec-collector/), [Shelly](/docs/referenz/shelly-collector/), [MQTT](/docs/referenz/mqtt-collector/) oder eine [Prognose](/docs/referenz/forecast-collector/) für die PV-Erzeugung. Bei den Geräten prüft HELIOS auf Knopfdruck, ob sie erreichbar sind und die Zugangsdaten stimmen. - **Grundeinstellungen** – Zeitzone, Inbetriebnahme der Anlage, Zugriffsschutz, Farbschema, CO₂-Faktor, eigene Domain samt HTTPS, Speicherorte, Software-Stand, Betriebsmodus und die dynamischen Strompreise samt preisoptimierter Speicherbeladung. ### Dienste Die Übersicht aller Container mit Status, Version und Aktualität. Von hier aus lassen sich einzelne Dienste starten und stoppen oder gleich alle auf einmal. **Aktualisieren** gibt es nur je Dienst: HELIOS lädt dann das Image neu und erzeugt den Container neu. Die Protokolle jedes Dienstes lassen sich direkt im Browser lesen. > **Änderungen greifen erst nach einem Neustart** > > > Nach einer Änderung an der Konfiguration schreibt HELIOS die neuen Dateien sofort, lässt die laufenden Dienste aber unberührt. Die Statusleiste meldet dann _Konfiguration geändert – Neustart erforderlich_ und nennt die betroffenen Dienste. Ein Klick auf **Alle Dienste neu starten** übernimmt die Änderung. Einzeln geht es auch: **Aktualisieren** in der Zeile des Dienstes. > ### Datensicherung Sicherungen von Konfiguration und Messwerten, siehe [Erstellen von Datensicherungen](/docs/anleitungen/datensicherung/). ## Bestehende Installation übernehmen Läuft SOLECTRUS auf dem Server bereits, ist kein Neuanfang nötig. Das Installationsskript erkennt die laufenden Dienste und trägt HELIOS in deren `compose.yaml` ein, statt eine neue anzulegen. Beim ersten Aufruf im Browser liest HELIOS `compose.yaml` und `.env` ein und übernimmt die bestehende Konfiguration, samt der Sensor-Zuordnungen. Vorher legt es beide Dateien als `.bak` zur Seite. ## Der Container HELIOS gehört zu den Diensten, die es verwaltet: Es steht mit einem eigenen Service in der `compose.yaml`, die es selbst schreibt, und bekommt seine Updates über [Watchtower](/docs/referenz/watchtower/) wie jeder andere Dienst. ### Zugriff auf Docker Die anderen Dienste steuert HELIOS über den Docker-Socket des Hosts, der als Volume in den Container gereicht wird: ```yaml volumes: - /var/run/docker.sock:/var/run/docker.sock ``` Damit kann HELIOS Container starten, stoppen, neu erzeugen und ihre Protokolle lesen. Ein entfernter Docker-Host ist deshalb nicht möglich, siehe [Was HELIOS nicht kann](#was-helios-nicht-kann). Dazu kommt das cgroup-Verzeichnis des Hosts, nur lesend: ```yaml volumes: - /sys/fs/cgroup:/host/sys/fs/cgroup:ro ``` Darüber liest HELIOS den tatsächlichen Speicher- und CPU-Verbrauch des Hosts. Ohne dieses Volume sieht ein HELIOS-Container in einem Proxmox-LXC nicht die Werte des Containers, sondern die des physischen Knotens. ### Eigene Daten Das Verzeichnis, in dem `compose.yaml` und `.env` liegen, ist im Container als `/data` eingehängt. Dort schreibt HELIOS beide Dateien, und dort legt es auch seine eigenen Daten ab: ``` /data/compose.yaml /data/.env /data/helios/config.yaml /data/helios/primary.sqlite3 ``` In `config.yaml` steht die Konfiguration, so wie sie im Browser eingegeben wurde. Sie ist die Quelle: `compose.yaml` und `.env` erzeugt HELIOS daraus, sobald sich die `config.yaml` geändert hat. Gesichert wird bei einer [Datensicherung](/docs/anleitungen/datensicherung/) ebenfalls die `config.yaml`. Die SQLite-Datenbank hält den übrigen Zustand von HELIOS, etwa den Verlauf der Datensicherungen. ### Erreichbarkeit Ohne eigene Domain veröffentlicht HELIOS den Port **3999** auf dem Host. Die Oberfläche läuft dann über HTTP, erreichbar unter `http://:3999`. Mit einer eigenen Domain samt HTTPS, eingerichtet unter _Konfiguration → Grundeinstellungen → Eigene Domain_, veröffentlicht der HELIOS-Container selbst keinen Port mehr. Stattdessen nimmt Traefik den Verkehr an und reicht ihn weiter. Die Oberfläche liegt dann auf derselben Domain wie das Dashboard, weiterhin unter Port 3999, aber per HTTPS und mit einem Zertifikat von Let's Encrypt: `https://:3999`. ## Updates Zu den Diensten gehört [Watchtower](/docs/referenz/watchtower/). Es prüft regelmäßig auf neue Versionen und installiert sie automatisch, HELIOS selbst eingeschlossen. Näheres unter [Installation von Updates](/docs/anleitungen/updates/). ## Was HELIOS nicht kann HELIOS verwaltet einen Docker-Host über dessen lokalen Docker-Socket. Daraus ergeben sich ein paar Grenzen: - **Kein Docker Swarm, kein Kubernetes.** HELIOS arbeitet mit `docker compose`, nicht mit anderen Orchestrierern. - **Kein zweites Verwaltungswerkzeug.** `compose.yaml` und `.env` schreibt HELIOS selbst. Liegen die SOLECTRUS-Dienste als Stack in Portainer oder einem ähnlichen Werkzeug, gehören die Dateien diesem Werkzeug. Beides nebeneinander geht nicht. - **Keine externen Datenbanken.** PostgreSQL, Redis und InfluxDB laufen auf demselben Host. Einzige Ausnahme ist eine entfernte InfluxDB im Betriebsmodus _Nur Kollektoren_. - **Kein entfernter Docker-Host.** HELIOS braucht den lokalen `docker.sock`. - **Keine beliebigen Images.** HELIOS erzeugt die `compose.yaml` vollständig neu. Beim Übernehmen einer bestehenden Installation muss es daher jeden Dienst kennen. Stößt es auf ein fremdes Image, verweigert es den Import und nennt den Dienst beim Namen. Ein paar bekannte Zusatzdienste wie `dozzle` lässt es stehen und reicht sie unverändert durch. Ein gemischter Betrieb ist trotzdem möglich: Was HELIOS nicht abdeckt, läuft daneben weiter. HELIOS braucht lediglich die alleinige Hoheit über `compose.yaml` und `.env` der SOLECTRUS-Dienste. ## Support-Paket HELIOS erzeugt unter _Support_ auf Knopfdruck ein **Support-Paket** mit Konfiguration, Protokollen und einer Momentaufnahme des Systems. Wozu es dient, steht unter [Support](/docs/support/). ## Quelltext HELIOS ist in Ruby on Rails implementiert, der Quelltext ist auf GitHub verfügbar: \ [github.com/solectrus/helios](https://github.com/solectrus/helios) --- # Konfiguration von HELIOS > Die wenigen Umgebungsvariablen, die HELIOS selbst liest, und die Tokens, die es für die übrigen Dienste erzeugt. HELIOS liest selbst nur wenige Umgebungsvariablen. Alle teilt es sich mit dem [Dashboard](/docs/referenz/dashboard/). Dazu kommen die Tokens für den Zugriff auf InfluxDB. Die liest HELIOS nicht, es erzeugt sie und verteilt sie an die übrigen Dienste. ## Umgebungsvariablen ### `SECRET_KEY_BASE` Schlüssel, mit dem Rails die Sitzungs-Cookies signiert. Erzeugt wird er etwa mit `openssl rand -hex 64`, das ergibt 128 Zeichen. HELIOS und das Dashboard verwenden denselben Wert. Ohne den Schlüssel startet der Container von HELIOS nicht. Ändert sich der Wert, werden alle Anmeldungen ungültig. ```properties title="Beispiel" SECRET_KEY_BASE=8f14e45fceea167a5a36dedd4bea2543... ``` > **HELIOS** > > > HELIOS erzeugt den Wert bei der Installation. Einzustellen gibt es nichts. > ### `ADMIN_PASSWORD` Passwort für den Zugang zu HELIOS. Dasselbe Passwort schützt die Einstellungen im [Dashboard](/docs/bedienung/administrator/), es gibt nur eines. Fehlt das Passwort, steht die Oberfläche von HELIOS jedem offen, der den Server erreicht. HELIOS sorgt deshalb selbst dafür, dass immer eines gesetzt ist. ```properties title="Beispiel" ADMIN_PASSWORD=my-secret-password ``` > **HELIOS** > > > HELIOS fragt das Passwort unter _Konfiguration → Grundeinstellungen → Zugriffsschutz_ ab. Bei einer neuen Installation würfelt das Installationsskript eines aus und zeigt es zum Schluss an. Trägt sich HELIOS in eine bestehende Installation ohne Passwort ein, leitet es eines aus `SECRET_KEY_BASE` ab — derselbe Schlüssel ergibt dabei immer dasselbe Passwort, auch bei einem zweiten Anlauf. > ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `Europe/Berlin`. Sie bestimmt die Zeitstempel im Protokoll und die Uhrzeit, zu der die automatische [Datensicherung](/docs/anleitungen/datensicherung/) läuft. ```properties title="Beispiel" TZ=Europe/Rome ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > ### `FORCE_SSL` Schaltet `secure`-Cookies, HSTS und die Weiterleitung von HTTP auf HTTPS ein. Erlaubt sind `true` und `false`. Standardwert ist `false`. Auf `true` gehört der Wert nur, wenn die Oberfläche hinter einem Reverse Proxy mit TLS-Zertifikat steht. Läuft sie über HTTP, kommt mit `secure`-Cookies keine Anmeldung zustande. ```properties title="Beispiel" FORCE_SSL=true ``` > **HELIOS** > > > HELIOS setzt `true`, sobald es seine Oberfläche über eine eigene Domain mit HTTPS ausliefert. Ohne Domain läuft sie auf Port 3999 über HTTP, dann bleibt die Variable weg. > ## InfluxDB-Tokens Jeder Dienst, der auf die Messwerte in [InfluxDB](/docs/referenz/influxdb/) zugreift, braucht dafür einen API-Token. Diese drei Variablen halten die Tokens bereit, die HELIOS bei der Installation erzeugt. Gelesen werden sie weder von HELIOS noch von InfluxDB. HELIOS gibt jedem Dienst denjenigen Token weiter, der zu seiner Aufgabe passt: Ein Kollektor darf damit nur schreiben, das Dashboard nur lesen. Beim Dienst selbst heißt die Variable dann immer `INFLUX_TOKEN`. Wer die Konfiguration von Hand pflegt, legt die Tokens selbst in InfluxDB an und trägt sie hier ein. > **Die vier Tokens sind derzeit gleich** > > > Bei einer Neuinstallation trägt HELIOS in alle vier Token-Variablen denselben Wert ein, nämlich den [`INFLUX_ADMIN_TOKEN`](/docs/referenz/influxdb/konfiguration/#influx_admin_token). InfluxDB legt beim ersten Start nur diesen einen an, weitere mit eingeschränkten Rechten erzeugt HELIOS bisher nicht. Die getrennten Variablen gibt es, damit eine übernommene Installation mit echter Rechtetrennung diese behält. > ### `INFLUX_TOKEN_READ` Token für das [Dashboard](/docs/referenz/dashboard/), das damit lesend auf die Messwerte zugreift. Es bekommt den Wert als [`INFLUX_TOKEN`](/docs/referenz/dashboard/allgemeine-konfiguration/#influx_token). Der Token muss in InfluxDB existieren und den Bucket lesen dürfen. Eine Änderung wirkt beim nächsten Start des Dashboards. Passt der Token nicht, bleiben die Kurven leer. ```properties title="Beispiel" INFLUX_TOKEN_READ=my-super-secret-read-token ``` > **HELIOS** > > > HELIOS erzeugt den Token bei der Installation. Einzustellen gibt es nichts. > ### `INFLUX_TOKEN_WRITE` Token für die Kollektoren, die damit Messwerte schreiben. Jeder Kollektor bekommt den Wert als [`INFLUX_TOKEN`](/docs/referenz/mqtt-collector/konfiguration/#influx_token). Der Token muss in InfluxDB existieren und in den Bucket schreiben dürfen. Eine Änderung wirkt beim nächsten Start der Kollektoren. ```properties title="Beispiel" INFLUX_TOKEN_WRITE=my-super-secret-write-token ``` > **HELIOS** > > > HELIOS erzeugt den Token bei der Installation. Einzustellen gibt es nichts. > ### `INFLUX_TOKEN_READWRITE` Token für den [Power-Splitter](/docs/referenz/power-splitter/), der Messwerte liest und seine Ergebnisse zurückschreibt. Nötig ist er nur, wenn der Power-Splitter läuft. Er bekommt den Wert als [`INFLUX_TOKEN`](/docs/referenz/power-splitter/konfiguration/#influx_token). ```properties title="Beispiel" INFLUX_TOKEN_READWRITE=my-super-secret-readwrite-token ``` > **HELIOS** > > > HELIOS erzeugt den Token bei der Installation, auch ohne Power-Splitter. Einzustellen gibt es nichts. > --- # Was ist InfluxDB? > Die Zeitreihendatenbank, in der SOLECTRUS sämtliche Messwerte speichert. Verwendet wird Version v2, die Versionen v1 und v3 werden nicht unterstützt. SOLECTRUS speichert sämtliche Messwerte in der Zeitreihendatenbank **InfluxDB** ab. Verwendet wird Version **v2**. Die Versionen **v1** und **v3** werden nicht unterstützt. ## Logging Wie alle Docker-Container schreibt auch InfluxDB ein Protokoll ins Docker-Log, das im Normalfall so aussieht: ```log ts=2026-07-14T04:19:03.808723Z lvl=info msg="Welcome to InfluxDB" log_id=143iRm~W000 version=v2.9.1 commit=d4fa1941fd build_date=2026-05-11T20:49:03Z log_level=info ... ``` ## Datensicherung Die [Datensicherung von HELIOS](/docs/anleitungen/datensicherung/) schließt InfluxDB mit ein, sowohl beim Sichern als auch beim Wiederherstellen. ## Docker-Image Das offizielle Docker-Image von InfluxDB ist auf Docker Hub verfügbar: \ [https://hub.docker.com/\_/influxdb](https://hub.docker.com/_/influxdb) --- # Zugriff auf die Web-Oberfläche von InfluxDB > Die Web-Oberfläche von InfluxDB im lokalen Netzwerk freigeben, für eigene Abfragen und den Export von Daten. Sie erlaubt vollen Zugriff auf alle Messwerte. Für eigene Abfragen oder den auszugsweisen Export der Daten gibt es die Web-Oberfläche von InfluxDB. Standardmäßig ist InfluxDB nur für die anderen Container erreichbar. Freigegeben wird sie in [HELIOS](/docs/referenz/helios/) unter _Konfiguration → Grundeinstellungen → InfluxDB_ mit der Option **InfluxDB im lokalen Netzwerk erreichbar machen**. Der Port lässt sich dort ebenfalls ändern, falls `8086` auf dem Server schon belegt ist. Danach ist die Oberfläche unter `http://:8086` erreichbar. Läuft SOLECTRUS unter einer eigenen Domain, führt derselbe Schalter InfluxDB über Traefik nach außen, dann per HTTPS unter `https://:8086`. Es erscheint ein Login-Formular. Der Benutzername lautet `admin`, das Passwort erzeugt HELIOS bei der Installation. Es steht als `INFLUX_PASSWORD` in der `.env`, die HELIOS am unteren Rand der Konfiguration anzeigt. Im Betriebsmodus _Nur Dashboard, Datenbanken und Zusatzdienste_ ist InfluxDB immer nach außen geöffnet, auch ohne diesen Schalter. Anders kämen die Kollektoren vom anderen Server nicht heran. > **Achtung** > > > Die Web-Oberfläche erlaubt vollen Zugriff auf alle Messwerte, auch das Löschen. Der Port sollte nur bei Bedarf offen sein. > --- # Konfiguration von InfluxDB > Die Umgebungsvariablen von InfluxDB, von der Ersteinrichtung beim ersten Start bis zu den Zugangsdaten der übrigen Dienste. InfluxDB wird über Umgebungsvariablen konfiguriert. Der Container stammt allerdings nicht von SOLECTRUS, sondern ist das offizielle InfluxDB-2-Image. ## Umgebungsvariablen ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `UTC`. Sie betrifft ausschließlich die Zeitstempel im Protokoll von InfluxDB. Die Messwerte selbst speichert InfluxDB immer in UTC, daran ändert `TZ` nichts. ```properties title="Beispiel" TZ=Europe/Berlin ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > ### `DOCKER_INFLUXDB_INIT_MODE` Schaltet die Ersteinrichtung ein. Erlaubt sind `setup` für eine neue Datenbank und `upgrade` für die Migration einer InfluxDB 1.x. SOLECTRUS verwendet `setup`. `setup` greift nur, solange es noch keine Datenbank gibt. Liegt unter [`INFLUX_VOLUME_PATH`](#influx_volume_path) bereits eine, überspringt InfluxDB die Einrichtung und startet einfach mit den vorhandenen Daten. Der Wert darf also dauerhaft stehen bleiben, er richtet kein zweites Mal etwas ein. Fehlt die Variable dagegen ganz, richtet InfluxDB auch auf einem leeren Datenpfad nichts ein. Die übrigen `DOCKER_INFLUXDB_INIT_*`-Variablen bleiben dann wirkungslos. ```properties title="Beispiel" DOCKER_INFLUXDB_INIT_MODE=setup ``` > **HELIOS** > > > HELIOS setzt den Wert fest auf `setup`. Einzustellen gibt es nichts. > ### `DOCKER_INFLUXDB_INIT_USERNAME` Benutzername des Administrators für den Login an der [Web-Oberfläche](/docs/referenz/influxdb/direktzugriff/). InfluxDB legt den Administrator beim ersten Start an. Im Setup-Modus verlangt InfluxDB den Benutzernamen. Fehlt er, bricht der Container mit einer Fehlermeldung ab. Nach dem ersten Start ändert die Variable nichts mehr. ```properties title="Beispiel" DOCKER_INFLUXDB_INIT_USERNAME=admin ``` > **HELIOS** > > > HELIOS setzt den Benutzernamen fest auf `admin`. Einzustellen gibt es nichts. > ### `INFLUX_PASSWORD` Passwort des Administrators für den Login an der [Web-Oberfläche](/docs/referenz/influxdb/direktzugriff/). Im Container heißt die Variable `DOCKER_INFLUXDB_INIT_PASSWORD`. Auch das Passwort verlangt InfluxDB im Setup-Modus, ohne bricht der Container ab. InfluxDB übernimmt das Passwort beim ersten Start. Wer es später in der Konfiguration überschreibt, ändert damit nicht das Passwort, sondern verliert nur die Notiz, wie es lautet. Ändern lässt es sich in der Web-Oberfläche von InfluxDB. ```properties title="Beispiel" INFLUX_PASSWORD=ExAmPl3PA55W0rD ``` > **HELIOS** > > > HELIOS erzeugt das Passwort bei der Installation. Einzustellen gibt es nichts. > ### `INFLUX_ORG` Organisation, mit der InfluxDB Benutzer, Buckets und Tokens gruppiert. SOLECTRUS verwendet `solectrus`, weitere Organisationen braucht es nicht. Im Container heißt die Variable `DOCKER_INFLUXDB_INIT_ORG`. Angelegt wird die Organisation beim ersten Start. Ein späterer Name benennt sie nicht um. Die anderen Dienste lesen `INFLUX_ORG` direkt und greifen dann ins Leere. ```properties title="Beispiel" INFLUX_ORG=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor. Einzustellen gibt es nichts. > ### `INFLUX_BUCKET` Bucket für die Messwerte, also die eigentliche Datenbank. SOLECTRUS verwendet nur **einen** Bucket, deshalb heißt er `solectrus`. Im Container heißt die Variable `DOCKER_INFLUXDB_INIT_BUCKET`. Auch der Bucket entsteht beim ersten Start. Ein späterer Name benennt ihn nicht um. Die Kollektoren und das Dashboard lesen `INFLUX_BUCKET` direkt und greifen dann ins Leere. ```properties title="Beispiel" INFLUX_BUCKET=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor. Einzustellen gibt es nichts. > > **Achtung** > > > InfluxDB legt den Bucket mit **unbegrenzter** Aufbewahrung an (Retention Policy: `forever`). Nur so bleiben die historischen Daten dauerhaft erhalten. InfluxDB erlaubt es, die Aufbewahrung später zu ändern. Für SOLECTRUS darf das nicht geschehen. > ### `INFLUX_ADMIN_TOKEN` Token mit Vollzugriff auf alles. InfluxDB legt ihn beim ersten Start mit genau diesem Wert an. HELIOS nutzt ihn für die Datensicherung und die Wiederherstellung. Im Container heißt die Variable `DOCKER_INFLUXDB_INIT_ADMIN_TOKEN`. Fehlt sie, erzeugt InfluxDB selbst einen zufälligen Token. Der steht dann nirgends in der Konfiguration, und die Datensicherung fällt aus. Ein anderer Wert erzeugt keinen neuen Token, er sperrt HELIOS nur aus. Die übrigen Dienste arbeiten nicht mit diesem Token, sondern mit je einem eigenen für Lesen, Schreiben oder beides. Die liest InfluxDB nicht, sie stehen bei [HELIOS](/docs/referenz/helios/konfiguration/#influxdb-tokens). ```properties title="Beispiel" INFLUX_ADMIN_TOKEN=my-super-secret-admin-token ``` > **HELIOS** > > > HELIOS erzeugt den Token bei der Installation. Einzustellen gibt es nichts. > ### `INFLUXD_USE_HASHED_TOKENS` Speichert die API-Tokens als Hash statt im Klartext. Erlaubt sind `true` und `false`. Den Standardwert bestimmt InfluxDB je nach Version: ab 2.9 ist das Hashing eingeschaltet, in 2.8 ausgeschaltet, ältere Versionen kennen die Option nicht. Anders als die `DOCKER_INFLUXDB_INIT_*`-Variablen wertet InfluxDB sie bei jedem Start aus. Beim ersten Start mit `true` wandelt es alle gespeicherten Tokens um. Aus dem Hash lässt sich ein verlorener Token nicht mehr zurückholen, und ein Downgrade auf eine ältere InfluxDB löscht die Tokens. ```properties title="Beispiel" INFLUXD_USE_HASHED_TOKENS=true ``` > **HELIOS** > > > HELIOS setzt die Variable nicht. Nur beim Import einer bestehenden Installation übernimmt HELIOS einen dort vorhandenen Wert unverändert. > ### `INFLUX_VOLUME_PATH` Pfad auf dem Host, in dem die Datenbank gespeichert wird. Er wird als Volume in den Container gemountet und sollte auf einem Datenträger mit ausreichend Speicherplatz liegen. InfluxDB selbst liest die Variable nicht. Was hier steht, entscheidet über alles Weitere: Existiert am Pfad schon eine Datenbank, verwendet InfluxDB diese und überspringt die Ersteinrichtung. Andernfalls legt es eine neue an, und die `DOCKER_INFLUXDB_INIT_*`-Variablen kommen zum Zug. ```properties title="Beispiel" INFLUX_VOLUME_PATH=/somewhere/solectrus/influxdb ``` > **HELIOS** > > > HELIOS speichert die Datenbank unter `influxdb` im eigenen Datenverzeichnis. Einzustellen gibt es nichts. Nur beim Import einer bestehenden Installation übernimmt HELIOS einen abweichenden Pfad. > --- # Was ist Ingest? > Der Proxy, der bei Balkonkraftwerken den Hausverbrauch neu berechnet, bevor die Messwerte in die InfluxDB gehen. **Ingest** ist ein Proxy, der die Messwerte der Kollektoren entgegennimmt, daraus einen korrigierten Hausverbrauch berechnet und alles an die InfluxDB weiterleitet. Der momentan **einzige Einsatzzweck** ist die Unterstützung von **Balkonkraftwerken**. Ohne Balkonkraftwerk hat Ingest keine Funktion. Ein Balkonkraftwerk speist direkt ins Hausnetz ein. Der Wechselrichter bzw. Stromspeicher meldet deshalb einen zu niedrigen Hausverbrauch. Der Hausverbrauch lässt sich aber rückwärts berechnen, sobald die anderen Werte der Strombilanz bekannt sind: ``` Hausverbrauch = Erzeugung vom Dach + Erzeugung des Balkonkraftwerks + Netzbezug + Batterieentladung (falls Batterie vorhanden) - Batterieladung (falls Batterie vorhanden) - Netzeinspeisung - Wallbox (falls vorhanden) - Wärmepumpe (falls vorhanden) ``` Wallbox und Wärmepumpe zieht Ingest nur ab, solange sie nicht über `INFLUX_EXCLUDE_FROM_HOUSE_POWER` aus dem Hausverbrauch herausgerechnet sind. Steht ein Verbraucher dort, bleibt er in der Formel außen vor und sein Anteil steckt weiterhin im berechneten Hausverbrauch. Das Dashboard zieht ihn dann erst bei der Anzeige ab. Für die Wärmepumpe ist das der Regelfall. Ein negatives Ergebnis setzt Ingest auf 0. Gibt es einen Sensor für die **Gesamterzeugung** (`INFLUX_SENSOR_INVERTER_POWER`), rechnet Ingest allein mit diesem Wert. Die Einzelwerte der Wechselrichter bleiben dann außen vor, statt aufaddiert zu werden. ## Der Puffer Kollektoren liefern nicht im Gleichtakt, und einzelne fallen vorübergehend aus. Ingest puffert deshalb alle Messwerte 12 Stunden lang in einer SQLite-Datenbank und interpoliert daraus die Werte zwischen zwei Messpunkten. Trägt ein Kollektor seine Werte verspätet nach, holt Ingest die Berechnung nach. Gerechnet wird nur für Zeitpunkte, zu denen **jeder** beteiligte Sensor einen Wert hat. Fehlt einer, entsteht an dieser Stelle eine Lücke im Hausverbrauch. Ein Sensor, der noch keinen neueren Messpunkt geliefert hat, zählt dabei höchstens 15 Minuten lang mit seinem letzten Wert. Das Zusammenspiel der Container ändert sich also wie folgt: ## Bisher (ohne Ingest) ```mermaid graph LR CollectorA[SENEC-Collector] CollectorB[Shelly-Collector] CollectorC[MQTT-Collector] Influx[InfluxDB] Dashboard[Dashboard] CollectorA -->|push| Influx CollectorB -->|push| Influx CollectorC -->|push| Influx Influx -->|pull| Dashboard ``` ## Mit Ingest ```mermaid graph LR CollectorA[SENEC-Collector] CollectorB[Shelly-Collector] CollectorC[MQTT-Collector] Influx[InfluxDB] Ingest[Ingest] Dashboard[Dashboard] CollectorA -->|push| Ingest CollectorB -->|push| Ingest CollectorC -->|push| Ingest Ingest -->|push| Influx Influx -->|pull| Dashboard ``` Damit wird Ingest zu einer kritischen Komponente, die im Fehlerfall den gesamten Datenfluss unterbricht. Ingest muss deshalb permanent laufen – wie die InfluxDB auch. ## Quelltext Ingest ist in Ruby implementiert, der Quelltext ist auf GitHub verfügbar: \ [github.com/solectrus/ingest](https://github.com/solectrus/ingest) --- # Inbetriebnahme von Ingest > HELIOS nimmt Ingest auf, sobald ein PV-Erzeuger als Steckersolargerät markiert ist. Danach schreiben die Kollektoren an Ingest statt an die InfluxDB. Ingest wird nicht einzeln installiert. HELIOS nimmt den Dienst automatisch auf, sobald ein PV-Erzeuger als Steckersolargerät markiert ist. Die Markierung sitzt in [HELIOS](/docs/referenz/helios/) unter _Konfiguration → Sensoren_: Der Sensor des Balkonkraftwerks (_PV-Erzeuger 1_ bis _5_) hat dafür die Option **Das ist ein Steckersolargerät (BKW)**. Danach brauchen die betroffenen Container unter _Dienste_ eine Aktualisierung. Anschließend erscheint unter _Konfiguration → Grundeinstellungen → Ingest_ eine neue Karte. Sie enthält eine einzige Einstellung: wie lange Ingest die Messwerte zwischenspeichert. > **Ingest bleibt aus, wenn die Werte von außen kommen** > > > Liefert ein externes System (etwa Home Assistant oder ioBroker) einen der Messwerte, aus denen der Hausverbrauch berechnet wird, lässt HELIOS Ingest weg. Es sähe dann nur einen Teil der Daten. In diesem Fall muss die externe Seite einen korrekten Hausverbrauch liefern. > ## Was sich ändert Bisher schreiben die Kollektoren ihre Messwerte direkt in die InfluxDB. Mit Ingest schreiben sie stattdessen an Ingest, und zwar über dieselbe Schnittstelle: Sie halten Ingest für eine InfluxDB. Es ändern sich nur Host und Port, aus `influxdb:8086` wird `ingest:4567`. Ingest verrechnet die eingehenden Messwerte und reicht sie an die InfluxDB weiter. Den Hausverbrauch berechnet es dabei selbst, statt ihn vom Speicher zu übernehmen. Umgestellt werden nur die Kollektoren, die Werte für die Berechnung des Hausverbrauchs liefern. Ein [Forecast-Collector](/docs/referenz/forecast-collector/) etwa schreibt weiterhin direkt in die InfluxDB. HELIOS weiß, welche das sind. Am [Dashboard](/docs/referenz/dashboard/) ist **nichts** einzustellen. Es liest wie bisher aus der InfluxDB. ## Prüfen, ob es läuft Beim Start listet Ingest im [Protokoll](/docs/anleitungen/logging/) die konfigurierten Sensoren auf: ```log Configured sensors: inverter_power_1 → SENEC:inverter_power inverter_power_2 → Garage:inverter_power grid_import_power → SENEC:grid_power_plus grid_export_power → SENEC:grid_power_minus battery_discharging_power → SENEC:bat_power_minus battery_charging_power → SENEC:bat_power_plus wallbox_power → SENEC:wallbox_charge_power heatpump_power → Consumer:power (excluded from house_power) house_power → SENEC:house_power Calculated house_power will OVERRIDE the incoming value! Forwarding to http://influxdb:8086 SQLite retention: 12 hours ``` Entscheidend sind die Zeilen zu `house_power` und zum Forwarding-Ziel: Ingest berechnet den Hausverbrauch selbst und leitet an die InfluxDB weiter. Im Protokoll der Kollektoren steht danach nicht mehr `influxdb`, sondern `ingest`: ```log Pushing to InfluxDB at http://ingest:4567, bucket solectrus, measurement SENEC ``` ## Web-Oberfläche Ingest bringt eine eigene [Web-Oberfläche](/docs/referenz/ingest/web-oberflaeche/) mit ein paar Kennzahlen mit, erreichbar unter `http://:4567`. --- # Konfiguration von Ingest > Die Umgebungsvariablen von Ingest, vom Hostnamen der InfluxDB über Port und Token bis zur Aufbewahrungsdauer im SQLite-Puffer. Ingest wird über Umgebungsvariablen konfiguriert. ## Umgebungsvariablen ### `INFLUX_HOST` Hostname des InfluxDB-Servers, an den Ingest die Messwerte weiterreicht. Läuft InfluxDB im selben Docker-Netzwerk, ist das der Name des Docker-Services, also `influxdb`. Es kann aber auch ein externer Server sein, etwa `influxdb.example.com`. Hier gehört nur der Host hin, **kein** `http://` oder `https://` und keine Portnummer. Port und Schema stehen getrennt in `INFLUX_PORT` und `INFLUX_SCHEMA`. ```properties title="Beispiel" INFLUX_HOST=influxdb ``` > **HELIOS** > > > HELIOS setzt den Hostnamen automatisch auf `influxdb`. Einzustellen gibt es nichts. > ### `INFLUX_PORT` Port des InfluxDB-Servers, eine Ganzzahl. Standardwert ist `8086`. Bei einer externen, per TLS abgesicherten InfluxDB ist es oft `443`. ```properties title="Beispiel" INFLUX_PORT=8086 ``` > **HELIOS** > > > HELIOS setzt den Port automatisch auf `8086`. Einzustellen gibt es nichts. > ### `INFLUX_SCHEMA` Schema für die Verbindung zu InfluxDB, `http` oder `https`. Standardwert ist `http`. Bei einer externen InfluxDB mit TLS gehört hier `https` hin. ```properties title="Beispiel" INFLUX_SCHEMA=http ``` > **HELIOS** > > > HELIOS setzt `http`, denn innerhalb des Docker-Netzwerks wird nicht verschlüsselt. > ### `RETENTION_HOURS` Dauer in Stunden, für die Ingest die eingehenden Messwerte in seiner SQLite-Datenbank aufbewahrt, eine Ganzzahl. Standardwert ist `12`. Ein Hintergrund-Job löscht stündlich alles, was älter ist. Aus diesem Puffer holt Ingest die Nachbarwerte, mit denen es zwischen zwei Messpunkten interpoliert. Ein größerer Wert lässt Ingest den Hausverbrauch auch dann noch berechnen, wenn ein Kollektor seine Messwerte erst Stunden später nachträgt. Er vergrößert aber die SQLite-Datei auf der Platte. Die Warteschlange zur InfluxDB berührt die Variable nicht: Ist die InfluxDB nicht erreichbar, hält Ingest die ausgehenden Daten so lange vor, bis der Schreibzugriff klappt. ```properties title="Beispiel" RETENTION_HOURS=36 ``` > **HELIOS** > > > HELIOS fragt die Dauer unter _Konfiguration → Grundeinstellungen → Ingest_ ab, vorbelegt mit `12`. > ### `STATS_PASSWORD` Passwort für den Zugriff auf die [Web-Oberfläche](/docs/referenz/ingest/web-oberflaeche/). Ohne die Variable ist sie ohne Passwort zu erreichen. ```properties title="Beispiel" STATS_PASSWORD=my-super-secret-password ``` > **HELIOS** > > > HELIOS setzt hier das Administrator-Passwort ein, dasselbe wie für Dashboard und HELIOS. Festgelegt wird es unter _Konfiguration → Grundeinstellungen → Zugriffsschutz_. > ### `INFLUX_SENSOR_HOUSE_POWER_CALCULATED` Ziel für den berechneten Hausverbrauch, in der Schreibweise `Measurement:Field`. Ohne die Variable schreibt Ingest das Ergebnis dorthin, wohin `INFLUX_SENSOR_HOUSE_POWER` zeigt, und überschreibt damit den Wert des Kollektors. Ist sie gesetzt, bleibt der Rohwert des Kollektors erhalten und das Ergebnis landet daneben. Nützlich ist das zum Vergleich beider Werte. Für den Dauerbetrieb taugt es nicht: Das Dashboard kennt die Variable nicht und liest den Hausverbrauch weiterhin aus `INFLUX_SENSOR_HOUSE_POWER`, also den unkorrigierten Wert. ```properties title="Beispiel" INFLUX_SENSOR_HOUSE_POWER_CALCULATED=Ingest:house_power_calculated ``` > **HELIOS** > > > HELIOS setzt die Variable nicht. Der berechnete Hausverbrauch überschreibt dort immer den eingehenden Wert. > ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `UTC`. Sie betrifft ausschließlich die Zeitstempel im Protokoll und in der Web-Oberfläche von Ingest. Die Messwerte selbst speichert InfluxDB immer in UTC, daran ändert `TZ` nichts. ```properties title="Beispiel" TZ=Europe/Berlin ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > ## Sensor-Zuordnungen Für die Berechnung des Hausverbrauchs muss Ingest wissen, wo die beteiligten Messwerte in der InfluxDB liegen. Die Zuordnung steht in `INFLUX_SENSOR_*`-Variablen, je eine pro Sensor, in der Schreibweise `Measurement:Field`. Ingest liest genau dreizehn davon: `INFLUX_SENSOR_INVERTER_POWER`, `INFLUX_SENSOR_INVERTER_POWER_1` bis `INFLUX_SENSOR_INVERTER_POWER_5`, `INFLUX_SENSOR_GRID_IMPORT_POWER`, `INFLUX_SENSOR_GRID_EXPORT_POWER`, `INFLUX_SENSOR_BATTERY_CHARGING_POWER`, `INFLUX_SENSOR_BATTERY_DISCHARGING_POWER`, `INFLUX_SENSOR_WALLBOX_POWER`, `INFLUX_SENSOR_HEATPUMP_POWER` und `INFLUX_SENSOR_HOUSE_POWER`. Alle anderen `INFLUX_SENSOR_*`-Variablen ignoriert Ingest. Die Namen und ihre Bedeutung sind dieselben wie beim Dashboard, beschrieben unter [Sensor-Konfiguration](/docs/referenz/dashboard/sensor-konfiguration/). ```properties title="Beispiel" INFLUX_SENSOR_INVERTER_POWER_1=SENEC:inverter_power INFLUX_SENSOR_INVERTER_POWER_2=Garage:inverter_power INFLUX_SENSOR_GRID_IMPORT_POWER=SENEC:grid_power_plus INFLUX_SENSOR_GRID_EXPORT_POWER=SENEC:grid_power_minus INFLUX_SENSOR_HOUSE_POWER=SENEC:house_power ``` Ein Sensor ohne Variable fehlt in der Strombilanz. Gerechnet wird nur für Zeitpunkte, zu denen jeder konfigurierte Sensor einen Wert hat. `INFLUX_SENSOR_HOUSE_POWER` geht nicht in die Rechnung ein, sondern gibt das Ziel für das Ergebnis vor. Ohne diese Variable hat der berechnete Wert keinen Platz, es sei denn, `INFLUX_SENSOR_HOUSE_POWER_CALCULATED` ist gesetzt. > **HELIOS** > > > HELIOS übernimmt die Zuordnungen aus _Konfiguration → Sensoren_ und gibt Ingest davon die Sensoren mit, die in die Berechnung eingehen. > ### `INFLUX_EXCLUDE_FROM_HOUSE_POWER` Komma-getrennte Liste von Sensoren, die aus der Berechnung herausfallen, ohne das Präfix `INFLUX_SENSOR_`. Ohne die Variable rechnet Ingest mit allen konfigurierten Sensoren. Ein Sensor aus dieser Liste wird nicht abgezogen, sein Anteil steckt also weiterhin im berechneten Hausverbrauch. Das Dashboard zieht ihn erst bei der Anzeige ab, [dort steht dieselbe Variable](/docs/referenz/dashboard/sensor-konfiguration/#influx_exclude_from_house_power). Beide Dienste müssen denselben Wert bekommen, sonst zählt der Verbraucher doppelt oder gar nicht. ```properties title="Beispiel" INFLUX_EXCLUDE_FROM_HOUSE_POWER=HEATPUMP_POWER ``` > **HELIOS** > > > HELIOS setzt die Variable, sobald ein Sensor unter _Konfiguration → Sensoren_ die Option **Aus Hausverbrauch herausrechnen** trägt. Dashboard und Ingest bekommen dieselbe Liste. > ## Token, Bucket und Organisation Ingest braucht weder `INFLUX_TOKEN` noch `INFLUX_BUCKET` noch `INFLUX_ORG`. Ein Kollektor schickt seine Messwerte an dieselbe Schnittstelle wie an eine InfluxDB, und dabei liegen Token, Bucket und Organisation im Request. Ingest nimmt sie von dort und reicht sie unverändert an die InfluxDB weiter. Es schreibt also mit dem Token des jeweiligen Kollektors. ## Speicherort der Datenbank Die SQLite-Datenbank liegt im Container unter `/app/data`. Wohin dieses Verzeichnis auf dem Host zeigt, entscheidet die Docker-Konfiguration. Eine Umgebungsvariable liest Ingest dafür nicht. > **HELIOS** > > > HELIOS fragt den Speicherort unter _Konfiguration → Grundeinstellungen → Speicherorte_ ab. > --- # Web-Oberfläche von Ingest > Die Web-Oberfläche von Ingest zeigt Kennzahlen zum Betrieb, etwa Datendurchsatz, Auslastung und Antwortzeiten. **Ingest** hat eine kleine Web-Oberfläche, die einige Kennzahlen zum Betrieb anzeigt, u.a.: - Datendurchsatz - Warteschlangenlänge - Messwerte mit ihrer Häufigkeit - CPU-Auslastung - RAM-Auslastung - Durchschnittliche Antwortzeit Die Web-Oberfläche ist unter `http://:4567` erreichbar und sieht so aus: ![Ingest Web-Oberfläche](@assets/ingest.png) ## Zugriffsschutz Ob die Oberfläche ein Passwort verlangt, entscheidet die Variable [`STATS_PASSWORD`](/docs/referenz/ingest/konfiguration/#stats_password). Ohne sie ist die Oberfläche ohne Anmeldung erreichbar. HELIOS setzt die Variable immer, und zwar auf das Administrator-Passwort, dasselbe wie für Dashboard und HELIOS. ![Ingest Web-Oberfläche Login](@assets/login-ingest.png) --- # Was ist der MQTT-Collector? > Der MQTT-Collector abonniert Topics eines MQTT-Brokers, verarbeitet die empfangenen Werte und schreibt sie in die InfluxDB. Der **MQTT-Collector** sammelt Messwerte über einen MQTT-Broker ein und schreibt diese in die InfluxDB. Im Gegensatz zu den spezialisierten Kollektoren (z.B. für SENEC oder Shelly) ist das ein Allzweckwerkzeug, das Messwerte aus verschiedenen Quellen verarbeitet. Voraussetzung für diesen Collector ist ein funktionsfähiger MQTT-Broker. Dieser kann entweder im lokalen Netzwerk laufen (ioBroker oder Mosquitto sind gängige MQTT-Broker) oder auch ein Cloud-Service sein (z.B. HiveMQ). Üblicherweise bindet der Collector Geräte an SOLECTRUS an, die SOLECTRUS nicht direkt unterstützt. Ein ioBroker-Adapter fragt das Gerät ab und stellt die Werte per MQTT bereit. Der MQTT-Collector holt sie dort ab. So lassen sich auch exotische Wallboxen, Wärmepumpen, Batteriespeicher, Wechselrichter oder E-Autos in SOLECTRUS einbinden. ## Empfang von Messwerten Der MQTT-Collector abonniert Topics bei einem MQTT-Broker, verarbeitet die empfangenen Werte und schreibt sie in eine InfluxDB. Prinzipiell ist das unabhängig von SOLECTRUS, aber üblicherweise läuft der Collector in einer SOLECTRUS-Umgebung. SOLECTRUS bedient sich dann der Werte aus der InfluxDB. Für jedes abonnierte Topic legt ein eigenes **Mapping** fest, was mit den Werten geschieht und wohin sie gespeichert werden. ```mermaid flowchart LR MQTTCollector[MQTT-Collector] MQTTMapping((MQTT-Mapping)) InfluxDB MQTTCollector -->|Topic + Payload| MQTTMapping MQTTMapping -->|Measurement + Field + Value| InfluxDB ``` Der Collector muss sich an kein vorgegebenes Namensschema halten. Die Messwerte lassen sich inhaltlich strukturieren, etwa nach ihrer Quelle. Die Bezeichnungen von Measurements und Fields in der InfluxDB sind also frei wählbar. Auch Messwerte, die SOLECTRUS nicht verarbeitet, lassen sich mit dem MQTT-Collector sammeln, etwa der Kilometerstand eines E-Autos oder die Außentemperatur. Sie liegen dann in der InfluxDB, ohne im Dashboard aufzutauchen. Wie das Mapping im Detail zu definieren ist, wird in der [Konfiguration](/docs/referenz/mqtt-collector/konfiguration/) beschrieben. > **Hinweis** > > > Messwerte müssen **kontinuierlich** über den MQTT-Broker eintreffen. Lücken im Datenempfang führen später in SOLECTRUS zu Problemen. Gängiges Negativ-Beispiel ist eine Wallbox, die nur bei Ladevorgängen den Verbrauch sendet. Sie muss auch außerhalb von Ladevorgängen kontinuierlich einen Verbrauch von 0 Watt senden, damit keine Lücken entstehen. > > Falls der MQTT-Broker eine Einstellung wie „Publish only on change" anbietet, ist diese zu **deaktivieren**. > ## Weiterverarbeitung in SOLECTRUS Das Dashboard von SOLECTRUS holt sich die Werte aus der InfluxDB, ohne zu wissen, woher sie kommen. Es ist also unabhängig von der Quelle der Messwerte. SOLECTRUS definiert dazu Sensoren, über die es die Werte abruft. Die Sensoren sind die Schnittstelle zwischen SOLECTRUS und der InfluxDB. Für den MQTT-Collector sind sie irrelevant. ```mermaid flowchart LR InfluxDB SensorMapping((Sensor-Mapping)) Dashboard InfluxDB -->|Measurement + Field + Value| SensorMapping SensorMapping -->|Sensor + Value| Dashboard ``` ## Logging Der Collector schreibt ein Protokoll ins Docker-Log, das im Normalfall so aussieht: ```log MQTT collector for SOLECTRUS, Version v0.7.6, built at 2026-06-08T05:06:38.669Z https://github.com/solectrus/mqtt-collector Copyright (c) 2023-2026 Georg Ledermann and contributors, released under the MIT License Using Ruby 4.0.5 on platform aarch64-linux-musl Subscribing from MQTT broker at mqtt://192.168.178.31:1883 Pushing to InfluxDB at http://influxdb:8086, bucket solectrus Subscribing to 1 topics: - MODBUS/BatteryLevel => SUNGROW:battery_soc (float) # Message from 2026-07-14 10:05:12 +0200 topic = MODBUS/BatteryLevel message = 42 => SUNGROW:battery_soc = 42.0 ... ``` Fehler protokolliert der Collector ebenfalls, etwa wenn der MQTT-Broker oder die InfluxDB nicht erreichbar ist. ## Quelltext Der MQTT-Collector ist in Ruby implementiert, der Quelltext ist auf GitHub verfügbar: \ [github.com/solectrus/mqtt-collector](https://github.com/solectrus/mqtt-collector) --- # Konfiguration des MQTT-Collectors > Die Umgebungsvariablen des MQTT-Collectors, vom Zugang zum Broker über die abonnierten Topics bis zur Verbindung mit der InfluxDB. Der MQTT-Collector wird über Umgebungsvariablen konfiguriert. ## Umgebungsvariablen ### `MQTT_HOST` Hostname des MQTT-Brokers, bei dem der Collector die Topics abonniert. Das kann die IP-Adresse eines lokal erreichbaren ioBroker sein, aber auch die Domain eines externen Brokers. Hier gehört nur der Host hin, **kein** `http://` oder `https://` und keine Portnummer. Der Port steht getrennt in `MQTT_PORT`. ```properties title="Beispiel" MQTT_HOST=192.168.178.31 ``` > **HELIOS** > > > HELIOS fragt den Hostnamen unter _Konfiguration → Datenquellen → MQTT-Collector_ ab. Ohne Eintrag lässt HELIOS den Collector weg. > ### `MQTT_PORT` Port des MQTT-Brokers, eine Ganzzahl. Ohne TLS lauscht ein Broker üblicherweise auf `1883`, mit TLS auf `8883`. Ob der Collector TLS spricht, entscheidet aber nicht der Port, sondern `MQTT_SSL`. Beides muss zusammenpassen. ```properties title="Beispiel" MQTT_PORT=1883 ``` > **HELIOS** > > > HELIOS fragt den Port unter _Konfiguration → Datenquellen → MQTT-Collector_ ab, vorbelegt mit `1883`. Das Feld lässt sich nicht leeren, denn der Collector hat keinen eigenen Standardwert. > ### `MQTT_SSL` Sichert die Verbindung zum Broker mit TLS ab. Erlaubt sind `true` und `false`, jeder andere Wert gilt als `false`. Standardwert ist `false`, denn ein lokaler ioBroker verlangt TLS üblicherweise nicht. ```properties title="Beispiel" MQTT_SSL=true ``` > **HELIOS** > > > HELIOS bietet dafür einen Schalter unter _Konfiguration → Datenquellen → MQTT-Collector_, standardmäßig aus. > ### `MQTT_USERNAME` Benutzername für den Zugriff auf den MQTT-Broker. Nötig ist er nur, wenn der Broker eine Anmeldung verlangt. Ohne die Variable meldet sich der Collector ohne Zugangsdaten an. ```properties title="Beispiel" MQTT_USERNAME=solectrus ``` > **HELIOS** > > > HELIOS fragt den Benutzernamen unter _Konfiguration → Datenquellen → MQTT-Collector_ ab. > ### `MQTT_PASSWORD` Passwort für den Zugriff auf den MQTT-Broker. Nötig ist es nur, wenn der Broker eine Anmeldung verlangt. Ohne die Variable meldet sich der Collector ohne Zugangsdaten an. ```properties title="Beispiel" MQTT_PASSWORD=my-mqtt-password ``` > **HELIOS** > > > HELIOS fragt das Passwort unter _Konfiguration → Datenquellen → MQTT-Collector_ ab. > ### `INFLUX_HOST` Hostname des InfluxDB-Servers. Läuft InfluxDB im selben Docker-Netzwerk, ist das der Name des Docker-Services, also `influxdb`. Es kann aber auch ein externer Server sein, etwa `influxdb.example.com`. ```properties title="Beispiel" INFLUX_HOST=influxdb ``` > **HELIOS** > > > HELIOS setzt den Hostnamen automatisch: normalerweise `influxdb`, bei aktivem [Ingest-Dienst](/docs/referenz/ingest/) stattdessen `ingest`. Nur bei einer externen InfluxDB fragt HELIOS ihn unter _Konfiguration → Grundeinstellungen → InfluxDB_ ab. > ### `INFLUX_SCHEMA` Schema für die Verbindung zu InfluxDB, `http` oder `https`. Standardwert ist `http`. Bei einer externen InfluxDB mit TLS gehört hier `https` hin. ```properties title="Beispiel" INFLUX_SCHEMA=https ``` > **HELIOS** > > > HELIOS setzt `http`, denn innerhalb des Docker-Netzwerks wird nicht verschlüsselt. Nur bei einer externen InfluxDB fragt HELIOS das Protokoll ab. > ### `INFLUX_PORT` Port für die Verbindung zu InfluxDB, eine Ganzzahl. Standardwert ist `8086`. Bei einer externen, per TLS abgesicherten InfluxDB ist es oft `443`. ```properties title="Beispiel" INFLUX_PORT=443 ``` > **HELIOS** > > > HELIOS setzt den Port automatisch: `8086` für InfluxDB, `4567` beim Umweg über den [Ingest-Dienst](/docs/referenz/ingest/). Nur bei einer externen InfluxDB fragt HELIOS ihn ab. > ### `INFLUX_TOKEN` Token, mit dem sich der Collector bei InfluxDB anmeldet. Er muss dort existieren und das Recht haben, in den angegebenen Bucket zu **schreiben**. Mehr braucht der Collector nicht: Er schickt Messwerte hin und liest nie etwas zurück. Passt der Token nicht, weist InfluxDB jeden Schreibzugriff ab. Der Collector läuft dann weiter, protokolliert aber Fehler, und im Dashboard bleiben die Kurven leer. ```properties title="Beispiel" INFLUX_TOKEN=my-super-secret-write-token ``` > **HELIOS** > > > HELIOS gibt dem Collector den Schreib-Token, siehe [`INFLUX_TOKEN_WRITE`](/docs/referenz/helios/konfiguration/#influx_token_write). Lese- oder Admin-Zugriff bekommt er nicht. > ### `INFLUX_ORG` Organisation in InfluxDB, unter der die Messwerte gespeichert werden. Eine Organisation ist der Mandant, dem Benutzer, Buckets und Tokens gehören. InfluxDB legt sie [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. In einer SOLECTRUS-Installation heißt sie `solectrus`, mehr als eine braucht es nicht. Der Name muss zu der Organisation passen, die in InfluxDB tatsächlich existiert. Ein anderer Wert benennt sie nicht um, er lässt den Collector nur ins Leere schreiben. ```properties title="Beispiel" INFLUX_ORG=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen der vorhandenen Organisation ab. > ### `INFLUX_BUCKET` Bucket in InfluxDB, in den der Collector die Messwerte schreibt. Ein Bucket ist das, was anderswo die Datenbank wäre: ein benannter Speicher mit eigener Aufbewahrungsdauer. Auch ihn legt InfluxDB [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. Eine SOLECTRUS-Installation kommt mit einem einzigen aus, er heißt `solectrus`. Der Name muss zu dem Bucket passen, der in InfluxDB existiert, und zu dem, aus dem das Dashboard liest. Gibt es ihn nicht, lehnt InfluxDB die Schreibzugriffe ab. ```properties title="Beispiel" INFLUX_BUCKET=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen des vorhandenen Buckets ab. > ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `UTC`. Sie betrifft ausschließlich die Zeitstempel im Protokoll des Collectors. Die Messwerte selbst speichert InfluxDB immer in UTC, daran ändert `TZ` nichts. ```properties title="Beispiel" TZ=Europe/Berlin ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > ## Topics Für jedes Topic, das der MQTT-Collector abonnieren soll, muss ein Mapping definiert werden. Ein Mapping besteht aus mehreren Umgebungsvariablen, die mit dem Präfix `MAPPING_X_` beginnen, wobei `X` eine eindeutige Zahl sein muss. Eine ausführliche Beschreibung eines Mappings findet sich auf der folgenden Seite: \ [Abonnieren von Topics](/docs/referenz/mqtt-collector/topics/). --- # Abonnieren von Topics mit dem MQTT-Collector > Wie ein Mapping ein MQTT-Topic auf Measurement und Field der InfluxDB abbildet, samt JSON-Extraktion, Formeln und Grenzwerten. Der MQTT-Collector kann Nachrichten von verschiedenen (beliebig vielen) Topics abonnieren, verarbeiten und dann in die InfluxDB schreiben. Dazu dienen Zuordnungen („Mappings"). Jedes Mapping legt drei Dinge fest: - Wo kommt der Wert her, also welches Topic muss abonniert werden? - Welche Verarbeitung ist notwendig (Vorzeichen-Behandlung, Datentyp-Konvertierung, JSON-Extraktion, Formelbildung)? - Wohin in der InfluxDB soll der ermittelte Wert geschrieben werden (Measurement und Field)? Jedes Mapping wird durch mehrere Umgebungsvariablen definiert, die mit dem Präfix `MAPPING_X_` beginnen. `X` ist eine Zahl, und alle Variablen mit derselben Zahl gehören zum selben Mapping. Die Nummerierung beginnt bei `0` und läuft lückenlos weiter. ## Verfügbare Umgebungsvariablen je Mapping Pflicht sind nur `MAPPING_X_TOPIC` und `MAPPING_X_TYPE`. Dazu kommt das Ziel in der InfluxDB, und dafür gibt es zwei Varianten: - **Der Normalfall**: `MAPPING_X_MEASUREMENT` und `MAPPING_X_FIELD`. Dort landet der Wert, ob positiv oder negativ. - **Die Vorzeichen-Aufteilung**: `MAPPING_X_MEASUREMENT_POSITIVE`, `MAPPING_X_MEASUREMENT_NEGATIVE`, `MAPPING_X_FIELD_POSITIVE` und `MAPPING_X_FIELD_NEGATIVE`. Der Wert landet je nach Vorzeichen in einem von zwei Feldern, etwa Netzbezug und Einspeisung. > **Achtung** > > > Die beiden Varianten schließen sich aus. Sobald eine der vier `POSITIVE`/`NEGATIVE`-Variablen gesetzt ist, müssen alle vier gesetzt sein, und `MAPPING_X_MEASUREMENT` bzw. `MAPPING_X_FIELD` dürfen dann **nicht** gesetzt sein. Der Collector prüft das beim Start und bricht mit einer Fehlermeldung ab, wenn beides gemischt ist. > > **HELIOS** > > > HELIOS erzeugt die Vorzeichen-Aufteilung nicht, es kennt nur Mappings mit `MEASUREMENT` und `FIELD`. Ersatz sind zwei Mappings auf dasselbe Topic mit einer [Formel](#mapping_x_formula) je Vorzeichen: `IF({value} > 0, {value}, 0)` für den positiven Anteil, `IF({value} < 0, -{value}, 0)` für den negativen. Beim Import einer bestehenden Installation nimmt HELIOS diese Umwandlung selbst vor. > ### `MAPPING_X_TOPIC` Das Topic, das der Collector abonniert. Mehrere Mappings dürfen dasselbe Topic verwenden, etwa um aus einem JSON-Payload mehrere Werte zu gewinnen. ```properties title="Beispiel" MAPPING_0_TOPIC=senec/0/ENERGY/GUI_INVERTER_POWER ``` > **HELIOS** > > > HELIOS fragt das Topic bei jedem Sensor mit der Quelle _MQTT_ ab, unter _Konfiguration → Sensoren_. Topics ohne zugehörigen Sensor kommen unter _Konfiguration → Datenquellen → MQTT-Topics_ dazu. > ### `MAPPING_X_TYPE` Der Datentyp des Feldes. Erlaubt sind `integer`, `float`, `string` und `boolean`. Jeder andere Wert lässt den Collector beim Start abbrechen. Bei `boolean` gelten `true`, `ok`, `yes`, `on` und `1` als wahr, unabhängig von Groß- und Kleinschreibung. Jeder andere Wert wird zu `false`. ```properties title="Beispiel" MAPPING_0_TYPE=float ``` > **HELIOS** > > > HELIOS fragt den Datentyp bei jedem MQTT-Sensor und jedem eigenen Topic ab, vorbelegt mit `float`. > ### `MAPPING_X_MEASUREMENT` Pflicht, solange das Mapping die Werte nicht nach Vorzeichen aufteilt. Der Name des InfluxDB-Measurements, in das der Wert geschrieben werden soll (unabhängig davon, ob er positiv oder negativ ist). ```properties title="Beispiel" MAPPING_0_MEASUREMENT=PV ``` > **HELIOS** > > > HELIOS fragt das Measurement bei jedem Sensor unter _Konfiguration → Sensoren_ ab. > ### `MAPPING_X_FIELD` Pflicht, solange das Mapping die Werte nicht nach Vorzeichen aufteilt. Der Name des InfluxDB-Feldes, in das der Wert geschrieben werden soll (unabhängig davon, ob er positiv oder negativ ist). ```properties title="Beispiel" MAPPING_0_FIELD=inverter_power ``` > **HELIOS** > > > HELIOS fragt das Field bei jedem Sensor unter _Konfiguration → Sensoren_ ab. > ### `MAPPING_X_MEASUREMENT_POSITIVE` Pflicht, sobald das Mapping die Werte nach Vorzeichen aufteilt. Name des InfluxDB-Measurements, in das der Wert geschrieben werden soll, wenn er **positiv** ist. Andernfalls (also wenn er negativ oder `0` ist) wird `0` geschrieben. ```properties title="Beispiel" MAPPING_1_MEASUREMENT_POSITIVE=PV ``` > **HELIOS** > > > HELIOS erzeugt die Vorzeichen-Aufteilung nicht. Ersatz sind zwei Mappings mit Vorzeichen-Formel, siehe oben. > ### `MAPPING_X_MEASUREMENT_NEGATIVE` Pflicht, sobald das Mapping die Werte nach Vorzeichen aufteilt. Der Name des InfluxDB-Measurements, in das der (absolute) Wert geschrieben werden soll, wenn er **negativ** ist. Andernfalls (also wenn er positiv oder `0` ist) wird `0` geschrieben. ```properties title="Beispiel" MAPPING_1_MEASUREMENT_NEGATIVE=PV ``` > **HELIOS** > > > HELIOS erzeugt die Vorzeichen-Aufteilung nicht. Ersatz sind zwei Mappings mit Vorzeichen-Formel, siehe oben. > ### `MAPPING_X_FIELD_POSITIVE` Pflicht, sobald das Mapping die Werte nach Vorzeichen aufteilt. Name des InfluxDB-Feldes, in das der Wert geschrieben werden soll, wenn er **positiv** ist. Andernfalls (also wenn er negativ oder `0` ist) wird `0` geschrieben. ```properties title="Beispiel" MAPPING_1_FIELD_POSITIVE=grid_import_power ``` > **HELIOS** > > > HELIOS erzeugt die Vorzeichen-Aufteilung nicht. Ersatz sind zwei Mappings mit Vorzeichen-Formel, siehe oben. > ### `MAPPING_X_FIELD_NEGATIVE` Pflicht, sobald das Mapping die Werte nach Vorzeichen aufteilt. Der Name des InfluxDB-Feldes, in das der (absolute) Wert geschrieben werden soll, wenn er **negativ** ist. Andernfalls (also wenn er positiv oder `0` ist) wird `0` geschrieben. ```properties title="Beispiel" MAPPING_1_FIELD_NEGATIVE=grid_export_power ``` > **HELIOS** > > > HELIOS erzeugt die Vorzeichen-Aufteilung nicht. Ersatz sind zwei Mappings mit Vorzeichen-Formel, siehe oben. > ### `MAPPING_X_JSON_KEY` Der Schlüssel, aus dem der Wert extrahiert wird, falls das Topic einen JSON-Payload enthält (mit **nicht** verschachtelten Key/Value-Paaren). Ein Schlüssel ist immer ein String, z.B. `inverter_power`. Ohne die Variable verarbeitet der Collector den Payload als nackten Wert. ```properties title="Beispiel" MAPPING_2_JSON_KEY=radiation_level ``` > **HELIOS** > > > HELIOS fragt die Wertgewinnung bei jedem MQTT-Sensor und jedem eigenen Topic ab und stellt _JSON-Schlüssel_ zur Wahl. Gesetzt wird immer nur eine der vier Varianten. > ### `MAPPING_X_JSON_PATH` Der [JSONPath](https://goessner.net/articles/JsonPath/), mit dem der Wert extrahiert wird, falls das Topic einen komplexen (z.B. verschachtelten) JSON-Payload enthält. Ein JSONPath beginnt immer mit `$.`, z.B. `$.example.foo.bar[2]`. Sind `JSON_PATH` und `JSON_KEY` gleichzeitig gesetzt, gewinnt `JSON_PATH`. Der Collector meldet das nicht, deshalb gehört immer nur eines von beiden ins Mapping. ```properties title="Beispiel" MAPPING_3_JSON_PATH=$.ccp[2] ``` > **HELIOS** > > > HELIOS fragt die Wertgewinnung bei jedem MQTT-Sensor und jedem eigenen Topic ab und stellt _JSON-Path_ zur Wahl. Gesetzt wird immer nur eine der vier Varianten. > ### `MAPPING_X_JSON_FORMULA` Eine Formel, die aus einem JSON-Payload den zu speichernden Messwert berechnet. Sie darf [einige mathematische Operationen](https://github.com/rubysolo/dentaku?tab=readme-ov-file#built-in-operators-and-functions) enthalten, z.B. `round({radiation_level} * 1.5)`. Die geschweiften Klammern `{}` dienen dazu, Werte aus dem JSON-Payload zu referenzieren. Es können dabei einfache Schlüssel oder JSONPath verwendet werden. Die Formel wirkt nur, wenn weder `JSON_KEY` noch `JSON_PATH` gesetzt ist. Diese beiden haben Vorrang. ```properties title="Beispiel" MAPPING_4_JSON_FORMULA=round({reactivity} * {radiation_level}) + 42 ``` > **HELIOS** > > > HELIOS fragt die Wertgewinnung bei jedem MQTT-Sensor und jedem eigenen Topic ab und stellt _JSON-Formel_ zur Wahl. Gesetzt wird immer nur eine der vier Varianten. > ### `MAPPING_X_FORMULA` Eine Formel für Topics ohne JSON, also mit nacktem Wert. Verfügbar ab Version 0.5.0. Der empfangene Wert wird über den Platzhalter `{value}` referenziert, z.B. `round({value} * 1000)`. Es gelten dieselben Operationen wie bei `JSON_FORMULA`. Die Formel wirkt nur, wenn weder `JSON_KEY` noch `JSON_PATH` noch `JSON_FORMULA` gesetzt ist. Alle drei haben Vorrang. ```properties title="Beispiel" MAPPING_4_FORMULA=round({value} * 1000) ``` > **HELIOS** > > > HELIOS fragt die Wertgewinnung bei jedem MQTT-Sensor und jedem eigenen Topic ab und stellt _Formel_ zur Wahl. Gesetzt wird immer nur eine der vier Varianten. > ### `MAPPING_X_MIN` Unterer Grenzwert für Messwerte, verfügbar ab Version 0.3.0. Wird ein Wert unterhalb dieses Grenzwerts empfangen, wird er ignoriert und **nicht** in die InfluxDB geschrieben. Damit lassen sich Ausreißer ausfiltern, die sonst die Statistik verfälschen. Ohne die Variable gibt es keine untere Grenze. Der Grenzwert greift erst nach JSON-Extraktion und Formel, also auf dem Wert, der tatsächlich gespeichert würde. ```properties title="Beispiel" MAPPING_0_MIN=5 ``` > **HELIOS** > > > HELIOS fragt den Minimalwert bei jedem MQTT-Sensor und jedem eigenen Topic ab. Bleibt das Feld leer, gibt es keine untere Grenze. > ### `MAPPING_X_MAX` Oberer Grenzwert für Messwerte, verfügbar ab Version 0.3.0. Wird ein Wert oberhalb dieses Grenzwerts empfangen, wird er ignoriert und **nicht** in die InfluxDB geschrieben. Ohne die Variable gibt es keine obere Grenze. Beide Grenzwerte wirken nur bei den Typen `float` und `integer`. Bei `string` und `boolean` bleiben sie ohne Effekt. ```properties title="Beispiel" MAPPING_0_MAX=15000 ``` > **HELIOS** > > > HELIOS fragt den Maximalwert bei jedem MQTT-Sensor und jedem eigenen Topic ab. Bleibt das Feld leer, gibt es keine obere Grenze. > ### `MAPPING_X_NULL_TO_ZERO` Wandelt einen Messwert von `NULL` in die Zahl `0` um und schreibt ihn nach InfluxDB. Verfügbar ab Version 0.7.0. Erlaubt sind `true` und `false`, jeder andere Wert lässt den Collector beim Start abbrechen. Standardwert ist `false`. Bei `false` wird ein Messwert von `NULL` ignoriert, also **nicht** nach InfluxDB geschrieben. Das gilt auch, wenn zwar ein Payload ankommt, der konfigurierte JSON-Schlüssel darin aber fehlt. ```properties title="Beispiel" MAPPING_3_NULL_TO_ZERO=true ``` > **HELIOS** > > > HELIOS bietet dafür bei jedem MQTT-Sensor und jedem eigenen Topic einen Schalter _NULL als 0 speichern_, standardmäßig aus. > ## Beispiele ### 1. Einfaches Mapping Topic wird abonniert, der erhaltene Wert wird unverändert als Fließkommazahl in die InfluxDB geschrieben: ```properties MAPPING_0_TOPIC=senec/0/ENERGY/GUI_INVERTER_POWER MAPPING_0_MEASUREMENT=PV MAPPING_0_FIELD=inverter_power MAPPING_0_TYPE=float ``` ### 2. Mapping mit Vorzeichen-Behandlung Wenn die Werte des Topics positiv oder negativ sein können, erfolgt hier eine Aufteilung. Positive Werte werden in `grid_import_power` geschrieben, negative Werte in `grid_export_power`. ```properties MAPPING_1_TOPIC=senec/0/ENERGY/GUI_GRID_POW MAPPING_1_MEASUREMENT_POSITIVE=PV MAPPING_1_MEASUREMENT_NEGATIVE=PV MAPPING_1_FIELD_POSITIVE=grid_import_power MAPPING_1_FIELD_NEGATIVE=grid_export_power MAPPING_1_TYPE=float ``` - Falls der empfangene Wert positiv ist (z.B. `1000`): `grid_import_power` wird auf `1000` gesetzt, `grid_export_power` auf `0`. - Falls der empfangene Wert negativ ist (z.B. `-500`): `grid_import_power` wird auf `0` gesetzt, `grid_export_power` auf `500`. - Falls der empfangene Wert `0` ist: `grid_import_power` und `grid_export_power` werden beide auf `0` gesetzt. ### 3. Mapping mit einfachem JSON-Payload Verwendung von `JSON_KEY`: ```properties MAPPING_2_TOPIC=my/little/nuclear/plant MAPPING_2_JSON_KEY=radiation_level MAPPING_2_MEASUREMENT=nuclear_power_plant MAPPING_2_FIELD=radiation_level MAPPING_2_TYPE=float ``` Aus einem JSON von beispielsweise `{"radiation_level": 90.5, "reactivity": 0.7}` resultiert der Wert `90.5`. ### 4. Mapping mit komplexem JSON-Payload Verwendung von `JSON_PATH`: ```properties MAPPING_3_TOPIC=go-e/ATTR MAPPING_3_JSON_PATH=$.ccp[2] MAPPING_3_MEASUREMENT=WALLBOX MAPPING_3_FIELD=power MAPPING_3_TYPE=float MAPPING_3_NULL_TO_ZERO=true ``` Dies extrahiert den Wert aus einem Payload wie `{"ccp": [1,2,42,3]}`. Im Beispiel liefert das den Wert an Position 2 (drittes Element) des Arrays `ccp`, also `42`. Sollte der Wert `null` sein (z.B. bei `{"ccp": [1,2,null,3]}`), wird er als `0` geschrieben. ### 5. Mapping mit Formel Es gibt zwei Möglichkeiten, eine Formel zu verwenden: #### a) Bei JSON-Payload ```properties MAPPING_4_TOPIC=my/little/nuclear/plant MAPPING_4_JSON_FORMULA="round({reactivity} * {radiation_level}) + 42" MAPPING_4_MEASUREMENT=nuclear_power_plant MAPPING_4_FIELD=danger_level MAPPING_4_TYPE=float ``` Aus einem JSON von z.B. `{"radiation_level": 90.5, "reactivity": 0.7}` entsteht `danger_level` mit `round(0.7 * 90.5) + 42`, also `105`. #### b) Bei String-Payload ```properties MAPPING_4_TOPIC=my/little/nuclear/plant/powerInKwH MAPPING_4_FORMULA="round({value} * 1000)" MAPPING_4_MEASUREMENT=nuclear_power_plant MAPPING_4_FIELD=power MAPPING_4_TYPE=integer ``` Im Gegensatz zum JSON-Fall wird hier der Wert über `{value}` referenziert und die Variable heißt `MAPPING_X_FORMULA`. Aus einem Payload von z.B. `42.5` entsteht `power` mit `round(42.5 * 1000)`, also `42500`. ### 6. Mapping mit Grenzwerten ```properties MAPPING_0_TOPIC=senec/0/ENERGY/GUI_INVERTER_POWER MAPPING_0_MEASUREMENT=PV MAPPING_0_FIELD=inverter_power MAPPING_0_TYPE=float MAPPING_0_MIN=5 MAPPING_0_MAX=15000 ``` Werte unter `5` oder über `15000` werden ignoriert und nicht in die InfluxDB geschrieben. --- # Was ist PostgreSQL? > Die relationale Datenbank für Tageszusammenfassungen, Einstellungen und Strompreise, samt Umgang mit neuen Versionen. Die Messwerte liegen in der [InfluxDB](/docs/referenz/influxdb/). Alles andere speichert SOLECTRUS in der relationalen Datenbank **PostgreSQL**: Tageszusammenfassungen, Einstellungen, Strompreise und einiges mehr. Bei einer Neuinstallation richtet HELIOS die Version **18** ein. Übernimmt es eine bestehende Installation, läuft deren ältere Major-Version zunächst weiter. ## Logging Wie alle Docker-Container schreibt auch PostgreSQL ein Protokoll ins Docker-Log, das im Normalfall so aussieht: ```log ... 2026-07-14 10:00:52.816 CEST [1] LOG: starting PostgreSQL 18.4 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit 2026-07-14 10:00:52.816 CEST [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 2026-07-14 10:00:52.816 CEST [1] LOG: listening on IPv6 address "::", port 5432 2026-07-14 10:00:52.817 CEST [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" 2026-07-14 10:00:52.826 CEST [1] LOG: database system is ready to accept connections ... ``` ## Datensicherung Die [Datensicherung von HELIOS](/docs/anleitungen/datensicherung/) schließt PostgreSQL mit ein. Eine gesonderte Sicherung der Datenbank ist nicht nötig. ## Updates PostgreSQL unterscheidet zwischen Minor- und Major-Updates. **Minor-Updates** (etwa 18.1 → 18.2) bringen Fehlerkorrekturen und laufen auf demselben Datenverzeichnis weiter. Darum kümmert sich [Watchtower](/docs/referenz/watchtower/) automatisch. **Major-Updates** (etwa 17 → 18) erscheinen jährlich. Ein neues Major-Release kann das vorhandene Datenverzeichnis nicht direkt weiterverwenden, die Daten müssen dazu migriert werden. PostgreSQL erledigt das nicht selbst. > **HELIOS übernimmt das Major-Update** > > > Sobald eine neue Major-Version bereitsteht, bietet [HELIOS](/docs/referenz/helios/) das Update unter _Dienste_ an. Es sichert die Datenbank, leert das Datenverzeichnis, startet die neue Version und spielt die Daten zurück. Anschließend prüft es, ob alle Tabellen angekommen sind. Geht etwas schief, kehrt es selbsttätig zur alten Version zurück. > ## Docker-Image Das offizielle Docker-Image von PostgreSQL ist auf Docker Hub verfügbar: \ [https://hub.docker.com/\_/postgres](https://hub.docker.com/_/postgres) --- # Konfiguration von PostgreSQL > Die Umgebungsvariablen von PostgreSQL für Passwort, Benutzer, Datenbankname, Zeitzone und Speicherort der Daten. PostgreSQL läuft im offiziellen Docker-Image. Die Variablen sind also die des Images, eigenen Code bringt SOLECTRUS hier nicht mit. Der Container ist nur im Docker-Netzwerk erreichbar, von außen führt kein Weg zur Datenbank. ## Umgebungsvariablen ### `POSTGRES_PASSWORD` Passwort des Datenbank-Benutzers. Ohne Wert bricht PostgreSQL beim ersten Start mit einer Fehlermeldung ab. Das Dashboard und der [Power-Splitter](/docs/referenz/power-splitter/) melden sich damit an, bei ihnen heißt die Variable `DB_PASSWORD`. Die Werte müssen übereinstimmen. PostgreSQL legt das Passwort beim ersten Start in seinem Datenverzeichnis ab. Ein späterer Wechsel in der Konfiguration ändert es dort nicht: Die Datenbank bleibt beim alten Passwort, das Dashboard versucht es mit dem neuen, und die Anmeldung schlägt fehl. ```properties title="Beispiel" POSTGRES_PASSWORD=my-secret-db-password ``` > **HELIOS** > > > HELIOS erzeugt das Passwort bei der Installation zufällig. Einzustellen gibt es nichts. > ### `POSTGRES_USER` Benutzer, den PostgreSQL beim ersten Start anlegt. Standardwert ist `postgres`. Er ist zugleich Superuser der Datenbank. Der Name muss zu dem passen, mit dem sich das Dashboard anmeldet (`DB_USER`). Ein abweichender Wert lässt beide auseinanderlaufen, denn der Benutzer aus `DB_USER` existiert dann nicht. Auch der Healthcheck des Containers fragt mit `pg_isready -U postgres` nach. ```properties title="Beispiel" POSTGRES_USER=postgres ``` > **HELIOS** > > > HELIOS setzt die Variable nicht. Es bleibt beim Standardwert `postgres`, mit dem sich auch das Dashboard anmeldet. > ### `POSTGRES_DB` Datenbank, die PostgreSQL beim ersten Start anlegt. Standardwert ist der Name aus `POSTGRES_USER`, also `postgres`. Mit dieser Datenbank arbeitet das Dashboard allerdings nicht. Es legt bei seinem ersten Start eine eigene an, `solectrus_production`, und die ist von `POSTGRES_DB` unabhängig. Ein anderer Wert benennt sie also nicht um, er entscheidet nur darüber, welche leere Datenbank daneben liegt. ```properties title="Beispiel" POSTGRES_DB=solectrus ``` > **HELIOS** > > > HELIOS trägt fest `solectrus` ein. Einzustellen gibt es nichts. > ### `PGDATA` Verzeichnis im Container, in dem PostgreSQL seine Dateien ablegt. Ohne die Variable gilt der Standardpfad von PostgreSQL, und der hängt von der Major-Version ab: `postgres:17` und älter legen die Daten in `/var/lib/postgresql/data` ab, `postgres:18` in `/var/lib/postgresql/18/docker`. Der Pfad muss innerhalb des Volumes liegen, das `DB_VOLUME_PATH` in den Container mountet. Zeigt er woandershin, schreibt PostgreSQL in das Dateisystem des Containers. Die Datenbank ist dann verloren, sobald der Container neu erzeugt wird. ```properties title="Beispiel" PGDATA=/var/lib/postgresql/data/pgdata ``` > **HELIOS** > > > HELIOS setzt die Variable normalerweise nicht, sondern mountet das Volume genau dorthin, wo PostgreSQL seine Daten erwartet. Nur aus einer übernommenen Installation, die `PGDATA` bereits gesetzt hatte, übernimmt HELIOS den Wert unverändert. Beim Upgrade auf eine neue Major-Version fällt er wieder weg. > ### `DB_VOLUME_PATH` Pfad, in dem die Datenbank gespeichert wird. Er geht nicht an PostgreSQL selbst, sondern an Docker, das ihn als Volume in den Container mountet. Er sollte auf einem Datenträger mit ausreichend Speicherplatz liegen. Was hier steht, entscheidet über alles Weitere: Liegt am Pfad schon eine Datenbank, startet PostgreSQL mit dieser weiter. Ist das Verzeichnis leer, legt PostgreSQL eine neue an. Nur dann greifen `POSTGRES_PASSWORD`, `POSTGRES_USER` und `POSTGRES_DB`. Bei jedem weiteren Start ignoriert PostgreSQL sie. ```properties title="Beispiel" DB_VOLUME_PATH=/somewhere/solectrus/postgresql ``` > **HELIOS** > > > HELIOS legt den Pfad bei der Installation fest, standardmäßig auf den Unterordner `postgresql` im Installationsverzeichnis. Unter _Konfiguration → Grundeinstellungen → Speicherorte_ zeigt HELIOS ihn an, ändern lässt er sich dort nicht. > ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `UTC`. Sie betrifft ausschließlich die Zeitstempel im Protokoll des Containers. Die gespeicherten Daten liegen in UTC, daran ändert `TZ` nichts. ```properties title="Beispiel" TZ=Europe/Berlin ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > --- # Was ist der Power-Splitter? > Der Power-Splitter teilt den Verbrauch jedes Verbrauchers in PV-Strom und Netzbezug auf. Darauf beruhen die Verbrauchskosten je Verbraucher. Der Power-Splitter analysiert den Stromverbrauch von E-Auto, Wärmepumpe, Haus und benutzerdefinierten Verbrauchern. Er teilt den Verbrauch auf in den Anteil, der mit Photovoltaik-Strom gedeckt wird, und den Anteil, der aus dem Netz stammt. Auf dieser Aufteilung beruhen die Verbrauchskosten je Verbraucher. > **Hinweis** > > > Zur Darstellung der Berechnungen des Power-Splitters in SOLECTRUS ist ein [Sponsoring-Abo](https://solectrus.de/sponsoring/) erforderlich. > Dazu drei Hinweise: - Die Berechnung erfolgt für sämtliche Verbrauchswerte, die in der InfluxDB vorhanden sind. Das bedeutet, dass nicht nur zukünftige Messwerte, sondern **auch die Messwerte der Vergangenheit** berücksichtigt werden. - Die Berechnung erledigt ein eigener Docker-Container (der eigentliche Power-Splitter). Er läuft dauerhaft im Hintergrund, berechnet die Aufteilung und schreibt sie in ein neues Measurement der InfluxDB. - Der Power-Splitter setzt voraus, dass neben dem Hausverbrauch weitere Verbraucher überwacht werden, etwa ein E-Auto, eine Wärmepumpe oder benutzerdefinierte Verbraucher. Fehlen sie, gibt es nichts aufzuteilen. Dann genügt die Autarkie, die SOLECTRUS auch ohne den Power-Splitter berechnet. ## Berechnete Werte Der Power-Splitter schreibt die folgenden Werte als _Field_ in das Measurement `power_splitter` der InfluxDB: - `wallbox_power_grid`: Netzbezug der Wallbox, in Watt - `house_power_grid`: Netzbezug des Hauses, in Watt - `heatpump_power_grid`: Netzbezug der Wärmepumpe, in Watt - `custom_power_XX_grid`: Netzbezug eines benutzerdefinierten Verbrauchers (`XX` von 01 bis 20), in Watt - `battery_charging_power_grid`: Netzbezug der Batterie, in Watt Beim Start prüft der Power-Splitter zunächst, ob Messwerte aus der Vergangenheit vorliegen, für die noch kein Split erfolgt ist. Diese arbeitet er nach, beginnend beim ältesten noch unbearbeiteten Tag. Je nach Datenmenge dauert das eine Weile, etwa 30 Minuten sind nicht ungewöhnlich. Anschließend erfolgt die Berechnung für den aktuellen Tag. Der Power-Splitter läuft dann im Endlosmodus und berechnet den aktuellen Tag in einem vorgegebenen Intervall (in einer Installation mit HELIOS alle 5 Minuten) permanent neu, um hinzugekommene Messwerte zu berücksichtigen. Um Mitternacht wird der Tag abgeschlossen und der nächste Tag begonnen. ## Neuberechnung erzwingen Mitunter sollen die berechneten Werte verworfen und neu berechnet werden, etwa nach einem nachträglichen Import historischer Messwerte. Dafür bekommt der laufende Container das Signal `USR1`: ```bash docker compose kill --signal USR1 power-splitter ``` Der Container beendet sich dabei nicht, sondern beginnt von vorn. Der Fortschritt steht im Protokoll. Danach wechselt er zurück in den Endlosmodus. > **Das geht nur im Terminal** > > > Für die Neuberechnung gibt es in HELIOS bislang keinen Knopf. Sie ist eine der wenigen Aufgaben, die eine Anmeldung auf dem Server erfordern. > Ist die Vergangenheit abgearbeitet, leert der Power-Splitter den Redis-Cache und setzt die Tageszusammenfassungen zurück. Beides erledigt er selbst, denn die Zusammenfassungen enthalten auch seine Werte. Nötig sind dafür `DB_HOST`, `DB_USER`, `DB_PASSWORD` und `REDIS_URL` – in einer Installation mit HELIOS sind sie immer gesetzt. ## Logging Der Power-Splitter schreibt ein Protokoll ins Docker-Log, das im Normalfall so aussieht: ```log Power Splitter for SOLECTRUS, Version v1.0.2, built at 2026-05-26 15:10:41 +0200 Using Ruby 4.0.5 on platform aarch64-linux-musl Copyright (c) 2024-2026 Georg Ledermann https://github.com/solectrus/power-splitter Accessing InfluxDB at http://influxdb:8086, bucket solectrus Sensor initialization started - Sensor 'grid_import_power' mapped to 'SENEC:grid_power_plus' - Sensor 'house_power' mapped to 'SENEC:house_power' - Sensor 'heatpump_power' mapped to 'Consumer:power' - Sensor 'wallbox_power' mapped to 'SENEC:wallbox_charge_power' - Sensor 'battery_charging_power' mapped to 'SENEC:bat_power_plus' - Sensor 'custom_power_01' mapped to 'Washer:power' - Sensor 'custom_power_02' mapped to 'Fridge:power' - Sensor 'custom_power_03' mapped to 'KabelFritz:power' - Sensor 'custom_power_04' mapped to 'Synology:power' - Sensor 'custom_power_05' mapped to 'iMac:power' - Sensor 'custom_power_06' mapped to 'Dishwasher:power' - Sensor 'house_power' excluded 'heatpump_power' Sensor initialization completed Starting endless loop for processing current data... 2026-07-14 10:16:17 +0200 - Processing day 2026-07-14 Pushing 123 records to InfluxDB Sleeping for 300 seconds... ... ``` Fehler protokolliert der Power-Splitter ebenfalls, etwa wenn die InfluxDB nicht erreichbar ist. ## Quelltext Der Power-Splitter ist in Ruby implementiert, der Quelltext ist auf GitHub verfügbar: \ [github.com/solectrus/power-splitter](https://github.com/solectrus/power-splitter) --- # Inbetriebnahme des Power-Splitters > Die Voraussetzungen für den Power-Splitter – ein weiterer Verbraucher neben dem Haus, die passenden Sensoren und der erste Durchlauf. [HELIOS](/docs/referenz/helios/) installiert den Power-Splitter automatisch, sobald die Voraussetzungen erfüllt sind. ## 1. Ein weiterer Verbraucher Neben dem Hausverbrauch muss mindestens ein weiterer Verbraucher an SOLECTRUS angebunden sein: ein E-Auto, eine Wärmepumpe oder ein benutzerdefinierter Verbraucher. Deren Messwerte müssen im Dashboard sichtbar sein. Gibt es nur den Hausverbrauch, gibt es nichts aufzuteilen. ## 2. Die passenden Sensoren Zugeordnet sein müssen mindestens `GRID_IMPORT_POWER` (Netzbezug) und `HOUSE_POWER` (Hausverbrauch), dazu die Sensoren der Verbraucher, deren Verbrauch aufgeteilt werden soll. Die Zuordnung erfolgt in HELIOS unter _Konfiguration → Sensoren_. Sind alle drei Teile beisammen – Netzbezug, Hausverbrauch und ein weiterer Verbraucher – nimmt HELIOS den Power-Splitter beim nächsten Start automatisch mit auf. ## 3. Der erste Durchlauf Beim Start arbeitet der Power-Splitter zunächst die Vergangenheit ab, beginnend beim ältesten noch unbearbeiteten Tag. Je nach Datenmenge und Rechenleistung dauert das eine Weile, eine halbe Stunde ist nicht ungewöhnlich. Mitverfolgen lässt sich das im [Protokoll](/docs/anleitungen/logging/). Danach leert der Power-Splitter den Redis-Cache und setzt die Tageszusammenfassungen zurück, damit sie seine Werte enthalten. Von Hand ist dafür nichts zu tun. ## Im Dashboard Bei einem gewählten Zeitraum (Tag, Woche, Monat, Jahr, Gesamt) zeigt der Tooltip dann bei jedem Verbraucher die Aufteilung seines Verbrauchs. Die Diagramme erscheinen gestapelt. --- # Konfiguration des Power-Splitters > Die Umgebungsvariablen des Power-Splitters, vom Berechnungsintervall über InfluxDB und PostgreSQL bis zu den Sensoren. Der Power-Splitter wird über Umgebungsvariablen konfiguriert. ## Umgebungsvariablen ### `POWER_SPLITTER_INTERVAL` Abstand zwischen zwei Berechnungen in Sekunden, eine Ganzzahl. Standardwert ist `3600`, also eine Stunde. Kleinere Werte lassen den Power-Splitter häufiger laufen. Genauer wird die Berechnung dadurch nicht, nur aktueller, und das sieht man ausschließlich am laufenden Tag im Dashboard. Werte unter `300` haben keine Wirkung: Der Power-Splitter hebt sie auf `300` an, also auf fünf Minuten. ```properties title="Beispiel" POWER_SPLITTER_INTERVAL=300 ``` > **HELIOS** > > > HELIOS trägt fest `300` ein. Einzustellen gibt es nichts. > ### `INFLUX_HOST` Hostname des InfluxDB-Servers. Läuft InfluxDB im selben Docker-Netzwerk, ist das der Name des Docker-Services, also `influxdb`. Es kann aber auch ein externer Server sein, etwa `influxdb.example.com`. ```properties title="Beispiel" INFLUX_HOST=influxdb ``` > **HELIOS** > > > HELIOS setzt den Hostnamen fest auf `influxdb`, auch bei aktivem [Ingest-Dienst](/docs/referenz/ingest/). Einzustellen gibt es nichts. > ### `INFLUX_SCHEMA` Schema für die Verbindung zu InfluxDB, `http` oder `https`. Standardwert ist `http`. Bei einer externen InfluxDB mit TLS gehört hier `https` hin. ```properties title="Beispiel" INFLUX_SCHEMA=https ``` > **HELIOS** > > > HELIOS setzt `http`, denn innerhalb des Docker-Netzwerks wird nicht verschlüsselt. > ### `INFLUX_PORT` Port für die Verbindung zu InfluxDB, eine Ganzzahl. Standardwert ist `8086`. Bei einer externen, per TLS abgesicherten InfluxDB ist es oft `443`. ```properties title="Beispiel" INFLUX_PORT=443 ``` > **HELIOS** > > > HELIOS setzt den Port fest auf `8086`. Einzustellen gibt es nichts. > ### `INFLUX_TOKEN` Token, mit dem sich der Power-Splitter bei InfluxDB anmeldet. Er muss dort existieren und das Recht haben, den angegebenen Bucket zu **lesen** und in ihn zu **schreiben**. Ein reiner Schreib-Token genügt nicht: Der Power-Splitter holt sich die Messwerte der Sensoren aus InfluxDB, rechnet und legt das Ergebnis dort wieder ab. Passt der Token nicht, weist InfluxDB die Zugriffe ab. Der Power-Splitter protokolliert Fehler, und im Dashboard bleibt die Aufteilung des Netzbezugs leer. ```properties title="Beispiel" INFLUX_TOKEN=my-super-secret-readwrite-token ``` > **HELIOS** > > > HELIOS gibt dem Power-Splitter einen Token mit Lese- und Schreibrecht, siehe [`INFLUX_TOKEN_READWRITE`](/docs/referenz/helios/konfiguration/#influx_token_readwrite). Den reinen Schreib-Token der Kollektoren bekommt er nicht. > ### `INFLUX_ORG` Organisation in InfluxDB, in der die Messwerte liegen. Eine Organisation ist der Mandant, dem Benutzer, Buckets und Tokens gehören. InfluxDB legt sie [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. In einer SOLECTRUS-Installation heißt sie `solectrus`. Der Name muss zu der Organisation passen, die in InfluxDB tatsächlich existiert. Ein anderer Wert benennt sie nicht um, er lässt den Power-Splitter nur ins Leere greifen. ```properties title="Beispiel" INFLUX_ORG=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor. Einzustellen gibt es nichts. > ### `INFLUX_BUCKET` Bucket in InfluxDB, aus dem der Power-Splitter die Messwerte liest und in den er seine Ergebnisse schreibt. Ein Bucket ist das, was anderswo die Datenbank wäre: ein benannter Speicher mit eigener Aufbewahrungsdauer. Auch ihn legt InfluxDB [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. Eine SOLECTRUS-Installation kommt mit einem einzigen aus, er heißt `solectrus`. Es muss derselbe Bucket sein, in den die Kollektoren schreiben und aus dem das Dashboard liest. Ein anderer Name führt den Power-Splitter auf einen leeren oder nicht vorhandenen Bucket, und er hat nichts zu rechnen. ```properties title="Beispiel" INFLUX_BUCKET=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor. Einzustellen gibt es nichts. > ### `REDIS_URL` Adresse des Redis-Cache, den das Dashboard nutzt. Der Power-Splitter leert ihn einmalig, nachdem er die Vergangenheit durchgerechnet hat. Sonst zeigt das Dashboard weiter die alten, zwischengespeicherten Werte. Ohne die Variable schreibt der Power-Splitter eine Warnung ins Protokoll und lässt den Cache stehen. Er ist dann [von Hand zu leeren](/docs/referenz/redis/#cache-leeren). ```properties title="Beispiel" REDIS_URL=redis://redis:6379/1 ``` > **HELIOS** > > > HELIOS setzt die Adresse fest auf `redis://redis:6379/1`. Einzustellen gibt es nichts. > ### `DB_HOST` Hostname der PostgreSQL-Datenbank des Dashboards. Läuft sie im selben Docker-Netzwerk, ist das der Name des Docker-Services, also `postgresql`. Wirksam nur zusammen mit `DB_USER` und `DB_PASSWORD`. Der Power-Splitter braucht die drei, um nach einer Neuberechnung die Tageszusammenfassungen des Dashboards zu löschen. Fehlt eine davon, schreibt er eine Warnung ins Protokoll, und die Zusammenfassungen sind im Dashboard von Hand zurückzusetzen. ```properties title="Beispiel" DB_HOST=postgresql ``` > **HELIOS** > > > HELIOS setzt den Hostnamen fest auf `postgresql`. Einzustellen gibt es nichts. > ### `DB_USER` Benutzername für die PostgreSQL-Datenbank, üblicherweise `postgres`. Wirksam nur zusammen mit `DB_HOST` und `DB_PASSWORD`. Fehlt eine der drei, kann der Power-Splitter die Tageszusammenfassungen des Dashboards nicht löschen. ```properties title="Beispiel" DB_USER=postgres ``` > **HELIOS** > > > HELIOS setzt den Benutzernamen fest auf `postgres`. Einzustellen gibt es nichts. > ### `DB_PASSWORD` Passwort für die PostgreSQL-Datenbank. Wirksam nur zusammen mit `DB_HOST` und `DB_USER`. Fehlt eine der drei, kann der Power-Splitter die Tageszusammenfassungen des Dashboards nicht löschen. ```properties title="Beispiel" DB_PASSWORD=ExAmPl3PA55W0rD ``` > **HELIOS** > > > HELIOS reicht das Passwort durch, das es bei der Installation für PostgreSQL erzeugt hat, siehe [`POSTGRES_PASSWORD`](/docs/referenz/postgresql/konfiguration/). Einzustellen gibt es nichts. > ### `INSTALLATION_DATE` Datum der Inbetriebnahme der PV-Anlage im Format `JJJJ-MM-TT`. Es gibt der Neuberechnung einen definierten Startpunkt. Ohne die Variable sucht der Power-Splitter den ältesten Tag, für den Messwerte vorliegen, und beginnt dort. Liegt der weit vor der Inbetriebnahme, rechnet er unnötig lange. ```properties title="Beispiel" INSTALLATION_DATE=2020-11-27 ``` > **HELIOS** > > > HELIOS fragt das Datum unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, es ist ein Pflichtfeld. > ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `Europe/Berlin`. Sie bestimmt, wo ein Tag beginnt und endet, denn der Power-Splitter rechnet tageweise. Eine falsche Zeitzone verschiebt die Tagesgrenzen und damit die Aufteilung an den Rändern. ```properties title="Beispiel" TZ=Europe/Rome ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > ## Sensor-Definition Der Power-Splitter nutzt dieselben Sensoren wie das Dashboard, beschrieben unter [Sensor-Konfiguration](/docs/referenz/dashboard/sensor-konfiguration/). Im Einzelnen sind das diese Variablen: - `INFLUX_SENSOR_GRID_IMPORT_POWER` - `INFLUX_SENSOR_HOUSE_POWER` - `INFLUX_SENSOR_WALLBOX_POWER` - `INFLUX_SENSOR_HEATPUMP_POWER` - `INFLUX_SENSOR_BATTERY_CHARGING_POWER` - `INFLUX_SENSOR_CUSTOM_POWER_01` - `INFLUX_SENSOR_CUSTOM_POWER_02` - `INFLUX_SENSOR_CUSTOM_POWER_03` - `INFLUX_SENSOR_CUSTOM_POWER_04` - `INFLUX_SENSOR_CUSTOM_POWER_05` - `INFLUX_SENSOR_CUSTOM_POWER_06` - `INFLUX_SENSOR_CUSTOM_POWER_07` - `INFLUX_SENSOR_CUSTOM_POWER_08` - `INFLUX_SENSOR_CUSTOM_POWER_09` - `INFLUX_SENSOR_CUSTOM_POWER_10` - `INFLUX_SENSOR_CUSTOM_POWER_11` - `INFLUX_SENSOR_CUSTOM_POWER_12` - `INFLUX_SENSOR_CUSTOM_POWER_13` - `INFLUX_SENSOR_CUSTOM_POWER_14` - `INFLUX_SENSOR_CUSTOM_POWER_15` - `INFLUX_SENSOR_CUSTOM_POWER_16` - `INFLUX_SENSOR_CUSTOM_POWER_17` - `INFLUX_SENSOR_CUSTOM_POWER_18` - `INFLUX_SENSOR_CUSTOM_POWER_19` - `INFLUX_SENSOR_CUSTOM_POWER_20` - `INFLUX_EXCLUDE_FROM_HOUSE_POWER` `INFLUX_SENSOR_GRID_IMPORT_POWER` und `INFLUX_SENSOR_HOUSE_POWER` sind Pflicht. Fehlt eine der beiden, bricht der Power-Splitter beim Start ab. Alle übrigen sind optional, und je mehr davon gesetzt sind, desto feiner teilt er den Netzbezug auf. ## Measurement Der Power-Splitter schreibt seine Berechnungen in ein neues Measurement mit der (unveränderlichen) Bezeichnung `power_splitter`. Eine eigene Variable für das Measurement ist daher nicht nötig. --- # Methodik des Power-Splitters > Wie der Power-Splitter den Netzbezug minutenweise auf die Verbraucher verteilt, mit Vorrang für die Wallbox und anteiliger Verteilung des Rests. Der Power-Splitter unterteilt einen Tag in 1-Minuten-Abschnitte und betrachtet jeden separat. Für jeden Abschnitt wird die durchschnittliche Leistung (in W) jedes Verbrauchers ermittelt: Haus, Wallbox, Wärmepumpe, Akkuladung und die benutzerdefinierten Verbraucher. Der Hausverbrauch ist dabei der bereinigte Wert, also ohne die Verbraucher, die aus ihm herausgerechnet sind. Geschrieben werden die Ergebnisse anschließend als 5-Minuten-Mittelwerte, das sind 288 Punkte pro Tag. Die Aufteilung der Leistung auf die Verbraucher erfolgt dann so: Der Netzbezug wird zunächst der Wallbox zugeordnet (maximal bis zu deren Verbrauch). Der Rest geht **anteilig** an die übrigen Verbraucher, jeder also nach seinem Anteil am Verbrauch, und auch hier bekommt keiner mehr zugeordnet, als er verbraucht hat. Diese Priorisierung folgt dem Gedanken, dass der Ladevorgang an der Wallbox bewusst gestartet wird, während Haus und Wärmepumpe dauerhaft nebenherlaufen. Ein Zahlenbeispiel: - Netzbezug: 5 kW - Wärmepumpe: 2 kW - Wallbox: 4 kW - Hausverbrauch: 1 kW Es sind also 5 kW aufzuteilen. Die Wallbox hat 4 kW benötigt und erhält diese vollständig zugeordnet. Es bleibt 1 kW übrig. Auf Haus und Wärmepumpe entfallen zusammen 3 kW Verbrauch, das Haus stellt davon ein Drittel, die Wärmepumpe zwei Drittel. Genau so wird der Rest verteilt: - Netzbezug für Wallbox: 4 kW (von 4 kW) - Netzbezug für Haus: 0,33 kW (von 1 kW) - Netzbezug für Wärmepumpe: 0,67 kW (von 2 kW) Einen eigenen Netzbezugs-Wert bekommt jeder benutzerdefinierte Verbraucher. Was er bedeutet, hängt davon ab, ob der Verbraucher aus dem Hausverbrauch herausgerechnet ist: - **Herausgerechnet**: Er zählt als eigener Verbraucher. Sein Netzbezug kommt zu dem des Hauses hinzu. - **Nicht herausgerechnet**: Er steckt weiterhin im Hausverbrauch. Sein Netzbezug ist dann ein Teil des Haus-Netzbezugs und darf nicht dazuaddiert werden. Aufgeteilt wird nur der Netzbezug, nicht der PV-Strom. Für den Akku heißt das: Strom **aus** dem Akku gilt als PV-Strom, denn der Akku nimmt üblicherweise nur PV-Strom auf und gibt ihn zeitverzögert wieder ab. Beim Laden zählt der Akku dagegen als Verbraucher wie jeder andere und bekommt seinen Anteil am Netzbezug zugeordnet, als `battery_charging_power_grid`. --- # Was ist Redis? > Die In-Memory-Datenbank, in der SOLECTRUS seinen Cache ablegt und die Live-Aktualisierung des Dashboards abwickelt. SOLECTRUS legt seinen Cache in der In-Memory-Datenbank **Redis** ab. Das Ergebnis jeder InfluxDB-Abfrage bleibt eine Zeit lang im Cache, sodass identische Abfragen die InfluxDB nicht erneut belasten. Redis transportiert außerdem die Live-Aktualisierung des Dashboards. Ohne Redis startet das Dashboard nicht. Beim Beenden, etwa im Rahmen eines Reboots, geht der Cache nicht verloren: Redis schreibt ihn in die Datei `dump.rdb` und liest sie beim nächsten Start wieder ein. Unterstützt wird Redis in Version 5 oder höher, wobei die aktuelle Version **8** empfohlen wird. ## Cache leeren Nötig ist das selten, etwa nachdem Messwerte aus der Vergangenheit nachträglich in die InfluxDB gekommen sind. In [HELIOS](/docs/referenz/helios/) gibt es dafür beim Dienst _Redis_ den Knopf **Cache leeren**. Ohne HELIOS erledigt das ein Befehl im Installationsverzeichnis: ```bash docker compose exec redis redis-cli FLUSHALL ``` Danach baut SOLECTRUS den Cache im laufenden Betrieb wieder auf. Die ersten Abfragen dauern dann etwas länger. ## Logging Wie alle Docker-Container schreibt auch Redis ein Protokoll ins Docker-Log, das in etwa so aussieht: ```log ... Starting Redis Server 1:C 14 Jul 2026 10:00:50.838 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 1:C 14 Jul 2026 10:00:50.838 * Redis version=8.8.0, bits=64, commit=00000000, modified=1, pid=1, just started 1:C 14 Jul 2026 10:00:50.838 * Configuration loaded ... 1:M 14 Jul 2026 10:00:50.889 * Ready to accept connections tcp ... ``` ## Docker-Image Das offizielle Docker-Image von Redis ist auf Docker Hub verfügbar: \ [https://hub.docker.com/\_/redis](https://hub.docker.com/_/redis) --- # Konfiguration von Redis > Zwei Umgebungsvariablen genügen Redis, für den Speicherort der Datei dump.rdb und für die Zeitzone im Protokoll. Ein Passwort gehört nicht dazu. Redis läuft im offiziellen Docker-Image. Viel gibt es nicht einzustellen: zwei Variablen, mehr braucht der Cache nicht. Ein Passwort ist keine davon, denn der Container ist nur im Docker-Netzwerk erreichbar. ## Umgebungsvariablen ### `REDIS_VOLUME_PATH` Pfad, in dem Redis seine Daten ablegt. Er geht nicht an Redis selbst, sondern an Docker, das ihn als Volume in den Container mountet. Dort landet die Datei `dump.rdb`, in die Redis beim Herunterfahren den Inhalt seines Speichers schreibt. Liegt am Pfad schon eine `dump.rdb`, liest Redis sie beim Start ein, und der Cache steht sofort wieder bereit. Fehlt sie, startet Redis mit leerem Cache. Verloren geht dabei nichts: Das Dashboard füllt den Cache im laufenden Betrieb neu, die ersten Abfragen dauern dann etwas länger. ```properties title="Beispiel" REDIS_VOLUME_PATH=/somewhere/solectrus/redis ``` > **HELIOS** > > > HELIOS legt den Pfad bei der Installation fest, standardmäßig auf den Unterordner `redis` im Installationsverzeichnis. Unter _Konfiguration → Grundeinstellungen → Speicherorte_ zeigt HELIOS ihn an, ändern lässt er sich dort nicht. > ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `UTC`. Sie betrifft ausschließlich die Zeitstempel im Protokoll des Containers. Was im Cache liegt, berührt sie nicht. ```properties title="Beispiel" TZ=Europe/Berlin ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > --- # Was ist der SENEC-Charger? > Der SENEC-Charger belädt einen SENEC-Stromspeicher aus dem Netz, wenn der Strompreis niedrig ist und die PV-Prognose wenig Ertrag erwarten lässt. Der **SENEC-Charger** steuert einen SENEC-Stromspeicher bei Verwendung eines dynamischen Stromtarifs (von [Tibber](https://tibber.com/de)). Er belädt ihn aus dem Netz, wenn der Strompreis unter einem Schwellwert liegt und die PV-Prognose zu wenig Ertrag erwarten lässt. Damit der SENEC-Charger funktioniert, werden zwei weitere Kollektoren benötigt: - Der [Tibber-Collector](/docs/referenz/tibber-collector/) sammelt die Strompreise von Tibber und schreibt sie in die InfluxDB. - Der [Forecast-Collector](/docs/referenz/forecast-collector/) sammelt die Wettervorhersage und schreibt sie ebenfalls in die InfluxDB. > **Hinweis** > > > Da für die Beladung des Speichers ein direkter Zugriff auf den SENEC-Stromspeicher notwendig ist, funktioniert dies nicht mit dem SENEC.Home 4 oder neuer. Unterstützt werden ausschließlich SENEC.Home V2.1 und V3. > ## Funktionsweise Der SENEC-Charger liest stündlich die Strompreise und die Prognose aus der InfluxDB und entscheidet, ob der Stromspeicher aus dem Netz beladen werden soll. Diese Faktoren gehen ein: - Betriebszustand des Stromspeichers, der einen leeren Akku meldet - Strompreis in den kommenden Stunden - Erwartete PV-Erzeugung laut Prognose Wie die Entscheidung im Einzelnen fällt, steht unter [Methodik](/docs/referenz/senec-charger/methodik/). ## Logging Der Charger schreibt ein Protokoll ins Docker-Log, das im Normalfall so aussieht: ```log SENEC charger for SOLECTRUS, Version 0.7.2, built at 2026-03-22T09:10:09.586Z https://github.com/solectrus/senec-charger Copyright (c) 2023-2026 Georg Ledermann, released under the MIT License Using Ruby 4.0.2 on platform aarch64-linux-musl Connecting to SENEC at https://192.168.178.29 Connecting to InfluxDB at http://influxdb:8086, bucket solectrus, measurements Prices and Forecast #1 - 2026-07-14 10:09:48 +0200 Grid power not cheap, nothing to do Checked prices between Sunday, 07:15 - Monday, 00:45, ⌀ 1.06 Best 4-hour range: Sunday, 07:15 - Sunday, 09:00, ⌀ 0.75 Ratio best/average: 70.9 % Sleeping for 3600 seconds ... ... ``` Fehler protokolliert der Charger ebenfalls, etwa wenn der Stromspeicher oder die InfluxDB nicht erreichbar ist. ## Quelltext Der SENEC-Charger ist in Ruby implementiert, der Quelltext ist auf GitHub verfügbar: \ [github.com/solectrus/senec-charger](https://github.com/solectrus/senec-charger) --- # Konfiguration des SENEC-Chargers > Umgebungsvariablen des SENEC-Chargers – Zugang zum Stromspeicher, Schwellwerte für Preis und Prognose sowie InfluxDB-Zugang. Der SENEC-Charger wird über Umgebungsvariablen konfiguriert. > **HELIOS** > > > HELIOS verwaltet den SENEC-Charger, richtet ihn aber nur ein, wenn die Voraussetzungen stimmen: ein lokal abgefragter SENEC-Speicher (V2.1 oder V3) und ein eingerichteter [Forecast-Collector](/docs/referenz/forecast-collector/). Dann erscheint die preisoptimierte Beladung unter _Konfiguration → Grundeinstellungen → Dynamische Strompreise_, zusammen mit den [Tibber-Preisen](/docs/referenz/tibber-collector/), die sie voraussetzt. > ## Umgebungsvariablen ### `SENEC_HOST` Hostname des SENEC-Stromspeichers, üblicherweise eine IP-Adresse im lokalen Netz. Eine lokale Domain geht ebenso. Hier gehört nur der Host hin, **kein** `http://` oder `https://` und keine Portnummer. Das Protokoll steht getrennt in `SENEC_SCHEMA`. Ergibt beides zusammen keine gültige URL, bricht der Charger beim Start ab. ```properties title="Beispiel" SENEC_HOST=192.168.1.42 ``` > **HELIOS** > > > HELIOS setzt den Hostnamen aus den Angaben zum [SENEC-Collector](/docs/referenz/senec-collector/), abgefragt unter _Konfiguration → Datenquellen → SENEC-Collector_. Charger und Collector teilen sich denselben Wert. > ### `SENEC_SCHEMA` Protokoll für die Verbindung zum Stromspeicher, `http` oder `https`. Standardwert ist `https`, denn ein SENEC.Home V3 antwortet ab Werk verschlüsselt. Ein anderer Wert als `http` oder `https` ergibt keine gültige URL, der Charger bricht dann beim Start ab. ```properties title="Beispiel" SENEC_SCHEMA=http ``` > **HELIOS** > > > HELIOS setzt das Protokoll aus den Angaben zum [SENEC-Collector](/docs/referenz/senec-collector/), abgefragt unter _Konfiguration → Datenquellen → SENEC-Collector_. Charger und Collector teilen sich denselben Wert. > ### `CHARGER_INTERVAL` Abstand zwischen zwei Prüfungen in Sekunden, eine positive Ganzzahl. Standardwert ist `3600`, also eine Stunde. Bei jeder Prüfung liest der Charger Preise und Prognose aus der InfluxDB und entscheidet über eine Beladung. Ein kürzeres Intervall bringt wenig, denn die Preise stehen für 24 Stunden im Voraus fest. Eine `0` oder ein nicht-numerischer Wert lässt den Charger beim Start abbrechen. ```properties title="Beispiel" CHARGER_INTERVAL=1800 ``` > **HELIOS** > > > HELIOS fragt das Prüfintervall unter _Konfiguration → Grundeinstellungen → Dynamische Strompreise_ ab, vorbelegt mit `3600`. > ### `CHARGER_PRICE_MAX` Preisgrenze in Prozent, bezogen auf den Durchschnittspreis der nächsten 24 Stunden. Erlaubt ist eine Ganzzahl größer als `0` und kleiner als `100`, alles andere lässt den Charger beim Start abbrechen. Standardwert ist `70`. Der Charger sucht das günstigste zusammenhängende Zeitfenster der nächsten 24 Stunden (siehe `CHARGER_PRICE_TIME_RANGE`) und vergleicht dessen Durchschnittspreis mit dem Durchschnitt der gesamten 24 Stunden. Bei `70` gilt der Strom als günstig, sobald das Fenster höchstens 70 % dieses Durchschnitts kostet. Beginnt das Fenster gerade, lädt der Charger. Liegt es später, wartet er darauf. Je kleiner der Wert, desto seltener wird geladen. ```properties title="Beispiel" CHARGER_PRICE_MAX=60 ``` > **HELIOS** > > > HELIOS fragt die Preisgrenze unter _Konfiguration → Grundeinstellungen → Dynamische Strompreise_ ab, vorbelegt mit `70`. > ### `CHARGER_PRICE_TIME_RANGE` Länge des Zeitfensters in Stunden, eine positive Ganzzahl. Standardwert ist `4`. Gemeint ist die Zeit, die der Speicher ungefähr für eine volle Beladung braucht, abhängig von seiner Kapazität und der Ladeleistung. Der Charger legt ein gleitendes Fenster dieser Länge über die nächsten 24 Stunden und sucht darin das günstigste zusammenhängende Zeitfenster. Ein zu langes Fenster verwässert den Preisvorteil, ein zu kurzes endet, bevor der Speicher voll ist. Eine `0` oder ein nicht-numerischer Wert lässt den Charger beim Start abbrechen. ```properties title="Beispiel" CHARGER_PRICE_TIME_RANGE=3 ``` > **HELIOS** > > > HELIOS fragt die Ladedauer unter _Konfiguration → Grundeinstellungen → Dynamische Strompreise_ ab, vorbelegt mit `4`. > ### `CHARGER_FORECAST_THRESHOLD` Grenze für den erwarteten PV-Ertrag der nächsten 24 Stunden in kWh, eine positive Ganzzahl. Standardwert ist `20`. Liegt die Prognose über diesem Wert, lädt der Charger **nicht** aus dem Netz, denn der Speicher füllt sich ohnehin aus der PV-Anlage. Der Wert gehört damit zur Größe der Anlage: Zu hoch gesetzt, verhindert er die Netzbeladung fast immer. Eine `0` oder ein nicht-numerischer Wert lässt den Charger beim Start abbrechen. ```properties title="Beispiel" CHARGER_FORECAST_THRESHOLD=25 ``` > **HELIOS** > > > HELIOS fragt die Prognose-Schwelle unter _Konfiguration → Grundeinstellungen → Dynamische Strompreise_ ab, vorbelegt mit `20`. > ### `CHARGER_DRY_RUN` Trockenlauf. Erlaubt sind `true` und `false`, jeder andere Wert gilt als `false`. Standardwert ist `false`. Bei `true` rechnet und protokolliert der Charger wie sonst auch, rührt den Speicher aber nicht an: Er startet keine Beladung und gibt keine Entladung frei. So lässt sich die Konfiguration beobachten, bevor sie scharf geschaltet wird. ```properties title="Beispiel" CHARGER_DRY_RUN=true ``` > **HELIOS** > > > HELIOS bietet dafür einen Schalter unter _Konfiguration → Grundeinstellungen → Dynamische Strompreise_, standardmäßig aus. > ### `INFLUX_HOST` Hostname des InfluxDB-Servers. Läuft InfluxDB im selben Docker-Netzwerk, ist das der Name des Docker-Services, also `influxdb`. Es kann aber auch ein externer Server sein, etwa `influxdb.example.com`. ```properties title="Beispiel" INFLUX_HOST=influxdb ``` > **HELIOS** > > > HELIOS setzt den Hostnamen automatisch auf `influxdb`. > ### `INFLUX_SCHEMA` Schema für die Verbindung zu InfluxDB, `http` oder `https`. Standardwert ist `http`. Bei einer externen InfluxDB mit TLS gehört hier `https` hin. ```properties title="Beispiel" INFLUX_SCHEMA=https ``` > **HELIOS** > > > HELIOS setzt das Schema nicht, es bleibt beim Standardwert `http`. Innerhalb des Docker-Netzwerks wird nicht verschlüsselt. > ### `INFLUX_PORT` Port für die Verbindung zu InfluxDB, eine Ganzzahl. Standardwert ist `8086`. Bei einer externen, per TLS abgesicherten InfluxDB ist es oft `443`. ```properties title="Beispiel" INFLUX_PORT=443 ``` > **HELIOS** > > > HELIOS setzt den Port nicht, es bleibt beim Standardwert `8086`. > ### `INFLUX_TOKEN` Token, mit dem sich der Charger bei InfluxDB anmeldet. Er muss dort existieren und das Recht haben, den angegebenen Bucket zu **lesen**. Mehr braucht der Charger nicht: Er fragt Preise und Prognose ab und schreibt nie etwas zurück. Passt der Token nicht, weist InfluxDB die Abfragen ab. Der Charger findet dann weder Preise noch Prognose und belädt den Speicher nicht. ```properties title="Beispiel" INFLUX_TOKEN=my-super-secret-read-token ``` > **HELIOS** > > > HELIOS gibt dem Charger den Lese-Token, siehe [`INFLUX_TOKEN_READ`](/docs/referenz/helios/konfiguration/#influx_token_read). Mehr als Lesen braucht er nicht. > ### `INFLUX_ORG` Organisation in InfluxDB, unter der die Messwerte liegen. Eine Organisation ist der Mandant, dem Benutzer, Buckets und Tokens gehören. InfluxDB legt sie [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. In einer SOLECTRUS-Installation heißt sie `solectrus`. Der Name muss zu der Organisation passen, die in InfluxDB tatsächlich existiert. Ein anderer Wert lässt den Charger ins Leere lesen. ```properties title="Beispiel" INFLUX_ORG=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. > ### `INFLUX_BUCKET` Bucket in InfluxDB, aus dem der Charger Preise und Prognose liest. Ein Bucket ist das, was anderswo die Datenbank wäre: ein benannter Speicher mit eigener Aufbewahrungsdauer. Auch ihn legt InfluxDB [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. Eine SOLECTRUS-Installation kommt mit einem einzigen aus, er heißt `solectrus`. Der Name muss zu dem Bucket passen, in den Tibber- und Forecast-Collector schreiben. Gibt es ihn nicht, lehnt InfluxDB die Abfragen ab. ```properties title="Beispiel" INFLUX_BUCKET=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. > ### `INFLUX_MEASUREMENT_PRICES` Measurement in InfluxDB, aus dem der Charger die Strompreise liest. Standardwert ist `Prices`. Es muss dasselbe Measurement sein, in das der [Tibber-Collector](/docs/referenz/tibber-collector/) die Preise schreibt, dort heißt die Variable `INFLUX_MEASUREMENT`. Der Charger liest daraus das Feld `amount`. Passt der Name nicht, findet er keine Preise und belädt den Speicher nie. ```properties title="Beispiel" INFLUX_MEASUREMENT_PRICES=Prices ``` > **HELIOS** > > > HELIOS setzt das Measurement gemeinsam mit dem [Tibber-Collector](/docs/referenz/tibber-collector/): Es ist der Wert aus _Konfiguration → Grundeinstellungen → Dynamische Strompreise_, vorbelegt mit `Prices`. > ### `INFLUX_MEASUREMENT_FORECAST` Measurement in InfluxDB, aus dem der Charger die PV-Prognose liest. Standardwert ist `Forecast`. Es muss dasselbe Measurement sein, in das der [Forecast-Collector](/docs/referenz/forecast-collector/) die Prognose schreibt. Der Charger liest daraus das Feld `watt` und rechnet daraus den erwarteten Ertrag der nächsten 24 Stunden in kWh aus. Passt der Name nicht, sieht der Charger einen Ertrag von 0 kWh und lädt bei günstigem Strom auch dann, wenn die Sonne scheint. ```properties title="Beispiel" INFLUX_MEASUREMENT_FORECAST=Forecast ``` > **HELIOS** > > > HELIOS setzt das Measurement auf denselben Wert wie beim [Forecast-Collector](/docs/referenz/forecast-collector/), abgefragt unter _Konfiguration → Datenquellen → Forecast-Collector_, vorbelegt mit `forecast`. > ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `UTC`. Sie betrifft die Zeitstempel im Protokoll des Chargers, also auch die Uhrzeiten der geprüften Preisfenster. Auf die Entscheidung selbst wirkt sie sich nicht aus. ```properties title="Beispiel" TZ=Europe/Berlin ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > --- # Methodik des SENEC-Chargers > Unter welchen Bedingungen der SENEC-Charger den Stromspeicher aus dem Netz belädt und wie er jede Prüfung durchläuft. Eine Beladung erfolgt unter folgenden Bedingungen, die alle erfüllt sein müssen: - Der Strompreis ist gerade besonders günstig - Es ist nur wenig Solarstrom zu erwarten - Der Speicher ist leer „Leer" meldet dabei der Speicher selbst über seinen Betriebszustand. Ein bestimmter Prozentwert steckt nicht dahinter. Ob die Bedingungen erfüllt sind, prüft der Charger in regelmäßigen Abständen (normalerweise stündlich). Im Docker-Log protokolliert und begründet er jede Entscheidung. Steigt der Ladestand während einer laufenden Beladung seit der letzten Prüfung nicht mehr – in der Regel, weil der Akku voll ist –, gibt der Charger die Entladung wieder frei. ## Flussdiagramm Jede Prüfung folgt diesem Ablauf: ```mermaid flowchart BEGINN --> CHA{Läuft gerade eine Netzbeladung?} CHA -->|JA| INC{Ladestand erhöht seit letzter Prüfung?} CHA -->|NEIN| EMPTY{Akku leer?} INC -->|JA| END1[ENDE] INC -->|NEIN| STOP[Entladung zulassen!] EMPTY -->|JA| SUN{Wird es nennenswert Sonnenschein geben?} EMPTY -->|NEIN| END4[ENDE] SUN -->|JA| END3[ENDE] SUN -->|NEIN| CHEAP{Netzstrom günstig?} CHEAP -->|JA| START[Starte Beladung!] CHEAP -->|NEIN| END5[ENDE] ``` Geprüft wird dabei nur die Netzbeladung, die der Charger selbst ausgelöst hat. Eine laufende Beladung aus der PV-Anlage zählt hier nicht. > **Hinweis** > > > Der SENEC-Charger lässt sich auch im Trockenlauf („dry run") betreiben. Er **simuliert** die Entscheidung dann nur, ohne den Speicher zu beladen. Mehr dazu in der [Konfiguration](/docs/referenz/senec-charger/konfiguration/#charger_dry_run) unter `CHARGER_DRY_RUN`. > --- # Was ist der SENEC-Collector? > Der SENEC-Collector liest die Messwerte eines SENEC-Stromspeichers aus und schreibt sie in die InfluxDB – lokal oder über die SENEC-Cloud. Der **SENEC-Collector** sammelt die Messwerte, die von einem SENEC-Stromspeicher gemeldet werden, und schreibt diese in die InfluxDB. Der Collector ist kompatibel mit folgenden Stromspeichern: - SENEC.Home V2.1 - SENEC.Home V3 - SENEC.Home 4 ## Betriebsmodi Grundsätzlich kann der Collector in zwei verschiedenen **Betriebsmodi** eingesetzt werden: - **Lokal:** Direkter Zugriff auf den SENEC-Stromspeicher über dessen lokale IP-Adresse. Die Daten werden über die `lala.cgi`-Schnittstelle ausgelesen. Möglich ist das beim V2.1 und V3, nicht aber beim Home 4, denn dieser hat keine lokale Schnittstelle. Der Collector liest in kurzem Intervall aus, standardmäßig alle 5 Sekunden. - **Cloud:** Abholen der Messwerte aus der SENEC-Cloud, über die Schnittstelle, die SENEC für seine Mobil-Apps bereitstellt. Dafür sind die SENEC-Zugangsdaten anzugeben (E-Mail und Passwort). Möglich ist das auch für den Home 4. Neue Werte liefert die Cloud allerdings nur in größeren Abständen: beim Home 4 im 1-Minuten-Takt, beim V2.1 und V3 im 5-Minuten-Takt. Ein kürzeres Abfrageintervall bringt daher nichts, der Collector lässt ohnehin nur mindestens 60 Sekunden zu. ### Vergleich der Betriebsmodi | | Lokal | Cloud | | :-------------- | :-------- | :-------- | | SENEC.Home V2.1 | Ja (5sec) | Ja (5min) | | SENEC.Home V3 | Ja (5sec) | Ja (5min) | | SENEC.Home 4 | Nein | Ja (1min) | Beim V2.1 und V3 sind also beide Betriebsmodi möglich. Über die Cloud läuft SOLECTRUS auch komplett auf einem Cloud-Server, ohne Rechner im lokalen Netzwerk. Dafür kommen die Messwerte nur alle 5 Minuten statt alle 5 Sekunden. ## Erfasste Messwerte Der Collector schreibt die folgenden Messwerte als _Field_ in das angegebene _Measurement_ der InfluxDB. Einige Messwerte sind nur im lokalen Betrieb verfügbar (also nicht beim Home 4). In der Cloud hängen vier Felder zusätzlich am Abfragemodus: `case_temp`, `application_version`, `current_state` und `current_state_ok` liefert der Collector nur bei `SENEC_REQUEST_MODE=full`. Beim Home 4 bleiben `current_state` und `current_state_ok` auch dann leer. | Field | Beschreibung | Lokal | Cloud | | :---------------------- | :-------------------------------------------- | :---: | :--------: | | `application_version` | Version der Firmware | Ja | Nur `full` | | `bat_charge_current` | Batterie-Ladestrom, in A | Ja | Nein | | `bat_fuel_charge` | Batterie-Ladestand, in % | Ja | Ja | | `bat_power_minus` | Batterie-Entladeleistung, in W | Ja | Ja | | `bat_power_plus` | Batterie-Ladeleistung, in W | Ja | Ja | | `bat_voltage` | Batterie-Spannung, in V | Ja | Nein | | `case_temp` | Gehäuse-Temperatur, in °C | Ja | Nur `full` | | `current_state_code` | Aktueller Betriebszustand, als Zahl | Ja | Nein | | `current_state` | Aktueller Betriebszustand, als Text | Ja | Nur `full` | | `current_state_ok` | Aktueller Betriebszustand ist OK (Boolean) | Ja | Nur `full` | | `ev_connected` | Elektroauto verbunden, Ja/Nein | Ja | Ja | | `grid_power_minus` | Netzeinspeisung, in W | Ja | Ja | | `grid_power_plus` | Netzbezug, in W | Ja | Ja | | `house_power` | Hausverbrauch, in W | Ja | Ja | | `inverter_power` | Erzeugte Leistung des Wechselrichters, in W | Ja | Ja | | `mpp1_power` | Leistung von Strang 1, in W | Ja | Nein | | `mpp2_power` | Leistung von Strang 2, in W | Ja | Nein | | `mpp3_power` | Leistung von Strang 3, in W | Ja | Nein | | `power_ratio` | Leistungsbegrenzung, in % | Ja | Nein | | `response_duration` | Dauer der Antwort, in ms | Ja | Nein | | `wallbox_charge_power` | Wallbox-Ladeleistung, in W | Ja | Ja | | `wallbox_charge_power0` | Wallbox-Ladeleistung für erste Wallbox, in W | Ja | Nein | | `wallbox_charge_power1` | Wallbox-Ladeleistung für zweite Wallbox, in W | Ja | Nein | | `wallbox_charge_power2` | Wallbox-Ladeleistung für dritte Wallbox, in W | Ja | Nein | | `wallbox_charge_power3` | Wallbox-Ladeleistung für vierte Wallbox, in W | Ja | Nein | ## Logging Der Collector schreibt ein Protokoll ins Docker-Log, das im Normalfall so aussieht: ```log SENEC collector for SOLECTRUS, Version v0.21.0, built at 2026-06-01T11:03:23.082Z https://github.com/solectrus/senec-collector Copyright (c) 2020-2026 Georg Ledermann, released under the MIT License Using Ruby 4.0.5 on platform aarch64-linux-musl Pushing to InfluxDB at http://influxdb:8086, bucket solectrus, measurement SENEC Wait until InfluxDB is ready ... OK Pulling from your local SENEC at https://192.168.178.29 every 5 seconds Getting state names (language: de) from SENEC by parsing source code... OK, got 99 state names Got record #1 at 2026-07-14 10:22:29 +0200 within 144 ms, FERNABSCHALTUNG, Inverter 4251 W, House 460 W, Wallbox 0 W Successfully pushed record #1 to InfluxDB ... ``` Fehler protokolliert der Collector ebenfalls, etwa wenn der Stromspeicher oder die InfluxDB nicht erreichbar ist. ## Quelltext Der SENEC-Collector ist in Ruby implementiert, der Quelltext ist auf GitHub verfügbar: \ [github.com/solectrus/senec-collector](https://github.com/solectrus/senec-collector) --- # Konfiguration des SENEC-Collectors > Umgebungsvariablen des SENEC-Collectors – Betriebsmodus, Zugang zum Stromspeicher oder zur SENEC-Cloud und InfluxDB-Zugang. Der SENEC-Collector wird über Umgebungsvariablen konfiguriert. Welche Variablen nötig sind, hängt am Betriebsmodus: `SENEC_ADAPTER=local` fragt den Stromspeicher im Heimnetz ab, `SENEC_ADAPTER=cloud` holt die Messwerte bei `mein-senec.de`. Jeder Modus hat seine eigenen Pflichtvariablen, die des anderen Modus ignoriert der Collector. ## Umgebungsvariablen ### `SENEC_ADAPTER` Betriebsmodus des Collectors. Erlaubt sind `local` für den direkten Zugriff auf den Stromspeicher und `cloud` für den Abruf über die SENEC-Cloud. Standardwert ist `local`. Jeder andere Wert bricht den Start ab. Der Home 4 hat keine lokale Schnittstelle, für ihn kommt nur `cloud` in Frage. ```properties title="Beispiel" SENEC_ADAPTER=cloud ``` > **HELIOS** > > > HELIOS fragt die Zugriffsart unter _Konfiguration → Datenquellen → SENEC-Collector_ ab, vorbelegt mit dem lokalen Zugriff. Bei einem Home 4 entfällt die Frage, HELIOS setzt dann `cloud`. > ### `SENEC_HOST` Hostname des SENEC-Stromspeichers, üblicherweise eine IP-Adresse. Pflicht, solange `SENEC_ADAPTER` auf `local` steht. Im Cloud-Modus wird die Variable ignoriert. Hier gehört nur der Host hin, **kein** `http://` oder `https://`. Das Protokoll steht getrennt in `SENEC_SCHEMA`. Fehlt der Host im lokalen Modus, bricht der Collector beim Start mit einer Fehlermeldung ab. ```properties title="Beispiel" SENEC_HOST=192.168.178.29 ``` > **HELIOS** > > > HELIOS fragt die IP-Adresse unter _Konfiguration → Datenquellen → SENEC-Collector_ ab und prüft auf Knopfdruck, ob das Gerät antwortet. Die Frage erscheint nur beim lokalen Zugriff. > ### `SENEC_SCHEMA` Protokoll für die Verbindung zum SENEC-Stromspeicher, `http` oder `https`. Standardwert ist `https`. Im Cloud-Modus wird die Variable ignoriert. Ältere Geräte sprechen mitunter nur `http`. Passt das Protokoll nicht, kommt keine Verbindung zustande. ```properties title="Beispiel" SENEC_SCHEMA=http ``` > **HELIOS** > > > HELIOS fragt das Protokoll unter _Konfiguration → Datenquellen → SENEC-Collector_ ab, vorbelegt mit `https`. Die Frage erscheint nur beim lokalen Zugriff. > ### `SENEC_LANGUAGE` Sprache der Status-Texte, die der Collector vom Gerät liest. Erlaubt sind `de`, `en` und `it`, andere Sprachen liefert das SENEC-Gerät nicht aus. Standardwert ist `de`. Im Cloud-Modus wird die Variable ignoriert. Der Collector liest die Namen der Betriebszustände aus der Weboberfläche des Geräts und schreibt sie als `current_state` in die InfluxDB. Die Sprache entscheidet also, in welcher Sprache dieses Feld gefüllt wird. ```properties title="Beispiel" SENEC_LANGUAGE=en ``` > **HELIOS** > > > HELIOS fragt die Sprache unter _Konfiguration → Datenquellen → SENEC-Collector_ ab, vorbelegt mit Deutsch. Die Frage erscheint nur beim lokalen Zugriff. > ### `SENEC_USERNAME` E-Mail-Adresse für die Anmeldung bei `mein-senec.de`. Pflicht, sobald `SENEC_ADAPTER=cloud` gesetzt ist. Im lokalen Modus wird die Variable ignoriert. Der Collector prüft beim Start, ob der Wert ein `@` enthält, und bricht sonst ab. ```properties title="Beispiel" SENEC_USERNAME=mail@example.com ``` > **HELIOS** > > > HELIOS fragt die E-Mail-Adresse unter _Konfiguration → Datenquellen → SENEC-Collector_ ab. Die Frage erscheint nur beim Cloud-Zugriff. > ### `SENEC_PASSWORD` Passwort für die Anmeldung bei `mein-senec.de`. Pflicht, sobald `SENEC_ADAPTER=cloud` gesetzt ist. Im lokalen Modus wird die Variable ignoriert. ```properties title="Beispiel" SENEC_PASSWORD=my-secret-password ``` > **HELIOS** > > > HELIOS fragt das Passwort unter _Konfiguration → Datenquellen → SENEC-Collector_ ab. Die Frage erscheint nur beim Cloud-Zugriff. > ### `SENEC_TOTP_URI` URI für die Multi-Faktor-Authentifizierung (MFA) bei `mein-senec.de`. Nötig ist sie nur im Cloud-Modus und auch dort nur, wenn das Konto MFA verlangt. Im lokalen Modus wird die Variable ignoriert. Anzugeben ist der vollständige String in Anführungszeichen. Er muss mit `otpauth://` beginnen und einen `secret`-Parameter enthalten, sonst bricht der Collector beim Start ab. Aus dem QR-Code von SENEC oder dem Eintrag im Google Authenticator lässt sich die URI mit dem [QR Code Secret Decoder](https://marq24.github.io/qr-code-decoder/) ermitteln. ```properties title="Beispiel" SENEC_TOTP_URI="otpauth://totp/SENEC:mail%40example.com?secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&digits=6&algorithm=SHA1&issuer=SENEC&period=30" ``` > **HELIOS** > > > HELIOS fragt die TOTP-URI unter _Konfiguration → Datenquellen → SENEC-Collector_ ab, als optionales Feld beim Cloud-Zugriff. Ohne Eintrag lässt HELIOS die Variable weg. > ### `SENEC_SYSTEM_ID` ID des SENEC-Systems, dessen Messwerte der Collector aus der Cloud holt. Nötig ist sie nur, wenn am Konto mehr als ein System hängt. Im lokalen Modus wird die Variable ignoriert. Ohne die Variable listet der Collector die verfügbaren IDs im Protokoll auf und verwendet die **erste**. Für eine andere als die erste ID sind drei Schritte nötig: 1. Die Variable leer lassen und den Collector starten. 2. Die gewünschte ID aus dem Protokoll ablesen. 3. Die ID hier eintragen und den Collector neu starten. ```properties title="Beispiel" SENEC_SYSTEM_ID=12345 ``` > **HELIOS** > > > HELIOS fragt die System-ID unter _Konfiguration → Datenquellen → SENEC-Collector_ ab, als optionales Feld beim Cloud-Zugriff. Ohne Eintrag lässt HELIOS die Variable weg. > ### `SENEC_INTERVAL` Intervall in Sekunden, in dem der Collector die Messwerte abfragt, eine Ganzzahl. Standardwert ist `5` im lokalen Modus und `60` im Cloud-Modus. Diese Werte sind zugleich die Untergrenze: Ein kleinerer Wert wird stillschweigend angehoben. Häufigeres Abfragen brächte ohnehin nichts, denn die Cloud liefert neue Werte nur alle 5 Minuten, beim Home 4 jede Minute. ```properties title="Beispiel" SENEC_INTERVAL=10 ``` > **HELIOS** > > > HELIOS fragt das Intervall unter _Konfiguration → Datenquellen → SENEC-Collector_ ab. Vorbelegt ist es passend zum Zugriff: 5 Sekunden lokal, 60 Sekunden beim Home 4 in der Cloud, sonst 300 Sekunden. > ### `SENEC_IGNORE` Messwerte, die der Collector **nicht** an InfluxDB sendet. Nötig, wenn ein Messwert aus einer anderen Quelle stammt, etwa die Wallbox-Leistung von einem Shelly. Erlaubt ist eine komma-getrennte Liste von [Feldnamen](/docs/referenz/senec-collector/#erfasste-messwerte) ohne Leerzeichen. Ohne die Variable sendet der Collector alle Messwerte. Ein unbekannter Feldname bricht den Start ab. Der Collector nennt ihn dann im Protokoll. ```properties title="Beispiel" SENEC_IGNORE=wallbox_charge_power,grid_power_minus ``` > **HELIOS** > > > HELIOS leitet die Liste selbst ab: Es trägt jedes Feld ein, das ein anderer Collector in dasselbe Measurement schreibt. Einzustellen gibt es nichts. > ### `SENEC_REQUEST_MODE` Umfang der Abfrage in der Cloud. Erlaubt sind `minimal` und `full`, jeder andere Wert bricht den Start ab. Standardwert ist `minimal`. Im lokalen Modus wird die Variable ignoriert. Mit `minimal` fragt der Collector nur einen Endpunkt mit den wichtigsten Feldern ab. Mit `full` holt er zusätzlich `case_temp`, `application_version`, `current_state` und `current_state_ok`. Die letzten beiden liefert der Home 4 allerdings nicht. Das kostet eine zweite Anfrage pro Durchlauf und erzeugt entsprechend mehr Last auf den SENEC-Servern. ```properties title="Beispiel" SENEC_REQUEST_MODE=full ``` > **HELIOS** > > > HELIOS fragt den Abfragemodus unter _Konfiguration → Datenquellen → SENEC-Collector_ ab, mit den Optionen _Minimal (empfohlen)_ und _Voll_. Die Frage erscheint nur beim Cloud-Zugriff. > ### `INFLUX_HOST` Hostname des InfluxDB-Servers. Läuft InfluxDB im selben Docker-Netzwerk, ist das der Name des Docker-Services, also `influxdb`. Es kann aber auch ein externer Server sein, etwa `influxdb.example.com`. ```properties title="Beispiel" INFLUX_HOST=influxdb ``` > **HELIOS** > > > HELIOS setzt den Hostnamen automatisch: normalerweise `influxdb`, bei aktivem [Ingest-Dienst](/docs/referenz/ingest/) stattdessen `ingest`. Nur bei einer externen InfluxDB fragt HELIOS ihn unter _Konfiguration → Grundeinstellungen → InfluxDB_ ab. > ### `INFLUX_SCHEMA` Schema für die Verbindung zu InfluxDB, `http` oder `https`. Standardwert ist `http`. Bei einer externen InfluxDB mit TLS gehört hier `https` hin. ```properties title="Beispiel" INFLUX_SCHEMA=https ``` > **HELIOS** > > > HELIOS setzt `http`, denn innerhalb des Docker-Netzwerks wird nicht verschlüsselt. Nur bei einer externen InfluxDB fragt HELIOS das Protokoll ab. > ### `INFLUX_PORT` Port für die Verbindung zu InfluxDB, eine Ganzzahl. Standardwert ist `8086`. Bei einer externen, per TLS abgesicherten InfluxDB ist es oft `443`. ```properties title="Beispiel" INFLUX_PORT=443 ``` > **HELIOS** > > > HELIOS setzt den Port automatisch: `8086` für InfluxDB, `4567` beim Umweg über den [Ingest-Dienst](/docs/referenz/ingest/). Nur bei einer externen InfluxDB fragt HELIOS ihn ab. > ### `INFLUX_TOKEN` Token, mit dem sich der Collector bei InfluxDB anmeldet. Er muss dort existieren und das Recht haben, in den angegebenen Bucket zu **schreiben**. Mehr braucht der Collector nicht: Er schickt Messwerte hin und liest nie etwas zurück. Passt der Token nicht, weist InfluxDB jeden Schreibzugriff ab. Der Collector läuft dann weiter, protokolliert aber Fehler, und im Dashboard bleiben die Kurven leer. ```properties title="Beispiel" INFLUX_TOKEN=my-super-secret-write-token ``` > **HELIOS** > > > HELIOS gibt dem Collector den Schreib-Token, siehe [`INFLUX_TOKEN_WRITE`](/docs/referenz/helios/konfiguration/#influx_token_write). Lese- oder Admin-Zugriff bekommt er nicht. > ### `INFLUX_ORG` Organisation in InfluxDB, unter der die Messwerte gespeichert werden. Eine Organisation ist der Mandant, dem Benutzer, Buckets und Tokens gehören. InfluxDB legt sie [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. In einer SOLECTRUS-Installation heißt sie `solectrus`, mehr als eine braucht es nicht. Der Name muss zu der Organisation passen, die in InfluxDB tatsächlich existiert. Ein anderer Wert benennt sie nicht um, er lässt den Collector nur ins Leere schreiben. ```properties title="Beispiel" INFLUX_ORG=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen der vorhandenen Organisation ab. > ### `INFLUX_BUCKET` Bucket in InfluxDB, in den der Collector die Messwerte schreibt. Ein Bucket ist das, was anderswo die Datenbank wäre: ein benannter Speicher mit eigener Aufbewahrungsdauer. Auch ihn legt InfluxDB [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. Eine SOLECTRUS-Installation kommt mit einem einzigen aus, er heißt `solectrus`. Der Name muss zu dem Bucket passen, der in InfluxDB existiert, und zu dem, aus dem das Dashboard liest. Gibt es ihn nicht, lehnt InfluxDB die Schreibzugriffe ab. ```properties title="Beispiel" INFLUX_BUCKET=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen des vorhandenen Buckets ab. > ### `INFLUX_MEASUREMENT` Measurement in InfluxDB, unter dem die Messwerte des Collectors landen. Standardwert ist `SENEC`. Der Name muss zu dem passen, den das Dashboard für die SENEC-Sensoren erwartet. Eine nachträgliche Änderung ist heikel: Bereits geschriebene Messwerte bleiben dauerhaft an den alten Namen gebunden. ```properties title="Beispiel" INFLUX_MEASUREMENT=power_storage ``` > **HELIOS** > > > HELIOS fragt den Namen unter _Konfiguration → Datenquellen → SENEC-Collector_ ab, vorbelegt mit `SENEC`. > ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `UTC`. Sie betrifft ausschließlich die Zeitstempel im Protokoll des Collectors. Die Messwerte selbst speichert InfluxDB immer in UTC, daran ändert `TZ` nichts. ```properties title="Beispiel" TZ=Europe/Rome ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > --- # Was ist der Shelly-Collector? > Der Shelly-Collector liest den Stromverbrauch von Shelly-Geräten aus, lokal oder über die Shelly-Cloud, und schreibt ihn in die InfluxDB. Der **Shelly-Collector** sammelt den Stromverbrauch, der von einem Shelly-Stromzähler gemessen wird, und schreibt diesen in die InfluxDB. Der Collector ruft die Messwerte entweder direkt vom Gerät (über die HTTP-Rest-API) oder über die Shelly-Cloud ab. Über die Cloud läuft der Collector auch außerhalb des lokalen Netzwerks, etwa auf einem Cloud-Server. Unterstützt werden Shelly-Geräte der ersten, zweiten und dritten Generation. Erfolgreich getestet wurden die folgenden Geräte: - Shelly Pro 3EM - Shelly Pro EM-50 - Shelly Pro 1PM - Shelly Pro 4PM - Shelly 3EM - Shelly Plus Plug S - Shelly PM Mini Gen3 - Shelly Plug S (Gen3) - Shelly Plug 2 - Shelly EM ## Erfasste Messwerte Der Collector schreibt die folgenden Messwerte als _Field_ in das angegebene _Measurement_ der InfluxDB: | Field | Beschreibung | | :------------------ | :----------------------- | | `power` | Leistung, in W | | `power_a` | Leistung Phase A, in W | | `power_b` | Leistung Phase B, in W | | `power_c` | Leistung Phase C, in W | | `power_d` | Leistung Kanal 4, in W | | `temp` | Temperatur, in °C | | `response_duration` | Dauer der Antwort, in ms | > **Hinweis** > > > Die Verfügbarkeit einzelner Messwerte hängt vom verwendeten Shelly-Gerät ab. Nicht alle Geräte liefern alle Messwerte. > ## Logging Der Collector schreibt ein Protokoll ins Docker-Log, das im Normalfall so aussieht: ```log Shelly collector for SOLECTRUS, Version v0.13.0, built at 2026-06-19T05:08:20.190Z https://github.com/solectrus/shelly-collector Copyright (c) 2024-2026 Georg Ledermann, released under the MIT License Using Ruby 4.0.5 on platform aarch64-linux-musl InfluxDB at http://influxdb:8086, bucket solectrus Device (local, every 5s): http://192.168.178.83 => Heatpump (no auth) Wait until InfluxDB is ready ... OK #1 - 11:44:52, Power 430.9 W, Temperature 46.2 °C (75 ms) Successfully pushed record #1 to InfluxDB ... ``` Sind mehrere Geräte konfiguriert, listet der Collector sie beim Start alle auf und fasst ihre Messwerte je Durchlauf zusammen. Fehler protokolliert der Collector ebenfalls, etwa wenn der Shelly oder die InfluxDB nicht erreichbar ist. ## Quelltext Der Shelly-Collector ist in Ruby implementiert, der Quelltext ist auf GitHub verfügbar: \ [github.com/solectrus/shelly-collector](https://github.com/solectrus/shelly-collector) --- # Konfiguration des Shelly-Collectors > Die Umgebungsvariablen des Shelly-Collectors, für den lokalen Zugriff oder den Weg über die Shelly-Cloud, auch für mehrere Geräte gleichzeitig. Der Shelly-Collector wird über Umgebungsvariablen konfiguriert. ## Lokal oder Cloud Der Collector erreicht die Geräte auf zwei Wegen. Welcher gilt, entscheidet `SHELLY_CLOUD_SERVER`: - **Lokal**: Die Variable bleibt leer. Der Collector fragt jedes Gerät direkt im Heimnetz ab, adressiert über `SHELLY_HOST`. - **Cloud**: Die Variable ist gesetzt. Der Collector holt die Messwerte aus der Shelly-Cloud, adressiert über `SHELLY_DEVICE_ID` und `SHELLY_AUTH_KEY`. Sind `SHELLY_HOST` und `SHELLY_CLOUD_SERVER` gleichzeitig gesetzt, bricht der Collector beim Start ab. Lokale und Cloud-Geräte lassen sich nicht mischen. ## Mehrere Geräte Ein einziger Collector bedient alle Shelly-Geräte. Dafür nehmen `SHELLY_HOST` (lokal) bzw. `SHELLY_DEVICE_ID` (Cloud) und `INFLUX_MEASUREMENT` eine Komma-getrennte Liste auf. Jedes Gerät schreibt in sein eigenes Measurement. ```properties title="Beispiel für zwei lokale Geräte" SHELLY_HOST=192.168.178.5,192.168.178.6 INFLUX_MEASUREMENT=Heatpump,Fridge ``` Geräteabhängige Optionen (`SHELLY_PASSWORD`, `SHELLY_INVERT_POWER`, `INFLUX_MODE`, `INFLUX_POWER_DATA_TYPE`) nehmen entweder einen einzelnen Wert für alle Geräte oder eine gleich lange Komma-getrennte Liste. Für alle Geräte gemeinsam gelten `SHELLY_INTERVAL`, `SHELLY_CLOUD_SERVER`, `SHELLY_AUTH_KEY` und die InfluxDB-Einstellungen. ## Umgebungsvariablen ### `SHELLY_HOST` Hostname des Shelly-Geräts. Pflicht beim lokalen Zugriff. Beim Cloud-Zugriff bleibt die Variable leer, dort tritt `SHELLY_DEVICE_ID` an ihre Stelle. Üblich ist die IP-Adresse, ein lokaler Gerätename tut es auch. Hier gehört nur der Host hin, **kein** `http://` oder `https://` und keine Portnummer. ```properties title="Beispiel" SHELLY_HOST=192.168.178.5 ``` > **HELIOS** > > > HELIOS fragt die Adresse jedes Geräts ab: unter _Konfiguration → Sensoren_ beim zugehörigen Sensor, unter _Konfiguration → Datenquellen → Shelly-Geräte_ bei allen übrigen. Aus diesen Adressen baut HELIOS die Liste. Steht die Verbindungsart auf **Über Shelly Cloud**, lässt HELIOS die Variable weg. > ### `SHELLY_PASSWORD` Passwort des Shelly-Geräts. Nötig ist es nur, wenn das Gerät passwortgeschützt ist. Festgelegt wird der Schutz in der Web-Oberfläche des Shelly unter _Settings / Device Settings / Authentication_. Ohne die Variable fragt der Collector das Gerät ohne Zugangsdaten ab. Der Benutzername steht fest auf `admin`, dafür gibt es keine Variable. Verwendet wird das Passwort nur beim lokalen Zugriff, beim Cloud-Zugriff ignoriert der Collector es. ```properties title="Beispiel" SHELLY_PASSWORD=my-shelly-password ``` > **HELIOS** > > > HELIOS fragt das Passwort je Gerät ab, zusammen mit dessen Adresse. Bleibt das Feld überall leer, lässt HELIOS die Variable weg. > ### `SHELLY_CLOUD_SERVER` Adresse des Shelly-Cloud-Servers, samt `https://`. Pflicht beim Cloud-Zugriff. Beim lokalen Zugriff bleibt die Variable leer. Sie ist der Schalter zwischen beiden Zugriffsarten: Ist sie gesetzt, holt der Collector die Messwerte aus der Cloud statt aus dem Heimnetz. Welcher Server der richtige ist, steht in der [Shelly-Cloud](https://control.shelly.cloud) unter _Settings / User Settings / Authorization cloud key_. Das Gerät muss dort registriert sein und seine Daten in die Cloud senden. ```properties title="Beispiel" SHELLY_CLOUD_SERVER=https://shelly-42-eu.shelly.cloud ``` > **HELIOS** > > > HELIOS fragt die Server-URL unter _Konfiguration → Datenquellen → Shelly-Collector_ ab, sobald die Verbindungsart auf **Über Shelly Cloud** steht. Ein Knopf daneben prüft, ob die Cloud antwortet. > ### `SHELLY_AUTH_KEY` Schlüssel für den Zugriff auf die Shelly-Cloud. Pflicht beim Cloud-Zugriff. Beim lokalen Zugriff ignoriert der Collector die Variable. Der Schlüssel muss das Recht haben, die Daten der angegebenen Geräte abzurufen. Erstellen und ablesen lässt er sich in der [Shelly-Cloud](https://control.shelly.cloud) unter _Settings / User Settings / Authorization cloud key / Get Key_. ```properties title="Beispiel" SHELLY_AUTH_KEY=ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 ``` > **HELIOS** > > > HELIOS fragt den Schlüssel unter _Konfiguration → Datenquellen → Shelly-Collector_ ab, sobald die Verbindungsart auf **Über Shelly Cloud** steht. > ### `SHELLY_DEVICE_ID` ID, unter der die Shelly-Cloud das Gerät führt. Pflicht beim Cloud-Zugriff. Beim lokalen Zugriff ignoriert der Collector die Variable, dort adressiert `SHELLY_HOST` das Gerät. Abzulesen ist die ID in der [Shelly-Cloud](https://control.shelly.cloud) beim jeweiligen Gerät unter _Settings / Device information_. ```properties title="Beispiel" SHELLY_DEVICE_ID=12345abcdef0 ``` > **HELIOS** > > > HELIOS fragt die Cloud-ID jedes Geräts ab: unter _Konfiguration → Sensoren_ beim zugehörigen Sensor, unter _Konfiguration → Datenquellen → Shelly-Geräte_ bei allen übrigen. Steht die Verbindungsart auf **Lokal**, lässt HELIOS die Variable weg. > ### `SHELLY_INTERVAL` Abstand zwischen zwei Abfragen in Sekunden, eine Ganzzahl. Standardwert ist `5`, das ergibt eine gute Auflösung. Kleinere Werte als `2` hebt der Collector auf `2` an. Beim Cloud-Zugriff fragt der Collector bis zu zehn Geräte in einer Anfrage ab. Läuft er in das Rate-Limit der Shelly-Cloud, wartet er und versucht es erneut. ```properties title="Beispiel" SHELLY_INTERVAL=10 ``` > **HELIOS** > > > HELIOS fragt das Intervall unter _Konfiguration → Datenquellen → Shelly-Collector_ ab, vorbelegt mit `5`. > ### `SHELLY_INVERT_POWER` Dreht das Vorzeichen der Leistung um, aus negativen Werten werden positive und umgekehrt. Erlaubt sind `true` und `false`, jeder andere Wert gilt als `false`. Standardwert ist `false`. Nötig ist `true`, wenn der Shelly eine Erzeugung misst, etwa an einem Balkonkraftwerk. Betroffen ist nur das Feld `power`. Die Einzelwerte `power_a` bis `power_d` schreibt der Collector unverändert. ```properties title="Beispiel" SHELLY_INVERT_POWER=true ``` > **HELIOS** > > > HELIOS bietet dafür je Gerät einen Schalter **Leistung invertieren**, standardmäßig aus. Invertiert kein Gerät, lässt HELIOS die Variable weg. > ### `INFLUX_HOST` Hostname des InfluxDB-Servers. Läuft InfluxDB im selben Docker-Netzwerk, ist das der Name des Docker-Services, also `influxdb`. Es kann aber auch ein externer Server sein, etwa `influxdb.example.com`. ```properties title="Beispiel" INFLUX_HOST=influxdb ``` > **HELIOS** > > > HELIOS setzt den Hostnamen automatisch: normalerweise `influxdb`, bei aktivem [Ingest-Dienst](/docs/referenz/ingest/) stattdessen `ingest`. Nur bei einer externen InfluxDB fragt HELIOS ihn unter _Konfiguration → Grundeinstellungen → InfluxDB_ ab. > ### `INFLUX_SCHEMA` Schema für die Verbindung zu InfluxDB, `http` oder `https`. Standardwert ist `http`. Bei einer externen InfluxDB mit TLS gehört hier `https` hin. ```properties title="Beispiel" INFLUX_SCHEMA=https ``` > **HELIOS** > > > HELIOS setzt `http`, denn innerhalb des Docker-Netzwerks wird nicht verschlüsselt. Nur bei einer externen InfluxDB fragt HELIOS das Protokoll ab. > ### `INFLUX_PORT` Port für die Verbindung zu InfluxDB, eine Ganzzahl. Standardwert ist `8086`. Bei einer externen, per TLS abgesicherten InfluxDB ist es oft `443`. ```properties title="Beispiel" INFLUX_PORT=443 ``` > **HELIOS** > > > HELIOS setzt den Port automatisch: `8086` für InfluxDB, `4567` beim Umweg über den [Ingest-Dienst](/docs/referenz/ingest/). Nur bei einer externen InfluxDB fragt HELIOS ihn ab. > ### `INFLUX_TOKEN` Token, mit dem sich der Collector bei InfluxDB anmeldet. Er muss dort existieren und das Recht haben, in den angegebenen Bucket zu **schreiben**. Mehr braucht der Collector nicht: Er schickt Messwerte hin und liest nie etwas zurück. Passt der Token nicht, weist InfluxDB jeden Schreibzugriff ab. Der Collector läuft dann weiter, protokolliert aber Fehler, und im Dashboard bleiben die Kurven leer. ```properties title="Beispiel" INFLUX_TOKEN=my-super-secret-write-token ``` > **HELIOS** > > > HELIOS gibt dem Collector den Schreib-Token, siehe [`INFLUX_TOKEN_WRITE`](/docs/referenz/helios/konfiguration/#influx_token_write). Lese- oder Admin-Zugriff bekommt er nicht. > ### `INFLUX_ORG` Organisation in InfluxDB, unter der die Messwerte gespeichert werden. Eine Organisation ist der Mandant, dem Benutzer, Buckets und Tokens gehören. InfluxDB legt sie [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. In einer SOLECTRUS-Installation heißt sie `solectrus`, mehr als eine braucht es nicht. Der Name muss zu der Organisation passen, die in InfluxDB tatsächlich existiert. Ein anderer Wert benennt sie nicht um, er lässt den Collector nur ins Leere schreiben. ```properties title="Beispiel" INFLUX_ORG=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen der vorhandenen Organisation ab. > ### `INFLUX_BUCKET` Bucket in InfluxDB, in den der Collector die Messwerte schreibt. Ein Bucket ist das, was anderswo die Datenbank wäre: ein benannter Speicher mit eigener Aufbewahrungsdauer. Auch ihn legt InfluxDB [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. Eine SOLECTRUS-Installation kommt mit einem einzigen aus, er heißt `solectrus`. Der Name muss zu dem Bucket passen, der in InfluxDB existiert, und zu dem, aus dem das Dashboard liest. Gibt es ihn nicht, lehnt InfluxDB die Schreibzugriffe ab. ```properties title="Beispiel" INFLUX_BUCKET=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen des vorhandenen Buckets ab. > ### `INFLUX_MEASUREMENT` Measurement in InfluxDB, in das der Collector die Messwerte schreibt. Ein Measurement ist das, was anderswo die Tabelle wäre. Standardwert ist `Consumer`. Bei mehreren Geräten steht hier ein Name je Gerät, in derselben Reihenfolge wie in `SHELLY_HOST` bzw. `SHELLY_DEVICE_ID`. Stimmt die Anzahl nicht überein, bricht der Collector beim Start ab. Mehr dazu unter [Zusätzliche Shelly-Verbrauchszähler](/docs/anleitungen/mehrere-shelly/). ```properties title="Beispiel" INFLUX_MEASUREMENT=Heatpump ``` > **HELIOS** > > > HELIOS fragt das Measurement je Gerät ab und setzt die Namen zu einer Liste zusammen. Beim Sensor eines benutzerdefinierten Verbrauchers trägt HELIOS es selbst ein. > ### `INFLUX_MODE` Bestimmt, welche Messwerte in InfluxDB landen. Erlaubt sind `default` und `essential`, jeder andere Wert lässt den Collector beim Start abbrechen. Standardwert ist `default`. Im `default`-Modus schreibt der Collector jeden gelesenen Messwert. Im `essential`-Modus schreibt er nur, solange Leistung fließt. Das spart Speicherplatz bei Geräten, die selten laufen, etwa Waschmaschine oder Geschirrspüler. Die Ränder schreibt er trotzdem mit: beim Abschalten einmalig 0 Watt, beim Wiedereinschalten den zuletzt verworfenen 0-Watt-Wert. Die Kurve beginnt und endet damit auf null, und InfluxDB rechnet die Verbrauchsmenge weiterhin richtig aus. ```properties title="Beispiel" INFLUX_MODE=essential ``` > **HELIOS** > > > HELIOS bietet dafür keine Einstellung. Nur beim Übernehmen einer vorhandenen Installation liest HELIOS einen bereits gesetzten Wert ein und behält ihn bei. > ### `INFLUX_POWER_DATA_TYPE` Datentyp der Leistungswerte in InfluxDB. Erlaubt sind `Float` und `Integer`, jeder andere Wert lässt den Collector beim Start abbrechen. Standardwert ist `Float`. Mit `Integer` speichert der Collector `power` und `power_a` bis `power_d` als Ganzzahlen. Nötig ist das bei der Migration von einem System, das diese Werte bereits als Ganzzahlen abgelegt hat, denn InfluxDB lässt den Datentyp eines Feldes nachträglich nicht mehr ändern. ```properties title="Beispiel" INFLUX_POWER_DATA_TYPE=Integer ``` > **HELIOS** > > > HELIOS bietet dafür keine Einstellung. Nur beim Übernehmen einer vorhandenen Installation liest HELIOS einen bereits gesetzten Wert ein und behält ihn bei. > ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `UTC`. Sie betrifft ausschließlich die Zeitstempel im Protokoll des Collectors. Die Messwerte selbst speichert InfluxDB immer in UTC, daran ändert `TZ` nichts. ```properties title="Beispiel" TZ=Europe/Berlin ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > --- # Was ist der Tibber-Collector? > Der Tibber-Collector fragt die Strompreise von Tibber ab und schreibt sie viertelstündlich in die InfluxDB. Für die Kostenberechnung dienen sie nicht. Der **Tibber-Collector** fragt die Strompreise des Anbieters [Tibber](https://tibber.com/) über dessen API ab und schreibt sie in die InfluxDB. Die erhaltenen Preise können für den [SENEC-Charger](/docs/referenz/senec-charger/) verwendet werden, um einen SENEC-Stromspeicher kostenoptimiert aus dem Netz zu laden. > **Hinweis** > > > Der Tibber-Collector setzt einen aktiven Vertrag bei Tibber voraus, dazu einen API-Token. Er lässt sich kostenlos auf der Tibber-Website erstellen. > > Die Preise werden von SOLECTRUS **nicht** verwendet, um die tatsächlichen Kosten durch den Netzbezug zu berechnen. Dafür gelten allein die im Dashboard hinterlegten [Strompreise](/docs/bedienung/kosten-berechnung/). > ## Verarbeitete Werte Der Collector holt die Preise in **Viertelstunden-Auflösung**, für den laufenden Tag und, sobald Tibber sie veröffentlicht, für den Folgetag. Je Viertelstunde schreibt er einen Datenpunkt als _Field_ in das angegebene _Measurement_ der InfluxDB: - `amount`: Strompreis inklusive Steuern und Abgaben, in der Währung des Tibber-Vertrags - `level`: Preisstufe, in Textform (`NORMAL`, `CHEAP`, `VERY_CHEAP`, `EXPENSIVE`, `VERY_EXPENSIVE`) ## Logging Der Collector schreibt ein Protokoll ins Docker-Log, das im Normalfall so aussieht: ```log Tibber collector for SOLECTRUS, Version v0.4.2, built at 2026-03-22T09:13:32.723Z https://github.com/solectrus/tibber-collector Copyright (c) 2023-2026 Georg Ledermann, released under the MIT License Using Ruby 4.0.2 on platform aarch64-linux-musl Pulling from https://api.tibber.com/v1-beta/gql every 3600 seconds Pushing to InfluxDB at http://influxdb:8086, bucket solectrus, measurement prices #1 - 2026-07-14 10:09:10 +0200 Fetching prices from Tibber ... OK Pushing prices to InfluxDB ... OK Sleeping for 3600 seconds ... ... ``` Ist die Tibber-API nicht erreichbar, protokolliert der Collector den Fehler und versucht es im nächsten Durchlauf erneut. Bei einer nicht erreichbaren InfluxDB bricht er dagegen ab. Docker startet den Container daraufhin neu. ## Quelltext Der Tibber-Collector ist in Ruby implementiert, der Quelltext ist auf GitHub verfügbar: \ [github.com/solectrus/tibber-collector](https://github.com/solectrus/tibber-collector) --- # Konfiguration des Tibber-Collectors > Die Umgebungsvariablen des Tibber-Collectors: Access Token für die Tibber-API, Intervall der Abfrage und die Verbindung zur InfluxDB. Der Tibber-Collector wird über Umgebungsvariablen konfiguriert. HELIOS richtet ihn unter _Konfiguration → Grundeinstellungen → Dynamische Strompreise_ ein. Dieselbe Eingabemaske steuert auch den [SENEC-Charger](/docs/referenz/senec-charger/), der die Preise nutzt. ## Umgebungsvariablen ### `TIBBER_TOKEN` Access Token für die Tibber-API. Er lässt sich [auf der Developer-Website von Tibber](https://developer.tibber.com/settings/access-token) erstellen und setzt einen Account mit aktivem Vertrag voraus. Weist Tibber den Token ab, protokolliert der Collector den Fehler und versucht es im nächsten Durchlauf erneut. In der InfluxDB landen dann keine Preise. ```properties title="Beispiel" TIBBER_TOKEN=3A77EECF61BD445F47241A5A36202185C35AF3AF58609E19B53F3A8872AD7BE1-1 ``` > **HELIOS** > > > HELIOS fragt das Token unter _Konfiguration → Grundeinstellungen → Dynamische Strompreise_ ab, sobald dort die Erfassung eingeschaltet ist. > ### `TIBBER_INTERVAL` Intervall in Sekunden, in dem der Collector die Preise von Tibber abfragt. Erlaubt ist eine positive Ganzzahl. Standardwert ist `3600`, also eine Stunde. Ein kürzeres Intervall bringt nichts, denn Tibber veröffentlicht die Preise nur einmal täglich. Es erzeugt lediglich zusätzliche API-Anfragen. Eine `0` oder ein nicht numerischer Wert lässt den Collector beim Start abbrechen. ```properties title="Beispiel" TIBBER_INTERVAL=7200 ``` > **HELIOS** > > > HELIOS setzt das Intervall nicht, es bleibt beim Standardwert `3600`. Ein anderer Wert lässt sich nicht einstellen. > ### `INFLUX_HOST` Hostname des InfluxDB-Servers. Läuft InfluxDB im selben Docker-Netzwerk, ist das der Name des Docker-Services, also `influxdb`. Es kann aber auch ein externer Server sein, etwa `influxdb.example.com`. ```properties title="Beispiel" INFLUX_HOST=influxdb ``` > **HELIOS** > > > HELIOS setzt den Hostnamen automatisch auf `influxdb`. Nur bei einer externen InfluxDB fragt HELIOS ihn unter _Konfiguration → Grundeinstellungen → InfluxDB_ ab. > ### `INFLUX_SCHEMA` Schema für die Verbindung zu InfluxDB, `http` oder `https`. Standardwert ist `http`. Bei einer externen InfluxDB mit TLS gehört hier `https` hin. ```properties title="Beispiel" INFLUX_SCHEMA=https ``` > **HELIOS** > > > HELIOS setzt das Schema nicht, es bleibt beim Standardwert `http`. Innerhalb des Docker-Netzwerks wird nicht verschlüsselt. Nur bei einer externen InfluxDB fragt HELIOS das Protokoll ab. > ### `INFLUX_PORT` Port für die Verbindung zu InfluxDB, eine Ganzzahl. Standardwert ist `8086`. Bei einer externen, per TLS abgesicherten InfluxDB ist es oft `443`. ```properties title="Beispiel" INFLUX_PORT=443 ``` > **HELIOS** > > > HELIOS setzt den Port nicht, es bleibt beim Standardwert `8086`. Nur bei einer externen InfluxDB fragt HELIOS ihn ab. > ### `INFLUX_TOKEN` Token, mit dem sich der Collector bei InfluxDB anmeldet. Er muss dort existieren und das Recht haben, in den angegebenen Bucket zu **schreiben**. Mehr braucht der Collector nicht: Er schickt Preise hin und liest nie etwas zurück. Passt der Token nicht, weist InfluxDB den Schreibzugriff ab. Die Preise landen dann nicht in der Datenbank. ```properties title="Beispiel" INFLUX_TOKEN=my-super-secret-write-token ``` > **HELIOS** > > > HELIOS gibt dem Collector den Schreib-Token, siehe [`INFLUX_TOKEN_WRITE`](/docs/referenz/helios/konfiguration/#influx_token_write). Lese- oder Admin-Zugriff bekommt er nicht. > ### `INFLUX_ORG` Organisation in InfluxDB, unter der die Preise gespeichert werden. Eine Organisation ist der Mandant, dem Benutzer, Buckets und Tokens gehören. InfluxDB legt sie [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. In einer SOLECTRUS-Installation heißt sie `solectrus`. Der Name muss zu der Organisation passen, die in InfluxDB tatsächlich existiert. Ein anderer Wert benennt sie nicht um, er lässt den Collector nur ins Leere schreiben. ```properties title="Beispiel" INFLUX_ORG=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen der vorhandenen Organisation ab. > ### `INFLUX_BUCKET` Bucket in InfluxDB, in den der Collector die Preise schreibt. Ein Bucket ist das, was anderswo die Datenbank wäre: ein benannter Speicher mit eigener Aufbewahrungsdauer. Auch ihn legt InfluxDB [beim ersten Start](/docs/referenz/influxdb/konfiguration/) an. Eine SOLECTRUS-Installation kommt mit einem einzigen aus, er heißt `solectrus`. Der Name muss zu dem Bucket passen, der in InfluxDB existiert. Gibt es ihn nicht, lehnt InfluxDB die Schreibzugriffe ab. ```properties title="Beispiel" INFLUX_BUCKET=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen des vorhandenen Buckets ab. > ### `INFLUX_MEASUREMENT` Measurement in InfluxDB, in das der Collector die Preise schreibt. Standardwert ist `Prices`, auch bei einem leeren Wert. Der Name muss zu dem passen, den der [SENEC-Charger](/docs/referenz/senec-charger/) unter `INFLUX_MEASUREMENT_PRICES` liest. Groß- und Kleinschreibung zählt dabei: `prices` und `Prices` sind zwei verschiedene Measurements. ```properties title="Beispiel" INFLUX_MEASUREMENT=Prices ``` > **HELIOS** > > > HELIOS setzt das Measurement, vorbelegt mit `Prices`. Ändern lässt es sich unter _Konfiguration → Grundeinstellungen → Dynamische Strompreise_. Ein nachträglicher Wechsel ist kaum möglich, denn die bereits geschriebenen Preise bleiben an den alten Namen gebunden. > ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `UTC`. Sie betrifft ausschließlich die Zeitstempel im Protokoll des Collectors. Die Preise selbst speichert InfluxDB immer in UTC, daran ändert `TZ` nichts. ```properties title="Beispiel" TZ=Europe/Berlin ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > --- # Was ist Watchtower? > Der Dienst, der neue Versionen der Docker-Images erkennt und einspielt. Warum Docker das nicht von selbst tut und wie HELIOS Watchtower einrichtet. **Watchtower** hält die Docker-Container von SOLECTRUS auf dem aktuellen Stand. Nötig ist das, weil Docker ein Image nur einmal herunterlädt und es danach immer wieder verwendet. Auch beim Tag `latest` sieht Docker von sich aus **nicht** nach, ob es inzwischen eine neuere Version gibt. Ohne Zutun läuft eine Installation vom Mai im Dezember noch mit dem Image vom Mai. Watchtower prüft daher regelmäßig, ob neue Versionen der verwendeten Images vorliegen. Findet es eine, lädt es das Image herunter, stoppt den alten Container und startet ihn mit der neuen Version neu. Watchtower läuft selbst als Container und aktualisiert auch sich selbst. Bei einer Installation mit [HELIOS](/docs/referenz/helios/) ist Watchtower dabei. Standardmäßig sieht es einmal täglich nach. Ein anderes Intervall bietet HELIOS unter _Konfiguration → Grundeinstellungen → Software-Stand_ an, sobald mindestens ein Dienst auf _Entwicklung_ steht. ## Nur die eigenen Container Damit Watchtower nicht sämtliche Container auf dem Host anfasst, kennzeichnet HELIOS die Dienste von SOLECTRUS mit dem Label `com.centurylinklabs.watchtower.scope=solectrus`. Watchtower hält nur diese aktuell. Andere Container auf demselben Server bleiben unangetastet. Das Label bekommen nur die Dienste, die HELIOS selbst erzeugt. Fremde Zusatzdienste, die es beim Übernehmen einer bestehenden Installation unverändert durchreicht, etwa `dozzle`, tragen es nicht. Watchtower aktualisiert sie deshalb nicht. ## Fork statt Original Das ursprüngliche [Watchtower](https://containrrr.dev/watchtower/) wird nicht mehr gepflegt und funktioniert mit Docker 29+ nicht mehr ohne weiteres. SOLECTRUS verwendet daher den [Fork von Nicholas Fedor](https://github.com/nicholas-fedor/watchtower), also das Image `nickfedor/watchtower`. > **Ältere Installation?** > > > Wer noch das alte Image `containrrr/watchtower` verwendet, bekommt unter Docker 29 oder höher möglicherweise keine Updates mehr. HELIOS erkennt das und weist unter _Dienste_ auf den Wechsel zum Fork hin. > --- # Konfiguration von Watchtower > Die Umgebungsvariablen von Watchtower für das Prüfintervall, das Scope-Label, das Aufräumen alter Images und die Zeitzone im Protokoll. Watchtower wird über Umgebungsvariablen konfiguriert. ## Umgebungsvariablen ### `WATCHTOWER_POLL_INTERVAL` Abstand zwischen zwei Prüfungen auf neue Images, in Sekunden. Standardwert ist `86400`, also einmal am Tag. Der Abstand zählt ab dem Start des Containers. Zwischen zwei Prüfungen bleibt ein Container auf seiner Version, auch wenn im Registry längst eine neuere liegt. ```properties title="Beispiel" WATCHTOWER_POLL_INTERVAL=28800 ``` > **HELIOS** > > > HELIOS setzt den Wert immer, standardmäßig `86400`. Zur Wahl stellt es ihn erst, wenn mindestens ein Dienst auf _Entwicklung_ steht, unter _Konfiguration → Grundeinstellungen → Software-Stand_. Dort stehen täglich (`86400`), alle 8 Stunden (`28800`) und stündlich (`3600`). > ### `WATCHTOWER_SCOPE` Beschränkt Watchtower auf die Container, die das Label `com.centurylinklabs.watchtower.scope` mit genau diesem Wert tragen. Welche Dienste von SOLECTRUS das Label bekommen, steht in der [Übersicht](/docs/referenz/watchtower/). Der Sonderwert `none` kehrt die Auswahl um: Watchtower übergeht dann alle Container, die ein Scope-Label tragen. Ohne die Variable nimmt sich Watchtower **jeden** Container auf dem Host vor, auch die, die nichts mit SOLECTRUS zu tun haben. ```properties title="Beispiel" WATCHTOWER_SCOPE=solectrus ``` > **HELIOS** > > > HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. > ### `WATCHTOWER_CLEANUP` Entfernt das alte Image, sobald der Container auf die neue Version umgestellt ist. Erlaubt sind `true` und `false`. Standardwert ist `false`. Ohne die Einstellung bleiben die abgelösten Images liegen und belegen weiter Platz auf der Platte. ```properties title="Beispiel" WATCHTOWER_CLEANUP=true ``` > **HELIOS** > > > HELIOS setzt `true`, einzustellen gibt es nichts. > ### `TZ` Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `UTC`. Sie betrifft die Zeitstempel im Protokoll von Watchtower. Auf den Abstand zwischen zwei Prüfungen wirkt sie sich nicht aus, den bestimmt allein `WATCHTOWER_POLL_INTERVAL`. ```properties title="Beispiel" TZ=Europe/Berlin ``` > **HELIOS** > > > HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`. > ## Weitere Variablen Watchtower kennt noch etliche Variablen mehr, etwa für Benachrichtigungen bei Updates, private Registries oder eine HTTP-API. HELIOS setzt keine davon, und für den Betrieb von SOLECTRUS braucht es sie nicht. Wer sie trotzdem nutzen will, findet sie in der Dokumentation des Watchtower-Projekts unter [Configuration → Arguments](https://watchtower.nickfedor.com/latest/configuration/arguments/). Zu beachten ist dabei: HELIOS erzeugt die `compose.yaml` bei jeder Änderung neu und verwirft dabei alles, was es nicht selbst geschrieben hat. --- # Support > Support zu SOLECTRUS läuft über GitHub, per Issue oder Diskussion. Was einer Anfrage beizulegen ist und was im Support-Paket von HELIOS steckt. Diese Dokumentation enthält neben der [Referenz](/docs/referenz/) zu den einzelnen Komponenten auch [Anleitungen](/docs/anleitungen/) zu häufigen Aufgaben und Problemen. Hilft das nicht weiter, läuft der Support über **GitHub**: - Bei technischen Problemen und Fehlerberichten ist ein **Issue** anzulegen: \ [https://github.com/solectrus/solectrus/issues](https://github.com/solectrus/solectrus/issues) - Für alles andere, etwa Fragen zur Installation, Verbesserungsvorschläge oder Kritik, steht der **Diskussionsbereich** zur Verfügung: \ [https://github.com/solectrus/solectrus/discussions](https://github.com/solectrus/solectrus/discussions) Die Suchfunktion von GitHub findet bestehende Issues und Diskussionen. Oft ist eine Frage dort schon beantwortet. ## Was mitzuschicken ist Je mehr über die Installation bekannt ist, desto schneller lässt sich helfen. Dafür gibt es das **Support-Paket**, das [HELIOS](/docs/referenz/helios/) unter _Support_ auf Knopfdruck erzeugt: ein ZIP-Archiv mit den Protokollen der Dienste, der Konfiguration und einer Momentaufnahme des Systems. Passwörter und Tokens ersetzt HELIOS dabei durch Platzhalter. > **Was im Paket erhalten bleibt** > > > Zwei Dinge werden nur abgeschwächt, nicht entfernt: > > - **Koordinaten** behalten ihre Vorkommastellen, die Nachkommastellen werden genullt (`52.51627` wird zu `52.00000`). Der Standort bleibt damit auf rund 100 km eingrenzbar. > - **Hostnamen** maskiert HELIOS nur, wenn sie öffentlich erreichbar sind. Private IP-Adressen und Namen wie `.local` oder `.fritz.box` bleiben lesbar, damit sich die Netzwerkstruktur nachvollziehen lässt. > > Vor dem Anhängen in einem öffentlichen Issue lohnt sich deshalb ein Blick ins Archiv. > Genügt ein Ausschnitt, reicht der passende Teil aus dem [Protokoll](/docs/anleitungen/logging/) des betroffenen Dienstes. > **Keine Support-Anfragen per E-Mail** > > > Support läuft ausschließlich über GitHub. Dort bleiben Frage und Antwort für die Nächsten lesbar, die auf dasselbe Problem stoßen. > > Ein GitHub-Konto lässt sich kostenlos anlegen. > # Integrationen --- # SOLECTRUS als Alternative zur SENEC-App > SOLECTRUS liest deinen SENEC-Stromspeicher aus, lokal oder über die Cloud. Ladestand, PV-Erzeugung, Netzbezug und Verbrauch, live und über Jahre. Dein SENEC-Speicher misst ständig, wie viel Strom geladen, entladen, erzeugt und verbraucht wird. SOLECTRUS bindet ihn ein und macht diese Messwerte sichtbar. Live und über Jahre, in einem Dashboard, das dir gehört. ## Welche SENEC-Modelle werden unterstützt? SOLECTRUS unterstützt die gängigen Generationen. Der Weg zu den Daten unterscheidet sich je nach Modell: - **SENEC.Home V2.1 und V3**: Diese Modelle erlauben **lokalen Zugriff**. Die Messwerte lassen sich direkt vom Gerät im eigenen Netzwerk abholen – schnell und ohne Umweg übers Internet. - **SENEC.Home 4**: Die aktuelle Generation bietet **keinen lokalen Zugriff**. Der Weg führt über die **SENEC-Cloud**, dieselbe Schnittstelle, die auch die SENEC-App nutzt. ## Lokal oder über die Cloud? Erlaubt dein Modell lokalen Zugriff, ist das die erste Wahl: unabhängig vom Internet und engmaschiger. Die Werte holt der **SENEC-Collector**, ein kleiner Dienst, der sie abruft und in die Datenbank schreibt. Lokal liest er im **5-Sekunden-Takt**, über die Cloud nur etwa **einmal pro Minute** (V2.1/V3 sogar nur alle 5 Minuten). Lokal kommen außerdem mehr Messwerte an als über die Cloud. Beim Home 4 führt der Weg über die Cloud. Dafür meldet sich der SENEC-Collector mit denselben Zugangsdaten an, die du auch in der SENEC-App nutzt. Das funktioniert zuverlässig, hängt aber davon ab, dass SENEC seine Schnittstelle stabil hält. Auch hier bleiben deine Daten bei dir: Der SENEC-Collector holt die Werte aus der Cloud und speichert sie lokal in deiner eigenen Installation. Niemand sonst sitzt dazwischen. Auch deine SENEC-Zugangsdaten bleiben lokal auf deinem Gerät und dienen ausschließlich dem Login bei SENEC. Keine Sorge: Der SENEC-Collector greift nur lesend zu und stört die SENEC-App nicht. Du kannst sie weiter nutzen. Die meisten SOLECTRUS-Nutzer werfen aber nur noch selten einen Blick hinein. ## Welche Daten ausgelesen werden Nach der Anbindung stehen in SOLECTRUS folgende Messwerte zur Verfügung: - **PV-Erzeugung** deiner Anlage – beim lokalen Zugriff bis hinunter auf die Leistung einzelner PV-Strings (MPP-Tracker) - **Ladestand** des Speichers (Prozent) sowie **Lade- und Entladeleistung** in Echtzeit - **Netzbezug** und **Einspeisung** am Hausanschluss - **Hausverbrauch** – also der Stromverbrauch deines gesamten Haushalts - **Wallbox-Ladeleistung**, sofern eine SENEC-Wallbox angebunden ist, sowie ob gerade ein **Fahrzeug angeschlossen** ist - **Gehäusetemperatur** des Speichers - beim lokalen Zugriff zusätzlich der **Betriebszustand** des Speichers – ein eigener Status-Sensor zeigt den genauen Zustand aus über hundert möglichen, vom normalen Laden und Entladen bis zu Sonderfällen wie einer Fernabschaltung - ebenfalls lokal die **Leistungsbegrenzung** – wie stark die Einspeisung gerade gedrosselt wird Aus diesen Werten berechnet SOLECTRUS Autarkiegrad, Eigenverbrauch, Kosten und Ersparnis. Live und aggregiert über Jahre hinweg. ## So bindest du deinen SENEC-Stromspeicher an Der **SENEC-Collector** läuft als Teil deiner SOLECTRUS-Installation und fragt den Speicher regelmäßig ab, lokal oder über die Cloud. Im Kern sind es drei Schritte: 1. **SOLECTRUS installieren** – am einfachsten über die [webbasierte Installation](/install/). 2. **Sensoren ergänzen** und dabei den SENEC-Collector als Quelle wählen. Sobald du den ersten SENEC-Sensor hinzufügst, werden die übrigen automatisch mit ergänzt. 3. **SENEC-Collector einstellen** – lokal die IP-Adresse, für die Cloud die Zugangsdaten. Fertig: Die Werte landen ab sofort im Dashboard. Du brauchst dafür weder Docker-Kenntnisse noch von Hand geschriebene Konfigurationsdateien: Bei der webbasierten Installation richtest du den SENEC-Collector **komplett im Browser** ein – Felder ausfüllen, speichern, fertig. ## Schon in Home Assistant oder ioBroker? Liegen deine SENEC-Messwerte bereits in einem Smart-Home-System wie [Home Assistant](/integration/home-assistant/) oder [ioBroker](/integration/iobroker/), kannst du sie auch direkt von dort übernehmen. Den SENEC-Collector brauchst du dann gar nicht. Wie das geht, steht im jeweiligen Artikel. ## Deine bisherigen Daten mitnehmen Du musst nicht bei null anfangen. SENEC stellt deine historischen Messwerte als CSV-Datei zum Download bereit. Nicht in voller Auflösung, aber die zentralen Werte, und das vom Tag der Inbetriebnahme bis heute. Die importierst du einmalig in SOLECTRUS. So hast du deinen Verlauf von Anfang an im Dashboard, statt erst ab der Anbindung Daten zu sammeln. Über die webbasierte Installation läuft der Import ohne Kommandozeile. ## Live-Demo In der Live-Demo läuft eine echte SOLECTRUS-Instanz mit allen Auswertungen. Angebunden ist dort ein SENEC.Home V3. > **Aus dem echten Leben** > > > Die Akkus der Demo-Anlage sind [seit Anfang 2026 defekt](https://github.com/orgs/solectrus/discussions/5111) und warten auf den Austausch durch SENEC. Du siehst also live, wie sich ein fernabgeschalteter Speicher in den Daten bemerkbar macht – auch das ist eine Form von Monitoring. Den Status-Sensor habe ich dafür abgeschaltet, deshalb steht im Dashboard schlicht „Live" statt „Fernabschaltung". Und falls jemand bei SENEC mitliest: Ich würde mich über eine baldige Lösung freuen. > --- # Shelly anbinden > SOLECTRUS bindet Shelly-Stromverbrauchszähler nativ ein – lokal oder per Cloud. Leistung und Verbrauch einzelner Verbraucher live und im Langzeitverlauf. Du willst wissen, was deine Wärmepumpe, die Wallbox oder der Server im Keller zieht? Das messen Shelly-Stromverbrauchszähler. SOLECTRUS bindet sie **nativ** ein, ohne Umweg über ein Smart-Home-System. So siehst du einzelne Verbraucher getrennt, live und über Jahre. ## Welche Shelly-Stromverbrauchszähler passen? Geeignet sind alle Shelly-Zähler mit **Leistungsmessung**: vom Plug S für die einzelne Steckdose über die PM-Modelle bis zu den Klemmenzählern wie **3EM**, **Pro 3EM** oder **EM**, mit denen du den Hausanschluss dreiphasig misst (Netzbezug und Einspeisung). Unterstützt werden Geräte der **Generationen 1 bis 3**, samt Plus- und Pro-Serie. Welches Modell du hast, musst du nicht selbst wissen: Das Abfragen übernimmt der **Shelly-Collector**, ein kleiner Dienst, der die Werte vom Gerät abruft und in die Datenbank schreibt. Er **erkennt den Gerätetyp automatisch** und liest die passenden Messwerte aus. ## Lokal oder per Cloud Auslesen lassen sie sich auf zwei Wegen: **lokal** im eigenen Netzwerk oder über die **Shelly-Cloud**. SOLECTRUS unterstützt beides. Lokal kommen die Werte direkt vom Gerät: schneller und ohne Cloud-Account. Deine Daten bleiben bei dir zu Hause. Dazu hinterlegst du die IP-Adresse des Geräts. Und es geht engmaschig: Lokal fragt der Shelly-Collector die Werte bis zum **5-Sekunden-Takt** ab, fein genug für eine echte Live-Darstellung. Über die Cloud erreichst du deine Shellys auch dann, wenn sie nicht im selben Netzwerk hängen. Dafür brauchst du den Cloud-Zugang deines Shelly-Kontos (Auth-Key und Geräte-ID). Auch dann bleiben deine Messwerte bei dir: Der Shelly-Collector holt sie aus der Cloud und speichert sie lokal in deiner eigenen Installation. ## Welche Daten ausgelesen werden Mit angebundenen Shelly-Zählern stehen in SOLECTRUS folgende Messwerte zur Verfügung: - die **Momentanleistung** jedes gemessenen Geräts (lokal bis im 5-Sekunden-Takt) - den daraus berechneten **Verbrauch** über Tage, Monate und Jahre - einzelne **Verbraucher** getrennt – Wärmepumpe, Wallbox, Server und Co. - bei dreiphasigen Klemmenzählern wahlweise **eine einzelne Phase (A, B oder C) oder die Gesamtleistung** – ein einziger Zähler kann so gleich mehrere Geräte erfassen, und der Shelly-Collector teilt die Phasen auf einzelne Verbraucher auf Der Shelly-Zähler liefert die Leistung in Watt. Den Energieverbrauch über die Zeit berechnet SOLECTRUS daraus. So siehst du, was einzelne Verbraucher kosten und wie viel davon aus der PV-Anlage gedeckt wird. Welche Werte genau ankommen, hängt vom jeweiligen Shelly ab. Der **Shelly-Collector** arbeitet **speichereffizient**: Geräte, die nur sporadisch laufen, etwa Waschmaschine oder Geschirrspüler, erzeugen nur dann Einträge, wenn sie in Betrieb sind. In den langen Ruhezeiten dazwischen wird nichts gespeichert. Das hält die Datenbank schlank, ohne dass dir ein Betriebszyklus entgeht. Für jeden gemessenen Verbraucher trennt der **Power-Splitter** von SOLECTRUS den Verbrauch automatisch in **PV-Strom und Netzstrom**. Du siehst also nicht nur, wie viel ein Gerät zieht, sondern auch, wie viel davon direkt vom Dach kam und wie viel teuer aus dem Netz. Tagesgenaue, sich ändernde Strompreise rechnet er mit ein. Bei Bedarf lassen sich die Werte auch **umdrehen** (Vorzeichen invertieren). Praktisch, wenn ein Shelly nicht einen Verbraucher misst, sondern eine Erzeugung – etwa die Einspeisung eines Balkonkraftwerks. ## So bindest du Shelly an Der **Shelly-Collector** läuft als Teil deiner SOLECTRUS-Installation und fragt alle angebundenen Shelly-Zähler regelmäßig ab, lokal bis im 5-Sekunden-Takt. Im Kern sind es drei Schritte: 1. **SOLECTRUS installieren** – am einfachsten über die [webbasierte Installation](/install/). 2. **Sensoren ergänzen** und dabei den Shelly-Collector als Quelle wählen. 3. **Shelly-Collector einstellen** – lokal die IP-Adresse, für die Cloud Auth-Key und Geräte-ID. Fertig: Die Werte landen ab sofort im Dashboard. Mehrere Shellys lassen sich parallel anbinden. Du brauchst dafür weder Docker-Kenntnisse noch von Hand geschriebene Konfigurationsdateien: Bei der webbasierten Installation richtest du den Shelly-Collector **komplett im Browser** ein – Felder ausfüllen, speichern, fertig. ## Schon in Home Assistant oder ioBroker? Liegen deine Shelly-Messwerte bereits in einem Smart-Home-System wie [Home Assistant](/integration/home-assistant/) oder [ioBroker](/integration/iobroker/), kannst du sie auch direkt von dort übernehmen. Den Shelly-Collector brauchst du dann gar nicht. Wie das geht, steht im jeweiligen Artikel. ## Live-Demo In der Live-Demo siehst du Shelly im Einsatz: Dort wird die **Wärmepumpe** per Shelly gemessen, dazu mehrere **Einzelverbraucher** wie Waschmaschine, Geschirrspüler oder Kühlschrank. Jeder mit eigener Leistung und eigenem PV-Anteil. --- # PV-Anlage per MQTT anbinden > Über MQTT lässt sich praktisch jede PV-Anlage und jedes Gerät herstellerunabhängig an SOLECTRUS anbinden. Der Collector abonniert die Topics am Broker. Dein Wechselrichter, Speicher oder Zähler wird nicht direkt unterstützt? Dann führt **MQTT** zum Ziel: der herstellerunabhängige Weg, über den praktisch jede Anlage und jedes Gerät in SOLECTRUS landet. MQTT braucht eine zentrale Sammelstelle, den **MQTT-Broker**. Der **MQTT-Collector** von SOLECTRUS verbindet sich mit ihm und abonniert gezielt die Werte, die du auswählst. ## So funktioniert MQTT MQTT ist ein etabliertes Protokoll aus der Welt des Internet of Things: schlank und in fast jedem Smart-Home-System zu Hause. Im Zentrum steht der **MQTT-Broker**, eine Art Vermittlungsstelle: - Geräte **veröffentlichen** ihre Messwerte beim Broker, jeweils unter einem frei gewählten Namen, dem **Topic** (publish). - Andere Teilnehmer **abonnieren** genau diese Topics und bekommen jeden neuen Wert zugestellt (subscribe). Sender und Empfänger kennen sich nicht. Sie treffen sich nur über den Broker. Genau hier setzt der **MQTT-Collector** von SOLECTRUS an: Er ist ein solcher Abonnent. ## Welcher Broker? Der **MQTT-Collector** spricht mit jedem MQTT-Broker. Du bist also an keinen bestimmten gebunden. Am häufigsten ist der Broker schlicht Teil deines Smart-Home-Systems: - **[Home Assistant](/integration/home-assistant/)** bringt mit dem Mosquitto-Add-on einen Broker gleich mit. - **[ioBroker](/integration/iobroker/)** kann über seinen MQTT-Adapter selbst als Broker dienen. Sofern dein Smart-Home-System die Werte per MQTT bereitstellt, lassen sich auch Wechselrichter von Herstellern wie Kostal, Fronius, SMA, Sungrow, SolarEdge oder Growatt anbinden, und viele weitere. Die Marken sind nur Beispiele: Was dein Smart-Home-System einliest, lässt sich auch per MQTT weiterreichen. Einen **eigenständigen Broker** richtest du nur in einem Fall ein: wenn ein Gerät von sich aus MQTT funkt (etwa ein ESP-Projekt wie ESPAltherma, ein Tasmota-Gerät oder mancher Zähler) und du kein Smart-Home-System betreibst, bei dem es seine Werte abladen könnte. Dann genügt ein schlanker **Eclipse Mosquitto** auf einem Raspberry Pi. Hängen deine Quellen nicht alle im selben Netzwerk, übernimmt ein gehosteter Dienst wie **HiveMQ Cloud** die Vermittlung. Wichtig ist nur eins: dass Quelle und Collector denselben Broker erreichen. ## Was sich übergeben lässt Der **MQTT-Collector** empfängt beliebige Messwerte – du bestimmst, welche das sind: - Erzeugung des **Wechselrichters** - Werte des **Stromspeichers** - jeder **Zähler** und jeder einzelne **Verbraucher** - Betriebswerte von Geräten wie **Wärmepumpe** oder **Wallbox** Der Collector ist flexibel genug für die unterschiedlichsten Quellen: - **JSON auslesen**: Viele Geräte verpacken mehrere Werte in eine JSON-Nachricht. Der Collector pickt sich gezielt den richtigen heraus – auch aus verschachtelten Strukturen. - **Rechnen und umrechnen**: Per Formel lassen sich Werte skalieren oder Einheiten anpassen, etwa von Watt auf Kilowatt oder von einem Rohwert auf die tatsächliche Leistung. - **Vorzeichen trennen**: Ein einziges Topic kann auf zwei Messwerte aufgeteilt werden – zum Beispiel Netzbezug und Einspeisung aus einem Zähler, je nachdem ob der Wert positiv oder negativ ist. So passt der Collector den ankommenden Datenstrom genau an das an, was SOLECTRUS braucht, ganz gleich, wie die Quelle ihre Werte liefert. ## So richtest du den MQTT-Collector ein Am einfachsten geht das über die [webbasierte Installation](/install/), der empfohlene Weg ohne Kommandozeile oder von Hand geschriebene Konfigurationsdateien. Der Ablauf: 1. Deine Anlage oder dein Smart-Home-System **veröffentlicht** ihre Messwerte am Broker. 2. Du hinterlegst die Verbindungsdaten deines Brokers und legst je Sensor fest, welches Topic er abonniert und wie der Wert behandelt wird. 3. Der MQTT-Collector abonniert die konfigurierten Topics und schreibt die Werte in die SOLECTRUS-Datenbank – fertig, sie erscheinen im Dashboard. Die Zuordnungen stellst du komplett im Browser ein, inklusive JSON-Auslesung, Formeln und Vorzeichen-Trennung. > **Werte müssen laufend gesendet werden** > > > Der Collector verarbeitet nur, was tatsächlich am Broker ankommt. Die Quelle muss ihre Werte daher kontinuierlich veröffentlichen – eine Einstellung wie „nur bei Änderung senden" solltest du deaktivieren, sonst bleiben Lücken im Verlauf. > ## Live-Demo In der Live-Demo läuft der MQTT-Collector selbst mit: Er holt die **internen Betriebswerte der Wärmepumpe** ein: Vor- und Rücklauftemperatur, Durchfluss und Warmwassertemperatur. Die Daten stammen von einer **Daikin Altherma**, ausgelesen über das Projekt **ESPAltherma**, das diese Werte abgreift und per MQTT bereitstellt. Eine Besonderheit zeigt, wozu die Formeln gut sind: Die **erzeugte Wärmeleistung** meldet die Wärmepumpe nicht direkt. Der Collector berechnet sie aus den Rohwerten, kurz gesagt als `Durchfluss × (Vorlauf − Rücklauf) × Wärmekapazität`. Hier kommen zwei Quellen zusammen: Den **Stromverbrauch** der Wärmepumpe misst dort ein [Shelly](/integration/shelly/), die **erzeugte Wärme** rechnet der MQTT-Collector aus den Temperaturen. Die **Arbeitszahl (COP)** berechnet SOLECTRUS dann selbst aus beiden Werten. --- # Home Assistant anbinden > Home Assistant führt deine Messwerte zusammen. Für die dauerhafte Aufbewahrung und ausführliche Energie-Auswertungen über Jahre übernimmt SOLECTRUS die Werte. [Home Assistant](https://www.home-assistant.io/) ist eine der populärsten Smart-Home-Zentralen: Über unzählige Integrationen bindet es Geräte und Dienste an und führt deren Messwerte an einer Stelle zusammen – Wechselrichter, Speicher, Zähler, Wärmepumpe, Wallbox. Im Automatisieren und Steuern ist Home Assistant richtig stark. Beim Langzeitverlauf hört der Komfort auf. Verlaufsdaten hält Home Assistant zwar vor, dünnt ältere Werte aber aus. Für die detaillierte Auswertung von Energiedaten über Jahre ist es nicht gebaut. Genau dafür gibt es SOLECTRUS: Du übergibst die Messwerte, SOLECTRUS bewahrt sie dauerhaft auf und wertet sie aus. ## Wo SOLECTRUS ergänzt Lückenlose Verläufe über Jahre, automatisch berechnete Kennzahlen: dafür ist SOLECTRUS gebaut. Jeder übergebene Messwert wird dauerhaft gespeichert, auf Wunsch über Jahre. Home Assistant steuert dein Zuhause. SOLECTRUS speichert die Werte und wertet sie aus. ## Was SOLECTRUS daraus macht SOLECTRUS übernimmt die Werte aus Home Assistant und legt sie in einer **InfluxDB-Zeitreihendatenbank** ab, in **voller Auflösung** und auf Wunsch über Jahre. Aus den Rohwerten berechnet SOLECTRUS automatisch **Autarkiegrad, Eigenverbrauch, Kosten und Ersparnis**. Live und aggregiert über Jahre hinweg. Dargestellt wird das in einem Dashboard, das auf Energiedaten zugeschnitten ist. Deine Daten bleiben in deiner eigenen Installation. Die Kommunikation mit den Geräten bleibt bei Home Assistant. SOLECTRUS bekommt die fertigen Messwerte überreicht. ## Welche Daten du übergeben kannst Du übergibst alle Sensoren, die SOLECTRUS kennt – also die typischen Energiewerte rund um PV-Anlage, Speicher, Verbrauch und Wärmepumpe. Aus deinen Home-Assistant-Sensoren wählst du die passenden aus und ordnest sie den SOLECTRUS-Werten zu. ## Zwei Wege der Anbindung Für die Übergabe an SOLECTRUS gibt es zwei Wege. Welcher besser passt, hängt von deinem Setup ab. ### Weg 1: Abruf per MQTT Home Assistant veröffentlicht die gewünschten Sensorwerte an einen **MQTT-Broker** – das Mosquitto-Add-on bringt einen solchen gleich mit. Der **MQTT-Collector** von SOLECTRUS abonniert die Werte dort und holt sie ab (Pull). Praktisch, wenn du ohnehin schon mit MQTT arbeitest. Das Prinzip dahinter beschreibt der separate Artikel zu [MQTT](/integration/mqtt/). ### Weg 2: Direkt nach InfluxDB Alternativ schiebt Home Assistant die ausgewählten Werte über die **Home-Assistant-Integration von SOLECTRUS** selbst direkt in die InfluxDB-Datenbank von SOLECTRUS (Push) – ohne Umweg über einen MQTT-Broker. Du wählst aus, welche Sensoren übergeben werden. Installation und Einrichtung beschreibt das [zugehörige Repository](https://github.com/solectrus/ha-integration). ## Live-Demo Wie die Auswertungen in SOLECTRUS aussehen, zeigt die Live-Demo mit echten Daten – inklusive Langzeitverlauf über Monate und Jahre. --- # ioBroker anbinden > ioBroker verbindet deine Geräte und kennt ihre aktuellen Messwerte. SOLECTRUS übernimmt sie und wertet sie live sowie über Jahre aus. [ioBroker](https://www.iobroker.net/) ist eine offene Smart-Home-Zentrale: Über Adapter werden unzählige Geräte und Dienste angebunden und deren Datenpunkte an einer Stelle zusammengeführt – Wechselrichter, Speicher, Zähler, Wärmepumpe, Wallbox. Stark im Einsammeln und Steuern. Eine Verlaufsaufzeichnung bringt ioBroker von Haus aus nicht mit: Dort wird für jeden Datenpunkt nur der **aktuelle** Messwert gespeichert. Hier kommt SOLECTRUS ins Spiel. ## Übergabe der Messwerte an SOLECTRUS SOLECTRUS legt die erhaltenen Messwerte in einer **Zeitreihendatenbank** (InfluxDB) ab und rechnet damit weiter. Aus der Leistung in Watt wird beispielsweise die Energie in Kilowattstunden, summiert über Tage und Jahre. Darauf bauen Kennzahlen wie **Autarkiegrad, Eigenverbrauch, Kosten und Ersparnis** auf. Die Rollen sind klar verteilt: ioBroker verbindet sich mit den Geräten, wie bisher. SOLECTRUS bekommt permanent die Messwerte überreicht und kümmert sich um den Rest. ## Zwei Wege der Anbindung Aus deinen ioBroker-Datenpunkten wählst du die passenden aus und ordnest sie den SOLECTRUS-Werten zu: die typischen Leistungswerte rund um PV-Anlage, Speicher, Verbrauch und Wärmepumpe. Für die Übergabe gibt es zwei Wege. Welcher besser passt, hängt von deinem Setup ab. ### Weg 1: Übertragen per MQTT Aktivierst du in ioBroker den **MQTT-Adapter** (im Broker-Modus), stellt ioBroker die Datenpunkte zur Abholung bereit. Der **MQTT-Collector** von SOLECTRUS abonniert die Werte dort und schreibt sie in die InfluxDB. Praktisch, wenn du ohnehin schon mit MQTT arbeitest. Das Prinzip dahinter beschreibt der separate Artikel zu [MQTT](/integration/mqtt/). ### Weg 2: Direkt nach InfluxDB Alternativ kann ioBroker die Datenpunkte aber auch selbst direkt in die InfluxDB-Datenbank von SOLECTRUS schreiben, also ohne Umweg über einen MQTT-Broker. Dafür gibt es den Community-Adapter [ioBroker.solectrus-influxdb](https://github.com/patricknitsch/ioBroker.solectrus-influxdb). Du hinterlegst die Zugangsdaten deiner SOLECTRUS-InfluxDB und wählst die Datenpunkte aus, die übertragen werden sollen. Der Adapter ist ein mächtiges Werkzeug: Er kann die Datenpunkte nicht nur weiterreichen, sondern bei Bedarf auch **umrechnen**. Denn nicht jedes Gerät liefert die Werte so, wie SOLECTRUS sie erwartet. Manche melden die Leistung pro Phase statt als Summe. Andere melden Bezug und Einspeisung als einen vorzeichenbehafteten Wert statt als zwei getrennte Datenpunkte. Für solche Fälle bringt er eine **Formel-Engine** mit: Du addierst Phasen oder trennst positive und negative Anteile, ohne ein Skript zu schreiben. Ein visueller **Formel-Editor** mit Live-Vorschau hilft beim Zusammenbauen. ## Live-Demo In der Live-Demo siehst du, wie die Werte im Dashboard dargestellt werden und wie der Langzeitverlauf über Monate und Jahre aussieht. --- # evcc anbinden > evcc kennt die Energiewerte deines Hauses und veröffentlicht sie per MQTT. SOLECTRUS übernimmt sie und wertet sie live sowie im Langzeitverlauf aus. [evcc](https://evcc.io/) steuert das PV-optimierte Laden deines E-Autos und kennt dabei eine Menge Energiewerte deines Hauses. Genau diese Werte lassen sich an SOLECTRUS übergeben und dort live sowie über Jahre auswerten. ## evcc als Brücke zu deiner Hardware Das Schöne daran: evcc spricht von Haus aus mit vielen Wechselrichtern, Speichern, Zählern und Wallboxen – von Kostal über SMA, Fronius und SolarEdge bis Sungrow und etlichen weiteren. Damit wird evcc quasi zum **Adapterstück** zwischen deiner Hardware und SOLECTRUS: Was evcc ohnehin schon kennt, kannst du direkt weiterreichen. Eine separate Anbindung jedes einzelnen Geräts entfällt. ## Welche Daten du übernehmen kannst evcc liefert beides: die **Energiebilanz des Hauses** (PV-Erzeugung, Hausverbrauch, Netzbezug und Einspeisung sowie den Stromspeicher) und die **Details rund ums Laden** von Hausakku und E-Auto, etwa Ladeleistung, geladene Energie und (wenn dein Fahrzeug ihn meldet) den Ladestand des Autos. ## So kommen die Werte in SOLECTRUS evcc gibt seine Werte über **MQTT** weiter. SOLECTRUS holt sie von dort ab. Wie das grundsätzlich funktioniert, beschreibt der Artikel zu [MQTT](/integration/mqtt/). Eine ausführliche Schritt-für-Schritt-Anleitung speziell für evcc gibt es aus der Community: \ [evcc mit SOLECTRUS verbinden (Howto)](https://github.com/larknafets/howtos/blob/main/solectrus/evcc.md). ## Live-Demo In der Live-Demo siehst du, wie Anlagen- und Ladewerte im Dashboard zusammenlaufen. --- # PV-Prognose: Solarertrag der nächsten Tage > Der erwartete Solarertrag der nächsten Tage in SOLECTRUS, je nach Anbieter bis zu 7 Tage im Voraus. Prognose und echter Ertrag im direkten Vergleich. Wie viel Strom liefert deine Anlage morgen? Und übermorgen? Die **Ertragsprognose** in SOLECTRUS zeigt es dir – für die kommenden Tage, je nach Anbieter bis zu 7 Tage im Voraus. So planst du deinen Verbrauch nach der Sonne: Wärmepumpe, Wallbox, Waschmaschine oder die Speicherladung wandern in die ertragreichen Stunden, statt teuren Netzstrom zu ziehen. ## Was die Prognose zeigt SOLECTRUS stellt die erwartete Erzeugung direkt neben den tatsächlichen Ertrag: - **Prognose für die kommenden Tage** – je nach Anbieter und Tarif bis zu 7 Tage im Voraus - **mehrere Dachflächen getrennt** – Ost und West laufen nicht in einen Topf, sondern werden einzeln vorhergesagt - **Prognose und Realität im direkten Vergleich** – Tag für Tag siehst du, wie gut die Vorhersage zur Wirklichkeit passt So erkennst du auf einen Blick, ob ein ertragreicher Tag bevorsteht und ob sich deine Anlage so verhält, wie sie soll. Bleibt der echte Ertrag dauerhaft hinter der Prognose zurück, ist das oft das erste Anzeichen für Verschattung, Verschmutzung oder einen schwächelnden String. ## Welche Anbieter werden unterstützt? Die Prognose holt der **Forecast-Collector** ein, ein kleiner Dienst deiner SOLECTRUS-Installation, der die Werte beim Anbieter abruft und in deine Datenbank schreibt. Drei Anbieter stehen zur Wahl: - **[pvnode](https://pvnode.com/)** – gleicht die Vorhersage per **Nowcast** mit aktuellen Satellitendaten ab, je nach Tarif bis zu alle 10 Minuten statt nur ein- oder zweimal am Tag. So bleibt die kurzfristige Prognose nah an der aktuellen Wetterlage, gerade bei wechselnder Bewölkung. Nebenbei liefert pvnode eine Außentemperatur- und Wetterprognose mit. - **[Solcast](https://solcast.com/)** – der etablierte Klassiker. Kostenloser Tarif für die private Nutzung, Registrierung vorausgesetzt. - **[Forecast.Solar](https://forecast.solar/)** – am schnellsten ausprobiert. Ohne Registrierung nutzbar, ebenfalls mit kostenloser Variante. > **Tarife bei pvnode** > > > pvnode bietet einen kostenlosen Einstieg (**Free**: Prognose für heute und morgen, ein Update am Tag). Die Vorschau über volle 7 Tage gibt es ab dem **Light**-Tarif. Der Nowcast mit 10-Minuten-Updates steckt im **Plus**-Tarif – die genaueste Variante. Dort lässt sich die Prognose zusätzlich anhand deiner echten Ertragsdaten kalibrieren. > ## So richtest du die Prognose ein Am einfachsten geht das über die **webbasierte Installation** – komplett im Browser, ohne Kommandozeile und ohne von Hand geschriebene Konfigurationsdateien: 1. **Anbieter wählen** – pvnode, Solcast oder Forecast.Solar. 2. **API-Schlüssel holen** – bei pvnode und Solcast nach einer kostenlosen Registrierung, bei Forecast.Solar optional. 3. **Dachflächen hinterlegen** – bei pvnode und Solcast legst du deine Anlage (eine „Site" mit deinen Dachflächen) direkt beim Anbieter an und trägst im Collector nur deren ID ein; bei Forecast.Solar gibst du Ausrichtung, Neigung und Leistung der Dachflächen direkt im Collector ein. Fertig. Wann genau abgefragt wird, regelt der Forecast-Collector selbst: Er holt die Daten passend zum Update-Rhythmus deines Anbieters und im Rahmen deines Tarif-Kontingents. Du musst kein Intervall einstellen. Die genauen Felder je Anbieter stehen in der [Dokumentation des Forecast-Collectors](/docs/referenz/forecast-collector/). ## Live-Demo In der Live-Demo siehst du die Prognose für mehrere Tage nebeneinander – Vorhersage neben echtem Ertrag. Die Werte stammen dort von **pvnode im Nowcast-Tarif**: Die Prognose wird alle 10 Minuten gegen frische Satellitendaten neu gerechnet, 7 Tage im Voraus, für eine reale 9,24-kWp-Anlage. # Blog --- # HELIOS ist angekommen _2026-07-24_ > HELIOS 1.0 ist da. SOLECTRUS lässt sich jetzt komplett im Browser installieren und konfigurieren. Ohne Docker-Wissen, ohne YAML von Hand. [Im Mai schrieb ich hier noch](/blog/2026-05-09-helios-ist-unterwegs/): „HELIOS ist unterwegs.“ Jetzt ist er da, der Installateur für SOLECTRUS. **HELIOS 1.0** ist fertig und ab sofort der empfohlene Weg, SOLECTRUS einzurichten und zu betreiben. ## Alles im Browser Bisher brauchte SOLECTRUS etwas Linux- und Docker-Wissen und die Bereitschaft, in der Kommandozeile YAML-Dateien zu editieren. Ich habe im Laufe der letzten Jahre erfahren, dass das für für viele eine ganz erhebliche Hürde ist. Genau diese fällt jetzt weg. Mit HELIOS vereinfacht sich die Installation und Konfiguration von SOLECTRUS ganz gewaltig. Ein kleines Skript prüft, ob der Server bereit ist, installiert alles Notwendige und übernimmt auch eine bestehende Installation von SOLECTRUS, liest also deren Konfiguration ein (das war übrigens der wirklich anspruchsvolle Part in der Entwicklung). Beruhigend, falls du SOLECTRUS schon länger nutzt: Du fängst **nicht** von vorne an. Danach öffnest du HELIOS im Browser und machst alles Weitere dort. ## Was HELIOS für dich übernimmt HELIOS läuft als kleine Web-App neben SOLECTRUS auf demselben Gerät. Ab der Installation bedienst du alles im Browser: - **Sensoren statt Umgebungsvariablen.** Du wählst aus, welche Sensoren du nutzen willst (PV-Erzeugung, Hausverbrauch, Speicher, Wärmepumpe, Wallbox und etliche mehr) und verbindest sie mit den Datenquellen. Rund 50 Sensoren stehen zur Auswahl. Die aktuellen Messwerte siehst du direkt daneben und prüfst so, ob die Zuordnung stimmt. - **Datenquellen mit Verbindungstest.** SENEC, Shelly, MQTT oder eine PV-Prognose: HELIOS prüft auf Knopfdruck, ob die Verbindung steht und die Zugangsdaten passen. - **Dienste im Blick.** Eine Liste zeigt alle Bestandteile mit Status und Version. Per Klick können sie gestartet oder gestoppt werden. Die Protokolle können eingesehen werden, ohne kryptische Befehle. - **Backup inklusive.** HELIOS sichert die Messwerte sowie die Konfiguration (auch automatisch und regelmäßig) und spielt sie bei Bedarf zurück. - **Einfache Updates.** Updates für die Datenbanken lassen sich mit einem Klick installieren. Updates für Kollektoren, den Power-Splitter und die sonstigen Bestandteile von SOLECTRUS kommen automatisch. HELIOS selbst hält sich ebenfalls automatisch auf dem aktuellen Stand. Auch die laufende Pflege wird damit einfacher. Einen neuen Shelly ergänzen, eine Wallbox hinzufügen, einen Sensor umbauen: Du klickst es zusammen, HELIOS schreibt die Konfiguration neu und startet die betroffenen Dienste durch. Von Docker und YAML musst du nichts mehr wissen. Und wenn es doch mal irgendwo hakt und du nicht weiterkommst, kann HELIOS die wichtigsten Informationen deiner Installation anonymisiert als Zip-Datei zusammenstellen. Damit kannst du im Forum um Hilfe bitten. Für die Profis unter euch: HELIOS weiß sehr genau, wie SOLECTRUS konfiguriert werden muss. Je nachdem, was man sich in der Web-Oberfläche zusammen geklickt hat, erzeugt HELIOS die passenden Docker-Dateien (`compose.yaml` und `.env`) und startet die Container. Bei jeder Änderung wird die Konfiguration aktualisiert. Wer möchte, kann jederzeit weiterhin sehen, wie die Konfiguration aussieht und was Docker damit macht. HELIOS ist keine Blackbox. ## Deine Daten bleiben zuhause HELIOS läuft auf deinem eigenen Gerät. Deine Konfiguration und deine Messwerte verlassen dein Zuhause nicht. Das Installationsskript ist vor der Ausführung auf GitHub einsehbar, und der komplette Quellcode von HELIOS liegt offen. Auf der Hardware-Seite bleibt HELIOS genügsam: etwas RAM für den zusätzlichen Dienst und etwas Speicherplatz auf der Disk. Es läuft auf AMD64 und ARM64, ein Raspberry Pi reicht also weiterhin. Wenn Docker noch nicht vorhanden ist, wird es automatisch installiert. ## An wen richtet sich HELIOS? Für eine Neuinstallation von SOLECTRUS ist HELIOS die erste Wahl. Aber auch wer SOLECTRUS schon länger nutzt, dem möchte ich HELIOS sehr ans Herz legen. HELIOS modernisiert eine bestehende Installation und behebt viele kleine Unzulänglichkeiten, die sich über die Jahre eingeschlichen haben könnten und die sonst nicht aufgefallen wären. Es gibt einige seltene Szenarien, in denen HELIOS nicht eingesetzt werden kann, das steht genauer in der [Referenz](/docs/referenz/helios/#was-helios-nicht-kann). HELIOS prüft vor der Übernahme einer bestehenden Installation, ob die Konfiguration kompatibel ist - und stoppt die Übernahme, wenn es nicht passt. In allen anderen Fällen wird ein Backup der bestehenden Konfiguration erstellt, bevor HELIOS übernimmt. So kann man jederzeit wieder zurück, falls man später merkt, dass es doch nicht passen sollte. ## Los geht's! Wenn du SOLECTRUS neu aufsetzt, führt dich die neue [Installationsseite](/install/) direkt zu HELIOS. Wenn du einen Linux-Server zur Verfügung hast, läuft HELIOS innerhalb weniger Minuten und die Einrichtung von SOLECTRUS kann beginnen. [Zur Installation ❯](/install/) Wer es genau wissen möchte: Alle Details zu Diensten, Backup und den einzelnen Einstellungen stehen in der [Referenz zu HELIOS](/docs/referenz/helios/). ## Der Konfigurator geht in Rente Mit 1.0 löst HELIOS den bisherigen [Konfigurator](https://configurator.solectrus.de/) ab. Der hat jahrelang gute Dienste geleistet, konnte aber nur Bausteine erzeugen, die du danach von Hand weiter pflegen musstest. HELIOS macht beides in einem: Erstinstallation und die laufende Pflege. ## Danke an die Tester HELIOS konnte entstehen und reifen, weil viele von euch früh mitgemacht haben. Ihr habt mir eure Konfigurationen geschickt, Fehler gemeldet und die rauen Kanten abgeschliffen. Das hat echt geholfen - herzlichen Dank dafür! Probier HELIOS aus und berichte, wie es bei dir läuft – im [Forum](https://github.com/orgs/solectrus/discussions) lese ich gerne von deinen Erfahrungen. --- # Version 1.2 räumt die Oberfläche auf _2026-05-30_ > Neue Menüleiste fürs Smartphone, Hausverbrauch als Tabelle, präzisere Darstellung bei Sensorausfällen und viele weitere Details. Version 1.2 ist da. Im Mittelpunkt stehen zwei Neuerungen: eine Menüleiste fürs Smartphone und der Hausverbrauch jetzt auch als Tabelle. Dazu kommen viele kleinere Verbesserungen – an der Oberfläche und unter der Haube. Der Überblick: ## Neue Menüleiste für kleine Displays Auf dem Smartphone war der Weg über das Hauptmenü oft ein Klick zu viel. Mit der neuen Menüleiste am unteren Bildschirmrand wechselst du direkt zwischen den wichtigsten Bereichen – mit dem Daumen, ohne Umwege. ## Hausverbrauch jetzt auch tabellarisch Die Aufschlüsselung der Verbraucher gab es bisher nur grafisch. Übersichtlich, aber für kleine Verbraucher fehlten oft die genauen Zahlen. Ein neuer Button (links in der Klammer) schaltet jetzt auf die **Tabellenansicht** um. Alle Verbraucher mit ihren Werten auf einen Blick, perfekt zum Vergleichen. Die Einstellung bleibt gespeichert – wer die Tabelle bevorzugt, sieht sie beim nächsten Mal wieder. ## Diagramme berücksichtigen auch Sensorausfälle Sensoren fallen schon mal aus – kurz oder länger. Bisher hat SOLECTRUS solche Aussetzer im Diagramm einfach überbrückt. Das sah aufgeräumt aus, war aber irreführend: Aus einer echten Lücke wurde eine glatte Kurve, die so nie gemessen wurde. Damit ist Schluss. Längere Ausfälle zeigt das Diagramm jetzt als das, was sie sind: eine Lücke. Je nach Gerät unterscheidet SOLECTRUS das sauber von echten Ruhephasen, in denen der Messwert wirklich Null ist. ## Soll-Temperatur des Wasserspeichers Du hast eine Wärmepumpe? Der neue Sensor `HEATPUMP_TANK_TEMP_SETPOINT` zeigt jetzt die Soll-Temperatur des Wasserspeichers – als gestrichelte Linie direkt im Diagramm. So siehst du auf einen Blick, warum die Wärmepumpe selbst im Sommer arbeitet. ## Die kleineren Dinge Auch im Detail hat sich einiges getan: - Live-Diagramme: pulsierende Markierung am rechten Rand bei neuen Messwerten - Wischgesten auf Touch-Displays: der Inhalt folgt weich dem Finger und federt zurück - Fortschrittsbalken bei Seitenwechseln erscheint sofort – klare Rückmeldung beim Laden - Aufschlüsselung mehrerer Wechselrichter jetzt auch in der „Jetzt"-Ansicht - PV-Prognose nun auch in den Zeiträumen 24 h, 48 h und 72 h sichtbar - Trend-Anzeige für den Batterieladestand ist wieder da - Eingabe des Codeworts visuell überarbeitet, passt jetzt zum übrigen Design ## Unter der Haube Nicht sichtbar, aber genauso wichtig: - Codewort-Schutz und Admin-Anmeldung an mehreren Stellen gehärtet - Das Abrufintervall der „Jetzt"-Seite passt sich automatisch an den Rhythmus deiner Sensoren an – das verhindert Fehlkonfigurationen, die ich oft gesehen habe - Statische Inhalte werden vorkomprimiert ausgeliefert und laden schneller - Ruby, Rails und unzählige weitere Pakete auf den neuesten Stand gebracht – gut für Sicherheit und Stabilität - Dazu viele Verbesserungen bei Stabilität, Performance und Fehlerbehandlung ## SOLECTRUS unterstützen SOLECTRUS ist Open Source und kostenfrei nutzbar. Wenn du SOLECTRUS regelmäßig verwendest, freue ich mich über deine Unterstützung: Mit einem [Sponsoring-Abo](/sponsoring/) ab 5 € im Monat schaltest du alle Features frei und machst die Weiterentwicklung möglich. --- # HELIOS ist unterwegs _2026-05-09_ > Ich arbeite an HELIOS, einem Werkzeug zur einfachen Installation und Konfiguration von SOLECTRUS – komplett im Browser. Hier war es zuletzt etwas ruhiger – und das hatte einen Grund. Ich arbeite an einem ganz neuen Werkzeug, das die Installation von SOLECTRUS erheblich vereinfachen wird. ## Warum das nötig ist SOLECTRUS einzurichten erfordert heute etwas Linux- und Docker-Wissen und die Bereitschaft, die Kommandozeile zu verwenden. Für viele ist das gut machbar – für andere eine spürbare Hürde, die mehr Zeit kostet als nötig. Bei Support-Anfragen sehe ich das immer wieder. Das muss einfacher werden. SOLECTRUS sollte für alle zugänglich sein, die ihre PV-Anlage verstehen wollen – nicht nur für die, die nebenbei auch noch Linux-Profi sind. Deshalb habe ich vor einigen Monaten mit der Entwicklung von **HELIOS** begonnen. ## Was HELIOS für dich tun kann HELIOS ist eine kleine Web-App, die parallel zu SOLECTRUS auf demselben Gerät läuft. Du holst sie dir mit einem einzigen Befehl auf den Server – ab da bedienst du alles im Browser. Vier Dinge übernimmt HELIOS für dich: - **Es versteht, was du schon hast.** Wenn SOLECTRUS bei dir bereits läuft, liest HELIOS deine bestehende Einrichtung ein – auch dann, wenn die Konfiguration über Jahre gewachsen ist. Du fängst nicht von vorne an. - **Es denkt in Sensoren, nicht in Variablen.** Im Mittelpunkt stehen die Sensoren, die SOLECTRUS kennt – PV-Erzeugung, Hausverbrauch, Stromspeicher, Wärmepumpe, Wallbox und mehr. Du wählst aus, welche du nutzen willst, und „verdrahtest“ sie in HELIOS mit deiner Anlage. Was du nicht brauchst, lässt du weg. Gleichzeitig siehst du, was möglich ist. - **Es kümmert sich um den technischen Kram.** Im Hintergrund schreibt HELIOS die Docker-Konfigurationsdateien, die SOLECTRUS braucht – jedes Mal frisch, sobald du etwas änderst. Was bisher Handarbeit war, passiert jetzt beim Klicken. - **Es zeigt dir, was läuft.** Statt abstrakter Docker-Container, die man bislang nur mit kryptischen Befehlen aufspüren kann, findest du eine übersichtliche Liste aller Bestandteile mit ihrem jeweiligen Status. Du siehst auf einen Blick, was funktioniert und was nicht – und kannst alles mit einem Klick starten, stoppen oder auch Updates durchführen. Auch die laufende Pflege wird damit einfacher. Einen neuen Shelly ergänzen, einen Sensor umkonfigurieren, eine Wallbox hinzufügen: Du klickst es zusammen, HELIOS macht den Rest. Du musst nicht mehr wissen, welche Umgebungsvariablen zu definieren sind, wie man unfallfrei eine YAML-Datei editiert oder wie man generell mit Docker jongliert. HELIOS läuft auf deinem eigenen Gerät, deine Konfiguration und deine Messwerte verlassen dadurch dein Zuhause nicht. ## Wo es hingeht HELIOS ist funktional fast fertig. Erste mutige Tester sind seit ein paar Wochen dabei und melden zurück, dass es schon erstaunlich gut läuft. Hier und da gibt es noch Ecken und Kanten, an denen ich arbeite. Sobald HELIOS stabil ist, wird es den bisherigen [Konfigurator](https://configurator.solectrus.de/) ablösen und der empfohlene Weg sein, SOLECTRUS einzurichten und zu betreiben. ## Du kannst beim Testen helfen Damit HELIOS am Ende für jedes denkbare Szenario fit ist, teste ich es sehr breitgefächert mit unterschiedlichsten Konfigurationen. Und dabei könntest du mir helfen: Wer mir die Konfiguration seiner bestehenden SOLECTRUS-Instanz zur Verfügung stellen möchte, kann mir dieser gerne per E-Mail an info@solectrus.de zusenden (Passwörter und andere sensible Daten bitte unkenntlich machen). Details dazu finden sich im [Forum-Posting auf GitHub](https://github.com/orgs/solectrus/discussions/5516). Danke fürs Mitmachen! HELIOS ist unterwegs – ich melde mich wieder, wenn er ankommt. **Ergänzung 24. Juli 2026:** HELIOS ist angekommen, ich berichte in einem eigenen [Beitrag](/blog/2026-07-24-helios-ist-angekommen/). --- # Version 1.1 zeigt die Strombilanz im Zeitverlauf _2026-03-10_ > Die Strombilanz gibt es jetzt als Diagramm über den Tagesverlauf. Woher der Strom kommt und wofür er draufgeht, sichtbar in jedem Moment des Tages. Genau zwei Monate nach [Version 1.0](/blog/2026-01-10-version-1-0/) erscheint das nächste größere Update. Im Mittelpunkt steht ein neues Diagramm, das die Strombilanz im Zeitverlauf sichtbar macht. Dazu kommen weitere Verbesserungen bei Darstellung und Bedienung. ## Strombilanz als Diagramm Ein häufig gewünschtes Feature ist die gleichzeitige Darstellung mehrerer Messwerte in einem Diagramm. Das klingt auf den ersten Blick einfach, aber damit allein ist noch nicht viel gewonnen. Entscheidend war, daraus eine Darstellung zu machen, die auch auf einen Blick verständlich ist. Die Lösung: Die bereits bekannte [Strombilanz](/features/#strombilanz) wird jetzt über den Tagesverlauf als Diagramm dargestellt. Man sieht sofort, woher der Strom kommt und wofür er draufgeht - nicht nur als Summe, sondern in jedem Moment des Tages. Oberhalb der Zeitachse steht die **Herkunft** des Stroms: PV-Erzeugung, Akku-Entnahme und Netzbezug. Unterhalb sieht man die **Verwendung**: Hausverbrauch, Wärmepumpe, Wallbox, Akku-Beladung und Einspeisung. Die Farben machen sofort sichtbar, wie gut der verfügbare Strom genutzt wird. Beide Hälften zusammen ergeben ein vollständiges Bild der Energieflüsse eines Tages. Zwei Beispiele zeigen, wie unterschiedlich dieses Diagramm im Alltag aussehen kann: Das Diagramm gibt es auch für beliebig große Zeiträume, die Darstellung erfolgt dann mit gestapelten Säulen. ## Neue Farbpalette für mehr Kontrast Gerade im neuen Strombilanz-Diagramm ist eine klare Farbtrennung wichtig. In der bisherigen Farbpalette lagen einige Töne zu nah beieinander. Deshalb gibt es jetzt die neue Palette **Kontrast** mit kräftigeren und besser unterscheidbaren Farben. Die Einstellung wirkt sich auf alle Sensoren aus. Wer es zurückhaltender mag, bleibt beim Standard. ## Diagramme vergrößern Per Klick lassen sich jetzt alle Diagramme maximieren. Im Vollbild füllen sie das gesamte Browserfenster aus. Bei Tagesdiagrammen wird auf 1-Minuten-Intervalle umgeschaltet. So werden deutlich mehr Details sichtbar als in der normalen Ansicht. ## Wärmepumpen-Seite neu gestaltet Hier wurde die Darstellung grundlegend überarbeitet und auf die wichtigsten Informationen konzentriert: **Arbeitszahl als Ringdiagramm**: Die Zusammensetzung der erzeugten Wärme aus PV-Strom, Netzstrom und dem (meist größten) Anteil der Umgebungswärme wird jetzt als Ringdiagramm ("Donut") dargestellt. Dadurch wird die Arbeitszahl deutlich greifbarer. Eine Arbeitszahl von 4 zeigt zum Beispiel auch visuell, dass _3/4_ der erzeugten Wärme aus der Umgebung stammen und nur _1/4_ aus Strom. **Stromkosten im Zeitverlauf**: Die Verbrauchskosten der Wärmepumpe werden zusätzlich als Diagramm dargestellt. Die Kosten für den Stromverbrauch setzen sich aus tatsächlich zu zahlenden Netzbezugskosten sowie den Opportunitätskosten zusammen. Denn auch selbst erzeugter Strom ist nicht kostenlos, wenn er stattdessen eingespeist oder anderweitig genutzt werden könnte. ## Vollbild-Modus für große Displays Manche nennen es eine [unbezahlbare Verbesserung](https://github.com/orgs/solectrus/discussions/5321#discussioncomment-16002446): Der Vollbild-Modus eignet sich jetzt noch besser für sehr große Bildschirme. Texte und andere Elemente skalieren mit, damit sie auch aus größerer Entfernung gut lesbar bleiben. ## Zeitraum-Auswahl überarbeitet Relative Zeiträume wie „Letzte 30 Tage“ sind jetzt direkt auswählbar. Das spart Klicks und macht die Bedienung intuitiver. ## Die kleineren Dinge Neben den großen Neuerungen hat sich auch im Detail einiges getan – hier die Kurzfassung: - Tagesprognose als schraffierte Fläche auf der Erzeugungs-Seite - Temperaturprognose mit Min/Max-Balken - Bessere Tooltips und glattere Kurven in allen Diagrammen - Gesamtwert für eigene Verbraucher im Kennzahlen-Fenster - Stabilere Flow-Animation beim Ändern der Fenstergröße - Sauberer Umgang mit fehlerhaften Sensorwerten - Kurzes Aufblitzen beim Navigieren zur Hauptseite im Dunkelmodus auf iOS behoben - Genauere Durchschnittswerte und Prognoseabweichung - Automatische Auffrischung der Anzeige nach längerer Inaktivität ## SOLECTRUS unterstützen SOLECTRUS ist Open Source und kostenfrei nutzbar. Einige der neuen Funktionen wie das Strombilanz-Diagramm und die kontrastreiche Farbpalette sind den Sponsoren vorbehalten. Wenn du SOLECTRUS regelmäßig verwendest, freue ich mich über deine Unterstützung: Mit einem [Sponsoring-Abo](/sponsoring/) ab 5 € im Monat schaltest du alle Features frei und machst die Weiterentwicklung möglich. --- # Version 1.0 ist da! _2026-01-10_ > Fünf Jahre Entwicklung, jetzt die Eins vor dem Punkt. Version 1.0 bringt die Wärmepumpe mit Arbeitszahl und frei wählbare Zeiträume für jede Auswertung. Lange hat es gedauert – jetzt ist sie da: Version 1.0. Was vor fünf Jahren als Hobbyprojekt begann, trägt endlich die Eins vor dem Punkt. Fühlt sich gut an. Steigen wir ein, es gibt einiges zu entdecken! ## Endlich: Die Wärmepumpe im Blick Du hast eine Wärmepumpe und deren Messwerte über Home Assistant oder ähnliches verfügbar? Dann wird dir die neue Seite gefallen. Erzeugte Wärme, Wasserspeicher- und Außentemperatur – alles auf einen Blick, parallel zu Strombilanz und Hausverbrauch. Die Darstellung zeigt, woher die Wärme kommt: Strom aus dem Netz, Strom aus PV und – idealerweise der mit Abstand größte Anteil – aus der Umgebung. Die Arbeitszahl (COP) wird automatisch berechnet – für jeden Zeitraum, den du wählst. Und ja, natürlich gibt's dafür auch eine Top-10. [Live-Demo ❯](https://demo.solectrus.de/heatpump/heatpump_heating_power/2026-01-01) ## Zeitraum? Du entscheidest. Das wurde oft gewünscht: freie Zeitraumauswahl, überall. „Letzte 30 Tage", „Letzte 12 Monate" – oder einfach per Kalender einen beliebigen Zeitraum festlegen. Geht jetzt. ## Wo bleibt das Geld? Kosten, Ersparnis, Einspeisevergütung – bisher nur als Summe sichtbar, jetzt auch als Verlauf über die Zeit. Wer wissen will, wo das Geld hingeht (oder herkommt), wird sich über die neuen Finanzdiagramme freuen: ## Was bringen die nächsten Tage? Die Prognose zeigt jetzt bis zu eine Woche im Voraus – auf einer eigenen Seite, mit Clear-Sky-Kurve und Temperatur. Praktisch für die Planung. Neu dabei: [pvnode als Prognose-Anbieter](/blog/2025-11-27-pv-prognose-mit-pvnode/) mit besonders genauen Vorhersagen. ## Trends erkennen Was lief gut, was eher nicht? Die neuen Trend-Darstellungen helfen beim Einordnen: - Heatmaps nach Tagen und Monaten – für alle wichtigen Sensoren - Höchst- und Tiefstwerte sowie Tagesdurchschnitt - Vergleich mit Vorjahr und Vormonat - Spezifischer Ertrag (kWh/kWp) zum Anlagenvergleich ## Opportunitätskosten, sauber getrennt Wer Strom selbst verbraucht statt einzuspeisen, verzichtet auf Vergütung. Diese Opportunitätskosten hat SOLECTRUS schon länger auf dem Schirm – jetzt werden sie klarer visualisiert und sauber von den anderen Kosten getrennt. So wird gerechnet: $$ \begin{aligned} \text{Netzbezugskosten} &= \text{Energiebezug aus dem Netz} \times \text{Arbeitspreis} \\ \text{Opportunitätskosten} &= \text{Eigenverbrauchte Energie} \times \text{Einspeisevergütung} \\ \text{Gesamtkosten} &= \text{Netzbezugskosten} + \text{Opportunitätskosten} \end{aligned} $$ ## Unter der Haube Der Code wurde in großen Teilen neu geschrieben. Klingt nach viel Arbeit – war es auch. Aber das Ergebnis: Neue Sensoren und Diagramme lassen sich künftig viel einfacher ergänzen. Auch bei der Performance hat sich was getan. Viele Berechnungen laufen jetzt direkt in PostgreSQL. Jahresübersichten und Gesamtauswertungen laden spürbar schneller. Und keine Sorge: Version 1.0 ist vollständig kompatibel zu früheren Versionen. Konfiguration anpassen? Nicht nötig – es sei denn, du willst die neuen Sensoren für Wärmepumpe oder Prognose nutzen. ## Danke! Ein großes Dankeschön an alle Beta-Tester – euer Feedback war Gold wert. Viel Spaß mit SOLECTRUS 1.0! ## SOLECTRUS unterstützen SOLECTRUS ist Open Source und kostenfrei nutzbar. Einige der neuen Features wie die Wärmepumpen-Seite, die Trend-Darstellungen sowie die Finanzdiagramme sind jedoch den Sponsoren vorbehalten. Mit einem [Sponsoring-Abo](/sponsoring/) (ab 5 € im Monat) unterstützt du die Weiterentwicklung – und schaltest alle Features frei. --- # PV-Prognose mit pvnode _2025-11-27_ > Der Forecast-Collector unterstützt ab sofort pvnode als weiteren Prognose-Anbieter. Für SOLECTRUS-Nutzer gibt es dort ein Einstiegsangebot. Es gibt Neuigkeiten zur Darstellung des prognostizierten PV-Ertrages: Der [Forecast-Collector](/docs/referenz/forecast-collector/) von SOLECTRUS unterstützt ab sofort [pvnode](https://pvnode.com/) als weiteren Anbieter. ## Was ist pvnode? **pvnode** ist ein deutsches Startup für PV-Ertragsprognosen und weiterer Analysen rund um Photovoltaikanlagen. Ich verwende deren Dienst selbst seit einigen Monaten und bin sehr zufrieden mit der Genauigkeit der Prognosen. Nun steht pvnode allen SOLECTRUS-Nutzern zur Verfügung. > **Spezialangebot für SOLECTRUS-Nutzer** > > > Das Unternehmen hinter pvnode hat für SOLECTRUS-Nutzer ein spezielles Angebot geschnürt. Die ersten **40 Interessenten** können den vollen Funktionsumfang zur Abfrage **eines** Standorts im Rahmen eines **Early-Access Paket** für **nur 10€ pro Jahr** erhalten. Bei Interesse bitte [Kontakt aufnehmen mit pvnode](https://www.pvnode.com/contact) und dabei SOLECTRUS erwähnen. > > Wie ich höre, sind einige der limitierten Pakete bereits vergeben. Schnell sein lohnt sich! > ## Demo In der [Live-Demo von SOLECTRUS](https://demo.solectrus.de/forecast) kann die Prognose eingesehen werden. Die dortige Darstellung mit mehreren Tagen nebeneinander gehört zu den Neuerungen der bevorstehenden Version 1.0 von SOLECTRUS, die sich momentan noch im Beta-Stadium befindet. ## Kostenlose Nutzung Wer pvnode erst einmal ausprobieren möchte, kann den Dienst in reduziertem Umfang auch kostenlos nutzen. Es gelten dann diese Einschränkungen: - Prognose nur **für den aktuellen und den folgenden** Tag verfügbar - Maximal **40 Abfragen pro Monat** möglich Beim kostenpflichtigen Tarif sind Prognosen für bis zu 7 Tage und bis zu 1.000 Abfragen pro Monat möglich. ## Konfiguration Die Einrichtung von pvnode in der aktualisierten Version `v0.7` des Forecast-Collectors ist in der [Dokumentation](/docs/referenz/forecast-collector/) beschrieben. Es ist wie üblich ein API-Schlüssel erforderlich, den man nach der Registrierung bei pvnode erhält. --- # API-Umstellung bei SENEC _2025-08-03_ > SENEC hat im Juli 2025 seine interne API auf OpenID Connect umgestellt, was für Fremdanbieter wie SOLECTRUS für reichlich Wirbel sorgte. Im Januar 2024 konnte ich die Anbindung des SENEC-Collectors an die SENEC-App-API [ankündigen](/blog/2024-01-31-unterstuetzung-des-senec-home-4/). Besitzer eines Stromspeichers der aktuellen Generation V4 (z.B. **SENEC.Home P4**) konnten seitdem ihre Messwerte direkt in SOLECTRUS einbinden. Doch am **21. Juli 2025** [änderte sich die Situation abrupt](https://github.com/solectrus/senec-collector/issues/639): SENEC schaltete die bislang genutzte Schnittstelle ab. Drittanbieter-Software – darunter auch der SENEC-Collector – erhielten nur noch eine Fehlermeldung: `401 - Unauthorized`. Was folgte, war eine Phase intensiver Analyse und Umstellung. Die gute Nachricht: **Nach einer Woche** war eine Lösung implementiert. SOLECTRUS kann wie gewohnt die aktuellen Messwerte abholen und anzeigen, auch vom **SENEC.Home P4**. ## Rückblick: Wie kommen überhaupt die Messwerte zu SOLECTRUS? SOLECTRUS unterstützt verschiedene Stromspeicher und Wechselrichter. Bei SENEC gab es bislang zwei verschiedene Wege, um an die Daten zu gelangen: - **Lokaler Zugriff**: Messwerte werden direkt vom Gerät abgeholt – offline, stabil und schnell. Das unterstützen aber nur ältere Modelle wie der **V2.1 und V3**. Die V4-Familie bietet hingegen **keinen lokalen Zugriff**. - **Cloud-Zugriff**: Dieser Weg ist nicht offiziell dokumentiert und eigentlich nur für die SENEC-eigene App gedacht. Sie funktionierte dennoch auch für Drittanbieter wie SOLECTRUS – bis vor kurzem. ## Was hat sich technisch geändert? SENEC setzt seit Ende Juli 2025 beim Cloud-Zugriff auf **OpenID Connect**, ein modernes Authentifizierungsverfahren für Single Sign-On. Es reicht fortan nicht mehr, nur Benutzername und Passwort zu kennen – auch die App selbst muss sich als vertrauenswürdig ausweisen und für den Login ein mehrstufiges Authentifizierungsverfahren durchlaufen. Diese Umstellung war aus Sicht von SENEC schon aus Sicherheitsgründen sinnvoll: Die bisherige API arbeitete mit sehr langlebigen Access-Tokens, was keineswegs ideal ist. Das neue OpenID Connect-Verfahren verwendet zeitlich begrenzte Tokens, die regelmäßig erneuert werden müssen. ## Die Herausforderung für Drittanbieter Für die offizielle SENEC-App war das kein Problem, da SENEC die API-Umstellung und App-Anpassung aufeinander abstimmen konnte. Tools wie der SENEC-Collector mussten aber ohne Vorwarnung und ohne Dokumentation umgestellt werden. Dieser Schritt war technisch anspruchsvoll und erforderte ein umfassendes Redesign der Kommunikation mit den Servern von SENEC. Klar ist natürlich: Die Schnittstelle war und ist nicht offiziell für Drittanbieter vorgesehen. Trotzdem ist diese Anbindung für viele Nutzer, die eine Alternative zur offiziellen App von SENEC haben möchten, ein zentrales Feature. ## Die Lösung: Anpassung an die neue Authentifizierung Nach intensiver Arbeit unterstützt der SENEC-Collector ab [Version 0.18.0](https://github.com/solectrus/senec-collector/releases/tag/v0.18.0) nun das neue OpenID Connect-Verfahren. Der Zugriff auf aktuelle Messwerte funktioniert wieder – auch für den P4. Wer sich für die technischen Details interessiert, findet im GitHub-Repository meines Ruby-Gems die genaue [Implementierung](https://github.com/solectrus/senec/blob/v0.21.0/lib/senec/cloud/connection.rb). > **Ergänzung vom 12.08.2025** > > > Mittlerweile werden einzelne SENEC-Nutzer beim Login auf `mein-senec.de` zur Einrichtung einer Multi-Faktor-Authentifizierung (MFA) aufgefordert. Führt man diese durch, ist bei zukünftigen Anmeldungen die Eingabe eines MFA-Tokens notwendig, auch in der SENEC-App und beim SENEC-Collector. > > Ich habe daher ein weiteres Update in Form der [Version 0.19.0](https://github.com/solectrus/senec-collector/releases/tag/v0.19.0) nachgeschoben, dass dies unterstützt. Wichtig ist dabei, dass man den initialen QR-Code, den man von SENEC erhält, **sorgfältig aufbewahrt**. Dieser QR-Code (bzw. dessen textlicher Inhalt) ist notwendig, um den SENEC-Collector zu konfigurieren. > Essenziell war die Unterstützung von Matthias Marquardt ([@marq24](https://github.com/marq24/)). Von ihm kamen entscheidende Hinweise zur Implementierung der neuen Authentifizierung. Seine [Home-Assistant-Integration](https://github.com/marq24/ha-senec-v3) war der Schlüssel zur Lösung. Vielen Dank dafür! Wir haben uns übrigens gemeinsam darauf verständigt, dass wir unsere API-Clients offen und transparent gestalten. Das soll heißen, dass wir nicht versuchen, die Zugriffe auf die SENEC-Server zu verschleiern, sondern einen klar identifizierbaren User-Agent verwenden. Für den SENEC-Collector heißt das konkret, dass bei allen Anfragen an die SENEC-API die folgende Information gesendet wird: ```http User-Agent: SENEC-Collector/0.19.0 (+https://github.com/solectrus/senec-collector) ``` Damit ist klar erkennbar, welcher Client auf die Schnittstelle zugreift - und ermöglicht es SENEC prinzipiell, gezielt zu filtern und unliebsame Clients auszusperren. Das ist ein bewusstes Signal: offenes Visier statt Versteckspiel. ## Mein Standpunkt In einer idealen Welt gäbe es von SENEC eine offizielle API – offen dokumentiert, stabil, mit Unterstützung für Entwickler. Denn als Betreiber eines Stromspeichers sollte man jederzeit Zugriff auf die **eigenen** Messwerte haben – nicht nur per App, sondern auch über offene Schnittstellen, die Drittanbieter in alternative Software integrieren können. Nur zur Klarstellung: SENEC ist hier beileibe nicht der einzige Hersteller, der ganz auf die eigene App setzt und seinen Nutzern keinen anderen Weg anbietet, an die Messwerte heranzukommen. Das ist leider ein weit verbreitetes Problem in der Branche. Wer schon mal versucht hat, automatisiert an die Messwerte seiner Wärmepumpe oder seines E-Autos zu kommen, weiß, wovon ich spreche. Falls SENEC künftig einen offiziellen API-Zugang anbieten sollte, implementiere ich das für SOLECTRUS sehr gerne. Bis dahin gilt: Auf inoffiziellem Weg steht die Verbindung wieder. --- # Balkonkraftwerke und mehrere Dachflächen _2025-06-05_ > Bis zu fünf Strings oder Wechselrichter, jeder einzeln ausgewertet und in der Summe. Auch ein zusätzliches Balkonkraftwerk ist dabei. SOLECTRUS `v0.20` ist da: Es können jetzt PV-Anlagen mit mehreren Dachflächen, unterschiedlichen Wechselrichtern und zusätzlichen Balkonkraftwerken dargestellt werden. ## Mehrere Erzeuger auf einen Blick Bis zu fünf Strings oder Wechselrichter lassen sich konfigurieren. Jeder wird separat angezeigt, dazu gibt es eine Gesamtsumme. Wie das eingerichtet wird, ist in der [Dokumentation](/docs/anleitungen/multiple-erzeuger/) beschrieben. ## Hausverbrauch korrekt berechnen Betreibst du ein Balkonkraftwerk ("Steckersolargerät") **zusätzlich** zu einer Dachanlage, ergibt sich eine Besonderheit: Der Strom aus dem Balkonkraftwerk fließt direkt ins Hausnetz. Der Wechselrichter der Dachanlage misst bzw. berechnet dadurch einen zu geringen Hausverbrauch. SOLECTRUS kann das korrigieren und den **tatsächlichen** Hausverbrauch darstellen. Die hierfür notwendigen Konfigurationsschritte finden sich ebenfalls in der [Dokumentation](/docs/referenz/ingest/). --- > **Exklusiv für Sponsoren** > > > Die Darstellung mehrerer Erzeuger ist [Sponsoren](/sponsoring/) vorbehalten. Für 5 € im Monat hilfst du, SOLECTRUS weiterzuentwickeln und erhältst Zugriff auf diese Funktion. > --- # Photovoltaik-Visualisierung im Ladenlokal _2025-06-02_ > Andre Holtfreter zeigt die Erträge seiner Photovoltaik-Anlagen auf großen Displays im Verkaufsraum von EP: Bölsche in Berlin. Ein Erfahrungsbericht. **EP: Bölsche** in Berlin-Friedrichshagen am Müggelsee ist ein inhabergeführtes Elektrofachgeschäft für Haus- und Unterhaltungselektronik mit 7 Angestellten. Das Geschäft existiert bereits seit 1990 und wurde von mir 2021 übernommen. ## Von der kleinen PV-Anlage zum smarten Dashboard: Wie aus Energiebedarf ein echtes Hobby wurde Was als kleine Photovoltaikanlage auf dem eigenen Dach begann, entwickelte sich in wenigen Jahren zu einem echten Herzensprojekt – für mich privat und für uns als Team bei EP: Bölsche. Im Jahr 2021 habe ich meine erste kleine private PV-Anlage mit 15 Modulen auf dem Hausdach installiert. Damals war das Thema Energiekrise bereits präsent – und mit jedem Tag wuchs das Bedürfnis nach mehr Unabhängigkeit und Autarkie. Die wachsende Begeisterung für Photovoltaik übertrug sich schnell auf meinen Arbeitsalltag – und auch auf mein Umfeld. Ein Jahr später rüstete ich unsere Geschäftsräume mit einer eigenen Anlage aus. Parallel dazu suchte ich nach einer Möglichkeit, die aktuellen Erträge nicht nur technisch auszulesen, sondern ansprechend darzustellen – idealerweise in Echtzeit und für Kunden sichtbar. Die Originalsoftware des Herstellers SENEC war hier keine große Hilfe: Die Aktualisierung erfolgte nur im 5-Minuten-Takt, die Oberfläche war eher nüchtern als einladend. ## SOLECTRUS: Echtzeit-Visualisierung, die begeistert Bei meiner Recherche stieß ich auf SOLECTRUS, ein Open-Source-Projekt, das genau dieses Problem löst: Es visualisiert die Daten von (nicht nur) SENEC-Anlagen in Echtzeit, übersichtlich, modern und intuitiv – direkt auf dem Smartphone, Tablet oder einem Display im Verkaufsraum. Schnell war klar: Das ist nicht nur ein nützliches Tool, sondern eine echte Bereicherung. Mein Kollege installierte SOLECTRUS ebenfalls auf seiner privaten Anlage, und wir nahmen Kontakt zum Entwicklerteam auf. Seitdem stehen wir im regelmäßigen Austausch und haben bereits einige praxisnahe Erweiterungen gemeinsam angestoßen. ## Photovoltaik – erst Energiequelle, dann Leidenschaft Was ursprünglich als Beitrag zur Energiewende gedacht war, wurde für mich privat zu einem echten Hobby. In den letzten drei Jahren habe ich meine Anlage mehrfach erweitert: - von 15 auf 23 Module auf dem Hausdach - zusätzlich 12 Module auf dem Carport - und zuletzt 8 weitere Module entlang eines neuen Gartenzauns, um auch den Pool mit Pumpe und Heizung solar zu versorgen. ## Photovoltaik bei EP: Bölsche Frikom – jetzt auch für unsere Kunden Diese persönliche Begeisterung spiegelt sich inzwischen auch in unserem Geschäft wider. Seit über einem Jahr bieten wir bei EP: Bölsche auch Photovoltaik-Dienstleistungen an. Unser Portfolio umfasst: - Balkonkraftwerke und Zubehör - Beratung zu Eigenverbrauch und Erweiterungen - Vermittlung qualifizierter Installationsbetriebe (auch Partner der Firma SENEC) - Unterstützung bei der Einrichtung von Visualisierungssoftware wie SOLECTRUS Was aus einem ganz persönlichen Wunsch nach mehr Unabhängigkeit entstand, ist heute ein fester Bestandteil unseres Unternehmens geworden. Und wir sind gespannt, wohin die Reise mit Photovoltaik und smarter Energie noch führt. **EP: Bölsche Frikom GmbH** \ Bölschestr. 115 \ 12587 Berlin \ [www.ep-boelsche.de](https://www.ep-boelsche.de) --- # Selbstdefinierte Verbraucher _2025-03-11_ > Version 0.19 teilt den Hausverbrauch auf einzelne Verbraucher auf. Wärmepumpe oder Wallbox bekommen damit ihre eigene Auswertung. Nach einer intensiven Entwicklungsphase steht nun Version `0.19` von SOLECTRUS bereit. Wichtigste Neuerung ist die Integration **selbstdefinierter Verbraucher**. Während bisher die **Erzeugung** von Strom im Vordergrund stand, bietet die neue Version Analysemöglichkeiten für den **Verbrauch** des Stroms. Diese Funktion gehört zu den am häufigsten gewünschten Erweiterungen und wurde ausführlich von der Community im [Beta-Test](https://github.com/orgs/solectrus/discussions/3749) erprobt. ## Aufteilen des Hausverbrauches Der Hausverbrauch setzt sich aus vielen Einzelverbräuchen zusammen. Mit separaten Stromzählern (z.B. von Shelly) lassen sich diese Einzelwerte erfassen. Bis zu 20 Geräte können via [MQTT](/docs/referenz/mqtt-collector/) oder dem [Shelly-Collector](/docs/referenz/shelly-collector/) in SOLECTRUS eingebunden werden. Vorzugsweise betrachtet man größere Verbraucher wie Geschirrspüler, Waschmaschine, Trockner, Kühlschrank, Sauna usw. Diese werden anschließend übersichtlich auf einer neuen Seite mit Diagrammen und Statistiken dargestellt. Es wird ersichtlich, wie der Verbrauch im Verhältnis zum Gesamtverbrauch des Hauses steht. Mit dem [Power-Splitter](/features/#power-splitter) berechnet SOLECTRUS außerdem für jeden Verbraucher den Anteil des „grünen“ (also selbst erzeugten) Stroms. [Demo ❯](https://demo.solectrus.de/house/custom_power_02/2025-W02) Optional können ausgewählte Verbraucher direkt in der Strombilanz sichtbar gemacht werden. Deren Verbrauch wird dann aus dem Hausverbrauch herausgerechnet. Die Konfiguration von SOLECTRUS muss um neue Sensoren erweitert werden. Eine Anleitung ist in der [Dokumentation](/docs/referenz/dashboard/sensor-konfiguration/) verfügbar. > **Exklusiv für Sponsoren** > > > Dieses Feature steht exklusiv den [Sponsoren](/sponsoring/) zur Verfügung. Mit €5 im Monat unterstützt du aktiv die Weiterentwicklung von SOLECTRUS und erhältst Zugang zu exklusiven Funktionen. > ## Weitere Neuerungen - Die Tageszusammenfassungen (eingeführt in [v0.18](/blog/2024-11-10-version-0-18/)) wurden grundlegend überarbeitet und werden jetzt effizienter verwaltet. Nach Installation des Updates erfolgt einmalig eine Neuberechnung. - Die Diagramme wurden im Detail weiter verbessert. So passt sich die Skalierung besser an die Werte an und es gibt ein Fadenkreuz, das genauer die Position anzeigt, wenn man mit der Maus über das Diagramm fährt. - Die Hauptnavigation wurde neu gestaltet und verwendet nun Icons statt Text. - Der Power-Splitter wurde präzisiert und es erfolgt eine tages-bezogene Anpassung für exaktere Ergebnisse. - Zusätzlich enthält das Update wie immer zahlreiche Fehlerkorrekturen und Optimierungen ‐ ermöglicht durch hilfreiches Feedback aus der Community, für das ich sehr dankbar bin! --- # Mehr Performance durch Tageszusammenfassungen _2024-11-10_ > Ein Klick auf GESAMT dauerte schon mal 20 Sekunden. Version 0.18 rechnet mit Tageszusammenfassungen und antwortet in Sekundenbruchteilen. Dank der Unterstützung durch die Sponsoren war es möglich, in den letzten Wochen eine Verbesserung zu entwickeln, die mir ganz besonders am Herzen lag. Im Gegensatz zu den bisherigen Arbeiten ist das Ergebnis diesmal zwar kaum sichtbar, aber dafür deutlich zu spüren. Es geht um die **Performance** der Benutzeroberfläche. Je nach angesammelter Datenmenge und Leistungsfähigkeit des eingesetzten Servers konnte SOLECTRUS in der Vergangenheit etwas träge reagiert haben, insbesondere wenn es um die Auswertung längerer Zeiträume ging. Hast du in deiner SOLECTRUS-Installation schon mal auf "GESAMT" geklickt? Dann weißt du vielleicht, dass das Ergebnis manchmal auf sich warten ließ. 20 Sekunden und mehr waren keine Seltenheit. Das ist jetzt Geschichte. Mit der heute veröffentlichten Version `0.18` wurde die Reaktionsgeschwindigkeit der Benutzeroberfläche erheblich verbessert, die Darstellung beliebiger Zeiträume erfolgt jetzt in Sekundenbruchteilen. ## Tageszusammenfassungen Die Idee dahinter: SOLECTRUS erstellt nun für jeden Tag eine sogenannte „Tageszusammenfassung“. Diese enthält die Messwerte des jeweiligen Tages in aggregierter Form, wie z.B. die insgesamt erzeugte Energie, den Tagesverbrauch einzelner Geräte, den minimalen und maximalen Ladestand des Akkus und vieles mehr. Diese Zusammenfassungen werden in der Datenbank abgelegt und für alle Zeitraumauswertungen herangezogen, was eine blitzschnelle Darstellung ermöglicht. Ein willkommener Nebeneffekt ist, dass einige manchmal auftretende Ungenauigkeiten in den Zahlen nun der Vergangenheit angehören. > **Zu beachten:** > > > Die Tageszusammenfassungen werden automatisch und kontinuierlich erstellt. Direkt nach Installation des Updates ist aber ein einmaliger Vorgang notwendig, um die Zusammenfassungen für die Vergangenheit zu erstellen. > > Diese Nachberechnung erfolgt, wenn man einen vergangenen Zeitraum wie z.B. ein Jahr, einen Monat oder gar "GESAMT" wählt. Meist dauert das nur wenige Minuten, kann aber bei sehr großen Datenmengen etwas länger dauern. Im Beta-Test war die längste Dauer 30 Minuten auf einem Synology-NAS. > > Dieser Vorgang ist **nur einmal** erforderlich. Für zukünftige Tage werden die Zusammenfassungen sukzessive automatisch erstellt - und das ist kaum spürbar. > Die Einführung der Tageszusammenfassungen war eine erhebliche Umstellung, die viele Bereiche des Programmcodes betraf. Wer sich für die technischen Hintergründe interessiert, kann sich auf GitHub informieren. Dort fand der Beta-Test statt, mit weiteren Erklärungen und begeisterten Rückmeldungen: \ https://github.com/orgs/solectrus/discussions/3587 ## Was kommt als Nächstes? Im [letzten Blog-Eintrag](/blog/2024-09-23-version-0-17/) wurde die Frage gestellt, welches Feature als Nächstes gewünscht wird. Die meisten Stimmen gab es für die [Unterstützung zusätzlicher Verbraucher](https://github.com/solectrus/solectrus/issues/3396). Das wird daher mein Thema in den nächsten Wochen sein. Dir gefällt SOLECTRUS und möchtest die weitere Entwicklung unterstützen? Es ist nie zu spät, [Sponsor zu werden](/sponsoring/) :-) --- # Neuer Dunkelmodus _2024-09-23_ > SOLECTRUS bekommt einen Dunkelmodus, der auf OLED-Displays sogar Strom spart. Dazu neu ist der Ladestand des E-Autos samt Verbindungsstatus. Dank der Unterstützung durch die Sponsoren war es möglich, in den letzten Wochen zwei neue Features zu entwickeln. Diese sind in die heute veröffentlichte Version 0.17 eingeflossen. ## Neu: Der Dunkelmodus Es ist soweit: SOLECTRUS unterstützt nun auch den Dunkelmodus, bietet also auf Wunsch eine abgedunkelte Benutzeroberfläche. Der Dunkelmodus sieht nicht nur gut aus und ist schonend für die Augen, sondern spart auch Energie. Gerade bei OLED-Displays wird weniger Strom verbraucht, wenn dunkle Flächen dargestellt werden. Das ist natürlich besonders interessant für Nutzer, die SOLECTRUS auf ihrem Smartphone verwenden. Der Dunkelmodus wird automatisch aktiviert, wenn das Betriebssystem dies unterstützt. Bei iOS funktioniert es am besten mit der neuen Version 18. Alternativ kann eine manuelle Aktivierung über das Hamburger-Menü erfolgen. ## Neu: Ladestand des E-Autos Besitzer eines E-Autos müssen einen weiteren Akkuladestand stets im Blick behalten. Mit SOLECTRUS ist das jetzt möglich. Wer den Ladestand grundsätzlich zur Verfügung hat (was ein Thema für sich ist), der kann nun dafür sorgen, dass SOLECTRUS den Ladestand des E-Autos darstellt. Optional ergänzt werden kann diese über den Verbindungsstatus des Autos. Wenn das Auto nicht mit der Wallbox verbunden ist, wird es leicht transparent dargestellt. Um diese Darstellung zu erhalten, müssen zwei neue Sensoren konfiguriert werden. Die [Dokumentation](https://github.com/solectrus/solectrus/wiki/Konfiguration) dazu ist bereits aktualisiert. ## Was kommt als Nächstes? Bei der Planung der weiteren Entwicklungsarbeit möchte ich gerne die Nutzer einbeziehen. Es gibt derzeitig 43 offene Issues bei GitHub. Einige davon sind größere Features, andere sind kleinere Verbesserungen. Hier ein paar Beispiele größerer Themen, die möglicherweise für viele interessant sind: - Amortisationsrechner für die PV-Anlage ([#2416](https://github.com/solectrus/solectrus/issues/2416)) - Vergleich der Kosten des E-Autos mit einem fiktiven Verbrenner ([#2407](https://github.com/solectrus/solectrus/issues/2407)) - Darstellen zusätzlicher Verbraucher ([#3396](https://github.com/solectrus/solectrus/issues/3396)) Bei GitHub lassen sich Issues bewerten und dann als sortierte Liste ausgeben. Das ist eine einfache Möglichkeit, um zu sehen, welche Features die Nutzer am meisten interessieren. Ich möchte alle Nutzer aufrufen, sich die Liste anzusehen und die Issues zu bewerten, die am wichtigsten erscheinen. Das hilft mir, die Prioritäten richtig zu setzen. > **Zu beachten:** > > > - Die Bewertung erfolgt im einzelnen Issue. Aus der Liste heraus ist also das zu bewertende Issue aufzurufen. > - Es wird nur die Bewertung des **ersten** Beitrags berücksichtigt, also nicht die der Kommentare darunter. > - Relevant ist die Bewertung mit "Daumen hoch" (👍). Andere Reaktionen werden in der Auswertung nicht berücksichtigt (auch nicht "Daumen runter"). Eine Bewertung kann aber zurückgezogen werden, was auch berücksichtigt wird. > - Ergänzende Kommentare sind natürlich willkommen. > - Neue Issues können gerne erstellt werden. Bitte vorher die Suchfunktion verwenden, um Duplikate zu vermeiden. > - Um eine Bewertung abzugeben, musst du bei GitHub angemeldet sein. Das ist kostenlos und dauert nur wenige Minuten. > - Man muss kein Sponsor sein, um abzustimmen. Jeder Nutzer ist eingeladen, sich zu beteiligen. > Genug der Vorrede, hier der Link zur Abstimmung:
→ [Zur Abstimmung bei GitHub](https://github.com/solectrus/solectrus/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc)
--- # Power-Splitter berechnet grünen Stromanteil _2024-08-31_ > Der Power-Splitter ermittelt, wie viel Strom für Wärmepumpe und E-Auto vom eigenen Dach kam. Damit stehen auch deren tatsächliche Kosten fest. ## Der Power-Splitter Wolltest du schon immer mal wissen, wie "grün" der Strom ist, den deine Wärmepumpe oder dein E-Auto verbraucht? Für die gesamte PV-Anlage ist das kein Problem – diese Information ergibt sich aus der Autarkie. Aber die Betrachtung einzelner Verbraucher ist nicht so einfach. Mit dem neuen [Power-Splitter](/features/#power-splitter) von SOLECTRUS wird das jetzt möglich. Er berechnet zuverlässig für jeden Moment, wie sich der aus dem Netz bezogene Strom ("rot") auf die einzelnen Verbraucher aufteilt. Die Differenz ergibt dann den PV-Strom ("grün"), und so lassen sich die tatsächlichen Kosten des Verbrauchers ermitteln. Ein **Beispiel**: Du weißt, dass deine Wärmepumpe in einem Jahr insgesamt 3.000 kWh verbraucht hat. Das ist einfach und wird vielleicht schon von der App deiner Wärmepumpe angezeigt. Mit dem Power-Splitter erfährst du nun aber auch, dass z.B. 30 % davon eingekauft werden mussten, während 70 % selbst erzeugt wurden. Das hat natürlich Auswirkungen auf deine Stromkosten. SOLECTRUS berechnet dies genau und berücksichtigt dabei optional auch die entgangene Einspeisevergütung. Du erfährst also mit dem Power-Splitter endlich, was deine Wärmepumpe (oder dein E-Auto) wirklich an Stromkosten verursacht. Ein Beta-Tester meint dazu: "Tolle Sache! Bevor ich es in der Live-Demo gesehen habe, wusste ich gar nicht, dass ich so etwas brauchen könnte, aber das Ganze wertet die Auswertungen doch enorm auf!" > **Hinweis** > > > Wie du nach dem Update auf Version `0.16` den Power-Splitter in Betrieb nimmst, erfährst du in der [Dokumentation](https://github.com/solectrus/power-splitter/wiki/Installation). Es muss nur ein zusätzlicher Docker-Container eingerichtet werden. > > Falls du SOLECTRUS mit dem [Konfigurator](/docs/referenz/helios/) neu installierst, wird der Power-Splitter automatisch mit installiert. > ## Nachhaltige Software-Entwicklung Kommen wir nun zu etwas völlig anderem. 😉 SOLECTRUS erfreut sich immer größerer Beliebtheit. Es fasziniert mich zu sehen, wie sich immer mehr User registrieren und die App regelmäßig nutzen. Ursprünglich war SOLECTRUS ja nur für meinen eigenen Bedarf gedacht. Bisher habe ich SOLECTRUS in meiner Freizeit entwickelt – wobei Freizeit ein dehnbarer Begriff ist, wenn man selbstständig ist. Mittlerweile gibt es jedoch so viel zu tun, dass die Entwicklung nicht mehr nebenbei erledigt werden kann. Es gibt viele Ideen und Anfragen, die ich gerne umsetzen würde. Und mit der steigenden Nutzerzahl steigt auch der Support-Aufwand. Damit SOLECTRUS weiterhin wachsen und gedeihen kann, ist es nun an der Zeit, das Projekt auf eine professionelle Basis zu stellen. Denn unentgeltliche Arbeit hat ihre Grenzen. Um auch in Zukunft neue Features und Verbesserungen umsetzen zu können, ist finanzielle Unterstützung unerlässlich. Die bisherigen freiwilligen Zuwendungen über Ko-Fi waren ein guter Anfang, und ich danke sehr dafür. Um das Projekt nachhaltig zu sichern, sind jedoch regelmäßige Einnahmen erforderlich. Deshalb gibt es ab sofort das [Sponsoring-Abo](/sponsoring/). Mit monatlich 5 € hilfst du, die Weiterentwicklung von SOLECTRUS zu sichern und erhältst Zugriff auf exklusive Features. Der oben erwähnte Power-Splitter ist das erste Feature, das exklusiv für Sponsoren verfügbar ist. Weitere sind bereits in Planung. Ich verstehe natürlich, dass in Zeiten von Netflix, Spotify, iCloud und Co. ein weiteres Abo nicht unbedingt das ist, was man sich wünscht. Ich hoffe daher auf euer Verständnis – gute Software zu entwickeln, kostet Zeit und Geld. Habe ich dich überzeugt? Das Abo kannst du abschließen, indem du in deiner SOLECTRUS-Installation rechts oben auf das Menü-Icon klickst und dann auf _Registrierung_. Der Hinweis auf das Abo ist dann nicht zu übersehen. Zahlen kannst du bequem mit PayPal, Kreditkarte, Apple Pay oder Google Pay. Übrigens: Wer sich an der Entwicklung von SOLECTRUS mit signifikanten Code-Beiträgen beteiligt, erhält die Sponsoring-Vorteile dauerhaft kostenlos. Gleiches gilt für diejenigen, die individuelle Features in Auftrag gegeben haben. Du brauchst noch etwas Bedenkzeit? Kein Problem, du kannst SOLECTRUS weiterhin kostenlos nutzen. SOLECTRUS wird dich nur ab und zu an die Möglichkeit des Sponsoring-Abos erinnern. > **Hinweis** > > > Wer über Ko-Fi oder GitHub bereits ein Sponsoring abgeschlossen hat, dem empfehle ich, auf das neue Sponsoring-Abo umzusteigen - also das bisherige Beenden und das neue Abschließen. Das muss leider manuell erfolgen, ein automatischer Wechsel ist technisch nicht möglich. > --- # Update für SENEC Firmware 0828/8828 _2024-08-06_ > SENEC verteilt die Firmware 0828/8828. Ohne SENEC-Collector 0.15.0 zeigt SOLECTRUS danach keine Messwerte mehr an. Also updaten. Im Rahmen des laufenden Austauschprogramms auf LFP-Batteriemodule verteilt SENEC derzeitig die Firmware `Revision MCU 0828` bzw. `Revision MCU 8828`. Dieses Firmware-Update bringt eine kleine Änderung mit sich, die eine Anpassung des SENEC-Collectors von SOLECTRUS erfordert. Wer die neue Firmware auf seinem Speicher hat, muss dafür sorgen, dass der SENEC-Collector in der heute von mir veröffentlichten Version `0.15.0` läuft, andernfalls funktioniert beim nächsten Start des Collectors die Abfrage der Status-Bezeichnungen nicht mehr und SOLECTRUS zeigt keine Messwerte mehr an. Es besteht also Handlungsbedarf. Der aktualisierte SENEC-Collector funktioniert übrigens auch mit älteren Firmware-Versionen von SENEC. Es ist also kein Problem, das Update schon jetzt zu installieren, auch wenn man gar nicht vom Tausch der Batteriemodule betroffen ist. > **Hinweis** > > > Die Versionsnummer des SENEC-Collectors ist nur zufällig identisch mit der aktuellen Version von SOLECTRUS. Das ist reiner Zufall und hat keine Bedeutung. Beide Docker-Images werden unabhängig voneinander aktualisiert. > ## Update des SENEC-Collectors installieren Wer Watchtower nutzt, muss nichts weiter tun, das Update wird automatisch installiert. Eine manuelle Installation des Updates gelingt hingegen wie folgt: 1. Das aktualisierte Docker-Image muss geholt werden, das geht mit:\ `docker compose pull` 2. Anschließend müssen die Container neu gestartet werden, wie üblich geht das mit:\ `docker compose up -d` (Bei älteren Versionen von Docker, z.B. auf einem Synology-NAS, bitte `docker-compose` statt `docker compose` verwenden) --- # Wärmepumpe und externe Wallbox _2024-07-15_ > Version 0.15 weist den Stromverbrauch der Wärmepumpe getrennt aus und bindet externe Wallboxen ein. Der neue Konfigurator vereinfacht die Installation. Ich freue mich sehr, die neueste Version meines OpenSource-Photovoltaik-Dashboards SOLECTRUS vorzustellen. Version **0.15** bringt endlich die Unterstützung für Wärmepumpen und erweitert die Möglichkeiten, eine externe Wallbox zu integrieren. Dazu gibt es viele Detailverbesserungen und intern wurde einiges umgekrempelt. Version 0.15 ist das größte Update seit langem. Und den neuen Konfigurator gibt's obendrauf. Aber der Reihe nach: ## Unterstützung für Wärmepumpe SOLECTRUS kann nun eine **Wärmepumpe** in der Strombilanz ausweisen und natürlich den Stromverbrauch im Zeitverlauf als Diagramm darstellen. Da üblicherweise der Stromverbrauch der Wärmepumpe im Hausverbrauch enthalten ist, kann dieser herausgerechnet werden, um eine Doppelzählung zu vermeiden. Das Ergebnis sieht dann so aus: Voraussetzung ist natürlich, den Stromverbrauch der Wärmepumpe abfragen zu können. Das könnte z.B. per MQTT über ioBroker, HomeAssistant oder andere Systeme möglich sein. Der zu SOLECTRUS gehörende MQTT-Collector wurde übrigens vollständig neu implementiert und funktionell erweitert. [Die neue Konfiguration des MQTT-Collectors ist im Wiki beschrieben.](https://github.com/solectrus/mqtt-collector/wiki/Konfiguration) Alternativ steht der [Shelly-Collector](https://github.com/solectrus/shelly-collector) zur Verfügung, der den Stromverbrauch beispielsweise über einen Shelly Pro 3EM auslesen kann. Um eine bestehende Installation von SOLECTRUS um die Wärmepumpe zu erweitern, sind ein paar Anpassungen in der Konfiguration nötig. [Wie das genau funktioniert, habe ich auf GitHub beschrieben.](https://github.com/orgs/solectrus/discussions/2861) ## Unterstützung für externe Wallbox Bislang konnte SOLECTRUS nur eine **interne** Wallbox darstellen, die also auf den Hausverbrauch "oben drauf" kommt, beispielsweise die Wallbox von SENEC. Jetzt ist es möglich, die Verbrauchswerte einer **externen** Wallbox per MQTT abzuholen und - das ist die wesentliche Neuerung - aus dem Hausverbrauch **herauszurechnen**. Voraussetzung ist, den Stromverbrauch der Wallbox per MQTT abfragen zu können. Auch hier können wieder ioBroker, HomeAssistant oder andere Systeme helfen. Zu beachten ist auch hier [die neue Konfiguration des MQTT-Collectors, die im Wiki beschrieben wird](https://github.com/solectrus/mqtt-collector/wiki/Konfiguration). ## Neue Sensoren-Konfiguration Intern waren dazu größere Anpassungen bei der Konfiguration nötig. SOLECTRUS definiert nun sog. **Sensoren**, um Messwerte aus der InfluxDB zu lesen. Sensoren sind eine Zwischenschicht, um die Messwerte (in InfluxDB gespeichert) von der Darstellung in SOLECTRUS zu entkoppeln. Das macht die Software flexibler und wird zukünftige Erweiterungen erleichtern. [Mehr dazu im Wiki auf GitHub.](https://github.com/solectrus/solectrus/wiki/Konfiguration) Wer keine Wärmepumpe oder Wallbox hat, kann die Sensoren auch einfach ignorieren, Version `0.15` ist vollständig abwärtskompatibel zu früheren Versionen. Falls es im Einzelfall doch irgendwo haken sollte, helfe ich gerne weiter. ## CO₂-Reduzierung für jeden Zeitraum Neben der finanziellen Ersparnis ist auch die CO₂-Reduzierung ein wichtiger Aspekt der Photovoltaik-Anlage. In einem ersten Schritt wird diese auf eine simple Weise errechnet, nämlich durch Multiplikation des erzeugten Stroms mit einem konstanten CO₂-Faktor. Das ist aber nicht das Ende der Fahnenstange, eine genauere Berechnung ist in Arbeit (mehr dazu siehe unten). Die Darstellung erfolgt in einem zusätzlichen Infokreis sowie als Diagramm für den gewählten Zeitraum. ## Verbesserungen an der Benutzeroberfläche **Swipe:** Auf Touch-Devices (Smartphone, Tablet) kann jetzt mit Wisch-Gesten zum nächsten/vorhergehenden Tag (oder Woche, Monat, Jahr) navigiert werden. **Smartphone-Optimierung:** Die Darstellung auf Smartphones passt sich nun besser auf sehr kleine Displays an. Und für die visuellen Effekte gibt's jetzt kleine Animationen beim Klick auf Buttons. ## Interne Verbesserungen Unter der Haube hat sich auch einiges getan. Viele interne Verbesserungen und Code-Refactorings machen die Software stabiler, effizienter und besser wartbar. Ich habe außerdem die Abhängigkeiten aktualisiert: SOLECTRUS verwendet jetzt die neueste Version von Ruby, Ruby on Rails und anderen Bibliotheken. Das bringt mehr Sicherheit und Stabilität. ## Behobene Bugs Das Update räumt auch einige Fehler aus dem Weg: - Bei der Fortschreibung der Diagrammen auf der Aktuell-Seite gab es gleich zwei Probleme: Neue Messwerte erschienen zeitversetzt (d.h. immer ein paar Sekunden zu spät) und bei Null-Werten blieb das Diagramm einfach stehen. Beides gehört jetzt der Vergangenheit an. - In machen Fällen gab es kleine Inkonsistenzen bei der Berechnung von Summen, beispielsweise stimmten die Angaben der Top10 oder die Balken von Diagrammen nicht exakt mit den Einzelansichten überein. Das wurde korrigiert. - Die Tooltips in der Strombilanz zeigen jetzt immer die vollen Nachkommastellen an. Gut für jeden, der es genau wissen will. ## Kompatibilität Für die neue Version gab es einen ausführlichen Beta-Test, an dem viele von euch teilgenommen haben. Vielen Dank für das Feedback und die Unterstützung! Ganz wichtig: Die Version 0.15 ist **abwärtskompatibel** zu den früheren Versionen, kommt also trotz der vielen Änderungen auch mit einer alten Konfiguration klar. Dennoch empfehle ich, einen Blick ins Docker-Log zu werfen, um sicherzustellen, dass alles korrekt läuft. Wenn es im Einzelfall doch zu Problemen kommen sollte, legt bitte ein [Issue auf GitHub](https://github.com/solectrus/solectrus/issues) an, damit wir schnell eine Lösung finden können. > **Hinweis** > > > Wer noch eine Betaversion im Einsatz hat, sollte auf die stabile Version wechseln. Das heißt, wer in seinem `docker-compose.yml` noch die Docker-Tags `pr-137`, `pr-2836` oder `separate_consumer` stehen hat, sollte unbedingt auf `latest` wechseln, um die zukünftige Versorgung mit Updates sicherzustellen. > > Wer eine Entwicklerversion verwendet (Docker-Tag `develop`), sollte ebenfalls einen Wechsel auf die stabile Version in Erwägung ziehen - oder zumindest automatische Updates (mit Watchtower) aktivieren. > ## Neuer Konfigurator Für eine Erstinstallation von SOLECTRUS verwendet man am einfachsten den neuen [Konfigurator](https://configurator.solectrus.de/), der vieles einfacher macht. Anstatt manuell die Dateien `docker-compose.yml` und `.env` zu bearbeiten, werden diese jetzt automatisch generiert, nachdem man einen web-basierten Fragebogen durchlaufen hat. Das ist übrigens auch für bestehende Solectronauten interessant, die damit prüfen können, ob alles optimal konfiguriert ist. ## Ausblick Und was steht als Nächstes an? Ich arbeite bereits an neuen Features. Geplant sind unter anderem: - **Deckung je Verbraucher**: Wisst ihr, wie viel das E-Auto oder die Wärmepumpe tatsächlich an Stromkosten verursacht hat? Nun, der Stromverbrauch des Verbrauchers ist dank SOLECTRUS bekannt - aber nicht, wie viel davon **selbst erzeugt** wurde. Das möchte ich ändern. Für jeden Verbraucher (Haus, Wärmepumpe, Wallbox) wird zukünftig berechnet, wie viel Strom selbst erzeugt wurde und wie viel aus dem Netz bezogen wurde - inklusive der **tatsächlichen Stromkosten** des jeweiligen Verbrauchers. Im Ergebnis könnte das etwa so aussehen: Ich halte das für eine spannende Fragestellung, die man mit bisherigen Tools nicht beantworten kann. [Mehr zur Idee und zur Implementierung findet sich auf GitHub.](https://github.com/solectrus/solectrus/issues/2436) - **CO₂-Reduktion:** Welchen Beitrag leistet die eigene Photovoltaik-Anlage zur Erreichung der Klimaziele im Land? Ich möchte eine genauere Berechnung in SOLECTRUS integrieren. Da die tatsächliche CO₂-Emission eines Landes üblicherweise im Tagesverlauf stark schwankt, ist die derzeitige Berechnung mit einem konstanten Emissionsfaktor sehr ungenau. Nachts ist nämlich die CO₂-Emission meist höher, weil Photovoltaik wegfällt und mehr Kohle- oder Gasverstromung zum Einsatz kommt. Über eine externe API soll die tatsächliche CO₂-Emission am Standort des Nutzers abgefragt und in die Berechnung einbezogen werden. [Auch hierzu lassen sich die technischen Details auf GitHub nachlesen.](https://github.com/solectrus/solectrus/issues/3198) - **Kombiniertes Diagramm:** Die bisherigen Diagramme stellen nur jeweils einen einzelnen Messwert dar. Oft kommt die Frage, ob nicht eine kombinierte Darstellung möglich ist. Und ja, daran wird tatsächlich gearbeitet, und das sogar mit tatkräftiger externer Unterstützung. [Es ist noch einiges zu tun](https://github.com/solectrus/solectrus/issues/2056), aber die ersten Schritte sind gemacht. Danke für eure Unterstützung und viel Spaß mit Version 0.15 von SOLECTRUS! --- # Neues aus der Kollektoren-Werkstatt _2024-06-05_ > Solcast als zweiter Prognose-Anbieter, ein Power-Splitter für den grünen Stromanteil und ein CSV-Importer für alte Messwerte. SOLECTRUS ist bekanntlich [modular aufgebaut](/docs/grundlagen/) - rund um das eigentliche Dashboard gibt es eine Vielzahl von sog. "Kollektoren", die Messwerte von verschiedenen Quellen einsammeln und in die Datenbank einpflegen. Hier ein kurzer Überblick über die aktuellen Entwicklungen und Neuerungen aus diesem Bereich, die sich auch in Form von Updates bemerkbar machen: ## Forecast-Collector v0.5.0 Neben [Forecast.solar](https://forecast.solar/) wird nun auch der Anbieter [Solcast](https://solcast.com/) unterstützt, der eine genauere Vorhersage der PV-Erzeugung bietet. War es bislang so, dass eine Vorhersage oft um 50% bis über 100% daneben lag, ist das bei Solcast um einiges zuverlässiger. Für die Nutzung ist eine Registrierung bei Solcast notwendig (kostenfrei bei bis zu zwei Dachflächen). Anschließend konfiguriert man dort seine PV-Anlage und erhält einen API-Key, den man dann im Forecast-Collector [einträgt](https://github.com/solectrus/forecast-collector/blob/develop/.env.solcast.example). Aber das Beste ist: Die Programmierung der Solcast-Unterstützung wurde von einem Nutzer [beigesteuert](https://github.com/solectrus/forecast-collector/pull/322). Herzlichen Dank an [Gereon](https://github.com/gereons)! Technische Details zum Update findet sich [auf GitHub](https://github.com/solectrus/forecast-collector/releases/tag/v0.5.0). ## CSV-Importer v0.4.0 Für den Import historischer Messwerte gibt es eine neue Version des CSV-Importers. Die wichtigste Neuerung ist die Unterstützung von SolarEdge. Wer also einen solchen Wechselrichter hat, kann die Messwerte aus früheren Zeiten in die SOLECTRUS-Datenbank übernehmen. Auch dieses Feature wurde im Wesentlichen von einem Nutzer [implementiert](https://github.com/solectrus/csv-importer/issues/217). Vielen Dank an [Sascha](https://github.com/AlpenFlizzer)! Technische Details zum Update findet sich [auf GitHub](https://github.com/solectrus/csv-importer/releases/tag/v0.4.0). ## SENEC-Collector v0.14.2 Mit dem SENEC-Collector fing [damals](https://ledermann.dev/blog/2021/02/03/photovoltaik-dashboard-als-web-applikation/) alles an. Inzwischen ist dieser Kollektor weitgehend stabil und ausgereift. Die [kürzlich eingeführte Cloud-Unterstützung](/blog/2024-01-31-unterstuetzung-des-senec-home-4/) hat noch eine kleine Optimierung erhalten und es wurde an der Stabilität gefeilt. Auch lassen sich nun einzelne Werte ignorieren, was insbesondere nützlich ist, wenn man eine Wallbox eines anderen Herstellers hat, dessen Messwerte per MQTT eingelesen werden. Technische Details zu den letzten Updates findet sich [auf GitHub](https://github.com/solectrus/senec-collector/releases). ## Shelly-Collector v0.3.0 Der Shelly-Collector ist noch recht frisch und ermöglicht das Abgreifen von Messwerten von Shelly-Geräten. Neben dem Shelly Pro 3EM wird nun auch der Shelly Plus Plug S unterstützt. Technische Details zum Update findet sich [auf GitHub](https://github.com/solectrus/shelly-collector/releases/tag/v0.3.0). ## Und sonst so? Abschließend noch zwei Hinweise auf laufende Entwicklungsarbeiten: ### MQTT-Collector: Großes Update in Arbeit Für den Anschluss auch exotischer Stromspeicher und Wechselrichter ist der MQTT-Collector zuständig. Dieser wird schon seit längerem grundlegend überarbeitet und wird bald in einer neuen Version erscheinen. Schwerpunkt ist eine neue Konfiguration. Es lassen sich damit beliebige Messwerte vom MQTT-Broker abrufen, es können JSON-Daten extrahiert und Berechnungen durchgeführt werden. Die neue Konfiguration ist abwärtskompatibel, niemand muss also nach einem Update seine Konfiguration neu schreiben. Wer sich für die technischen Details interessiert, kann sich hier einlesen: https://github.com/solectrus/mqtt-collector/pull/137 ### Ganz neu: Der Power-Splitter Mit dem "Power-Splitter" ist ein weiteres Tool [in Arbeit](https://github.com/solectrus/solectrus/issues/2436#issuecomment-2053977326). Damit wird es möglich, genau zu berechnen, woher der für die einzelnen Verbraucher benötigte Strom kommt. Hat man einen großen Verbraucher wie z.B. eine Wärmepumpe oder eine Wallbox, dann möchte man vermutlich wissen, wie viel des verbrauchten Stroms selbst erzeugt und wie viel aus dem Netz bezogen wurde. Der Power-Splitter rechnet dies aus, indem der Netzbezug rechnerisch auf die betriebenen Geräte aufgeteilt wird. Im Ergebnis erfährt man, wie hoch die Stromkosten eines Verbraucher **wirklich** sind. Ein Wärmepumpen-Betreiber weiß zwar sicherlich, wie viel Strom (in kWh) seine Wärmepumpe z.B. in einem Jahr verbraucht hat, aber nicht, wie viel das in Euro sind. Denn es macht ja einen gewaltigen Unterschied, ob der Strom vom Dach kommt oder gekauft werden musste. Der Power-Splitter rechnet genau das aus. Und das Beste ist: Dies funktioniert auch im Nachhinein, also mit den bereits in SOLECTRUS vorhandenen Messwerten. Voraussetzung ist nur, dass diese hinreichend noch aufgelöst sind, also mindestens im 5-Minuten-Takt vorliegen. Dies nur als Ausblick, später mehr dazu. ### Dashboard: Großes Update voraus Das Dashboard selbst, also die Benutzeroberfläche, erfährt derzeit auch einige grundlegende Verbesserungen. Die Konfiguration ändert sich und wird flexibler, so dass eine [externe Wallbox](https://github.com/orgs/solectrus/discussions/2865) und eine [Wärmepumpe](https://github.com/orgs/solectrus/discussions/2861) unterstützt werden. Etliche Solectronauten nehmen derzeitig an einem Beta-Test teil und geben wertvolles Feedback, danke dafür auch an dieser Stelle! Hierzu wird es demnächst einen eigenen Blog-Beitrag geben. --- # Unterstützung des SENEC.Home 4 _2024-01-31_ > Der SENEC.Home 4 hat keine lokale Web-Oberfläche mehr. SOLECTRUS holt seine Messwerte deshalb über mein-senec.de, mit den Login-Daten der SENEC-App. In letzter Zeit häufen sich die Anfragen: "Wann wird SOLECTRUS den SENEC.Home 4 unterstützen?". Ich freue mich, verkünden zu können: Die Zeit ist gekommen! Ab jetzt ist SOLECTRUS auch für Besitzer des SENEC.Home 4 verfügbar. Anders als seine Vorgängermodelle bietet der SENEC.Home 4 keine lokale Web-Oberfläche, über die man Messwerte erhalten könnte. Daher musste nach einer alternativen Methode gesucht werden, um Zugang zu den Messdaten zu erhalten. Die Lösung ist die Nutzung der API der SENEC-App, die dankenswerterweise von einem engagierten Nutzer analysiert und [dokumentiert](https://documenter.getpostman.com/view/932140/2s9YXib2td) wurde. Der Zugriff erfolgt über die persönlichen Login-Daten, die jeder SENEC-Kunde für `mein-senec.de` besitzt. ## Vor- und Nachteile Diese Methode bringt einen interessanten Vorteil mit sich: - Ein lokaler Server zum Abholen der Messwerte ist nicht mehr erforderlich. Da keine direkte Verbindung zum Stromspeicher erfolgt, sondern nur zur SENEC-Cloud, kann der Zugriff auch über einen Internet-Server erfolgen. Dadurch ist es möglich, SOLECTRUS komplett auf einem Cloud-Server zu betreiben. Natürlich bleibt auch der Betrieb auf einem zeitgemäßen Linux-Server, wie beispielsweise einem Raspberry Pi, weiterhin möglich. Es gibt jedoch auch Nachteile: - Im Gegensatz zum direkten Zugriff auf den Stromspeicher, der nahezu Echtzeit-Daten liefert, bietet die App-API von SENEC eine Aktualisierungsrate von nur 60 Sekunden (bei Verwendung des Home 4). Dadurch ist die Datenanzeige in SOLECTRUS für dieses Modell weniger "live" als bei einem direkt angebundenen V3. - Nicht alle Daten sind über die App-API verfügbar. Beispielsweise fehlt der aktuelle Speicherstatus (wie "AKKU VOLL", der auch im Display des V3 angezeigt wird). Aber die wesentlichen Messwerte wie Erzeugung, Verbrauch, Akkustand und Wallbox-Daten sind verfügbar. ## Ausprobieren Um die App-API nutzbar zu machen, wurde nicht SOLECTRUS selbst, sondern nur der [SENEC-Collector](https://github.com/solectrus/senec-collector) angepasst. Die neue Version `0.12.0` des Collectors unterstützt sowohl den direkten Zugriff (jetzt als "local" bezeichnet) als auch den Zugriff über die App-API ("cloud"). Für Interessierte steht eine neue [Anleitung zur Installation auf einem Hetzner-Cloud-Server](https://github.com/solectrus/hosting/tree/main/guide/external-server-cloud) zur Verfügung. Wer ein wenig Erfahrung mit der Linux-Kommandozeile hat, kann SOLECTRUS damit in wenigen Minuten auf einem Cloud-Server installieren und ausprobieren. Die bestehenden Anleitungen für Raspberry Pi und Synology NAS wurden ebenfalls aktualisiert. Ein guter Einstiegt ist die [Gesamtübersicht aller Anleitungen](https://github.com/solectrus/hosting). ## Feedback Ich freue mich über Feedback und Anregungen. Am besten über die [Issues](https://github.com/solectrus/hosting/issues) bzw. das [Forum](https://github.com/orgs/solectrus/discussions) auf GitHub oder per E-Mail. --- # Preisoptimierte Speicherbeladung aus dem Netz _2024-01-28_ > Ein neues Tool lädt den SENEC-Speicher aus dem Netz, sobald der Tibber-Preis niedrig ist. Wie die Automatik entscheidet und was sie dafür abfragt. Dynamische Stromtarife erfreuen sich immer größerer Beliebtheit. Wenn der Strompreis stündlich an den aktuellen Großhandelspreis angepasst wird, ergibt sich für den Endkunden eine interessante Möglichkeiten zur Reduzierung der Stromkosten, indem der Verbrauch in die kostengünstige Zeit verschoben wird. Für den Besitzer einer Photovoltaik-Anlage mit Stromspeicher eröffnet sich eine zusätzliche Option: Wenn die Ausbeute der eigenen PV-Anlage gering ist, zum Beispiel im Winter, lädt man den Speicher zu günstigen Zeiten aus dem Stromnetz. Davon profitiert man dann einige Stunden später, wenn der Strompreis wieder deutlich gestiegen ist. Das könnte sich lohnen, auch wenn natürlich Ladeverluste und die Degradation des Speichers berücksichtigt werden müssen. Darüber hinaus gibt es rechtliche Aspekte zu beachten, die weiter unten skizziert werden. ## Vorstellung der Beladungsautomatik Wenn dein Stromanbieter [Tibber](https://tibber.com) heißt und du einen Stromspeicher von [SENEC](https://senec.com) hast (v2.1 oder V3), dann gibt es hierfür ein neues OpenSource-Tool, das die kosten-optimierte Beladung des Speichers aus dem Netz automatisiert. Es ist als Docker-Container verfügbar, läuft auch auf einem Raspberry Pi und lässt sich einfach in deine bestehende SOLECTRUS-Installation integrieren. Es kann aber auch ganz ohne SOLECTRUS verwendet werden. ### Wie arbeitet die Automatik? Die Automatik des Tools besteht aus vier Komponenten: 1. Die aktuellen Strompreise werden regelmäßig über die Tibber-API abgefragt. Jeder Tibber-Kunde kann sich ein kostenloses API-Token erstellen, über den die individuellen Strompreise der nächsten 12-36 Stunden abgerufen werden können. 2) Die erwartete Stromerzeugung für die eigene PV-Anlage der nächsten 24 Stunden wird ebenso regelmäßig abgefragt. Hierfür wird die PV-Ertragsvorhersage von [forecast.solar](https://forecast.solar) verwendet, die bereits in SOLECTRUS integriert ist. 3) Der aktuelle Status und Füllstand des Speichers wird ebenfalls regelmäßig abgefragt. Hierfür wird die lokale Schnittstelle des SENEC-Speichers verwendet. 4) Eine Logik entscheidet nun jeweils, ob der Speicher voll beladen, eine Beladung freigegeben oder ob gar nichts getan werden soll. Die Logik ist konfigurierbar und kann an die eigenen Bedürfnisse angepasst werden. Verwendet wird die Funktion "Notbeladung", die auch über die lokale Web-Oberfläche des Speichers verfügbar ist (im Menü `Setup` > `Wartung` > `Vollladung`). ### Wie wird über die Beladung entschieden? Die Logik ist das Kernstück des Tools und überraschend komplex. Sie berücksichtigt verschiedene Kriterien: - Eine Beladung aus dem Netz wird nur dann durchgeführt, wenn der Speicher vollkommen leer ist. Ermittelt wird dies über den Status des Speichers, der über die lokale Schnittstelle abgefragt wird. Der Status muss `Akku leer` lauten. Das bedeutet auch: Wenn der Speicherfüllstand 0% ist, aber gerade eine Batteriediagnose durchgeführt wird oder ein sonstiges Problem vorliegt, dann wird nicht geladen. - Eine Beladung erfolgt außerdem nur dann, wenn in den nächsten 24 Stunden wenig PV-Strom erwartet wird. Was genau "wenig" bedeutet, kann konfiguriert werden. Es kann ein Schwellenwert in kWh angegeben werden. Gibt man beispielsweise 5 kWh an, dann wird der Speicher nur dann beladen, wenn in den nächsten 24 Stunden weniger als 5 kWh PV-Strom erwartet werden. - Das letzte, aber wichtigste Kriterium ist natürlich der Strompreis. Eine Beladung aus dem Netz erfolgt nur bei günstigem Preis. Nur, was genau heißt "günstig"? Es hat einige Fehlversuche benötigt, um den passenden Algorithmus zu finden: 1. Es wird zunächst ermittelt, wie hoch der durchschnittliche Strompreis in den nächsten 24 Stunden ist. Da Tibber die Preise für den nächsten Tag aber erst gegen Mittag des Vortages bereitstellt, kann es sein, dass man (im ungünstigsten Fall) nur die nächsten 12 Stunden betrachten kann. Falls also weniger als 24 Stunden zur Verfügung stehen, wird der durchschnittliche Strompreis für die verfügbare Zeit ermittelt. 2. Anschließend wird das günstigste Zeitfenster in den nächsten 24 Stunden ermittelt. Wie lang ein Zeitfenster ist, kann konfiguriert werden. Es sollte so lang sein, wie eine volle Ladung etwa dauern wird, hängt also von Kapazität des Speichers und der Ladeleistung ab. Für einen Speicher mit 10 kWh Kapazität und einer Ladeleistung von 2,5 kW sollte das Zeitfenster also 4 Stunden betragen. Es wird also ermittelt, welcher 4-Stunden-Zeitraum den geringsten Durchschnittspreis hat. 3. Wenn das günstigste Zeitfenster einen deutlich geringeren Preis hat als der bevorstehende 24-Stunden-Durchschnitt, dann wird der Speicher beladen. Was genau "deutlich geringer" heißt, kann über einen Schwellenwert konfiguriert werden. Ein Beispiel wäre `70%`, das bedeutet: Das günstigste Zeitfenster muss 70% der Kosten des 24-Stunden-Durchschnitts **unterschreiten**. - Der SENEC-Speicher hat die Besonderheit, dass eine durchgeführte Netzbeladung auch explizit freigegeben werden muss. Ansonsten würde zwar geladen, danach aber der Verbrauch weiterhin aus dem Netz gedeckt. Die Logik prüft also, ob eine Beladung das Maximum erreicht hat. Maximum bedeutet, dass sich der Füllstand nicht weiter erhöht. Es wird also nicht einfach auf 100% Ladestand gewartet, weil es ja auch gedrosselte Geräte gibt, die maximal 70% Ladestand erreichen. Ist das Maximum erreicht, wird die Beladung freigegeben. Wie die Logik sich jeweils entscheidet, wird im Log ausgegeben. Es empfiehlt sich, gerade in der ersten Zeit nach Installation das Docker-Log genau im Auge zu behalten. Wer unsicher ist, kann das Tool auch in einem "Dry-Run-Modus" laufen lassen, der fast alle Schritte durchführt - nur nicht die tatsächliche Beladung oder Beladungsfreigabe. ### Einschränkungen, Fallstricke und Pferdefüße Der rote Kasten ist etwas größer geworden. Bitte in Ruhe lesen, bevor du das Tool installierst! > **Wichtige Hinweise** > > > - Ob eine Beladung aus dem Netz wirklich lohnenswert ist, muss jeder für sich selbst entscheiden. Es gibt Ladeverluste und ein Akku wird durch häufiges Be- und Entladen sicherlich nicht besser. > > - Zu beachten ist unbedingt, dass durch das Beladen des Speichers mit sogenanntem Graustrom die **EEG-Vergütung (Einspeisevergütung) erlischt**. Details lassen sich bei der [EEG-Clearingstelle](https://www.clearingstelle-eeg-kwkg.de/haeufige-rechtsfrage/181) nachlesen. > > - Ob und wie sich eine manuelle Beladung aus dem Netz durch eine automatische Steuerung auf die SENEC-Garantie auswirkt, kann ich nicht beurteilen. Ich übernehme keinerlei Haftung, weder für defekte Stromspeicher, hohe Stromrechnungen, Verlust der EEG-Vergütung, abgebrannte Häuser oder sonstige Schäden. > > - Jede Beladung und Beladungsfreigabe wird im Log des Speichers protokolliert. SENEC bekommt das also mit. Da sich die Funktion aber auch über die Web-Oberfläche des Speichers auslösen lässt, handelt es sich nicht um eine Geheimwissenschaft. > > - Ob SENEC die Existenz des Tools gutheißen oder zumindest tolerieren wird, kann ich nicht sagen. Ich habe keine Kontakte zu SENEC und habe das Tool ohne deren Wissen entwickelt. Falls jemand von SENEC dies liest - ich freue mich über einen Gedankenaustausch, zumindest wenn dieser nicht über eine Anwaltskanzlei erfolgt. > > - Sollte SENEC irgendwann die lokale Schnittstelle des Speichers dahingehend ändern, dass eine manuelle Vollladung nicht mehr durchgeführt werden kann, kann das Tool nicht mehr verwendet werden. > > - Unterstützt wird nur der SENEC.Home V3 und V2.1, nicht aber der V4. Getestet wurde es außerdem nur mit dem V3, beim V2.1 sind aber keine Unterschiede zu erwarten. > > - Das Abholen von Strompreisen funktioniert derzeitig nur mit Tibber. Andere Anbieter dynamischer Stromtarife werden derzeitig nicht unterstützt. > > - Das Tool ist noch sehr neu und kaum getestet. Fehler sind also nicht unwahrscheinlich. Bei technischen Problemen bitte ein [Issue auf GitHub](https://github.com/solectrus/senec-charger/issues) erstellen. > ### Installation und Dokumentation Die Installation auf einem lokalen Server (wie z.B. einem Raspberry oder NAS) erfordert Linux- und Docker-Kenntnisse. Wer SOLECTRUS installiert bekommen hat, wird das aber auch schaffen. Es geht letztendlich um zwei weitere Docker-Container, die über Umgebungsvariablen konfiguriert werden. Dokumentation gibt es bislang kaum, aber das wird sich vielleicht noch ändern. Auf GitHub steht alles bereit: - https://github.com/solectrus/senec-charger/ - https://github.com/solectrus/tibber-collector > **Sponsoring** > > > Ich freue mich besonders, dass durch Sponsoring ein Teil des Entwicklungsaufwands finanziert wurde. Die Firma [EP: Bölsche Frikom GmbH](https://www.ep-boelsche.de/) aus Berlin hat die Entwicklung beauftragt. Herzlichen Dank dafür! > > Da ich aber nicht nur für Geld arbeite, sondern auch für die Freude an der Sache, ist das Tool OpenSource und kostenlos verfügbar. Weitere finanzielle Unterstützung ist dennoch sehr willkommen. > > Du hast Interesse an einer Zusammenarbeit? Deine Firma benötigt eine individuelle Lösung oder ein besonderes Feature für SOLECTRUS? Dann sollten wir darüber reden ! > --- # Neue Kachel-Darstellung _2023-12-03_ > Ausgewählte Messwerte als große Kacheln auf einer eigenen Seite, auch aus einigen Metern noch ablesbar. Dazu eine neue Seitenleiste. Das letzte Update ist schon eine Weile her, aber nun ist es endlich soweit: Version **0.14** ist verfügbar. Es gibt einige interessante Neuerungen, die ich vorstellen möchte. ## Einzelwerte in Kachel-Darstellung Die größte Neuerung ist die Darstellung ausgewählter Messwerte in Form von Kacheln auf einer separaten Seite. Das ist insbesondere dann nützlich, wenn man eine Darstellung benötigt, die auch aus der Ferne gut sichtbar ist. Dargestellt wird der Photovoltaik-Ertrag für verschiedene Zeiträume sowie die CO₂-Einsparung und die eingesparten Stromkosten im laufenden Jahr. In einer Titelzeile können Angaben zum Betreiber und zur PV-Anlage dargestellt werden. > **Sponsored Feature** > > > Ich freue mich besonders, dass diese Funktion als "Sponsored Feature" realisiert werden konnte. Die Firma [EP: Bölsche Frikom GmbH](https://www.ep-boelsche.de/) aus Berlin hat die Entwicklung dieser Funktion beauftragt und finanziert. Vielen Dank dafür! > > Ziel der Zusammenarbeit war es, ausgewählte Messwerte in prägnanter Form auf einem Digital-Signage-System zu präsentieren und damit Laufkundschaft auf die Photovoltaik-Anlage aufmerksam zu machen. > > In einem separaten Blog-Beitrag werde ich demnächst etwas mehr über diese Art der Entwicklungs-Finanzierung schreiben, vielleicht ist das ja auch für andere interessant. > Aus dem Sponsoring resultiert auch, dass die dargestellten Kacheln derzeitig fix sind, das heißt, sie sind nicht änderbar. Das muss für die Zukunft aber nicht so bleiben. ## Einstellungen verbergen Wenn man seine SOLECTRUS-Installation öffentlich betreibt, möchte man vielleicht nicht unbedingt, dass jedermann die gezahlten Strompreise, die Einspeisevergütung oder andere Einstellungen sehen kann. Diese Dinge waren auch in früheren Versionen immer nur für den Admin zu **ändern**, aber nun sind sie auch nur für den Admin zu **sehen**. Nicht vergessen: Das Admin-Passort hast Du selbst festgelegt, als Du SOLECTRUS installiert hast. Es findet sich in der `.env`-Datei als `ADMIN_PASSWORD`. ## Vollbildmodus Um den verfügbaren Platz besser auszunutzen, lässt sich nun der Vollbildmodus des Browsers aktivieren. Das ist insbesondere dann nützlich, wenn ein Tablet oder andere Gerät verwendet wird, das sonst keine Möglichkeit bietet, das Browser-Interface auszublenden. ## Neue Seitenleiste Zu viele Icons sind unübersichtlich. Deshalb wurde die Navigation überarbeitet und es gibt eine Seitenleiste, die bei Bedarf geöffnet werden kann. ## Stromverbrauch reduziert Kein Witz - SOLECTRUS verbraucht nun tatsächlich weniger Strom. Die Fluss-Animation und der pulsierende Status-Indikator hatten sich als unnötig CPU-belastend und damit als Stromfresser herausgestellt. Die Animationen wurden deshalb entfernt. ## Und sonst noch? - Auf Mobilgeräten erfolgt jetzt eine verbesserte Nutzung des verfügbaren Platzes - Außerdem wurden viele Abhängigkeiten aktualisiert, so läuft SOLECTRUS nun auf Basis von Ruby on Rails in der aktuellen Version 7.1 - Es gab einige kleinere Fehler, die behoben wurden und SOLECTRUS robuster machen --- # Version 0.13.2 verfügbar _2023-10-01_ > Das Update bringt eine verbesserte Statusanzeige und zeigt eine etwaige Einspeisebegrenzung an. Fehlerbehebungen gibt es natürlich auch. Ein neues Update ist da, nachdem es in den letzten Wochen etwas ruhiger war. Es bringt einige Detailverbesserungen und Fehlerbehebungen. Eigentlich sollte es die Version `0.13.1` sein. Ein kurzfristig entdeckter Fehler macht aber ein weiteres Update auf die Version `0.13.2` notwendig. Hier die wichtigsten Änderungen im Einzelnen: ## Differenziertere Status-Anzeige Ein SENEC-Speicher liefert einen Statuscode mit einem Wert zwischen 0 und 98. Einige Werte repräsentieren den Normalzustand ("Laden", "Entladen", "Peak-Shaving: Warten" und einige mehr), die anderen stehen für Probleme jeder Art. Ein Statuscode, der nicht zum Normalbetrieb gehört (z.B. "NPU-Fehler"), wird nun farblich hervorgehoben angezeigt. Diese Situation ist zu unterscheiden von einer verlorenen Verbindung, wenn also überhaupt kein aktuelle Messung vorliegt. Dies wird nun als "Keine Verbindung" angezeigt (anstelle des bisherigen "FAIL"). Wenn kein genauer Statuscode bekannt ist (z.B. bei Verwendung des MQTT-Collectors), wird "Verbunden" angezeigt (anstelle des bisherigen "LIVE"). ## Darstellung von aktiver Einspeisebegrenzung Je nach Größe, Alter und Konfiguration der PV-Anlage kann es sein, dass die Einspeisung auf 70% der PV-Leistung begrenzt wird. Wenn ein solcher Zustand erkannt wird (verursacht durch hohe Erzeugung bei gleichzeitig geringem Eigenverbrauch), wird dies nun in der Grafik angezeigt. Sieht man einen solchen Hinweis ist, ist das eine gute Gelegenheit für Waschmaschine, Geschirrspüler und Co. > **Zu beachten** > > > Die (reguläre) Einspeisebegrenzung hat nichts mit dem Konditionierungsmodus zu tun, der von SENEC derzeitig bei einigen Speichern aus Sicherheitsgründen aktiviert wurde. > ## Aktualisierungs-Intervall einstellbar Die Häufigkeit der Messwert-Aktualisierung kann nun über die Umgebungsvariable `INFLUX_POLL_INTERVAL` eingestellt werden. Der Standardwert ist 5 Sekunden. Wenn man also die (schon immer vorhandene) Variable `SENEC_INTERVAL` auf einen höheren Wert als die standardmäßigen 5 Sekunden gesetzt hat, kann man das Dashboard daran anpassen. `SENEC_INTERVAL` und `INFLUX_POLL_INTERVAL` sollten den gleichen Wert haben. > **Übersicht** > > > - `SENEC_INTERVAL` Wie oft werden Messwerte durch den SENEC-Collector vom Speicher abgerufen und an InfluxDB übertragen? > - `INFLUX_POLL_INTERVAL` Wie oft sollen die Messwerte von InfluxDB abgefragt und im Dashboard angezeigt werden? > Die neue Variable ist auch dann nützlich, wenn bei Verwendung des MQTT-Collector seltener als alle 5 Sekunden Messwerte übertragen werden. Es lässt sich dann vermeiden, dass der Status "Keine Verbindung" angezeigt wird. ## Solarprognose für mehrere Dachflächen Falls du Solarmodule auf mehr als nur einer Dachfläche installiert hast, kann dies bei der Solarprognose berücksichtigt werden. Der Forecast-Collector (ab [Version 0.4.0](https://github.com/solectrus/forecast-collector/releases/tag/v0.4.0)) kann nun entsprechend konfiguriert werden. Eine genaue Anleitung für die Konfiguration findet sich hier: \ https://github.com/orgs/solectrus/discussions/2396 ## Verbesserte Effizienz bei der Messwertabfrage Der SENEC-Collector (ab [Version 0.10.0](https://github.com/solectrus/senec-collector/releases/tag/v0.10.0)) nutzt nun eine [persistente Verbindung](https://en.wikipedia.org/wiki/HTTP_persistent_connection), um Messwerte vom Speicher abzurufen. Dies bedeutet, dass die Verbindung nach dem Erhalt eines Messwerts nicht getrennt, sondern für die nächste Abfrage offen gehalten wird. Der folgende Messwert wird nach 5 Sekunden über dieselbe bestehende Verbindung abgerufen. Diese Methode ist signifikant effizienter im Vergleich zur alten Vorgehensweise, bei der für jeden einzelnen Messwert eine neue Verbindung etabliert wurde. Dies ist besonders vorteilhaft bei Verbindungen über `https`, da der SSL/TLS-Handshake entfällt. Während dies für SOLECTRUS kaum Auswirkungen hat, entlastet es den SENEC-Speicher erheblich. Laut meinen Messungen dauerte der Abruf eines Messwerts unter Einbeziehung des Verbindungsaufbaus etwa 250 ms. Mit einer persistenten Verbindung reduziert sich die Zeit für den einzelnen Abruf auf lediglich 8 ms, was einer Verbesserung um den **Faktor 30** entspricht. ## Fehlerbehebungen Diverse kleinere Problemchen konnten abgestellt werden: - Bei Uhrzeitabweichungen zwischen Server und Browser kommt es nicht mehr zu Darstellungsfehlern in den Diagrammen. - Die Berechnung der Autarkie erfolgt nun auch dann korrekt, wenn es keinen Verbrauch gibt, was beispielsweise bei Verwendung eines Balkonkraftwerks der Fall sein kann. - Bei unterbrochener Verbindung werden jetzt nicht mehr sehr alte Messwerte angezeigt, sondern die Anzeige wechselt nach einer Stunde auf eine leere Darstellung. --- # Erfahrungen mit dem SENEC-Update _2023-09-06_ > Was sich beim Zugriff auf den internen Webserver des Speichers nach dem Firmware-Update ändert. Beobachtungen aus Sicht eines Software-Entwicklers. Wie [kürzlich beschrieben](/blog/2023-08-18-unterstuetzung-fuer-neue-senec-firmware/), hat SENEC die Firmware des Speichers aktualisiert und damit einige Dinge geändert. Entsprechend groß ist der Wirbel in den User-Foren und auf Facebook. Dieses Update ist heute auch bei mir angekommen und ich möchte meine Beobachtungen dazu mitteilen - aus Sicht eines Software-Entwicklers. > **Hinweis** > > > Ob und wie sich das Update stromtechnisch auswirkt, lasse ich in diesem Beitrag völlig außen vor. Gleiches gilt für den derzeitig laufenden Konditionierungsbetrieb, von dem ich auch nicht betroffen bin und daher nicht beurteilen kann. Ich betrachte hier nur den Zugriff auf den integrierten Webserver. > > Ich betreibe auch **kein** SENEC-Bashing. Als Entwickler weiß ich zu gut, dass Fehler nie ganz zu vermeiden sind. Dass mein SENEC.Home V3 seit mittlerweile 3 Jahren wartungsfrei durchläuft und dabei automatisiert mit Updates versorgt wird, finde ich beachtlich. > Die Firmware des SENEC-Speichers besteht aus verschiedenen Komponenten (MCU, NPU, GUI etc.), die nacheinander aktualisiert werden. Der Speicher startet dabei mehrmals neu, das Ganze zieht sich über Stunden hin. Es finden diverse Tests zwischendurch statt (Selbsttest, Batteriediagnose). Während ich diese Zeilen schreibe, ist der Versionsstand meines Speichers wie folgt: - REVISION MCU: **0825** - REVISION MCU-BL: **2307** - REVISION NPU-REGS: **10** - REVISION NPU-IMAGE: **2106** - REVISION GUI: **0966** **Ergänzung 07.09.2023:** Heute kam eine weiteres Update hinzu: - REVISION NPU-IMAGE: **2309** **Ergänzung 18.09.2023:** Die NPU wurde erneut aktualisiert: - REVISION NPU-IMAGE: **2310** **Ergänzung 04.10.2023:** Heute wurde MCU erneut aktualisiert: - REVISION MCU: **0826** Nun zur Aufstellung dessen, was sich aus meiner Sicht geändert hat: ## API-Änderungen Die JSON-API, die vom Speicher bereitgestellt wird (das allseits bekannte `/lala.cgi`, das von allen Tools zum Abgreifen von Messwerten benutzt wird, auch von SOLECTRUS), liefert die Daten mit etwas anderer Strukturierung zurück. Einige Werte sind auch ganz verschwunden. Das macht eine Anpassung aller Tools erforderlich, die darauf zugreifen. Hier zwei Dinge, die ich für SOLECTRUS anpassen musste: 1. Einen genauen Zeitstempel der Messung gibt es offenbar nicht mehr, zuvor stand dieser in `STATISTIC.MEASURE_TIME`. SOLECTRUS bedient sich nun bei `RTC.WEB_TIME`. Das erscheint mir als eine Verschlechterung der Messgenauigkeit, weil dies offenbar die Uhrzeit des Speichers ist, nicht der Zeitpunkt der Messung. Die zu erwartende Abweichung dürfte sich aber nur minimal auswirken. 2. Der Status des Speichers steht nicht mehr in `STATISTIC.CURRENT_STATE`, sondern in `ENERGY.STAT_STATE`. ## URL-Änderungen Die URL einiger Webseiten hat sich minimal geändert, es ist jetzt eine veränderte Groß-/Kleinschreibung zu beachten. Das betrifft die folgenden Seiten: - Log-Viewer: `/log.html` => `/Log.html` - Tages-Logs als reiner Text: `/log/yyyy/mm/dd.log` => `/Log/yyyy/mm/dd.log` - Display-Anzeige: `/display.html` => `/Display.html` - Variablen: `/vars.html` => `/Vars.html` - Diagramme: `/chart.html` => `/Chart.html` Die alten URLs führen zu einer Fehlermeldung "Unauthorized" (http-Status `401`). Dies lässt einige User vermuten, dass SENEC nützliche Informationen vor allzu neugierigen Blicken absichtlich verbergen möchte. Für mich sieht das aber eher nach unbeabsichtigten Fehlern aus, die SENEC vermutlich bald korrigieren wird. Klar ist aber auch: Dass es kein automatisches URL-Redirect gibt, ist unschön. **Ergänzung 04.10.2023:** Die URLs haben sich erneut geändert, es ist sind jetzt **zwei** Slashes nach der IP-Adresse notwendig: - Log-Viewer: `//Log.html` - Tages-Logs als reiner Text: `//Log/yyyy/mm/dd.log` - Display-Anzeige: `//Display.html` - Variablen: `//Vars.html` - Diagramme: `//Chart.html` ## Umstellung auf https Der Zugriff auf den Speicher ist nur noch per `https` möglich, nicht mehr per `http`. Leider wurde das unschön implementiert, denn es gibt keinen automatischen Redirect von http zu https. Alle Tools, die direkt auf den Speicher zugreifen, müssen also zwingend angepasst werden. Das betrifft natürlich SOLECTRUS, aber auch ioBroker, Home Assistant, evcc, etc. Soweit ich das mitbekomme, stehen solche Updates aber auch bereit. Alle haben eines gemeinsam: Als User muss man die Zugriffsmethode (engl. "Schema", hier `http` oder `https`) manuell und explizit einstellen. Die Umstellung von `http` auf `https` scheint übrigens zuletzt dran zu kommen, bei mir ist sie jedenfalls noch gar nicht erfolgt, mein Speicher werkelt noch auf `http`. Ein SOLECTRUS-User hatte die [Vermutung geäußert](https://github.com/solectrus/senec-collector/issues/224#issuecomment-1698827094), dass erst das NPU-Update die Umstellung auf `https` bewirkt. Das könnte stimmen, denn bei mir ist die Revision des NPU-Images bislang unverändert bei `2106`. **Ergänzung 07.09.2023:** Seit heute ist auch bei mir die Umstellung auf `https` erfolgt, nachdem das NPU-Image auf `2309` aktualisiert wurde. Insofern stimmt die obige Vermutung. Eine weitere, etwas unschöne Sache bezüglich `https` sei erwähnt: Der Datenverkehr wird zwar nun verschlüsselt, was grundsätzlich eine gute Sache ist. **ABER:** Das für `https` prinzipiell erforderliche Zertifikat ist selbst-signiert, sodass der Browser die Gültigkeit nicht bestätigen kann: Je nach Browser wird dadurch eine mehr oder weniger alarmistische Warnung ausgegeben. Diese Warnung gilt es zu ignorieren. Ich denke, hier hat SENEC einen Kompromiss gewählt: Einerseits wird der Datenverkehr nun verschlüsselt, was eine Verbesserung darstellt. Denn über den Webserver werden auch Passwörter verschickt, nämlich wenn der Installateur den Speicher in den Admin-Modus versetzt. Andererseits wurde die Warnmeldung bezüglich der Signierung in Kauf genommen. Mir ist übrigens kein Weg bekannt, mit der SENEC diese Warnmeldung hätte verhindern können, ohne dem User noch mehr zuzumuten. Eine Aufforderung zur Installation eines Root-Zertifikats hätte zu weiteren Irritationen geführt. Ein solcher Hinweis tauchte übrigens vor einigen Tagen in der SENEC-App auf, wurde aber offenbar wieder entfernt. **Ergänzung 10.09.2023:** Inzwischen hat SENEC auf `mein-senec.de` im Bereich "Allgemeine Dokumente" tatsächlich ein Zertifikat mit der Bezeichnung `SenecGui-Root` bereitgestellt. Dieses Root-Zertifikat kann man sich installieren und als vertrauenswürdig einstufen, aber das ist kein trivialer Vorgang. Ich habe das mal gemacht und kann bestätigen, dass die Warnmeldung im Browser dann verschwindet. Aber das ist sicherlich keine Lösung für den normalen User. In Firefox läuft die Installation des Zertifikats beispielsweise wie folgt ab: - Zip-Datei von `mein-senec.de` (Allgemeine Dokumente) herunterladen und entpacken. Enthalten ist eine `.pem`-Datei - In Firefox über Einstellungen die Zertifikatsverwaltung aufrufen, dort zum Tab "Zertifizierungsstellen" wechseln - Button "Importieren" klicken, dann `.pem`-Datei auswählen, öffnen und per Checkbox festlegen, dass dieser CA zur Identifizierung von Websites vertraut werden soll - Danach ist die Warnmeldung in Firefox beim Aufruf von `https://[speicher-ip]` verschwunden ## Fehler in der neuen Firmware Soweit ich das sehe, stecken zumindest zwei Fehler in der neuen Firmware, die in den verschiedenen User-Foren für größere Aufregung sorgen: ### 1. Display-Anzeige ohne Werte Unter `/Display.html` erscheine eine leere Anzeige, es sieht folgendermaßen aus: Es ist also nur das Layout zu sehen, die eigentlich anzuzeigenden Werte fehlen. Schaut man in die DevTools des Browsers, stellt sich schnell heraus, dass die Seite bestimmte Variablen per `/lala.cgi` abfragt, die es in der API gar nicht mehr gibt: ```json { "DISPLAY": { "IMAGE": "VARIABLE_NOT_FOUND", "LEDS": "VARIABLE_NOT_FOUND" } } ``` Das ist ein Fehler und vermutlich keine Absicht. Hier wird SENEC sicherlich nachbessern - entweder, indem die API diese Variablen in einer zukünftigen Version wieder zurückliefert **oder** indem die Seite `/Display.html` ganz entfernt wird. **(Ergänzung 02.10.2023)** Laut einer Ankündigung von SENEC hat man sich dort für die zweite Möglichkeit entschieden - die Display-Anzeige wird in Kürze **wegfallen**. Weitere Informationen dazu finden sich im Abschnitt "Häufige NPU-Fehler" weiter unten. **(Ergänzung 04.10.2023)** Die Display-Anzeige ist auch durch das Update auf MCU-Version 826 **nicht** entfernt worden, es hat sich aber die URL auf `//Display.html` geändert. Der Fehler mit der leeren Anzeige ist geblieben. ### 2. Lov-Viewer bleibt leer Unter `/Log.html` erscheint ebenfalls eine leere Anzeige, es sieht folgendermaßen aus: Auch das dürfte keineswegs Absicht sein, ein Blick in die Browser-Devtools verrät die Details: ``` Request URL: /log/2023/09/06.log Request Method: GET Status Code: 401 Unauthorized ``` Der aufmerksame Leser erkennt den Fehler sofort: Die URL stimmt einfach nicht, der Log-Viewer greift auf die alte URL mit `/log` zu, nicht auf die neue, die ja auf `/Log` lautet. SENEC hat einfach vergessen, den Programmcode des Log-Viewers anzupassen. Ein ganz banaler Fehler. Auch hier wird es sicherlich ein weiteres Update geben. **(Ergänzung 04.10.2023)** Auch hier hat sich die Adresse geändert, nun lautet es `//Log.html`. Die Anzeige ist aber weiterhin leer, weil intern unverändert die alte URL (mit `/log`) aufgerufen wird. ### 3. Häufige NPU-Fehler **(Ergänzung 09.09.2023)** Im Log finden sich seit den Updates häufige Mitteilungen wie diese: ``` 2023-09-09 03:14:32 [I|NPU] Switched off 2023-09-09 03:15:03 [I|Energy Management] State: Entladen -> NPU-Fehler 2023-09-09 03:15:07 [I|NPU] Correctly started 2023-09-09 03:15:10 [I|NPU] Communication established 2023-09-09 03:15:11 [I|NET] IP address changed from 192.168.178.29 to unconnected (255.255.255.255). 2023-09-09 03:15:11 [I|NPU] NPU: Change backend server to 0 2023-09-09 03:15:18 [I|NPU] NPU: image version 2309-b5746b50 2023-09-09 03:15:18 [I|NPU] NPU: protocol version 10 (0xB574) 2023-09-09 03:15:20 [I|NET] IP address changed from unconnected (255.255.255.255) to 192.168.178.29. 2023-09-09 03:15:41 [I|Energy Management] State: NPU-Fehler -> Netz & Entladen ``` Bei mir passiert das etwa 10 Mal am Tag. Während dieses etwa eine Minute dauernden Vorgangs ist der Speicher über das Netzwerk nicht erreichbar und zeigt im Display die Meldung `NPU-Fehler` an. Tools wie der SENEC-Collector von SOLECTRUS können in dieser Zeit keine Messwerte abfragen. NPU ist die Kommunikationseinheit, also der Teil des Speichers, der für den Netzwerkzugang zuständig ist. Offenbar wird die NPU neu gestartet, vielleicht weil irgendein Problem festgestellt wurde, das im Log nicht erwähnt wird. Die Auswirkungen sind recht gering, aber normal ist das sicherlich nicht. Da die Logs automatisch an SENEC übertragen werden, dürfte dort das Problem bekannt sein. Potential für weitere Updates ist also vorhanden. **(Ergänzung 15.09.2023)** Die Protokollierung von `Switched off` und die damit verbundene Anzeige von `NPU-Fehler` im Display traten bei mir nach dem Firmware-Update insgesamt fünf Tage lang auf und wurden 73 Mal im Log vermerkt, also alle 1-2 Stunden. Dann hört es plötzlich auf, seit mittlerweile vier Tagen findet sich die Meldung nicht mehr im Log. Die Installation eines weiteren Updates kann ich nicht erkennen. Von anderen Usern höre ich ähnliches. Völlig **spekulative**, aber denkbare Erklärung: Im Rahmen des Firmware-Updates lief ein mehrtägiger Prozess im Gerät ab, der viel Rechenleistung verschlungen hat (Prüfvorgänge, Aufräumen oder was auch immer). Ein Watchdog-Modul hat das erkannt und die NPU sicherheitshalber bei einer bestimmten Schwelle neu gestartet. Nach Fertigstellung des Prozesses ist die Auslastung wieder normal und der Watchdog greift nicht mehr ein. **(Ergänzung 02.10.2023)** Zwischenzeitlich ist der NPU-Fehler bei mir sporadisch wieder aufgetreten. Das Problem ist also nicht aus der Welt. In diesem Zusammenhang findet sich seit heute in der SENEC-App der Hinweis, dass in Kürze (ab dem 04.10.2023) ein weiteres Firmware-Update (826) kommen wird, das u.a. den "NPU-Fehler" beheben soll. Ich bin gespannt. Leider wird außerdem angekündigt, dass die Funktionen `/Display.html` und `/Vars.html` nicht mehr unterstützt werden. Begründet wird der Wegfall mit der Optimierung des Speicherverbrauchs der Firmware und der allgemeinen Erhöhung der Sicherheitsstandards. Zumindest wird dies in einem Schreiben von SENEC an die Installateure so dargestellt, das derzeitig auf Facebook kursiert. `/Vars.html` ist eine Komfortfunktion, die sämtliche Variablen und Messwerte aus dem Speicher abruft und tabellarisch darstellt. Durch den Wegfall dieser Funktion ist es aber **nicht** so, dass man an diese Daten gar nicht mehr herankommt. `/Vars.html` verwendet intern die API (`/lala.cgi`) die es weiterhin gibt. Es fällt nur der bequeme Zugriff über den Browser weg. Für neugierige, aber weniger versierte User ist das allerdings eine deutliche Einschränkung. **(Ergänzung 04.10.2023)** Das von SENEC angekündigte MCU-Update auf Version 826 ist bei mir heute angekommen. Neustart und Selbsttest liefen problemlos durch, der Speicher ist wieder erreichbar. SOLECTRUS funktioniert unverändert weiter. Ob sich die NPU-Fehler dadurch wirklich erledigt haben, wird sich zeigen. Der angekündigte Wegfall von `/Display.html` und `/Vars.html` ist nicht erfolgt, die URLs haben sich aber erneut geändert. Sie lauten nun `//Display.html` und `//Vars.html`, die bekannten Fehler der leeren Anzeige sind aber geblieben. **(Ergänzung 06.10.2023)** Auch nach dem MCU-Update auf 826 ist heute in meinem Speicher ein NPU-Fehler aufgetreten, der zu einer 10-minütigen Nichterreichbarkeit geführt hat. Das Thema ist also noch nicht durch. ### Ausblick Soweit der aktuelle Stand. Ich bin gespannt, wie es weitergeht. Ich werde diesen Beitrag aktualisieren, sobald es Neuigkeiten gibt. > **Funfact** > > > Aus Entwicklersicht erheiternd ist, dass SENEC im aktualisierten GUI auch die JavaScript-Bibliothek [jQuery](https://jquery.com/) aktualisiert hat: Statt jQuery `3.2.1` (aus dem Jahr 2017) kommt nun jQuery `3.6.1` (aus 2022) zum Einsatz. > > Der Einsatz von jQuery ist **der** Legacy-Indicator schlechthin - ok, dieses Bashing konnte ich mir dann doch nicht verkneifen :-) > --- # Unterstützung für neue SENEC-Firmware _2023-08-18_ > SENEC aktualisiert die Firmware des Speichers auf Revision MCU 3825 und stellt damit auf https um. Das macht eine Anpassung des SENEC-Collectors erforderlich. Derzeit rollt SENEC ein Firmware-Update aus, dass es in sich hat - es ändert nämlich die API, über die SOLECTRUS mit dem Speicher kommuniziert. Das führt dazu, dass SOLECTRUS nicht mehr funktioniert, wenn die neue Firmware installiert ist. Die neue Firmware hat die Versionsnummer `Revision MCU 3825`, möglicherweise gibt es aber auch andere Versionen, die die API ändern. Ob man die neue Firmware hat, erkennt man sicher daran, ob die Webseite des Speichers über `http` (alte Firmware) oder über `https` (neue Firmware) erreichbar ist. Sobald die neue Firmware installiert ist, funktioniert SOLECTRUS nicht mehr, d.h. es werden keine neuen Messwerte mehr angezeigt. Das ist nicht so schön. Wann genau dein Speicher von SENEC aktualisiert wird, weiß nur SENEC. Du solltest aber darauf vorbereitet sein, dass es in den nächsten Tagen oder Wochen passieren kann. Die gute Nachricht: In Zusammenarbeit mit betroffenen SOLECTRUS-Benutzern habe ich eine Lösung erarbeiten können und ein Update für den SENEC-Collector veröffentlicht, das die neue Firmware unterstützt. ## Update des SENEC-Collectors installieren Nutzer von SOLECTRUS, bei denen die neue Firmware bereits auf dem SENEC-Speicher angekommen ist, müssen ein Update des SENEC-Collectors installieren. Das geht wie folgt: 1. In der Datei `.env` muss die Zeile `SENEC_SCHEMA=https` ergänzt werden 2. In der Datei `docker-compose.yml` muss unter `services.senec-collector.environment` der Eintrag `SENEC_SCHEMA` ergänzt werden (damit die Variable aus der `.env`-Datei auch im Container ankommt) 3. Das aktualisierte Docker-Image muss jetzt geholt werden, das geht mit:\ `docker compose pull` 4. Abschließend müssen die Container neu gestartet werden, wie üblich geht das mit:\ `docker compose up -d` (Bei älteren Versionen von Docker, z.B. auf einem Synology-NAS, bitte `docker-compose` statt `docker compose` verwenden) > **Wichtig** > > > Ergänze die Zeile `SENEC_SCHEMA=https` erst dann, wenn Du festgestellt hast, dass der Speicher im Browser wirklich über `https` erreichbar ist. Es ist leider so, dass die Website der alten Firmware **nur** über `http` erreichbar ist, die Website der neuen Firmware hingegen **nur** über `https`. > Nach diesen Schritten sollte SOLECTRUS wieder funktionieren. Falls nicht, bitte im [Forum auf GitHub](https://github.com/orgs/solectrus/discussions) melden. Technische Hintergrundinformationen finden sich im zugehörigen Issue auf GitHub:\ https://github.com/solectrus/senec-collector/issues/224 --- # Version 0.13 verfügbar _2023-08-13_ > Das Update enthält Fehlerbehebungen und führt die Registrierung ein. Unterstütze die weitere Entwicklung, indem du deine Instanz registrieren lässt! Ein neues Update für SOLECTRUS ist verfügbar. Diesmal stehen vor allem Fehlerbehebungen und die Einführung einer Registrierung im Mittelpunkt. ## Die Registrierung Es ist bereits über zwei Jahre her, seit ich die erste Version von SOLECTRUS veröffentlicht habe. Ehrlich gesagt hätte ich nicht erwartet, dass sich so viele Menschen für dieses Projekt begeistern würden. Das zahlreiche Feedback lässt zwar großes Interesse erahnen, konkrete Nutzerzahlen habe ich jedoch bisher nicht. Um das zu ändern und SOLECTRUS gezielt weiterzuentwickeln, führe ich nun die Registrierung durchgeführter Installationen ein. Nach Installation der aktuellen Version `0.13` wirst du daher einen gelben Hinweisbalken bemerken: Falls du nicht als Administrator eingeloggt bist, sieht du stattdessen nur den Hinweis, dich für die Registrierung zunächst als Admin einzuloggen. Fragen dazu? Die [Anleitung](/docs/bedienung/administrator/) hilft dir weiter! Ein Klick auf `Jetzt registrieren` leitet dich zu einem Formular, das du weitestgehend anonym ausfüllen kannst. Lediglich eine E-Mail-Adresse wird benötigt, sodass ich dich bei Bedarf kontaktieren kann. Keine Sorge: Dein Posteingang wird nicht überflutet, und deine Daten werden vertraulich behandelt und nicht an Dritte weitergegeben. Deine Registrierung unterstützt mich bei der Planung und Weiterentwicklung von SOLECTRUS. Ein großes Dankeschön für dein Engagement und das entgegengebrachte Vertrauen! ## Fehlerbehebungen - In der `JETZT`-Ansicht konnte es passieren, dass beim Wechsel des Messwertes (z.B. von `Erzeugung` zu `Hausverbrauch`) das Diagramm nicht korrekt fortgeführt wurde. Dieser Fehler ist nun behoben. - Wenn Messwerte verzögert eintreffen, konnte der Batterieladestand in der `JETZT`-Ansicht kurzzeitig auf 0% fallen. Auch das ist nun behoben. ## Sonstige Verbesserungen - Die Balkendiagramme in den Ansichten `WOCHE`, `MONAT`, `JAHR` und `GESAMT` werden nun mit abgerundeten Ecken dargestellt. - Unter der Haube wurden die verwendeten Fremdkomponenten auf den neuesten Stand gebracht, jetzt läuft SOLECTRUS mit den aktuellsten Versionen von Ruby on Rails und anderen Bibliotheken. --- # Version 0.12 verfügbar _2023-07-08_ > In der Top-10 wird die Peak-Leistung dargestellt. Außerdem gibt es ansprechendere Diagramme und Verbesserungen für große Displays Ein weiteres Update steht bereit, Folgendes hat sich getan: ## Neuerungen - In der Top-10 lässt sich neben der Energie (in kWh) nun auch die höchste erreichte Leistung (in kW) ermitteln. Damit kannst du herausfinden, ob und wann deine PV-Anlage die theoretische Peak-Leistung der Module erreicht hat. Hier im Screenshot zu sehen: Die Module (mit einem Nominalwert von **9,24 kWp**) erzielen tatsächlich bis zu **10,5 kW** - gemittelt über 5 Minuten. Damit kann man zufrieden sein. Wenn du den Zeitraum auf "Jahr" stellst, kannst du außerdem die Degradation ermitteln, also die unvermeidliche Leistungsreduktion der Solarmodule im Laufe der Zeit. Aber auch die maximale Ent- und Beladeleistung des Akkus oder die höchste Leistungsaufnahme des Hauses sind interessante Werte, die du jetzt ermitteln kannst. ## Verbesserungen - Die Diagramme kommen nun in einer aufpolierten Darstellung daher. Zusammen mit einem Farbverlauf und einer interpolierten Darstellung von Liniendiagrammen sehen sie jetzt deutlich ansprechender aus. - Auf sehr großen Displays wird der zur Verfügung stehende Platz besser ausgenutzt, die Darstellung erscheint breiter. - Auf Touch-Displays (Smartphone, Tablet) kann jetzt durch längeres Tippen auf ein Segment der Strombilanz der zugehörige Messwert angezeigt werden. ## Fehlerbehebungen - Die Kompatibilität mit englisch-sprachigen Systemen wurde verbessert --- # Version 0.11 verfügbar _2023-06-10_ > Die Kostenberechnung zeigt jetzt, was der Netzbezug tatsächlich gekostet hat, ohne entgangene Einspeisevergütung. Top 10 auch wochenweise. Es ist einiges passiert seit dem letzten Update. Hier sind die wichtigsten Punkte, die du wissen solltest: ## Neuerungen - Die Kostenberechnung wurde umgebaut. Sie basiert jetzt auf den tatsächlichen Kosten anstatt auf Opportunitätskosten. Es wird jetzt also berechnet, was **tatsächlich** an Kosten (durch Netzbezug) entstanden ist. Die entgangene Einspeisevergütung, die durch den eigenen Verbrauch von Strom entsteht, wird nicht mehr berücksichtigt. Die Berechnung ist dadurch einfacher und transparenter geworden. Ein [Artikel](/docs/bedienung/kosten-berechnung/) erklärt es genauer. - Die "Top 10"-Seite wurde erweitert, jetzt gibt es zusätzlich eine wöchentliche Ansicht. ## Verbesserungen - Die Genauigkeit der Statistiken für Tage/Wochen/Monate wurde verbessert. Die Gruppierung der Messwerte in InfluxDB berücksichtigt jetzt nämlich die aktuelle Zeitzone, was zu präziseren Ergebnissen führt. Ja, die meisten SOLECTRUS-Nutzer dürften alle in der gleichen Zeitzone leben, daher ist das vielleicht etwas unverständlich. Aber InfluxDB rechnet standardmäßig in UTC, was nun mal von der mitteleuropäischen Sommerzeit abweicht und zu geringfügig falsch gruppierten Tagen, Monaten und Wochen führte. Nichts Dramatisches, aber jetzt ist es eben besser. - Die Benutzeroberfläche wurde optimiert, sodass nicht mehr unnötig Daten geladen werden: Wenn du einen Wert in der Strombilanz (linke Seite) auswählst, wird nur das Diagramm (rechte Seite) neu geladen, also nicht mehr die gesamte Seite. Das hatte einige interne Umbauarbeiten notwendig gemacht. - Die Handhabung von Tooltips auf Touch-Displays (Smartphone, Tablet) wurde deutlich verbessert. Ein Tooltip wird nun, wie man das auch erwarten würde, beim ersten Tippen angezeigt und beim zweiten wieder geschlossen. - Die Hauptnavigation auf Smartphones und Tablets wurde optimiert. Beim Tippen auf das Menü-Icon wird der bisherige Inhalt überdeckt, nicht mehr verschoben. Das ist deutlich intuitiver. - Das gilt auch für die auf kleinen Displays sichtbare Navigation am unteren Bildschirmrand, die eine neue Optik erhalten hat. - Ein Link zur Dokumentation wurde in die Hauptnavigation aufgenommen. Dort gibt es z.B. zwei neue Artikel, in der die [Kosten-Berechnung](/docs/bedienung/kosten-berechnung/) sowie die [Ersparnis-Berechnung](/docs/bedienung/ersparnis-berechnung/) erklärt werden. ## Fehlerbehebungen - Ein kleines Problem mit der Skalierung des Temperaturdiagramms wurde behoben. --- # MQTT-Anbindung für SOLECTRUS _2023-06-01_ > Der neue MQTT-Collector holt Messwerte von jeder Anlage, die per MQTT sendet. SOLECTRUS ist damit nicht mehr auf SENEC beschränkt. Es gibt spannende Neuigkeiten für alle, die SOLECTRUS nicht nur mit SENEC-Stromspeichern, sondern auch mit Anlagen anderer Hersteller nutzen möchten. Bisher war SOLECTRUS speziell auf Nutzer von SENEC-Stromspeichern ausgelegt. Der [SENEC-Collector](https://github.com/solectrus/senec-collector) sammelt Messwerte direkt vom Stromspeicher, was zwangsläufig nicht kompatibel mit Anlagen anderer Hersteller ist. Mit dem neuen [MQTT-Collector](https://github.com/solectrus/mqtt-collector) wird diese Einschränkung nun aufgehoben. Es können jetzt Messwerte von allen Anlagen empfangen werden, die über das MQTT-Protokoll angebunden werden können. Das bedeutet, dass ab jetzt auch Anlagen von anderen Herstellern mit SOLECTRUS kompatibel sind. MQTT (Message Queuing Telemetry Transport) ist ein weit verbreitetes Kommunikationsprotokoll, das insbesondere im Bereich des Internet der Dinge (IoT) Anwendung findet. Es ermöglicht eine sichere, zuverlässige und einfache Kommunikation zwischen verschiedenen Geräten und Plattformen. Zentrale Instanz ist der MQTT-Broker, der die Kommunikation zwischen verschiedenen Clients koordiniert. Für die Nutzung des MQTT-Collectors ist es notwendig, dass die Messwerte von der Anlage an einen MQTT-Broker gesendet werden, wo sie dann vom MQTT-Collector abgeholt werden. Das Abfragen und Senden kann z.B. über eine Hausautomatisierungs-Software erfolgen. Bis jetzt wurde folgende Software im Zusammenspiel mit dem MQTT-Collector getestet: - [ioBroker](https://www.iobroker.net/) (enthält einen integrierten MQTT-Broker) - [evcc](https://evcc.io/) (benötigt einen separaten MQTT-Broker) Auf GitHub findet sich ein erster [Erfahrungsbericht zur Nutzung von evcc mit dem MQTT-Collector](https://github.com/evcc-io/evcc/discussions/8139). Der neue MQTT-Collector befindet sich in einem noch experimentellen Stadium. Es wäre daher großartig, wenn Ihr den Collector ausprobiert, testet und Feedback gebt! Nützliche Informationen zur Einrichtung finden sich in der [Installationsanleitung](https://github.com/solectrus/hosting). --- # Version 0.10.1 verfügbar _2023-05-06_ > Die Prognose reicht jetzt sechs Tage voraus, das Temperaturdiagramm beginnt bei 20 °C, und fehlende Werte erscheinen nicht mehr als Null. Es gibt ein neues Update: SOLECTRUS hat ein paar kleinere Verbesserungen und Fehlerbehebungen erhalten, die es noch benutzerfreundlicher und ansprechender machen. Lasst uns einen Blick auf die Neuerungen werfen: ## Änderungen - Der Vergleich der Stromerzeugnis mit der Vorhersage (z.B. "x% mehr/weniger als erwartet") erscheint jetzt nur noch dort, wo die Prognose auch im Diagramm angezeigt wird. Das ist nur bei der Tages-Darstellung der Fall, nicht aber bei Woche/Monat/Jahr/Gesamt. Bei größeren Zeiträumen hat der Vergleich außerdem nur eine beschränkte Aussagekraft, da es ja nicht um einen Wettkampf zwischen Vorhersage und tatsächlichem Ergebnis geht. Eine hohe positive Abweichung heißt nicht unbedingt, dass die PV-Anlage so toll ist, sondern möglicherweise nur, dass die Prognose ungenau war. - Es lassen sich nun die nächsten sechs Tage anzeigen, also nicht nur der jeweils nächste Tag. Dadurch können die kostenpflichtigen Vorhersagen von [forecast.solar](https://forecast.solar) genutzt werden, die sich ja über mehrere Tage erstrecken. - Das Temperaturdiagramm wurde optimiert: Es beginnt jetzt bei 20°C statt bei 0°C - der Strom-Speicher ist ja kein Kühlschrank. Außerdem wird eine fließendere Kurve angezeigt, da die Originalwerte ungerundet verwendet werden. ## Fehlerbehebungen - Keine Verwirrung mehr in den Diagrammen: Fehlende Werte werden nicht mehr fälschlicherweise als `0` angezeigt. - Tritt ein Fehler in der App auf (was hoffentlich gar nicht vorkommt), dann gibt es fortan zumindest eine schickere Darstellung dafür. Zuvor konnte es passieren, dass nur eine kryptische Nachricht wie "Content missing" erscheint. - In der `.env`-Datei zur Konfiguration können jetzt auch Sonderzeichen verwendet werden – zuvor konnte es zu seltsamen Fehlern kommen, wenn z.B. ein Datenbank-Passwort mit einem `#` beginnt. - Keine unnötigen Warnungen mehr im Logfile, wenn kein API-Schlüssel für den Error-Tracker _Honeybadger_ hinterlegt ist. Außer in der Demo kommt _Honeybadger_ sowieso nicht zum Einsatz. - Kleinere Layout- und Markup-Fehler wurden behoben. Dies wird niemand spüren, gibt aber dem Entwickler ein besseres Gefühl :) - Diverse Fremdkomponenten wurden aktualisiert, um das Dashboard noch flüssiger und schneller laufen zu lassen. ## Installation des Updates Wie alle Updates von SOLECTRUS lässt sich auch dieses auf einfache Weise über die Kommandozeile (SSH-Login) installieren: ```bash # Im Ordner ausführen, in dem die docker-compose.yml von SOLECTRUS liegt: docker compose pull docker compose up -d ``` oder (bei älteren Versionen von Docker, z.B. auf einem Synology-NAS) ```bash # Im Ordner ausführen, in dem die docker-compose.yml von SOLECTRUS liegt: docker-compose pull docker-compose up -d ``` ## Ausblick Es gibt noch etliche Ideen und Verbesserungen, die ich in den nächsten Wochen und Monaten je nach verfügbarer Zeit umsetzen möchte. Einen Überblick darüber kann man sich in den [Issues auf GitHub](https://github.com/solectrus/solectrus/issues) verschaffen. Zu guter Letzt möchte ich ein riesengroßes Dankeschön aussprechen für die Flut an wunderbaren, positiven Rückmeldungen, die in den vergangenen Wochen eingegangen sind. SOLECTRUS hat eine noch kleine, aber stetig wachsende Fan-Gemeinde – grandios! Ein besonderer Applaus gebührt all den großzügigen Usern, die ihren Obulus in den [virtuellen Klingelbeutel](https://ko-fi.com/ledermann) geworfen haben, um die Weiterentwicklung von SOLECTRUS zu unterstützen. Vielen Dank dafür! --- # Version 0.10 verfügbar _2023-04-01_ > Der Ladestand des Speichers als Kurve über Tag, Monat und Jahr. Dazu der Temperaturverlauf, jetzt in einer brauchbaren Skalierung. Kein (April-)Scherz, es gibt wieder ein Release mit weiteren neuen Features: ## Diagramme für den Verlauf des Akku-Ladestands Der Ladestand des Speichers lässt sich nun im Zeitverlauf in einer Weise darstellen, die in der offiziellen App so nicht möglich ist. Neben der bereits schon länger vorhandenen Darstellung von Be- und Entladung (in kWh) wird der Ladestand (in Prozent) visualisiert. So lässt sich ablesen, wie voll oder leer der Akku im Zeitverlauf gewesen ist. ### Akku-Ladestand im Verlauf eines Tages Zunächst ein Beispiel für einen Tag im März 2023: Der Akku wurde bis zum Morgen zur Hälfte geleert, bevor er dann tagsüber wieder nahezu voll geladen wurde. ### Akku-Ladestand im Verlauf eines Monats Interessanter ist die Darstellung für einen Monat, weil jeder Tag als **Spannbreite** angezeigt wird. So lässt sich ablesen, wie der geringste und höchste Ladestand an jedem Tag war. Hier am Beispiel von März 2023 lässt sich erkennen, dass der Akku in der zweiten Monatshälfte zu keinem Zeitpunkt leer geworden ist. ### Akku-Ladestand im Verlauf eines Jahres Noch interessanter ist die Darstellung für ein Jahr: Dargestellt wird wieder eine Spannbreite, diesmal aber für einen **durchschnittlichen** Tag im jeweiligen Monat. Gut zu sehen hier im Beispiel des Jahres 2021: In den Wintermonaten wird der Akku nicht voll, im Sommer hingegen nicht leer. Je größer ein Balken ist, desto mehr kam der Akku zum Einsatz. Wohlgemerkt: Jeder Balken zeigt die Spannbreite vom **durchschnittlichen** Mindestladestand bis zum **durchschnittlichen** Höchstladestand des Monats an. ## Diagramme für die Temperaturverlauf Ähnlich wird nun auch der Verlauf der Gehäuse-Temperatur dargestellt. Es werden jedoch keine Durchschnitte gebildet, sondern des absolute Maximum und Minimum, einzelne Ausreißer werden also sichtbar. Da die Gehäuse-Temperatur erst ab Version 0.5.0 des SENEC-Collectors (vom März 2022) erfasst wird, steht für frühere Zeiträume leider kein Datenmaterial zur Verfügung. Und da in den von SENEC bereitgestellten CSV-Dateien die Temperatur leider nicht enthalten ist, sie kann auch nicht nachträglich importiert werden. ## Was noch? - Das gewünschte Diagramm kann nun auch über ein Dropdown-Menü ausgewählt werden - In der Top-10 werden jetzt auch sehr kleine Balken mit Zahlen beschriftet - In den Diagrammen wurde der Hover-Effekt verbessert, d.h. beim Überfahren mit der Maus erfolgt die Anzeige des Wertes deutlicher Ansonsten gibt es die üblichen kleinen Verbesserungen und Fehlerbehebungen. --- # SOLECTRUS hat Küchendienst _2023-03-22_ > Henning Groß hat SOLECTRUS in der Küche hängen, auf einem Tablet im Kiosk-Mode. Sein Erfahrungsbericht zu PV-Anlage und SENEC-Speicher. Der Photovoltaik-Enthusiast [Henning Groß](https://mitkaracho.de) schreibt in seinem Blog über die Installation von SOLECTRUS in seiner Küche. Er verwendet ein Tablet im Kiosk-Mode, um den Status seiner PV-Anlage jederzeit im Blick zu haben. Lesenswert! https://mitkaracho.de/posts/2023/solectrus-mit-senec/ --- # Version 0.9 verfügbar _2023-03-12_ > Kosten des Stromverbrauchs, "Flop-10", Temperatur-Anzeige, URL-Shortcuts für Kiosk-Modus, Internationalisierung (I18n) Es gibt ein neues Release mit einigen interessanten neuen Features: ## Kosten des Stromverbrauchs SOLECTRUS berechnet nun die Kosten für den Stromverbrauch innerhalb eines gewählten Zeitraums. Es wird dabei die tatsächliche Situation mit einem theoretischen Szenario ohne jeden Verbrauch (und somit Volleinspeisung) verglichen. Wichtig ist dabei das Verständnis, dass auch der Verbrauch von selbst erzeugtem Strom Geld kostet - nämlich in Form der entgangenen Einspeisevergütung. Die Kosten werden aufgeteilt auf Haus und E-Auto (sofern vorhanden) dargestellt. Es wird dabei pragmatisch davon ausgegangen, dass Netzbezugskosten primär durch das E-Auto veranlasst wurden. Grundlage der Berechnung sind die erfassten Strompreise sowie die Einspeisevergütung. Die Kostenberechnung ergänzt die bereits vorhandene Ermittlung der Einsparung, die durch die Photovoltaik-Anlage erzielt wird. ## "Flop-10" Nicht nur die **besten** Resultate sind von Interesse, sondern auch die **schlechtesten**. Um diese darzustellen, lässt sich die Top-10 jetzt auch aufsteigend sortieren. Damit lassen sich z.B. folgende Fragen beantworten: - "Wann gab es die geringste Stromerzeugung?" - "Wann habe ich das E-Auto am wenigsten geladen?" - "Wann habe ich am wenigsten Strom aus dem Netz bezogen?" Um Irritationen zu vermeiden, werden bei aufsteigender Sortierung nur vollständige Perioden berücksichtigt, d.h. der Zeitraum ganz am Anfang (bei Installation der Anlage) sowie der aktuelle Zeitraum sind nicht enthalten. ## Temperatur-Anzeige Auf der Seite `Jetzt` wird nun zusätzlich die aktuelle Gehäuse-Temperatur des Speichers dargestellt. ## URL-Shortcuts für Kiosk-Modus SOLECTRUS kann nun besser in einem Kiosk-Modus (oder als Slideshow) verwendet werden, bei dem automatisch und ohne Interaktion einzelne Seiten rotierend aufgerufen werden. Dazu gibt es jetzt URL-Shortcuts, die direkt auf einen aktuellen Zeitraum verweisen. Bisher enthält eine URL den konkreten gewünschten Zeitraum, also z.B. `/inverter_power/2023-03-12` für die Stromerzeugung am 12.03.2023. Hinzugekommen ist jetzt die Möglichkeit, Shortcuts zu verwenden, z.B. `/inverter_power/day`, womit direkt auf die Stromerzeugung des aktuellen Tages verwiesen werden kann. Konkret gibt es Shortcuts für vier verschiedene Zeiträume: - `/{field}/day` - `/{field}/week` - `/{field}/month` - `/{field}/year` ## Internationalisierung (I18n) Die Benutzeroberfläche ist nun in **Englisch** und **Deutsch** verfügbar. Die Darstellung hängt davon ab, welche Sprache in deinem Browser eingestellt ist. Wenn du einen deutschen Browser verwendest, wirst du somit keinen Unterschied feststellen. ## Danke! Vielen Dank an alle, die mit ihren Anregungen und Ideen dazu beitragen, dass SOLECTRUS immer besser wird! --- # Version 0.8 verfügbar _2023-02-16_ > Tag, Woche, Monat und Jahr aktualisieren sich jetzt alle fünf Minuten von selbst. Und die Anzeige nennt nun den Status des Speichers. ## Live-Anzeige auch für Perioden Bisher wurde die Darstellung nur auf der Seite `Jetzt` automatisch (im **5-Sekunden-Takt**) aktualisiert. Dies gilt nun auch für die Periodendarstellung, also die Seiten `Tag`, `Woche`, `Monat`, `Jahr` und `Alle`, wobei hier die Anzeige alle **fünf Minuten** aktualisiert wird. Dies ist nützlich bei der Verwendung von SOLECTRUS in einem öffentlichen Bereich, z.B. in einem Büro oder einem Geschäft. ## Statusanzeige Anstelle der bisherigen Anzeige `Live` wird nun der aktuelle Speicherstatus angezeigt. Es handelt sich um die gleiche Information, die auch auf dem Display des Speichers angezeigt wird. Die grüne "Leuchtdiode" signalisiert weiterhin, ob die Daten aktuell sind, also innerhalb der letzten Sekunden aktualisiert wurden. Damit das funktioniert, muss der [SENEC-Collector](https://github.com/solectrus/senec-collector/releases) in Version 0.6.0 oder neuer installiert sein. --- # Website für SOLECTRUS _2023-01-03_ > solectrus.de ist online. Warum aus einem Feierabend-Projekt rund um PV-Anlage und SENEC-Speicher eine eigene Website geworden ist. SOLECTRUS nimmt so langsam Fahrt auf. Die Zahl der Nutzer steigt, was ich insbesondere an den vielen Anfragen per E-Mail sehe. Auf meiner persönlichen Website [ledermann.dev](https://ledermann.dev) habe ich ja schon länger einen Link zu SOLECTRUS, aber das ist nicht wirklich ein Marketing-Kanal. Grund genug, endlich mal die Domain `solectrus.de` zu registrieren und eine eigene Website aufzusetzen. Mal sehen, wohin die Reise geht. ## Historische Entwicklung Die Idee zu SOLECTRUS stammt ursprünglich aus 2020. Damals wurde die Photovoltaikanlage auf dem Dach unseres Hauses installiert und ein Stromspeicher von SENEC im Keller platziert. Als Software-Entwickler war ich natürlich neugierig, nachdem ich herausfand, dass die Daten der Anlage und des Speichers über eine undokumentierte API abgefragt werden können. Ich habe das damals ausführlich [in einem Blog-Artikel](https://ledermann.dev/blog/2021/02/03/photovoltaik-dashboard-als-web-applikation/) aufgeschrieben.