Photovoltaik, Batteriespeicher, E-Auto... clever Energie managen

Begonnen von Yeeha, 26 Januar 2021, 18:27:23

Vorheriges Thema - Nächstes Thema

Yeeha

Hallo zusammen,

noch habe ich keine sehr konkrete Frage, sondern eher: Bin ich auf dem Richtigen Weg (tm)? Ich würde mich freuen, wenn mich der eine oder andere begleiten würde auf meiner Lernkurve, und vielleicht taugt der Thread eines Tages für andere Einsteiger mit ähnlicher Aufgabenstellung.

Ich habe eine PV-Anlage mit Batteriespeicher (S10 von E3DC), die kann modbus. Und ich habe ein E-Auto, das kann keine Konnektivität. Strom kaufen kostest um die 30 ct, Strom einspeisen bringt nur 10 ct, d.h. ich möchte den Anteil des Eigenstroms an meinem Verbrauch optimieren. Und natürlich will ich in der Regel fahrbereit sein.

Was ich bisher am Laufen habe:
- E3DC ist per modbus an FHEM, d.h. ich kenne die aktuellen Werte: Hausverbrauch, Einspeisung/Bezug, (Ent-)Ladestrom der Batterie, Ladezustand der Batterie...
- Über einen Slider kann ich FHEM eingeben, mit welchem Ladezustand im Auto ich daheim angekommen bin.
- Eine WLAN-Steckdose (Delock) mit Strom-/Leistungsmessung und Energiezähler ist per MQTT angebunden, da kann ich mein Ladekabel vom Auto einstecken (statt Wallbox; mehr als 3 kW Überschuss kommen sowieso fast nie aus der PV, und nachts habe ich auch genug Zeit)
- Wenn über die WLAN-Steckdose Energie geht, rechne ich mittels userReadings aus, wieviel jetzt im Auto sein müsste (Ladezustand des Autos bei der Ankunft plus aktueller Energiezählerstand der Steckdose minus Energiezählerstand des Steckdose bei der Ankunft). Anzeigen in einer Grafik geht auch.

Meine Visualisierung ist noch ziemlich Müll, aber bleiben wir mal noch bei der Funktion.

Ich habe mir einen Satz von Regeln überlegt, wann ich das Auto laden will. Beispielsweise immer, wenn die Batterie der PV-Anlage voll ist. Oder wenn das Auto bei unter 50% Ladung ist. Oder wenn der Überschuss der PV-Erzeugung mindestens 2 kW beträgt. Dagegen soll es wieder aus gehen, wenn ich den Strom großteils zukaufen würde (mit Hysterese, damit es nicht nervös schaltet). Diesen Satz von Regeln möchte ich jetzt mit einem einzigen DOIF (DOELSEIF...) implementieren.

Und wenn das gelungen ist, suche ich noch nach einer Möglichkeit, dass ich manuell eingeben kann: "Lade mir auf x% auf", und dann geht die Steckdose für die passende Zeitdauer an, entgegen den o.g. Regeln.

Was meint ihr, klappt das so oder bin ich auf der falschen Spur? Habt ihr ein paar Tips, was ich in dem Zusammenhang beachten sollte?

Herzlichen Dank für eure Unterstützung!

Yeeha

Yeeha

Hallo zusammen,

kleines Update:
Die Regeln habe ich jetzt auch drin, scheint zu funktionieren. Es sind noch nicht alle Bedingungen eingetreten (kaum Ertrag von der PV derzeit), aber grundsätzlich läuft es.

Jetzt habe ich doch eine konkrete Frage. Ich möchte eine Funktion hinzu fügen, wo ich vorgeben kann, auf wie viel ich das Auto aufladen möchte, egal was der o.g. Satz der Regeln sagt. Also beispielsweise meinen meine Regeln, wenn das Auto schon 60% hat, der PV-Speicher im Haus hat nur 30% und es kommt nichts vom Dach, dann schalte ich die Ladesteckdose aus. Mein Wunsch ist jetzt, einen Slider hinzu zu fügen, wo ich einstellen kann, ich will z.B. das Auto auf 80% aufladen, und dann geschieht eben dies, und erst danach gelten wieder die Regeln.

Wie bekomme ich solche zwei Modi hin?

Danke für eure Tipps!

Yeeha

Yeeha

Hallo mal wieder,

auch wenn es etwas zum Selbstgespräch wird hier... vielleicht hilft es ja mal jemandem, der eine ähnliche Aufgabe lösen möchte.

