Nutzung Solarstrom-Überschuss
🌞 PV-Überschusssteuerung mit FHEM und Tasmota-Steckdose
Ich nutze im Haus FHEM für verschiedene Smart-Home-Lösungen.
Ein Teilbereich ist die Steuerung meiner privaten Zierfisch-Zuchtanlage.
Darin ist eine Aquaponik-Anlage integriert, d. h. der Wasserkreislauf wird auch zur Bewässerung von Nutzpflanzen (z. B. Salat) genutzt.
Da die Anlage im Keller untergebracht ist, wird komplett mit LED-Beleuchtung gearbeitet – das gilt auch für den Aquaponik-Teil.
Mein Wunsch:
Bei vorhandenem Solarstrom-Überschuss sollte die Grundbeleuchtung der Aquaponik-Anlage automatisch verstärkt werden.
Dazu schalte ich über eine mit Tasmota geflashte Steckdose einen 150 W LED-Strahler zu, wenn genügend PV-Überschuss vorhanden ist.
Tomaten in Aquaponik-Kultur – Foto: Rüdiger Bäcker
In FHEM habe ich u. a. einen Lesekopf für meinen Stromzähler integriert.
Dieser liefert kontinuierlich – jede Minute – die aufaddierten Werte für
- Strombezug → Power_ELZ_PV_1.8.0
- Einspeisung → Power_ELZ_PV_2.8.0
Mein Ziel:
- Einschalten, wenn der Bezug gleich bleibt, die Einspeisung jedoch steigt.
- Ausschalten, sobald wieder Strom bezogen wird (Bezug steigt).
Nachfolgend die Dokumentation der Umsetzung.
📡 Idee
- Einschalten: Wenn kein Strombezug (Import ≈ 0) und Einspeisung steigt.
- Ausschalten: Wenn wieder Strom bezogen wird (Import steigt deutlich).
- Nach jedem Schalten werden die internen Delta-Werte zurückgesetzt, um sofortiges Zurückschalten zu vermeiden.
- Ein Dummy (pv_autoSwitch) dient als Ein-/Ausschalter für die Automatik.
⚙️ 1. Dummy zum Aktivieren/Deaktivieren der Automatik
define pv_autoSwitch dummy
attr pv_autoSwitch setList on off
attr pv_autoSwitch webCmd on:off
attr pv_autoSwitch room 00_Strom⚙️ 2. userReadings am Zähler-Device <ZAEHLERNAME>
Berechnet die Differenz (delta) seit der letzten Messung.
attr userReadings \
import_delta { my $v=ReadingsNum($name,"Power_ELZ_PV_1.8.0",0);; my $p=ReadingsVal($name,"Power_ELZ_PV_1.8.0_prev","");; if($p eq ""){ fhem("setreading $name Power_ELZ_PV_1.8.0_prev $v");; return 0; } fhem("setreading $name Power_ELZ_PV_1.8.0_prev $v");; return sprintf("%.6f",$v-$p); }, \
export_delta { my $v=ReadingsNum($name,"Power_ELZ_PV_2.8.0",0);; my $p=ReadingsVal($name,"Power_ELZ_PV_2.8.0_prev","");; if($p eq ""){ fhem("setreading $name Power_ELZ_PV_2.8.0_prev $v");; return 0; } fhem("setreading $name Power_ELZ_PV_2.8.0_prev $v");; return sprintf("%.6f",$v-$p); } ⚙️ 3. DOIF für die Automatiksteuerung
Das DOIF prüft die Deltas und schaltet entsprechend die Tasmota-Steckdose tasmota_0516C4.
Nach jedem Schalten werden die _prev-Readings auf den aktuellen Wert gesetzt → Deltas = 0.
defmod di_pv_socket DOIF \
([pv_autoSwitch] eq "on" && [:import_delta] <= 0.0005 && [:export_delta] >= 0.001) \
( set tasmota_0516C4 on;; \
setreading Power_ELZ_PV_1.8.0_prev {ReadingsNum("","Power_ELZ_PV_1.8.0",0)};; \
setreading Power_ELZ_PV_2.8.0_prev {ReadingsNum("","Power_ELZ_PV_2.8.0",0)} \
) \
DOELSEIF \
([pv_autoSwitch] eq "on" && [:import_delta] >= 0.001) \
( set tasmota_0516C4 off;; \
setreading Power_ELZ_PV_1.8.0_prev {ReadingsNum("","Power_ELZ_PV_1.8.0",0)};; \
setreading Power_ELZ_PV_2.8.0_prev {ReadingsNum("","Power_ELZ_PV_2.8.0",0)} \
) 📋 Erklärung der Schwellenwerte
- import_delta <= 0.0005 → Import max. ~30 W (bei 1 min Intervall).
- export_delta >= 0.001 → Export min. ~60 W (bei 1 min Intervall).
- wait 60:120 → Einschalten erst nach 60 s stabiler Bedingung, Ausschalten nach 120 s.
🔍 Vorteile dieser Lösung
- Keine Endlosschleifen, weil Deltas direkt zurückgesetzt werden.
- Schaltschwellen einfach anpassbar.
- Automatik per Dummy bequem ein-/ausschaltbar.
- Funktioniert unabhängig von der PV-Anlage – nur Lesekopf + FHEM + Tasmota nötig.
Hilfe durch KI und Disclaimer
Nicht unerwähnt bleiben soll an der Stelle, das ich zur Unterstützung bei der Umsetzung und der Dokumentation die Hilfe von KI genutzt habe.
Das Ganze funktioniert bei mir seit geraumer Zeit einwandfrei, unabhängig davon übernehme ich aber keine Haftung für diese Lösung.

