Meine Wallbox (Hardy Barth) kann zwar Überschuss-Laden, aber trotzdem hat das nicht so wirklich funktioniert und er hat mir regelmäßig meine Batterie (RCT Wechselrichter mit Batterie) leergesaugt.
Ich dachte mir, das kann ich besser ;-)
Wichtig: ich habe noch einen manuellen Umschalter zwischen 1 und 3 Phasigem Laden vor der Wallbox - damit kann ich runter bis auf rund 1500 Watt Ladeleistung (6A x 1 Phase x 240 Volt). Bei Bedarf, kann ich manuell auf 3 Phasen hochschalten.
Die Logik steckt in folgendem DOIF:
defmod Doif_Wallbox_Steuerung DOIF (\
## PV MODUS\
\
[$SELF:Mode] eq "PV" ## PV-Modus des DOIFs\
&& [Wallbox:pvmode] eq "manual" ## Manueller Modus\
&& [Wallbox:chargecontrols_01_connected] eq "1" ## Auto angesteckt\
\
&& [my_rct_device:battery_soc] >= 60 ## Batterie ist schon ausreichend geladen\
&& ([{sunrise()}-{sunset(-7200)}] || [my_rct_device:battery_soc] >= 90) ## bis maximal 2h vor Sonnenuntergang (damit die Batterie sich nochmal erholen kann) oder alternativ die Batterie noch voll...\
&& (\
[my_rct_device:power_solarCombined] ## PV-Leistung\
+ (6 * 240) ## Mindestladung, einphasig\
+ ([my_rct_device:power_battery] < 0 ? ([my_rct_device:power_battery] * -1 - 500) : 0) ## Batterie Ladung (= negativ) ignorieren, bis auf x Watt Reserve...\
- [my_rct_device:power_household_external] ## abzüglich Hausverbrauch\
+ [Wallbox:loading_power] ## abzüglich gegenwärtige Wallbox Ladung\
) >= ((6 * 240 * [Wallbox:phases_connected]) + 100)\
) \
{ \
## Prüfe wieviel Ampere noch möglich sind\
for (my $ampere = 16;; $ampere >= 6;; $ampere = $ampere - 2) \
{\
\
Log 5, "for check ampere: ".$ampere;;\
\
## checke ob PV-Leistung noch reicht\
if (\
(\
[my_rct_device:power_solarCombined] ## PV-Leistung\
+ (6 * 240) ## Mindestladung, einphasig\
+ ([my_rct_device:power_battery] < 0 ? ([my_rct_device:power_battery] * -1 - 500) : 0) ## Batterie Ladung (= negativ) ignorieren, bis auf x Watt Reserve...\
- [my_rct_device:power_household_external] ## abzüglich Hausverbrauch\
+ [Wallbox:loading_power] ## abzüglich gegenwärtige Wallbox Ladung\
)\
>= (($ampere * 240 * [Wallbox:phases_connected]) + 100)\
)\
\
{\
\
## Wenn die Batterie angezapft wird (unter 85%), dann gehe auf Minimal-Ladung...\
if (int(ReadingsVal('my_rct_device','battery_soc', '0') < 85))\
{\
$ampere = 6;;\
}\
\
## setze nur neu, wenn sich Werte ändern\
if ([$SELF:ampere] ne $ampere)\
{\
fhem("setreading $SELF ampere ".$ampere);;\
fhem("set Wallbox manual_amp ".$ampere);;\
Log 5, "neue ampere: ".$ampere;;\
}\
\
## Leistung reicht, also laden!\
fhem("setreading $SELF charge on");;\
fhem("set Wallbox charge start");; \
last;; ## Schleife abbrechen, wenn Wert gefunden \
\
}\
\
}\
}\
DOELSEIF\
(\
## MANUELL Modus\
\
(\
[$SELF:Mode] eq "ManualMin" \
|| [$SELF:Mode] eq "ManualMax"\
|| [$SELF:Mode] eq "MinPlusPV"\
)\
&& [Wallbox:pvmode] eq "manual" ## Manueller Modus\
&& [Wallbox:chargecontrols_01_connected] eq "1" ## Auto angesteckt\
) \
{ \
\
## setze nur neu, wenn sich Werte ändern\
if ("[$SELF:Mode]" eq "ManualMin")\
{\
fhem("setreading $SELF ampere 6");;\
fhem("set Wallbox manual_amp 6");;\
}\
elsif ("[$SELF:Mode]" eq "MinPlusPV")\
{\
my $ampere;;\
\
## Prüfe wieviel Ampere noch möglich sind\
for ($ampere = 16;; $ampere >= 6;; $ampere = $ampere - 2) \
{\
\
Log 5, "for check ampere: ".$ampere;;\
\
## checke ob PV-Leistung noch reicht\
if (\
(\
[my_rct_device:power_solarCombined] ## PV-Leistung\
+ (6 * 240) ## Mindestladung, einphasig\
+ ([my_rct_device:power_battery] < 0 ? ([my_rct_device:power_battery] * -1 - 500) : 0) ## Batterie Ladung (= negativ) ignorieren, bis auf x Watt Reserve...\
- [my_rct_device:power_household_external] ## abzüglich Hausverbrauch\
+ [Wallbox:loading_power] ## abzüglich gegenwärtige Wallbox Ladung\
)\
>= (($ampere * 240 * [Wallbox:phases_connected]) + 100)\
)\
\
{\
\
## Wenn die Batterie angezapft wird (unter 85%), dann gehe auf Minimal-Ladung...\
if (int(ReadingsVal('my_rct_device','battery_soc', '0') < 90))\
{\
$ampere = 6;;\
}\
\
## setze nur neu, wenn sich Werte ändern\
if ([$SELF:ampere] ne $ampere)\
{\
fhem("setreading $SELF ampere ".$ampere);;\
fhem("set Wallbox manual_amp ".$ampere);;\
Log 5, "neue ampere: ".$ampere;;\
} \
last;; ## Schleife abbrechen, wenn Wert gefunden \
}\
}\
\
fhem("setreading $SELF ampere $ampere");;\
fhem("set Wallbox manual_amp $ampere");;\
} \
else\
{\
fhem("setreading $SELF ampere 16");;\
fhem("set Wallbox manual_amp 16");;\
}\
\
## Ladung starten!\
fhem("setreading $SELF charge on");; \
fhem("set Wallbox charge start");; \
}\
DOELSE\
{\
Log 5, "off check";;\
fhem("setreading $SELF ampere 6");;\
fhem("setreading $SELF charge off");;\
Log 5, "neue ampere 6 und off";;\
\
fhem("set Wallbox manual_amp 6");;\
fhem("set Wallbox charge stop");;\
}
attr Doif_Wallbox_Steuerung checkall all
attr Doif_Wallbox_Steuerung do always
attr Doif_Wallbox_Steuerung group Auto
attr Doif_Wallbox_Steuerung readingList Mode
attr Doif_Wallbox_Steuerung room Automatisierung,Steuerung
attr Doif_Wallbox_Steuerung setList Mode:PV,MinPlusPV,ManualMin,ManualMax
attr Doif_Wallbox_Steuerung wait 60:30:180
attr Doif_Wallbox_Steuerung webCmd Mode
Und das ist das Ergebnis (angehängt). Den Peak um 8:45 ignorieren - das war ein Inseltest meiner PV-Anlage...
Kurz zur Funktionsweise:
Zunächst prüft er ob ein Auto angeschlossen ist und die PV Leistung abzüglich Hausleistung und minimaler Wallbox-Ladeleistung einen Überschuss hergibt. Wenn ja, dann durchläuft er eine Schleife und zählt von maximaler Ladung (16 A) runter auf minimale Ladeleistung (6 A) - sobald diese gefunden wurde startet die Ladung.
Das ganze mit einer Hysterese von 60 Sekunden für Start und Einstellung Stromstärke. Abschalten erst nach 5 Min (um Wolkenzüge, Wasserkocher, etc. abzufangen).