Ich habe die Sache mit den zwei Modi jetzt umgangen, indem ich die Schwelle, bis zu der das Auto "auf jeden Fall mal" geladen werden soll, per Slider einstellbar mache. Und sobald das Auto voll genug ist, geht der Slider für den nächsten Zyklus auf einen Defaultwert (50%). Wenn ich also "manuell" die Ladung auf z.B. 80% erzwingen möchte, drehe ich diesen Slider hoch. Wenn das Auto dann einmal bei 80% war, fällt der Slider auf 50% zurück und nur der Überschuss aus der Solaranlage geht ans Auto, sozusagen der Automatik-Betrieb.

Es scheint alles zu funktionieren. Was mich stutzig macht ist die Verteilung der verwendeten Variablen bzw. Readings und userReadings. Die scheint mir wenig elegant.

Ich habe das Device der Steckdose. Von den Readings verwende ich ENERGY_Total (den Stand des Energiezählers) und das userReading AutoIstSOCkWh (den berechneten Stand der Ladung im Auto in kWh).

Auf der anderen Seite habe ich ein Dummy-Device für die Eingabe von AutoSollSOCProz (Soll-Ladezustand in Prozent), AutoSollSOCkWh (das selbe in kWh umgerechnet), die Eingabe von AutoStartSOCProz (der Ladezustand bei der letzten Ankunft in Prozent, Startwert für die Berechnungen), AutoStartSOCkWh (das selbe in kWh) und - Achtung - auch SteckerStartkWh (der Stand des Energiezählers der o.g. Steckdose) zum Zeitpunkt der letzten Eingabe am Dummy-Device. Ich nehme also die Eingabe am Dummy-Device als Auslöser, von einem anderen Device einen Wert zu holen und ihn wiederum im Dummy-Device zu speichern. Ist das Murks? Wie würde man das "richtig" aufziehen?

Um jetzt im Device der Steckdose AutoIstSOCkWh (den aktuellen Ladezustand des Autos) zu berechnen, nehme ich den aktuellen Energiezähler-Wert am Stecker minus den im Dummy-Device zwischengeparkten Startwert dieses Zählers plus den Startwert der Auto-Batterie bei der Ankunft. Also eine Rechnung zwischen zwei Devices hin und her. Mir kommt das selber fischig vor, aber mir fällt nichts besseres ein.

Wie geht sauberer Stil in FHEM?

Yeeha

Damian

Damit du hier nicht ganz alleine bist :)

Ich mache so etwas innerhalb von einem Modul-Device, ich benutze dazu keine Dummys, sondern Readings innerhalb des eigenen Modul-Devices.

Da du keinerlei konkrete Angaben zu deiner Definition gepostet hast, wird auch nicht so schnell hier jemand konkrete Verbesserungsvorschläge machen ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Yeeha

Hallo Damian,

danke für die Antwort. Also, wenn du dir meine Definitionen antun möchtest...

Hier ist der Dummy mit den Slidern und dem Attribut, wo ich den Zählerstand bei meiner Ankunft zwischenspeichere (SteckerStartkWh):

defmod Auto_Batterie dummy
attr Auto_Batterie group Auto-Ladungsregelung
attr Auto_Batterie icon car
attr Auto_Batterie readingList AutoStartSOCProz AutoSollSOCProz
attr Auto_Batterie room Garage
attr Auto_Batterie setList AutoStartSOCProz:slider,1,1,100,1 AutoSollSOCProz:slider,1,1,100,1
attr Auto_Batterie stateFormat AutoLademengekWh kWh (mind.) aufladen
attr Auto_Batterie userReadings AutoStartSOCkWh {ReadingsVal("Auto_Batterie","AutoStartSOCProz",0)/100*40}, AutoSollSOCkWh {ReadingsVal("Auto_Batterie","AutoSollSOCProz",0)/100*40}, SteckerStartkWh {ReadingsVal("Stecker1","ENERGY_Total",0)}, AutoLademengekWh {ReadingsVal("Auto_Batterie","AutoSollSOCkWh",0)-ReadingsVal("Auto_Batterie","AutoStartSOCkWh",0)}
attr Auto_Batterie webCmd AutoStartSOCProz:AutoSollSOCProz
attr Auto_Batterie webCmdLabel Istwert bei Ankunft (%)\
:Sollwert mindestens(%)


Und hier die WLAN-Steckdose:

