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.