DOIF: Einfache Überschuss-Steuerung für Photovoltaik

Begonnen von Torxgewinde, 11 April 2023, 10:31:16

Vorheriges Thema - Nächstes Thema

Torxgewinde

Eine ganz einfache Regel für Stromüberschuss lässt sich realisieren, wenn man den Stromzähler oder ein Smartmeter als Input (=hier Device: "Stromzaehler", Reading "Leistung_Stromnetz_Mittelwert") nimmt. Die Logik ist, wenn lange mehr eingespeist wird (Reading "delay" in Sekunden) als der zu schaltende Verbraucher aufnimmt (Reading "power" in Watt), dann schalte ein. Wenn 20 Sekunden lang nur noch ganz wenig (=hier 100 Watt) eingespeist wird, dann schalte wieder ab.

Mehrere dieser Module lassen sich kombinieren, wenn man die Verzögerungen zum Zuschalten (=reading "delay") jeweils unterschiedlich wählt. Der am höchsten priorisierte Überschuss-Verbraucher hat das kleinste Delay. Er schaltet also als erster auf und der eingespeiste Strom verringert sich entsprechend um den Leistungsbedarf. Erst wenn auch für den nächsten, geringer priorisierten Verbraucher auch genug Leistung bereit steht, schaltet sich auch dieser auf. Sinkt die eingespeiste Leistung unter 100 Watt, gehen alle Überschuss-Verbraucher gleichzeitig aus. Man könnte die Abschaltverzögerung auch untersschiedlich wählen, damit nicht alle Verbraucher gleichzeitig abschalten. Der am niedrigsten priorisierte Verbraucher hätte dann für das Abschalten die kleinste Verzögerung (=hier 20 Sekunden). Diese Lösung ist für Verbraucher, die man beliebig ein- und ausschalten kann, elektrische Heizungen oder Heizstäbe zum Beispiel.

defmod UberschussVerbraucher.control DOIF ([$SELF:command] eq "Automatik" and [Stromzaehler:Leistung_Stromnetz_Mittelwert:d] <= -1.0*[$SELF:power])\
    { Log 1, "🤖⚡ Stromüberschuss-Verbraucher AN" }\
    (set UeberschussVerbraucher.device on)\
DOELSEIF ([$SELF:command] eq "Automatik" and [Stromzaehler:Leistung_Stromnetz_Mittelwert:d] > -100)\
    { Log 1, "🤖🚫 Stromüberschuss-Verbraucher AUS" }\
    (set UeberschussVerbraucher.device off)\
DOELSEIF (["$SELF:command: Aus"])\
    { Log 1, "✋🚫 Stromüberschuss-Verbraucher manuell AUS" }\
    (set UeberschussVerbraucher.device off)\
DOELSEIF (["$SELF:command: An"])\
    { Log 1, "✋⚡ Stromüberschuss-Verbraucher manuell AN" }\
    (set UeberschussVerbraucher.device on)
attr UberschussVerbraucher.control alias Überschuss-Verbraucher Steuerung
attr UberschussVerbraucher.control cmdState Automatik AN|Automatik AUS|Manuell AUS|Manuell AN
attr UberschussVerbraucher.control readingList command delay power
attr UberschussVerbraucher.control setList command:uzsuSelectRadio,An,Aus,Automatik\
delay:slider,0,1,600\
power:slider,100,100,3600
attr UberschussVerbraucher.control stateFormat &nbsp;;command (state)
attr UberschussVerbraucher.control wait [$SELF:delay]:20:0:0
attr UberschussVerbraucher.control webCmd command

setstate UberschussVerbraucher.control 2023-03-20 07:18:08 delay 300
setstate UberschussVerbraucher.control 2023-03-24 14:50:17 power 1000

Falls die Werte vom Smartmeter (hier Teil eines Device "Stromzaehler") zu sehr schwanken, kann man auf dem Mittelwert arbeiten. Die Funktion movingAverageT (Wiki, Forum) ist dafür geeignet. Bei dem Smartmeter/Stromzähler/Wechselrichter Device kann man ein userReading des gleitenden Mittelwertes der letzten 600 Sekunden anlegen:
define Stromzaehler ...
...
attr Stromzaehler userReadings Leistung_Stromnetz_Mittelwert:PM_active_power.* { ## Bezug/Einspeisung in das Netz\
sprintf("%.1f", -1.0 * movingAverageT("Stromzaehler", "PM_active_power", 600));;\
},\
...

Du darfst diesen Dateianhang nicht ansehen.

Torxgewinde

#1
Es gibt mittlerweile auch eine neue DOIF Funktion, die man sich ggf. auch zunutze machen könnte: diffpsec. Auch dort bitte noch die Zeiten zum Zuschalten und Abschalten konfigurieren.

Torxgewinde

#2
Eine Variation habe ich für einen Verbraucher wie eine Spülmaschine/Waschmaschine vorgenommen: Das Gerät hat eine schaltbare Steckdose mit gut erreichbarem An/Aus Taster vorgeschaltet und es soll ein einmal gestarteter Spülvorgang nicht wieder abgebrochen/unterbrochen werden, selbst wenn die Sonne dann nachlässt.

Nutzung:
Man belädt die Spülmaschine (oder Waschmaschine), schaltet am Gerät ein und drückt, bevor der Spülvorgang bzw. Waschvorgang so richtig beginnt, auf den Taster an der Funksteckdose um den Spülvorgang an der Stelle zu pausieren (Zwischenstecker geht dann AUS, Ausgang also stromlos). Je nach Maschine, vermutlich aber bei den meisten, wird der Vorgang weiter fortgesetzt wenn der Strom wieder eingeschaltet wird. Diesen Job des Wiedereinschaltens, wenn Solarüberschuß da ist, übernimmt das DOIF:

defmod Steckdose.Spuelmaschine.control DOIF ([$SELF:command,"Automatik"] eq "Automatik" and [Stromzaehler:Leistung_Stromnetz_Mittelwert:d] <= -1.0*[$SELF:power,1000] and [Spuelmaschine:state] ne "on")\
{ Log 1, "🤖🍽🔌 Stromüberschuss in Spuelmaschine AN" }\
(set Spuelmaschine on)\
DOELSEIF ([$SELF:command,"Automatik"] eq "Automatik" and [Spuelmaschine:state] eq "off")\
{ Log 1, "✋🍽🚫 Spuelmaschine ausgeschaltet und wieder bereit für Automatik" }\
DOELSEIF (["$SELF:command: Aus"])\
{ Log 1, "✋🍽🚫 Spuelmaschine manuell AUS" }\
(set Spuelmaschine off)\
DOELSEIF (["$SELF:command: An"])\
{ Log 1, "✋🍽🔌 Spuelmaschine manuell AN" }\
(set Spuelmaschine on)
attr Steckdose.Spuelmaschine.control alias Spuelmaschine Steuerung
attr Steckdose.Spuelmaschine.control cmdState Automatik AN|Automatik BEREITSCHAFT|Manuell AUS|Manuell AN
attr Steckdose.Spuelmaschine.control group Spuelmaschine
attr Steckdose.Spuelmaschine.control readingList command delay power
attr Steckdose.Spuelmaschine.control room Küche
attr Steckdose.Spuelmaschine.control setList command:uzsuSelectRadio,An,Aus,Automatik\
delay:slider,0,1,1200\
power:slider,100,100,3600
attr Steckdose.Spuelmaschine.control stateFormat &nbsp;;command (state)
attr Steckdose.Spuelmaschine.control wait [$SELF:delay,300]:0:0:0
attr Steckdose.Spuelmaschine.control webCmd command

Wer auch eine Solarprognose hat, kann dies als weitere Bedingung im ersten DOIF-Fall mit einbauen. Was auch interssant wäre, ist ein "Schalte spätestens um XX:XX Uhr" ein Fall. Postet gerne wenn ihr Verbesserungen in diese Richtungen habt.

fhainz