defmod Stecker1 MQTT2_DEVICE DVES_2E377E
attr Stecker1 IODev MQTT2_FHEM_Server
attr Stecker1 alias Autosteckdose
attr Stecker1 autocreate 0
attr Stecker1 comment NOTE: For on-for-timer SetExtensions are used. You may add on-for-timer option running on the device. The following is limited to 1h max duration, but will not affect future simple "on" commands:<br>on-for-timer {my $duration = $EVTPART1*10;; 'cmnd/cmnd/DVES_2E377E/Backlog POWER1 1;; delay '.$duration.';; POWER1 0'}<br>See the "Praxisbeispiele" in the wiki for "pulseTime1" alternative option and it's restrictions.
attr Stecker1 group Auto-Ladungsregelung
attr Stecker1 icon hue_filled_outlet
attr Stecker1 jsonMap POWER1:0 POWER2:0 POWER3:0 POWER4:0 Dimmer:0 Channel_0:0 Channel_1:0 Channel_2:0 Channel_3:0 Channel_4:0 HSBColor:0 Color:0
attr Stecker1 model tasmota_basic_state_power1
attr Stecker1 readingList tele/DVES_2E377E/LWT:.* LWT\
  tele/DVES_2E377E/STATE:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  tele/DVES_2E377E/SENSOR:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  tele/DVES_2E377E/INFO.:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  tele/DVES_2E377E/UPTIME:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  stat/DVES_2E377E/POWER1:.* state\
  stat/DVES_2E377E/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr Stecker1 room Garage
attr Stecker1 setList off:noArg    cmnd/DVES_2E377E/POWER1 0\
  on:noArg     cmnd/DVES_2E377E/POWER1 1\
  toggle:noArg cmnd/DVES_2E377E/POWER1 2\
  setOtaUrl:textField cmnd/DVES_2E377E/OtaUrl $EVTPART1\
  upgrade:noArg   cmnd/DVES_2E377E/upgrade 1
attr Stecker1 setStateList on off toggle
attr Stecker1 userReadings AutoIstSOCkWh {ReadingsVal("Auto_Batterie","AutoStartSOCkWh",0) + ReadingsVal("Stecker1","ENERGY_Total",0) - ReadingsVal("Auto_Batterie","SteckerStartkWh",0)}


Darauf wirken dann meine Regeln:

([S10:battsoc] > 95)
    (set Stecker1 on)
DOELSEIF ([Stecker1:AutoIstSOCkWh] < [Auto_Batterie:AutoSollSOCkWh])
    (set Stecker1 on)
DOELSEIF ([06:30-7:00] and [S10:battsoc] > 40)
    (set Stecker1 on)
DOELSEIF ([S10:battsoc] < 50 and [Stecker1:AutoIstSOCkWh] > [Auto_Batterie:AutoSollSOCkWh])
    (set Stecker1 off)
DOELSEIF ([S10:battsoc] > 65 and ([S10:battwatt] + [Stecker1:ENERGY_Power] - [S10:gridwatt]) > 2000)
    (set Stecker1 on)
DOELSEIF ([Stecker1:AutoIstSOCkWh] > [Auto_Batterie:AutoSollSOCkWh] and [S10:gridwatt] > 2000)
    (set Stecker1 off)


Das S10-Zeugs ist von der PV-Anlage, deren Definition habe ich "blind" aus einem anderen Thread übernommen.

Im Prinip nehme ich den Dummy für diejenigen Werte, die nur bei der Ankunft daheim einmal gesetzt werden, und den Stecker für alle Werte, die sich kontinuiertlich ändern.

Schöne Grüße und besten Dank im Voraus!

Yeeha

Damian

Also, alles was du im Dummy machst kannst du auch in deinem DOIF machen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gvzdus

In 1-2 Wochen kommt unser ID.3, dann werde ich auch "mitspielen" beim Steuern & Regeln. Allerdings werden wir uns - wenn wir wissen, ob und wie er in die Garage passt - also ob die Wallbox nach innen oder außen kommt, dann eine Wallbox zulegen (OpenWB natürlich).

Die OpenWB kann mit dem Umschalten 1-phasig / 3-phasig auch den Strombedarf feiner regulieren. Ob das auch eine Lösung für Dich mit dem "dummen" Auto wäre, kannst Du ja mal im OpenWB-Forum recherchieren.

ch.eick

Hallo zusammen,
in diesen Thread Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV) befassen wir uns auch mit Ansteuerung von Starkverbrauchern. Es gibt dazu auch eine Seite von mir im Wiki und in naher Zukunft kommt noch ein zweiter WR und zwei WallBoxen dazu. Interessant wäre eventuell die Geräteansteuerung, dort wird auch mit einfachen Shellys das ein/ausgeschaltet überwacht. Mit Konfigurationsdummy hangelt sich über DOIFs das Gerät dann unterhalb der PV-Leistung mit Einschaltzeiten, Min und Max Werten entlang. Es gibt auch eine Ladesteuerung für den Speicher und eine Leistungsprognose für den aktuellen und nächsten Tag, die auch in den DOIFs mit entscheidet.

Viele Grüße
     Christian

RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick