# 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 <georg@ledermann.dev>
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)
