Das SolarPower-Modulpaket besteht aus zwei FHEM-Modulen, die zusammenarbeiten, um den Eigenverbrauch von Solarstrom zu maximieren:
- 77_SolarPowerController.pm – Der zentrale Controller, der die verfügbare Solarleistung überwacht und Verbraucher intelligent ein-/ausschaltet.
- 77_SolarPowerConsumer.pm – Repräsentiert einen steuerbaren Verbraucher mit Zeitplänen, Prioritäten und Laufzeitbeschränkungen.
Der SolarPowerController liest die aktuell verfügbare Solarleistung (Überschuss) aus einem konfigurierten Reading und entscheidet bei jeder Änderung, welche Verbraucher ein- oder ausgeschaltet werden sollen. Die Entscheidung basiert auf:
- Priorität – Verbraucher mit höherer Priorität werden bevorzugt.
- Notwendige Laufzeit – Geräte, deren Mindestlaufzeit noch nicht erreicht ist, werden priorisiert.
- Verfügbare Leistung – Ein Gerät wird nur eingeschaltet, wenn genug Überschuss vorhanden ist.
- Min. Ein-/Ausschaltzeit – Verhindert zu häufiges Schalten.
- Eltern-Abhängigkeiten – Geräte können von anderen abhängen (z.B. Ventilator-Stufen).
Die Moduldateien in das FHEM-Modulverzeichnis kopieren:
cp 77_SolarPowerController.pm /opt/fhem/FHEM/
cp 77_SolarPowerConsumer.pm /opt/fhem/FHEM/Anschließend FHEM neu laden:
reload 77_SolarPowerController
reload 77_SolarPowerConsumer
define <name> SolarPowerController <Device>:<Reading>
Parameter:
| Parameter | Beschreibung |
|---|---|
Device |
FHEM-Gerät, das die Solarleistung liefert (z.B. ein Wechselrichter) |
Reading |
Reading des Geräts mit dem aktuellen Leistungsüberschuss in Watt |
Beispiel:
define PV_Controller SolarPowerController Inverter:GridFeedIn
Der Controller reagiert automatisch auf Änderungen des konfigurierten Readings und steuert alle definierten SolarPowerConsumer.
define <name> SolarPowerConsumer <device>
Parameter:
| Parameter | Beschreibung |
|---|---|
device |
Das zu steuernde FHEM-Gerät |
Beispiel:
define PV_Fridge SolarPowerConsumer Fridge
| Befehl | Beschreibung |
|---|---|
on |
Gerät einschalten (nutzt onCmd falls definiert) |
off |
Gerät ausschalten (nutzt offCmd falls definiert) |
enable |
Steuerung durch den Controller aktivieren |
disable |
Steuerung durch den Controller deaktivieren |
reset_daily_runtime |
Tägliche Laufzeit zurücksetzen |
| Attribut | Format | Beschreibung |
|---|---|---|
priority |
Zahl | Priorität des Geräts (höher = wichtiger) |
power |
Zahl (Watt) | Leistungsaufnahme des Geräts |
schedule |
Zeitplan | Zeitfenster für die Steuerung (siehe unten) |
minDailyRuntime |
HH:MM |
Minimale tägliche Laufzeit |
maxDailyRuntime |
HH:MM |
Maximale tägliche Laufzeit |
minOnTime |
HH:MM |
Minimale Einschaltdauer pro Zyklus |
minOffTime |
HH:MM |
Minimale Ausschaltdauer vor erneutem Einschalten |
onCmd |
Befehl | Alternativer Einschaltbefehl für das Gerät |
offCmd |
Befehl | Alternativer Ausschaltbefehl für das Gerät |
stateReading |
Reading:Wert |
Reading zur Zustandserkennung |
parent |
Name | Übergeordneter SolarPowerConsumer (Abhängigkeit) |
disabled |
- | Deaktiviert den Consumer |
HH:MM-HH:MM[|Tage][,HH:MM-HH:MM[|Tage]]
Tages-Codes:
| Code | Bedeutung |
|---|---|
0 |
Sonntag |
1 |
Montag |
2 |
Dienstag |
3 |
Mittwoch |
4 |
Donnerstag |
5 |
Freitag |
6 |
Samstag |
7 |
Wochenende |
8 |
Arbeitstage |
9 |
Tag vor Wochenende/Feiertag |
X |
Tag vor Arbeitstag |
Beispiele:
# Täglich 08:00 bis 18:00
attr PV_Fridge schedule 08:00-18:00
# Mo-Mi 09:00-17:00, vor Arbeitstag 08:00-18:00, vor Wochenende 07:00-19:00
attr PV_Fridge schedule 09:00-17:00|123,08:00-18:00|X,07:00-19:00|9
# Zwei Zeitfenster am gleichen Tag (dürfen sich nicht überschneiden)
attr PV_Fridge schedule 09:00-12:00|123,13:00-19:00|123Das Gerät wird am Ende jedes Zeitfensters automatisch ausgeschaltet.
| Reading | Beschreibung |
|---|---|
state |
Aktueller Zustand (on/off/defined) |
control |
Steuerungszustand (enabled/disabled) |
dailyRuntime |
Bisherige Laufzeit heute (HH:MM) |
availableRuntime |
Verbleibende verfügbare Laufzeit im aktuellen Schedule |
nextOn |
Zeitpunkt der nächsten geplanten Aktivierung |
nextOff |
Zeitpunkt der nächsten geplanten Deaktivierung |
power |
Aktuell gemessene Leistung des Geräts |
Ein Ventilator mit 3 Geschwindigkeitsstufen (100W, +50W, +40W):
# Stufe 1: 100W
define PV_Fan1 SolarPowerConsumer Fan
attr PV_Fan1 power 100
attr PV_Fan1 onCmd speed 1
attr PV_Fan1 offCmd off
attr PV_Fan1 stateReading speed:1
attr PV_Fan1 priority 3
attr PV_Fan1 schedule 08:00-20:00
# Stufe 2: zusätzlich 50W (braucht Stufe 1)
define PV_Fan2 SolarPowerConsumer Fan
attr PV_Fan2 power 50
attr PV_Fan2 onCmd speed 2
attr PV_Fan2 offCmd speed 1
attr PV_Fan2 stateReading speed:2
attr PV_Fan2 priority 2
attr PV_Fan2 parent PV_Fan1
attr PV_Fan2 schedule 08:00-20:00
# Stufe 3: zusätzlich 40W (braucht Stufe 2)
define PV_Fan3 SolarPowerConsumer Fan
attr PV_Fan3 power 40
attr PV_Fan3 onCmd speed 3
attr PV_Fan3 offCmd speed 2
attr PV_Fan3 stateReading speed:3
attr PV_Fan3 priority 1
attr PV_Fan3 parent PV_Fan2
attr PV_Fan3 schedule 08:00-20:00Durch die parent-Abhängigkeit wird sichergestellt, dass Stufe 3 nur eingeschaltet wird, wenn Stufe 2 aktiv ist, und Stufe 2 nur wenn Stufe 1 aktiv ist.
Ein Getränkekühlschrank mit 60W, der täglich mindestens 3 Stunden laufen soll:
# MQTT-Gerät (z.B. Shelly) als Schalter
define MyFridge MQTT2_DEVICE
# SolarPowerConsumer für den Kühlschrank
define PV_MyFridge SolarPowerConsumer MyFridge
attr PV_MyFridge power 60
attr PV_MyFridge schedule 06:00-22:00
attr PV_MyFridge minDailyRuntime 03:00
attr PV_MyFridge minOnTime 00:05
attr PV_MyFridge minOffTime 00:05
attr PV_MyFridge room PVErgebnis-Readings im Betrieb:
| Reading | Beispielwert | Beschreibung |
|---|---|---|
state |
off |
Gerät aktuell ausgeschaltet |
control |
enabled |
Steuerung aktiv |
dailyRuntime |
04:19 |
Heute bereits 4:19h gelaufen |
availableRuntime |
11:02 |
Noch 11:02h im Schedule verfügbar |
nextOn |
2026-05-22 06:00:00 |
Nächstes Einschalten morgen 06:00 |
nextOff |
2026-05-21 22:00:00 |
Schedule-Ende heute 22:00 |
power |
0 |
Aktuelle Leistung (0 = aus) |
Der Controller schaltet den Kühlschrank bei Solarüberschuss ein und stellt sicher, dass die Mindestlaufzeit von 3 Stunden innerhalb des Zeitfensters 06:00–22:00 erreicht wird.
Bei jeder Änderung der Solarleistung durchläuft der Controller folgende Schritte:
- Alle aktiven Consumer (control = enabled) sammeln
- Sortierung nach notwendiger Restlaufzeit und Priorität
- Für eingeschaltete Geräte: Wenn Mindesteinschaltzeit erreicht, Leistung zum Budget addieren und als abschaltbar markieren
- Für abschaltbare Geräte:
- Einschalten erzwingen, wenn Mindestlaufzeit sonst nicht erreichbar
- Mindest-Ausschaltzeit beachten
- Maximale Tageslaufzeit prüfen
- Parent-Abhängigkeiten prüfen
- Bei genügend Überschuss einschalten, sonst ausschalten
GNU General Public License v2.0 – siehe GPL_V2.txt
(c) 2024-2025 Devirex