Vorstellung E-Auto PV-Überschuss laden

Begonnen von Nogga, 22 Juli 2022, 11:03:10

Vorheriges Thema - Nächstes Thema

Nogga

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] >= 90 ## 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...\
&& ([$SELF:targetBatteryLevel] == 80 ? 90 : [$SELF:targetBatteryLevel]) > [Auto_Enyaq:battery_level] ## entweder Zielladestand erreicht oder wenn nicht gesetzt, dann 95%...\
&& (\
[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\
) \
{ \
\
\
if (\
int("[$SELF:targetBatteryLevel]") <= int(ReadingsVal('Auto_Enyaq','battery_level', '100'))\
## ||\
## int(ReadingsVal('Auto_Enyaq','battery_level', '100') == int(ReadingsVal('Auto_Enyaq','battery_level', 'min_charge_level'))\
   )\
{\
fhem("set pushmsg msg device='AlexPhone11' message='Zielladestand erreicht! Ziel: [$SELF:targetBatteryLevel]% / Ladestand: ".int(ReadingsVal('Auto_Enyaq','battery_level', '100'))."%'");;\
fhem("setreading $SELF Mode PV");;\
}\
\
## 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\
{\
fhem("setreading $SELF ampere 6");;\
fhem("setreading $SELF charge off");;\
fhem("setreading $SELF targetBatteryLevel 80");;\
\
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,targetBatteryLevel
attr Doif_Wallbox_Steuerung room Automatisierung,Steuerung
attr Doif_Wallbox_Steuerung setList Mode:PV,MinPlusPV,ManualMin,ManualMax targetBatteryLevel:slider,15,5,100
attr Doif_Wallbox_Steuerung wait 60:30:180
attr Doif_Wallbox_Steuerung webCmd Mode:targetBatteryLevel
attr Doif_Wallbox_Steuerung webCmdLabel Modus:Zielladestand

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).

Nogga


Nogga

Anbei noch ein schönes Chart von vorgestern, dass die Funktionsweise nochmal schön illustriert.
Das zweite "wilde" Chart hat mehr Ladung aber keine schöne Kurve zeigt aber, dass auch bei Wolkenhimmel die Batterie (bzw. das Netz) selten (= Hysterese) bis gar nicht belastet wird...

immerdasgleiche

Schönes Projekt! Habe das gleiche Problem.

Wie hast du deine Hardy Barth Wallbox in FHEM eingebunden? Ich habe ein passendes Modul bis jetzt nicht finden können :/

Nogga

Ich habe kein Modul genutzt, sondern die REST-API und das HTTPMOD-Modul drangekoppelt:

http://apidoc.ecb1.de/#/

Das ist das HTTMOD-Device. Aber natürlich komplett auf meine Bedürfnisse zugeschnitten.
Ich nutze den manuellen Modus für meine PV-Steuerung.


defmod Wallbox HTTPMOD http://192.168.178.152/api/v1/all 60
attr Wallbox DbLogInclude wallbox_meter,loading_power
attr Wallbox eventMap /charging_mode eco:eco/charging_mode quick:quick/charging_mode manual:manual/pv_overage true:AI on/pv_overage false:AI off
attr Wallbox extractAllJSON 1
attr Wallbox get01ExtractAllJSON 1
attr Wallbox get01Name pvmode
attr Wallbox get01Poll 1
attr Wallbox get01PollDelay 60
attr Wallbox get01URL http://192.168.178.152/api/v1/pvmode
attr Wallbox get02ExtractAllJSON 1
attr Wallbox get02Name ai_mode
attr Wallbox get02Poll 1
attr Wallbox get02PollDelay 60
attr Wallbox get02URL http://192.168.178.152/api/v1/chargecontrols/1/mode/eco/startstop
attr Wallbox get03CheckAllReadings 1
attr Wallbox get03JSON 1-0:1.8.0
attr Wallbox get03Name wallbox_meter
attr Wallbox get03Poll 1
attr Wallbox get03PollDelay 60
attr Wallbox get03URL http://192.168.178.152/api/v1/meters/1
attr Wallbox getHeader1 Content-Type: application/json
attr Wallbox group Auto
attr Wallbox reading1JSON meter_data_1-0:1.8.0
attr Wallbox reading1Name wallbox_meter
attr Wallbox reading2JSON meter_data_1-0:1.4.0
attr Wallbox reading2Name loading_power
attr Wallbox reading3JSON meter_data_1-0:32.4.0
attr Wallbox reading3Name L1_voltage
attr Wallbox reading4JSON meter_data_1-0:52.4.0
attr Wallbox reading4Name L2_voltage
attr Wallbox reading5JSON meter_data_1-0:72.4.0
attr Wallbox reading5Name L3_voltage
attr Wallbox reading6JSON chargecontrols_01_manualmodeamp
attr Wallbox reading6Name current_manual_amp
attr Wallbox room Steuerung
attr Wallbox set01Data pvmode=$val
attr Wallbox set01FollowGet pvmode
attr Wallbox set01Header Accept: application/json
attr Wallbox set01Hint eco,quick,manual
attr Wallbox set01Method POST
attr Wallbox set01Name charging_mode
attr Wallbox set01TextArg eco,quick,manual
attr Wallbox set01URL http://192.168.178.152/api/v1/chargecontrols/1/mode
attr Wallbox set02Data autostartstop=$val
attr Wallbox set02FollowGet ai_mode
attr Wallbox set02Header Accept: application/json
attr Wallbox set02Hint true,false
attr Wallbox set02Method POST
attr Wallbox set02Name pv_overage
attr Wallbox set02TextArg true,false
attr Wallbox set02URL http://192.168.178.152/api/v1/chargecontrols/1/mode/eco/startstop
attr Wallbox set03Data empty
attr Wallbox set03Header Accept: application/json
attr Wallbox set03Hint start,stop
attr Wallbox set03Method POST
attr Wallbox set03Name charge
attr Wallbox set03TextArg start,stop
attr Wallbox set03URL http://192.168.178.152/api/v1/chargecontrols/1/$val
attr Wallbox set04Data manualmodeamp=$val
attr Wallbox set04FollowGet pvmode
attr Wallbox set04Header Accept: application/json
attr Wallbox set04Hint 6,6.5,7,7.5,8,8.5,9,9.5,10,10.5,11,11.5,12,12.5,13,13.5,14,14.5,15,15.5,16
attr Wallbox set04Method POST
attr Wallbox set04Name manual_amp
attr Wallbox set04TextArg 6,6.5,7,7.5,8,8.5,9,9.5,10,10.5,11,11.5,12,12.5,13,13.5,14,14.5,15,15.5,16
attr Wallbox set04URL http://192.168.178.152/api/v1/chargecontrols/1/mode/manual/ampere
attr Wallbox stateFormat pvmode / Phasen: phases_connected / Ladeleistung: loading_power W
attr Wallbox userReadings phases_connected { (ReadingsVal($name, "L2_voltage","0") eq "0") ? "1" : "3" }
attr Wallbox webCmd eco:quick:manual:AI on:AI off

Juergen

Danke, Nogga! Da habe ich lange drauf gewartet! Funktioniert einwandfrei!!!

Nogga

Update:

Habe meine neueste Version des DOIF zur Verfügung gestellt. Zukauf-Logik habe ich entfernt - die brauche ich persönlich eigentlich nicht wirklich.
Stattdessen sind nun noch Manuell-Lademodi hinzugekommen:
- ManualMin = Immer mit Minimal-Leistung laden (6A)
- ManualMax = Das gleiche mit Maximum (16A)
Beide Modi gibt es natürlich auch built-in - aber damit kann ich alles aus FHEM bequem steuern.

Zusätzlich noch ein
ManualMinPlusPV = Er lädt immer mit 6A ODER: wenn die Batterie mindestens zu 90% geladen ist UND genügend Überschuss da ist - auch mit mehr (dynamisch mit der gleichen Logik wie PV).
Damit kann ich eine Mindestladung über den Tag PLUS bedarfsweise Überschuss laden... Für mich ideal in der Übergangszeit und im Winter... (bisher klappt das prima).

Bisher konnte ich damit seit Juli fast 5500 km komplett vom Dach laden...

sigma415

#7
Zitat von: Nogga am 15 November 2022, 17:15:32Update:

Habe meine neueste Version des DOIF zur Verfügung gestellt. ....


Hallo Nogga, ich hab jetzt lange rumexperimeniert mit dem SAE (Smart Appliance Enabler) in Verbindung mit meinen SMA STP10.0, SMA HM 2.0, BYD-Speicher und go-echarger, hatte aber das gleiche Problem: beim eAuto-Laden wird oft der BYD-Speicher leergezogen. Und ich finde es nicht so recht intelligent, die PV-Energie verlustreich zwischen den Speichern zu verschieben. Daher möchte ich das auch so wie Du per FHEM lösen.

Allerdings: Wo finde ich dein neuestes DOIF ???

Ist das oben im ersten Post das Update ?
FHEM auf ubuntu-Server (Notebook), CUNO's via LAN, 3x HMLAN, 2x goE, Tasmota-Devices via MQTT, Home Connect, Velux-KLF200, Harmony, SMA STP10, SMA HM2.0, BYD HVS7.7, etc. pp.  ....
Und immer noch viele, viele (Alt-) HM's (ohne -IP).

Christoph.A

Hallo Nogga

für welche Wallbox ist das Setup? Ich habe seit einer Woche eine cPμ2 Wallbox, die auch gerne von der Hausbatterie nascht.

Nogga

Ich habe tatsächlich eine cPH2 (https://www.echarge.de/de/fuer_zuhause) als RCT Wallbox gebrandet.
Es ist gut möglich das der Code auch dafür funktioniert - häufig wird ja die gleiche Software genutzt... Müsstest Du mal recherchieren.
Ansonsten kann man die "Intelligenz" natürlich auch an die eigene Umgebung anpassen. Wichtig wäre nur, dass die Wallbox ein externes steuern erlaubt und Du die PV-Daten irgendwo hast...

Christoph.A

Die Werte meiner Wallbox werden mit angezeigt und einen Plot habe ich auch erzeugen können.
Jedoch das Setzen von neuen Werten funktioniert bis dato noch nicht.
Per curl kann ich neue Werte an die Wallbox senden. Bspw.: "curl -X PUT -d '{"salia/chargemode":"power"}' http://192.168.50.24/api/secc" mit den Parameter eco/manual/power
Diese werden dann auch auf der Wallbox Webseite geändert angezeigt.
An deinem Code habe ich bis jetzt nur die IP-Adresse geändert und DbLogInclude auskommentiert und habe einen Text-Logfile angelegt.
Die Funktionsweise von defmod/HTTPmod und set sind mir noch nicht ganz klar. Muss ich mich noch einlesen. Hast du einen Tip für ein kommentiertes Beispiel?
Grüße und Danke Christoph

Nogga

Ach daran haperts...
Dann geb ich Dir mal meinen HTTPMOD Code für meine Wallbox:

defmod Wallbox HTTPMOD http://192.168.178.15/api/v1/all 30
attr Wallbox DbLogInclude wallbox_meter,loading_power
attr Wallbox eventMap /charging_mode eco:eco/charging_mode quick:quick/charging_mode manual:manual/pv_overage true:AI on/pv_overage false:AI off
attr Wallbox extractAllJSON 0
attr Wallbox get01ExtractAllJSON 1
attr Wallbox get01Name pvmode
attr Wallbox get01Poll 1
attr Wallbox get01PollDelay 60
attr Wallbox get01URL http://192.168.178.15/api/v1/pvmode
attr Wallbox get02ExtractAllJSON 1
attr Wallbox get02Name ai_mode
attr Wallbox get02Poll 1
attr Wallbox get02PollDelay 60
attr Wallbox get02URL http://192.168.178.15/api/v1/chargecontrols/1/mode/eco/startstop
attr Wallbox get03CheckAllReadings 1
attr Wallbox get03JSON 1-0:1.8.0
attr Wallbox get03Name wallbox_meter
attr Wallbox get03Poll 1
attr Wallbox get03PollDelay 60
attr Wallbox get03URL http://192.168.178.15/api/v1/meters/1
attr Wallbox getHeader1 Content-Type: application/json
attr Wallbox group Auto
attr Wallbox reading1JSON meter_data_1-0:1.8.0
attr Wallbox reading1Name wallbox_meter
attr Wallbox reading2JSON meter_data_1-0:1.4.0
attr Wallbox reading2Name loading_power
attr Wallbox reading3JSON meter_data_1-0:32.4.0
attr Wallbox reading3Name L1_voltage
attr Wallbox reading4JSON meter_data_1-0:52.4.0
attr Wallbox reading4Name L2_voltage
attr Wallbox reading5JSON meter_data_1-0:72.4.0
attr Wallbox reading5Name L3_voltage
attr Wallbox reading6JSON chargecontrols_01_manualmodeamp
attr Wallbox reading6Name current_manual_amp
attr Wallbox room Steuerung
attr Wallbox set01Data pvmode=$val
attr Wallbox set01FollowGet pvmode
attr Wallbox set01Header Accept: application/json
attr Wallbox set01Hint eco,quick,manual
attr Wallbox set01Method POST
attr Wallbox set01Name charging_mode
attr Wallbox set01TextArg eco,quick,manual
attr Wallbox set01URL http://192.168.178.15/api/v1/chargecontrols/1/mode
attr Wallbox set02Data autostartstop=$val
attr Wallbox set02FollowGet ai_mode
attr Wallbox set02Header Accept: application/json
attr Wallbox set02Hint true,false
attr Wallbox set02Method POST
attr Wallbox set02Name pv_overage
attr Wallbox set02TextArg true,false
attr Wallbox set02URL http://192.168.178.15/api/v1/chargecontrols/1/mode/eco/startstop
attr Wallbox set03Data empty
attr Wallbox set03Header Accept: application/json
attr Wallbox set03Hint start,stop
attr Wallbox set03Method POST
attr Wallbox set03Name charge
attr Wallbox set03TextArg start,stop
attr Wallbox set03URL http://192.168.178.15/api/v1/chargecontrols/1/$val
attr Wallbox set04Data manualmodeamp=$val
attr Wallbox set04FollowGet pvmode
attr Wallbox set04Header Accept: application/json
attr Wallbox set04Hint 6,6.5,7,7.5,8,8.5,9,9.5,10,10.5,11,11.5,12,12.5,13,13.5,14,14.5,15,15.5,16
attr Wallbox set04Method POST
attr Wallbox set04Name manual_amp
attr Wallbox set04TextArg 6,6.5,7,7.5,8,8.5,9,9.5,10,10.5,11,11.5,12,12.5,13,13.5,14,14.5,15,15.5,16
attr Wallbox set04URL http://192.168.178.15/api/v1/chargecontrols/1/mode/manual/ampere
attr Wallbox stateFormat pvmode / Phasen: phases_connected / Ladeleistung: loading_power W
attr Wallbox userReadings phases_connected { (ReadingsVal($name, "L2_voltage","0") eq "0") ? "1" : "3" }
attr Wallbox webCmd quick:manual

Die Commands habe ich aus der API Doku:
http://apidoc.ecb1.de/#/

Damit solltest Du eigentlich alle Inputs für Deinen eigenen Code haben :-)

BTW: Ich habe noch meinen Eingangscode mit meiner letzten (momentan gut funktionierend Version seit 12 Monate...) aktualisiert.