Ich verwende das SolarForecast Modul in Kombination mit einem Modbus Zähler und einem Relais.
Geschirrspüler normal einschalten, FHEM erkennt eine Leistung > 8W, schaltet das Steckdosen-Relais ab und setzt einen Anforderungs-Dummy. Das SolarForecast Modul plant die Freigabe des Geschirrspüler in Abhängigkeit der vorausgesagten PV-Leistung irgendwann am Tag ein. Nach dem Start läuft der Geschirrspüler dann durch, auch wenn mal eine Wolke vorbeizieht.
Über einen weiteren Dummy kann ich den Geschirrspüler per Hand Freigeben falls mal ein Regentag ist.
Mit dem SolarForecast Modul kannst du auch das "Schalte spätestens um XX:XX Uhr" realisieren.

schwatter

Morgen,

ich verwende dein Beispiel aus Post 1 schon sehr lange. Hatte am Anfang meinen Zähler nicht ausgelesen, meine WR's aber schon. Daraufhin das
DOIF auf positive Zahlen umgebaut.
Seit ein paar Monaten lese ich nun den Zähler aus und arbeite mit negativen Zahlen. Daher habe ich das DOIF nun wieder umgestellt wie im ersten Beispiel.
Eine Sache die meiner Meinung nach nicht stimmt, ist das -1.0 vor movingAverageT in dem userReadings.
1. Smartmeter gibt - aus
2. (- Smartmeterwert) mal (- movingAverageT) == + Leistung_Stromnetz_Mittelwert
3. Dein DOIF prüft [Stromzaehler:Leistung_Stromnetz_Mittelwert:d] <= -1.0*[$SELF:power]). Da Leistung_Stromnetz_Mittelwert positiv ist, wird CMD1 nie wahr.

Oder habe ich einen Denkfehler?

Gruß schwatter

Torxgewinde

#5
Hi,
Bei Überschuss-Einspeisung (=die PV schiebt in das Netz) ist bei mir:
- PM_active_power positiv
- der movingAverageT() ist dann nach seiner Zeit positiv
- das Userreading Leistung_Stromnetz_Mittelwert verrechnet mit -1.0, dadurch wird das Ergebnis dann negativ, was ich logischer fand, da ich dann ja in das Netz schiebe.

Naja, und da läuft es bei dir und mir auseinander, ich glaube das ist dann schon alles.

In dem DOIF zu einem Überschussverbraucher kann ich bei mir das Reading sehen:
- e_Sun2000_Leistung_Stromnetz_Mittelwert und das ist bei Überschuss negativ

Ist das nun sagen wir mal -5000 W und mein $SELF:power-wert ist 1000 W, dann ist:
-5000 <= -1.0*1000 wahr und der DOIF Fall ist erfüllt.

Ich fand, dass bei Überschuss aus Sicht des Netzbetreiber-Zählers ein negativer Wert korrekter ist, da er bei Leuten ohne PV ja positive Werte liefern dürfte. PV-Überschuss ist für mich aus Sicht des Zählers dann negativ, auch wenn ich Überschuss mag und dann vorteilhaft finde :)

Als Tabelle:
MesswertBedeutungVorzeichenErklärung
PM_active_powerMomentane Leistung wie vom WR gemeldet vom StromzählerpositivDie PV-Anlage erzeugt Strom
movingAverageT()Geglätteter Durchschnittswert der LeistungpositivMittelwert über einen Zeitraum
Leistung_Stromnetz_MittelwertNetzbezug oder EinspeisungnegativEinspeisung ins Netz
Leistung_Stromnetz_Mittelwert (bei Bezug)Strom wird aus dem Netz gezogenpositivTypisch für Haushalte ohne PV
DOIF-Bedingung (-5000 ≤ -1.0 * 1000)Überschusssteuerung für VerbraucherwahrVerbraucher wird eingeschaltet




HTH

schwatter

#6
Ah ok,
da bei dir das Reading PM_active_power im  Stromzaehler steht und auch dahin das neue Reading erzeugt wird,
bin ich davon ausgegangen, das das Smartmeter auch bei dir Minus ausgibt.

Edit:
Ich sehe deine Tabelle. Es ist also die Momentane Leistung vom WR.

Gruß schwatter