Autor Thema: PV-Überschussladen via DOIFs und Go-E-Charger  (Gelesen 342 mal)

Offline Muschelpuster

  • Sr. Member
  • ****
  • Beiträge: 795
  • Wanzen müssen draußen bleiben - Pech gehabt Alexa!
PV-Überschussladen via DOIFs und Go-E-Charger
« am: 24 Oktober 2021, 18:01:37 »
Moin zusammen,

Ich will mal meine Regelung zum Solar-Überschussladen mit DOIFs posten. Das ist keine hohe Schule, funktioniert aber.

Ausgangslage:
Meine Solaranlage hat keinen Speicher und nur 4,2kWp. Da unser Auto hauptsächlich halbtags auf Kurzstrecken unterwegs ist bekommt es genug Sonne ab um es primär mit Sonnenstrom zu laden.
Mein E-Zähler hat eine IR-Schnittstelle die ich durch die räumliche Trenung und die Einfachheit mit NodeRed auslese und die Werte per MQTT an FHEM sende. Ursprünglich habe ich das mit dem Volkszähler gemacht, aber NodeRed ist einfach einfacher. Daher nutze ich NodeRed auch dazu Durchschnittswerte des Verbrauchs der ca. letzen 1, 5, 10 und 15 Minuten zu ermitteln und zu senden.
In der Garage hängt mein Go-E und wird über das Go-E-Modul im FHEM ausgelesen und gesteuert.

Funktion:
Ich kann einen Zukaufswert einstellen, da unsere Solaranlage ja nicht so groß ist. Das geht in 1A-Schritten. Der Go-E wird am Laden gehindert, indem die RFID-Autorisierung aktiv ist. Möchte ich manuell laden, dann kann ich einfach den Chip vorhalten oder das Laden über die App starten. Dabei sind alle Solar-Regeln außer Gefecht gesetzt, da diese sehen, dass das Auto trotz Mode RFID lädt. Zur Solarladung wird der Charger auf Mode Open gestellt.

Einschränkungen / offene Punkte:
Derzeit mache ich die Phasenumschaltung manuell. Auch wird die Leistung nach dem Ladestart zumeist erst einmal erhöht, da ich bislang die erste Anpassung der Ladeleistung nicht in Abhängigkeit der Startzeit der Ladung verzögere.
Ich hatte das Ganze ursprünglich in einem DOIF und habe das zur anfänglichen Fehlersuche etwas entzerrt. Jetzt könnte wieder alles in ein DOIF, so ist es aber auch erst einmal ok.

Zählerwerte mit User-Readings Ladesteuerung_Auto_*
defmod MQTT2_node_red_e_zaehler MQTT2_DEVICE node_red_e_zaehler
attr MQTT2_node_red_e_zaehler IODev mqtt_Broker
attr MQTT2_node_red_e_zaehler alias E-Zähler
attr MQTT2_node_red_e_zaehler group E-Zähler
attr MQTT2_node_red_e_zaehler readingList node_red__e_zaehler:e-zaehler\x5cwerte:.* { json2nameValue($EVENT) }
attr MQTT2_node_red_e_zaehler room Energie
attr MQTT2_node_red_e_zaehler stateFormat Einkauf: einkauf_gerundet kWh | Verkauf: verkauf_gerundet kWh | Aktuell: aktuell W
attr MQTT2_node_red_e_zaehler userReadings einkauf_gerundet {int(ReadingsVal("MQTT2_node_red_e_zaehler","einkauf",0)+0.5)},\
verkauf_gerundet {int(ReadingsVal("MQTT2_node_red_e_zaehler","verkauf",0)+0.5)},\
letzte_5min {int(ReadingsVal("MQTT2_node_red_e_zaehler","letzte_5min",0))},\
letzte_10min {int(ReadingsVal("MQTT2_node_red_e_zaehler","letzte_10min",0))},\
letzte_15min {int(ReadingsVal("MQTT2_node_red_e_zaehler","letzte_15min",0))},\
Ladesteuerung_Auto {ReadingsVal("MQTT2_node_red_e_zaehler","aktuell",10000)-ReadingsVal("di_ueberschussladen","Zukauf",0)},\
Ladesteuerung_Auto_05 {int(ReadingsVal("MQTT2_node_red_e_zaehler","letzte_5min",10000))-ReadingsVal("di_ueberschussladen","Zukauf",0)},\
Ladesteuerung_Auto_10 {int(ReadingsVal("MQTT2_node_red_e_zaehler","letzte_10min",10000))-ReadingsVal("di_ueberschussladen","Zukauf",0)},\
Ladesteuerung_Auto_15 {int(ReadingsVal("MQTT2_node_red_e_zaehler","letzte_15min",10000))-ReadingsVal("di_ueberschussladen","Zukauf",0)}
Hier werden aus den gesendeten Werten einige User-Readings unter Beihilfe meines Zukauf-Sliders Zukauf aus dem DOIF di_ueberschussladen genutzt. Diese Werte habe ich in den Zähler ausgelagert, weil sie dann automatisch triggern. Grundsätzlich ziehe ich den Zukaufswert nur vom echten wert ab und kann so das Regelverhalten über oder unter die Nulllinie verschieben.

Ein-/Ausschalten der Ladung:
defmod di_ueberschussladen DOIF ## cmd_1: Starte Ladung wenn genug Überschuss vorhanden ist:\
([MQTT2_node_red_e_zaehler:Ladesteuerung_Auto_15]<-1400 and \
[MQTT2_node_red_e_zaehler:Ladesteuerung_Auto_10]<-1400 and \
[MQTT2_node_red_e_zaehler:Ladesteuerung_Auto_05]<-1400 and \
([myGoE:car_state]==3 or [myGoE:car_state]==4) and\
[myGoE:access_control_state] eq "by_RFID_or_App" and\
[di_schaltsperre:state] ne "cmd_2")\
(set myGoE amp_current 6) (set myGoE allow_charging 1)\
(set myGoE access_control_state access_open)\
(set di_schaltsperre cmd_4)\
DOELSEIF\
## cmd_2: Stoppe Ladung, wenn nicht genug Überschuss vorhanden ist: \
([MQTT2_node_red_e_zaehler:Ladesteuerung_Auto_05]>100 and \
[myGoE:access_control_state] eq "access_open" and\
[myGoE:car_state]==2 and \
[myGoE:amp_current]<7 and\
[myGoE:allow_charging]==1 and\
[di_schaltsperre:state] ne "cmd_4") \
(set myGoE allow_charging 0)\
(set myGoE amp_current 12)\
(set myGoE access_control_state by_RFID_or_App)\
(set di_schaltsperre cmd_2)\
DOELSEIF\
## cmd_3: Breche Timer für Ladestopp ab, wenn Bedingung nicht stabil ist:\
([MQTT2_node_red_e_zaehler:Ladesteuerung_Auto_05]<100 and \
[myGoE:access_control_state] eq "access_open" and\
[myGoE:car_state]==2 and \
[myGoE:amp_current]<7 and\
[myGoE:allow_charging]==1 and\
[di_ueberschussladen:wait_timer]=~"cmd_2") \
()\
DOELSEIF\
## cmd_4: Sperre Wallbox wenn kein Auto angesteckt ist (verhindert automatischen Ladestart beim nächsten Stecken)\
([myGoE:car_state]<2) \
(set myGoE access_control_state by_RFID_or_App)\
(set myGoE amp_current 12)\
(set di_einschaltsperre cmd_1)\

attr di_ueberschussladen alias Auto Start/Stop Ladung
attr di_ueberschussladen devStateIcon disabl.*:general_aus:enable initi.*|cmd.*:general_an:disable .*rro.*:icoTool
attr di_ueberschussladen group Auto
attr di_ueberschussladen readingList Zukauf
attr di_ueberschussladen repeatsame 1:1:0:1
attr di_ueberschussladen room Energie
attr di_ueberschussladen setList Zukauf:slider,-460,230,3680
attr di_ueberschussladen wait 0,2,2:180,2,2,1,1:0:0,2,1
attr di_ueberschussladen webCmd Zukauf
attr di_ueberschussladen webCmdLabel erlaubter Zukauf in W
Hier ist also der oben erwähnte Slider Zukauf zu sehen. Ansonsten gibt es eben den Start und den Stop der Ladung mit etwas Verzögerung dazu und ein Abbruch der Wait-Timer, wenn die Bedingungen nicht stabil gegeben sind. Zudem sieht man, dass ich auf das di_schaltsperre zugreife. Das ist meine 'Eieruhr' um ein zu schnelles Ein- und Ausschalten zu verhinden. Würde ich das hier mit einem Wait-Timer machen, so müsste der immer erst einmal ablaufen, auch wenn die letzte Statusänderung schon lange genug her ist. Daher habe ich das ausgelagert.

Anpassung der Ladeleistung:
defmod di_ueberschussladen_reglung DOIF ## cmd_1: Erhöhe Ladung, wenn genug Überschuss vorhanden ist:\
([MQTT2_node_red_e_zaehler:Ladesteuerung_Auto_05]<-250 and \
[myGoE:access_control_state] eq "access_open" and\
[myGoE:car_state]==2 and \
[myGoE:amp_current]<16 and\
[myGoE:allow_charging]==1)\
(set myGoE amp_current {([myGoE:amp_current]+1)})\
DOELSEIF\
## cmd_2: Breche Timer für Erhöhung der Ladung ab, wenn Bedingung nicht stabil ist:\
([MQTT2_node_red_e_zaehler:Ladesteuerung_Auto_05]>-250 and \
[myGoE:access_control_state] eq "access_open" and\
[di_ueberschussladen_reglung:wait_timer]=~"cmd_1") \
()\
DOELSEIF\
## cmd_3: Reduziere Ladung, wenn nicht genug Überschuss vorhanden ist:\
([MQTT2_node_red_e_zaehler:Ladesteuerung_Auto_05]>50 and \
[myGoE:access_control_state] eq "access_open" and\
[myGoE:car_state]==2 and\
[myGoE:amp_current]>6 and\
[myGoE:allow_charging]==1)\
(set myGoE amp_current {([myGoE:amp_current]-1)})\
DOELSEIF\
## cmd_4: Breche Timer für Reduktion der Ladung ab, wenn Bedingung nicht stabil ist:\
([MQTT2_node_red_e_zaehler:Ladesteuerung_Auto_05]<50 and \
[di_ueberschussladen_reglung:wait_timer]=~"cmd_3") \
()\

attr di_ueberschussladen_reglung alias Auto Regelung Ladeleistung
attr di_ueberschussladen_reglung devStateIcon disabl.*:general_aus:enable initi.*|cmd.*:general_an:disable .*rro.*:icoTool
attr di_ueberschussladen_reglung do always
attr di_ueberschussladen_reglung group Auto
attr di_ueberschussladen_reglung readingList Zukauf
attr di_ueberschussladen_reglung room Energie
attr di_ueberschussladen_reglung wait 120:0:120:0
Wie schon geschrieben kann das auch in die Start- / Stop-Regel mit rein. Mal sehen, ob ich das mal wieder alles zusammen klebe.

Die Eieruhr:
defmod di_schaltsperre DOIF ([di_schaltsperre:state] eq "cmd_2") ()\
DOELSEIF\
([di_schaltsperre:state] eq "cmd_X") ()\
DOELSEIF\
([di_schaltsperre:state] eq "cmd_4") ()\
DOELSEIF\
([di_schaltsperre:state] eq "cmd_Y") ()
attr di_schaltsperre alias Timer Schaltverzögerung
attr di_schaltsperre devStateIcon cmd_2:time_timer:initialize \
disabl.*:general_aus:enable\
initi.*|cmd.*:general_an:disable\
.*rro.*:icoTool
attr di_schaltsperre group Auto
attr di_schaltsperre room Energie
attr di_schaltsperre wait 720:0:720:0
Die Eieruhr wird einfach auf cmd_2 oder cmd_4 gesetzt um sie 'aufzuziehen- damit triggert man sie selber und der Wait-Timer läuft ab und sie 'schaltet um'. Daiman meinte, dass das garnicht geht, hat es jetzt aber 'abgenickt' ;-)

Fehlerabsicherung:
defmod di_ueberschussladen_fehlerabschaltung DOIF ## cmd_1: Stoppe Ladung, falls Abregelung nicht funktioniert:\
([MQTT2_node_red_e_zaehler:Ladesteuerung_Auto_15]>750 and\
[myGoE:access_control_state] eq "access_open" and\
[myGoE:car_state]==2 and \
[myGoE:allow_charging]==1) \
(set myGoE allow_charging 0)\
(set myGoE amp_current 12)\
(set myGoE access_control_state by_RFID_or_App)\
(set di_schaltsperre cmd_2)\
DOELSEIF\
## cmd_2: Reset des DOIF, wenn automatische Ladung startet\
([di_ueberschussladen:state] eq "cmd_1") ()\

attr di_ueberschussladen_fehlerabschaltung alias Laderegelung Auto Fehlerabsicherung
attr di_ueberschussladen_fehlerabschaltung devStateIcon disabl.*:general_aus:enable initi.*|cmd.*:general_an:disable .*rro.*:icoTool
attr di_ueberschussladen_fehlerabschaltung group Auto
attr di_ueberschussladen_fehlerabschaltung room Energie
attr di_ueberschussladen_fehlerabschaltung wait 4500,2,2,1:0
Ich hatte es 2x, dass die Reduzierung der Ladeleistung scheinbar artig ausgeführt wurde, der Charger oder das Modul sich aber nicht darum geschert haben. Daher habe ich diese Fehlerabsicherung eingebaut, die rein grätscht, wenn das mal wieder passieren sollte.


Soweit also der Ausflug in meine bescheidenen Ideen dazu - vielleicht kann der Eine oder Andere ja einige Anregungen für seine eigen Ladereglung gebrauchen. Ud natürlich freue ich mich über Optimierungen ;-)

Niels
fhem @ ZBOX mit 1,6MHz Celeron, 4GB RAM & 120GB SSD mit Debian Stretch
1-Wire via Sheepwalk RPI2 @ raspberry B 512 # MiLight # Homematic via HM-CFG-LAN # W&T WebIO # Rademacher DuoFern # ESPeasy # logdb@mysql # configdb@mysql # Shelly @ MQTT2 # go-eCharger mit PV-Überschussladung via DOIF
Gefällt mir Gefällt mir x 1 Liste anzeigen