Skip to content

Commit

Permalink
Power-Splitter
Browse files Browse the repository at this point in the history
  • Loading branch information
ledermann committed Oct 4, 2024
1 parent 94c98cd commit 2f844c5
Show file tree
Hide file tree
Showing 4 changed files with 250 additions and 93 deletions.
84 changes: 84 additions & 0 deletions referenz/power-splitter/inbetriebnahme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
---
title: Inbetriebnahme
layout: page
parent: Power-Splitter
nav_order: 3
---

# Inbetriebnahme des Power-Splitters

Bei einer Neuinstallation von SOLECTRUS über den [Konfigurator](https://configurator.solectrus.de/) wird der Power-Splitter automatisch mit installiert. Wenn nicht der Konfigurator verwendet wurde oder eine ältere Installation vorliegt, muss der Power-Splitter händisch hinzugefügt werden. Hier wird beschrieben, wie das geht.

1. Zunächst ist sicherzustellen, dass ein E-Auto und/oder eine Wärmepumpe an SOLECTRUS angebunden wurde. Deren Messwerte müssen also in der SOLECTRUS-Instanz sichtbar sein.

2. Als nächstes ist zu prüfen, ob die [neue Sensor-Konfiguration](/docs/wartung/sensor-konfiguration) bereits vorhanden ist. Bei älteren Installation (vor Juli 2024) ist meist die ältere Konfiguration vorhanden und muss zunächst angepasst werden.

Das bedeutet: Beim Start der Docker-Container von SOLECTRUS dürfen keine Warnungen bezüglich fehlender Sensoren im Log erscheinen. Falls doch, müssen diese zunächst behoben werden. Im Log steht genau, wie das geht.

Es müssen also folgende ENV-Variablen (mit Werten) in der `.env`-Datei enthalten sein:

- `INFLUX_SENSOR_GRID_IMPORT_POWER`
- `INFLUX_SENSOR_HOUSE_POWER`
- `INFLUX_SENSOR_WALLBOX_POWER` und/oder `INFLUX_SENSOR_HEATPUMP_POWER`

Üblicherweise gibt es weitere Sensoren in der `.env`, die sind für den Power-Splitter aber nicht relevant.

3. Abschließend ist sicherzustellen, dass Version `0.16.0` oder neuer von SOLECTRUS verwendet wird.

4. Die eigentliche Integration des Power-Splitter erfolgt nun durch Anpassung der Dateien `compose.yaml`. Hier ist derPower-Splitter als zusätzlicher Service zu ergänzen:

```yaml
services:
# ...
power-splitter:
image: ghcr.io/solectrus/power-splitter:latest
environment:
- TZ
- POWER_SPLITTER_INTERVAL
- INFLUX_HOST
- INFLUX_SCHEMA
- INFLUX_PORT
- INFLUX_TOKEN=${INFLUX_ADMIN_TOKEN}
- INFLUX_ORG
- INFLUX_BUCKET
- INFLUX_SENSOR_GRID_IMPORT_POWER
- INFLUX_SENSOR_HOUSE_POWER
- INFLUX_SENSOR_WALLBOX_POWER
- INFLUX_SENSOR_HEATPUMP_POWER
- INFLUX_EXCLUDE_FROM_HOUSE_POWER
- REDIS_URL
logging:
options:
max-size: 10m
max-file: '3'
restart: unless-stopped
depends_on:
influxdb:
condition: service_healthy
redis:
condition: service_healthy
links:
- influxdb
- redis
labels:
- com.centurylinklabs.watchtower.scope=solectrus
```
Der Power-Splitter liest aus der InfluxDB die Messwerte der Verbraucher sowie des Netzbezugs und schreibt die Aufteilung in ein neues Measurement mit der (unveränderlichen) Bezeichnung `power_splitter`.

Wichtig beim `INFLUX_TOKEN` ist, dass dieses sowohl zum Schreiben als auch zum Lesen berechtigt. Es empfiehlt sich, hierfür das Admin-Token zu nehmen (wie oben angegeben).

Die `REDIS_URL` wird benötigt, um nach dem ersten Durchlauf einmalig den Cache leeren zu können.

5. Abschließend ist ein Neustart der Container durchzuführen, mit `docker compose up -d` wird nun wird der Power-Splitter mit gestartet.

Wenn sich die Container gar nicht starten lassen sollten, ist vermutlich der Service nicht richtig in die `compose.yaml` eingefügt worden. Hier ist insbesondere die Einrückung zu prüfen, das ist bei YAML-Dateien äußerst wichtig.

Die Log-Ausgabe des neuen Containers kann mit folgendem Befehl vefolgt werden:\
`docker compose logs power-splitter -f` (kann beendet werden mit `Strg+C`)

Bei etwaigen Fehlermeldungen muss unbedingt die Ursache gefunden und behoben werden.

Wenn alles fehlerfrei läuft, wird der Power-Splitter zunächst die Daten der Vergangenheit bearbeiten, anschließend im Hintergrund weiterlaufen und jeweils den aktuellen Tag berechnen. Dies lässt sich alles genau im Log nachvollziehen. Es ist empfehlenswert, das zu tun. Nach einer gewissen Zeit (abhängig von Rechenpower und Datenmenge) wird die Berechnung der Vergangenheit abgeschlossen sein.

Wenn jetzt in SOLECTRUS ein Zeitraum gewählt wird (Tag/Woche/Monat/Jahr/Gesamt), sieht man bei Haus, E-Auto und Wärmepumpe (sofern vorhanden) jeweils im Tooltip die Aufteilung des Verbrauchs. Außerdem erscheinen deren Diagramme in einer gestapelten Darstellung.
105 changes: 39 additions & 66 deletions referenz/power-splitter/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,93 +5,66 @@ parent: Referenz
nav_order: 6
---

# Verwendung für SOLECTRUS
# Power-Splitter

Der Power-Splitter analysiert den Stromverbrauch großer Verbraucher (E-Auto, Wärmepumpe, Haus). Der gemessene Verbrauch wird aufgeteilt in den Anteil, der mit Photovoltaik-Strom gedeckt wird und den Anteil, der aus dem Netz bezogen wird. Daraus ergeben sich interessante Einblicke in die Verbrauchskosten, die sonst so nicht möglich waren.
Der Power-Splitter analysiert den Stromverbrauch großer Verbraucher (E-Auto, Wärmepumpe, Haus). Der Verbrauch wird aufgeteilt in den Anteil, der mit Photovoltaik-Strom gedeckt wird und den Anteil, der aus dem Netz bezogen wird. Daraus ergeben sich interessante Einblicke in die Verbrauchskosten, die sonst so nicht möglich waren.

Zunächst ein paar wichtige Hinweise:

- Der Power-Splitter ergibt nur Sinn, wenn man ein E-Auto und/oder eine Wärmepumpe hat (also **nicht** zwingend beides) und erfolgreich an SOLECTRUS angebunden hat. Wer also **beides nicht** hat, für den ist es uninteressant, weil es dann nichts aufzuteilen gibt.

- Die Berechnung erfolgt für sämtliche Verbrauchswerte von Wärmepumpe und/oder E-Auto, die in der InfluxDB vorhanden sind. Das bedeutet, dass nicht nur zukünftige Messwerte, sondern **auch die Messwerte der Vergangenheit** berücksichtigt werden.

- Für die Berechnung kommt ein neuer Docker-Container (der eigentliche "Power-Splitter") zum Einsatz. Dieser läuft permanent im Hintergrund, berechnet die Aufteilung und schreibt sie in ein neues Measurement der InfluxDB.

## Inbetriebnahme des Power-Splitters

1. Stelle sicher, dass du ein E-Auto und/oder eine Wärmepumpe an SOLECTRUS angebunden hast. Deren Messwerte müssen also in deiner SOLECTRUS-Instanz sichtbar sein.

2. Prüfe, ob die [neue Sensor-Konfiguration](https://github.com/solectrus/solectrus/wiki/Konfiguration#sensor-konfiguration) bei dir vorhanden ist. Das ist der Fall, wenn du zur Installation den neuen [Konfigurator](https://configurator.solectrus.de/) verwendet hast. Wenn du schon länger mit dabei ist, hast du vermutlich noch die alte Konfiguration (von Version `0.14.5` oder früher), das muss vorher [angepasst werden](https://github.com/solectrus/solectrus/wiki/Umstellung-auf-neue-Sensor%E2%80%90Konfiguration).

Das bedeutet: Beim Start der Docker-Container von SOLECTRUS dürfen keine Warnungen bezüglich fehlender Sensoren im Log erscheinen. Falls doch, müssen diese zunächst behoben werden. Im Log steht genau, wie das geht.

Es müssen also folgende ENV-Variablen (mit Werten) in der `.env`-Datei enthalten sein:
- Für die Berechnung kommt ein zusätzlicher Docker-Container (der eigentliche Power-Splitter) zum Einsatz. Dieser läuft dauerhaft im Hintergrund, berechnet die Aufteilung und schreibt sie in ein neues Measurement der InfluxDB.

- `INFLUX_SENSOR_GRID_IMPORT_POWER`
- `INFLUX_SENSOR_HOUSE_POWER`
- `INFLUX_SENSOR_WALLBOX_POWER` und/oder `INFLUX_SENSOR_HEATPUMP_POWER`
- Der Power-Splitter ergibt nur Sinn, wenn man ein E-Auto und/oder eine Wärmepumpe hat (also **nicht** zwingend beides) und erfolgreich an SOLECTRUS angebunden hat. Wer also **beides nicht** hat, für den ist es uninteressant, weil es dann nichts aufzuteilen gibt. Die von SOLECTRUS bereits berechnete Autarkie stellt in diesem Fall die Situation bereits dar.

Mehr [Infos zur Konfiguration](https://github.com/solectrus/power-splitter/wiki/Konfiguration) finden sich in einem separaten Artikel.
## Berechnete Werte

Üblicherweise gibt es weitere Sensoren in der `.env`, die sind für den Power-Splitter aber nicht relevant.
Der Power-Splitter schreibt die folgenden Werte als _Field_ in das Measurement `power_splitter` der InfluxDB:

3. Stelle sicher, dass du Version `0.16.0` oder neuer von SOLECTRUS verwendest.
- `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

4. Jetzt kommt der wichtigste Punkt: Bearbeite die `docker-compose.yml` (oder `compose.yml`) und ergänze den Power-Splitter als zusätzlichen Service. Achte unbedingt (!) auf die richtige Einrückung mit Leerzeichen.
Beim Start prüft der Power-Splitter zunächst, ob Messwerte aus der Vergangenheit vorliegen, für die noch kein Split erfolgt ist. Dies wird dann nachgeholt, beginnend beim ältesten noch nicht bearbeiteten Tag. Dies kann einige Zeit in Anspruch nehmen, je nachdem, wie viele Daten nachzuarbeiten sind. Etwa 30min sind hierbei nicht ungewöhnlich.

```yaml
services:
# ...
power-splitter:
image: ghcr.io/solectrus/power-splitter:latest
labels:
- com.centurylinklabs.watchtower.scope=solectrus
environment:
- TZ
- INFLUX_HOST
- INFLUX_SCHEMA
- INFLUX_TOKEN=${INFLUX_ADMIN_TOKEN}
- INFLUX_PORT
- INFLUX_ORG
- INFLUX_BUCKET
- INFLUX_SENSOR_GRID_IMPORT_POWER
- INFLUX_SENSOR_HOUSE_POWER
- INFLUX_SENSOR_WALLBOX_POWER
- INFLUX_SENSOR_HEATPUMP_POWER
- INFLUX_EXCLUDE_FROM_HOUSE_POWER
- POWER_SPLITTER_INTERVAL
- REDIS_URL=redis://redis:6379/1
links:
- influxdb
- redis
depends_on:
influxdb:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
```
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 (standardmäßig 1 Stunde) permanent neu, um hinzugekommene Messwerte zu berücksichtigen. Um Mitternacht wird der Tag abgeschlossen und der nächste Tag begonnen.

Der Power-Splitter liest aus der InfluxDB die Messwerte der Verbraucher sowie des Netzbezugs und schreibt die Aufteilung in ein neues Measurement mit der (unveränderlichen) Bezeichnung `power_splitter`.
## Protokollierung

Wichtig beim `INFLUX_TOKEN` ist, dass dieses sowohl zum Schreiben als auch zum Lesen berechtigt. Du kannst das Admin-Token nehmen (wie oben angegeben) oder selbst ein neues Token im InfluxDB-Frontend anlegen (letzteres lohnt sich aber nur für bei hohen Sicherheitsanforderungen).
Der Power-Splitter schreibt ein Protokoll ins Docker-Log, das im Normalfall so aussieht:

Die `REDIS_URL` wird benötigt, um nach dem ersten Durchlauf einmalig den Cache leeren zu können.
```plaintext
Power Splitter for SOLECTRUS, Version 0.5.0, built at 2024-08-30 02:05:48 +0200
Using Ruby 3.3.5 on platform x86_64-linux-musl
Copyright (c) 2024 Georg Ledermann <[email protected]>
https://github.com/solectrus/power-splitter
Wenn du eine verteilte Installation betreibst (Lokal + Cloud), solltest du den Service auf dem Cloud-Host installieren - also da, wo die InfluxDB läuft. Das reduziert den Traffic.
Accessing InfluxDB at http://influxdb:8086, bucket SENEC
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 'house_power' excluded 'heatpump_power'
Sensor initialization completed
5. Starte die Container erneut mit `docker compose up -d`, diesmal wird der Power-Splitter mit gestartet.
Starting endless loop for processing current data...
Wenn sich die Container gar nicht starten lassen sollten, hast du vermutlich den Service nicht richtig in die `docker-compose.yml` (oder `compose.yml`) eingefügt. Prüfe insbesondere die Einrückung, das ist bei YAML-Dateien äußerst wichtig.
2024-10-04 15:43:56 +0200 - Processing day 2024-10-04
Pushing 188 records to InfluxDB
Sleeping for 3600 seconds...
...
```

Verfolge nun die Log-Ausgabe des neuen Containers mit folgendem Befehl:\
`docker compose logs power-splitter -f` (kann beendet werden mit `Strg+C`)
Das Protokoll kann über folgenden Befehl abgerufen werden:

Wenn du irgendwelche Fehlermeldungen siehst, kümmere dich zunächst darum, bevor du fortfährst.
```bash
docker logs [container-name]
```

Wenn alles fehlerfrei läuft, wird der Power-Splitter zunächst die Daten der Vergangenheit bearbeiten, anschließend im Hintergrund weiterlaufen und jeweils den aktuellen Tag berechnen. Dies lässt sich alles genau im Log nachvollziehen. Es ist empfehlenswert, das zu tun. Nach einer gewissen Zeit (abhängig von Rechenpower und Datenmenge) wird die Berechnung der Vergangenheit abgeschlossen sein.
Bei Problemen oder Fehlern (z.B. wenn die InfluxDB nicht erreichbar ist) wird dies ebenfalls protokolliert. Es empfiehlt sich daher, im Zweifelsfall zuerst das Protokoll zu prüfen.

Geschafft :-) Wenn du in SOLECTRUS jetzt einen Zeitraum auswählst (Tag/Woche/Monat/Jahr/Gesamt), siehst du bei Haus, E-Auto und Wärmepumpe (sofern vorhanden) jeweils im Tooltip die Aufteilung des Verbrauchs. Außerdem erscheinen deren Diagramme in einer gestapelten Darstellung.
## Quelltext

Quelltext im GitHub-Repository: \
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)
Loading

0 comments on commit 2f844c5

Please sign in to comment.