Ausführen einer regelmäßigen Prüfung (PV Überschuss)

Begonnen von stobor, 29 Mai 2023, 12:10:43

Vorheriges Thema - Nächstes Thema

stobor

Hallo,
abhängig von unserem aktuellen Stromüberschuss würde ich gern verschiedene Verbraucher einschalten.
Ich bekomme bereits die aktuellen PV Daten.
Was würde Sinn machen, um zu entscheiden, wann ich was einschalte?

Ich könnte jede Minute wiederkehrend abfragen, wieviel Überschuss ich gerade habe und dann Verbraucher ein bzw wieder ausschalten. Wie sollte das genau aussehen?

Kann ich auch notify benutzen, und auf die Überproduktion prüfen (Wert größer als ...)? Wie prüfe ich sinnvoller Weise auf größer?

Den PVready Ausgang des Wechselrichters empfange ich auch. Aber der Wechselrichter schalten natürlich nur bei einem fix definierten Wert.
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-73-generic x86_64))  mit CUL V3.2 (Firmware 1.57 CUL868) für FS20 und CUL V3.4 (Firmware 1.57 CUL868) für HM + Arduino Mega
FHEM Revision: 27642
FS20-Schalter und Dimmer
HM Fensterkontakte, Heizungsthermostate, Temperatursensoren

DS_Starter

ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

PotatoFritz

Hallo,
da bedarf etwas mehr Information.

Zeigen Deine PV-Daten den Überschuss?  (PV-Produktion > Hausverbrauch)

Wenn ja, dann einfach ein notify auf PV-Überschuss.


Ich habe die Daten als Dummy-Device  Einspeiseleistung.

Auf der Einspeiseleistung habe ich ein notify.

Auf den Verbrauchern habe ich ein Attribut Eigenverbrauch.


Im notify prüfe ich dann ob die Einspeiseleistung größer dem Eigenverbrauch des Verbrauchers ist und schalte es entsprechend.
Dabei habe ich dann noch einige Feinheiten eingebaut.
a) Ich prüfe zusätzlich auf einen gleitenden Durschnitt der Einspeiseleistung.
  Damit möchte ich verhindern, dass permanent ein- und ausgeschaltet wird.
b) Wenn ein Verbraucher erstmal geschaltet wurde, dann läuft wer mindestens eine bestimmte Zeit (z.B. 60 Sekunden).
  Auch dies soll permantes ein- und ausschalten vermeiden.






betateilchen

Das muss man doch nicht in den Anfängerfragen diskutieren.

Für Themen rund um Solaranlagen gibt es ein eigenes Unterforum:

https://forum.fhem.de/index.php?board=61.0

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

stobor

Zitat von: PotatoFritz am 29 Mai 2023, 12:33:27Hallo,
da bedarf etwas mehr Information.

Zeigen Deine PV-Daten den Überschuss?  (PV-Produktion > Hausverbrauch)

Wenn ja, dann einfach ein notify auf PV-Überschuss.


Ich habe die Daten als Dummy-Device  Einspeiseleistung.

Auf der Einspeiseleistung habe ich ein notify.

Auf den Verbrauchern habe ich ein Attribut Eigenverbrauch.


Im notify prüfe ich dann ob die Einspeiseleistung größer dem Eigenverbrauch des Verbrauchers ist und schalte es entsprechend.
Dabei habe ich dann noch einige Feinheiten eingebaut.
a) Ich prüfe zusätzlich auf einen gleitenden Durschnitt der Einspeiseleistung.
  Damit möchte ich verhindern, dass permanent ein- und ausgeschaltet wird.
b) Wenn ein Verbraucher erstmal geschaltet wurde, dann läuft wer mindestens eine bestimmte Zeit (z.B. 60 Sekunden).
  Auch dies soll permantes ein- und ausschalten vermeiden.

Hallo PotatoFritz,

kannst Du mal Deinen Code teilen?
Ich bekomme über den ModBus die aktuelle Einspeiseleistung (alle 20sec einen aktuellen Wert). Wie sieht denn Dein notify auf der Einspeiseleistung aus? Prüfst Du ab, ob der Wert größer als 0 ist (wie?) und checkst dann, welche Geräte man einschalten könnte?
Wie machst Du das mit denn Attribut "Eigenverbrauch"/ Wie wird das angelegt und abgefragt?

Prüfst Du auch noch einmal, ob kein Strom mehr eingespeist wird bzw. was aus dem Netz gezogen wird, um die Verbraucher wieder abzuschalten?


P.S.: Wie kann man das Thema verschieben?
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-73-generic x86_64))  mit CUL V3.2 (Firmware 1.57 CUL868) für FS20 und CUL V3.4 (Firmware 1.57 CUL868) für HM + Arduino Mega
FHEM Revision: 27642
FS20-Schalter und Dimmer
HM Fensterkontakte, Heizungsthermostate, Temperatursensoren

PotatoFritz

#5
Ich habe mal die für Dich unwichtigen Teile entfernt.

Wie gesagt, ich habe unter state.av einen gleitenden Durschnitt.

Die gelesene Temperatur ist die Temperatur eines Pufferspeichers, die kannst Du natürlich vergessen.

Kann man ggf. auch schöner lösen, ich nutze dies aber so für einen Getränkekühlschrank in der Garage und eine Brauchwasserwärmepumpe.


Stromeinspeisung:state.av:.* {
my $MinLaufzeit=60;
my $Eigenverbrauch=AttrVal("Waermepumpe","Verbrauch",9999);

my $Einspeisung_aktuell = ReadingsVal("Stromeinspeisung","state",0);

my $Stromeinspeisung_Moving=ReadingsVal("Stromeinspeisung","state.av",0);

my $Temp = ReadingsVal("Speicher_Hotspot","Temp",80);

my $Status = ReadingsVal("Waermepumpe","state","off");
my $age = ReadingsAge("Waermepumpe","state",0);
my $neuerStatus="off";
if ((($Einspeisung_aktuell-$Eigenverbrauch)>0) and (($Stromeinspeisung_Moving-$Eigenverbrauch)>0) and ($Temp<60))
  {
   $neuerStatus="on";
  }
if ($Status eq "off")
    {
      if ($neuerStatus eq "on")
      {
        fhem ("set Waermepumpe on");
      }
    }
else
   {
    if (($neuerStatus eq "off") and ($Status eq "on") and ($age>$MinLaufzeit))
      {
      fhem ("set Waermepumpe off");
      }
   }
}

stobor

Wo ist denn das notify? Wie sieht das aus?

Fehlt vor Deinem "Stromeinspeisung:state.av:.* { ..." das notify?
In state steckt Deine aktuelle Einspeiseleistung?
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-73-generic x86_64))  mit CUL V3.2 (Firmware 1.57 CUL868) für FS20 und CUL V3.4 (Firmware 1.57 CUL868) für HM + Arduino Mega
FHEM Revision: 27642
FS20-Schalter und Dimmer
HM Fensterkontakte, Heizungsthermostate, Temperatursensoren

PotatoFritz

In der Einspeiseleistung steckt der Überschuss aus der PV-Anlage (PV-Produktion > Verbrauch Haus).

Dies ist abhängig davon wie Dir die Daten aus dem Wechselrichter und/oder dem Stromzähler zur Verfügung stehen.

Ich lese die Daten aus dem Stromzähler über die Obis-Schnittstelle.




zum Notify verstehe Deine Frage nicht wirklich.

Der Code entspricht dem notify bzw. dem Code im notify.

Definition mit 
define  n_Waermepumpe notify Stromeinspeisung:state.av:.* {}

Anschließend den restlichen Code in die Klammern und gut ist.

Wie beschrieben, auf dem Dummy Stromeinspeisung habe ich einen Gleitenden Durchschnitt.

attr Stromeinspeisung userReadings state.av {sma("Stromeinspeisung","state",30)}

sma ist eine Funktion für die Erstellung eines gleitenden Durschnitts in der myUtils.





M.Schulze

Zitat von: stobor am 29 Mai 2023, 12:10:43Hallo,
abhängig von unserem aktuellen Stromüberschuss würde ich gern verschiedene Verbraucher einschalten.
Ich bekomme bereits die aktuellen PV Daten.
Was würde Sinn machen, um zu entscheiden, wann ich was einschalte?

Hol dir lieber den Zählerwert "1-0:16.7.0" rein. Der kommt im Sekundentakt vom Zähler. Verheizen des Überschusses mit einem großen Verbraucher ist dann in wenigen Zeilen programmiert. Also nicht nur an / aus sondern auch Halbwellen PWM oder Phasenabschnitt.

Über W-Lan wird das zwar in Echtzeit funktionieren, aber ist sicher nicht zu empfehlen.

Für das intelligente Verheizen mit "verschiedenen Verbrauchern" fehlt einfach ein Modul. Und viele Entwickler sind nicht mehr hier.
Auch müsste dafür Vorarbeit geleistet werden.


MfG


Muss ich hier das Licht aus machen?

stobor

Zitat von: PotatoFritz am 29 Mai 2023, 19:57:25In der Einspeiseleistung steckt der Überschuss aus der PV-Anlage (PV-Produktion > Verbrauch Haus).

Dies ist abhängig davon wie Dir die Daten aus dem Wechselrichter und/oder dem Stromzähler zur Verfügung stehen.

Ich lese die Daten aus dem Stromzähler über die Obis-Schnittstelle.




zum Notify verstehe Deine Frage nicht wirklich.

Der Code entspricht dem notify bzw. dem Code im notify.

Definition mit 
define  n_Waermepumpe notify Stromeinspeisung:state.av:.* {}

Anschließend den restlichen Code in die Klammern und gut ist.

Wie beschrieben, auf dem Dummy Stromeinspeisung habe ich einen Gleitenden Durchschnitt.

attr Stromeinspeisung userReadings state.av {sma("Stromeinspeisung","state",30)}

sma ist eine Funktion für die Erstellung eines gleitenden Durschnitts in der myUtils.


Ok, verstanden. Ich wunderte mich nur über das fehlende notify.

Wie sieht denn Deine Funktion in der myUtils aus?
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-73-generic x86_64))  mit CUL V3.2 (Firmware 1.57 CUL868) für FS20 und CUL V3.4 (Firmware 1.57 CUL868) für HM + Arduino Mega
FHEM Revision: 27642
FS20-Schalter und Dimmer
HM Fensterkontakte, Heizungsthermostate, Temperatursensoren

PotatoFritz

Den habe ich auch irgendwo hier aus dem Forum.



sub sma($$$)
{
  my ($name,$reading,$count) = @_;
  my $dummy="sma ";
  my $hash = $defs{$name};
  my @new = my ($val) = ($hash->{READINGS}{$reading}{VAL});
  my $num;
  my $arr;
  my $i;
#  Log 1, "$dummy Start Count und Nr $count ";
 my $Wert = 0;
#   {
   #-- initialize if requested
#   $hash->{READINGS}{$reading}{"history"}=undef;   }
   #-- test for existence
   if( !$hash->{READINGS}{$reading}{"history"})
    {
     Log 1,"$dummy erster Aufruf ARRAY CREATED $name,$reading,$count";
     for($i=0;$i<$count;$i++)
        {
         push(@{$hash->{READINGS}{$reading}{"history"}},\@new);
        }
     $arr=\@{$hash->{READINGS}{$reading}{"history"}};
     for($i=0;$i<$count;$i++)
       {
         Log 1,"Array init " .$i ."--" .$arr->[$i] [0];
       }
     }
   else
    {

     pop @{$hash->{READINGS}{$reading}{"history"}};
     unshift(@{$hash->{READINGS}{$reading}{"history"}});
     push(@{$hash->{READINGS}{$reading}{"history"}},\@new);

     $arr=\@{$hash->{READINGS}{$reading}{"history"}};
#     Log 1, scalar @{$hash->{READINGS}{$reading}{"history"}};
     $Wert = 0;
     my $old=-1;
     for($i=0;$i<$count;$i++)
       {
         $Wert+=$arr->[$i] [0];
#         Log 1,"Array " .$Wert ."-" .$i ."--" .$arr->[$i] [0];
       }
      $Wert=$Wert/$count;
      return $Wert;
    }
 }

ch.eick

Zitat von: M.Schulze am 29 Mai 2023, 20:20:03Und viele Entwickler sind nicht mehr hier.
Im zweiten Post ist dafür schon der richtige Link drin, direkt vom Entwickler :-)

Und hier habe ich mal meine Eigenverbrauchssteuerung abgelegt.
Das sind dann verschiedene Devices, die man ja nach Verbrausverhalten auswählen kann und dann natürlich noch adaptiert.

VG  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

stobor

Zitat von: stobor am 29 Mai 2023, 22:45:18
Zitat von: PotatoFritz am 29 Mai 2023, 19:57:25In der Einspeiseleistung steckt der Überschuss aus der PV-Anlage (PV-Produktion > Verbrauch Haus).

Dies ist abhängig davon wie Dir die Daten aus dem Wechselrichter und/oder dem Stromzähler zur Verfügung stehen.

Ich lese die Daten aus dem Stromzähler über die Obis-Schnittstelle.




zum Notify verstehe Deine Frage nicht wirklich.

Der Code entspricht dem notify bzw. dem Code im notify.

Definition mit 
define  n_Waermepumpe notify Stromeinspeisung:state.av:.* {}

Anschließend den restlichen Code in die Klammern und gut ist.

Wie beschrieben, auf dem Dummy Stromeinspeisung habe ich einen Gleitenden Durchschnitt.

attr Stromeinspeisung userReadings state.av {sma("Stromeinspeisung","state",30)}

sma ist eine Funktion für die Erstellung eines gleitenden Durschnitts in der myUtils.


Ok, verstanden. Ich wunderte mich nur über das fehlende notify.

Wie sieht denn Deine Funktion in der myUtils aus?

Über
define  n_Waermepumpe notify Stromeinspeisung:state.av:.* {}prüfst Du ja ab, ob sich der Wert ändert, oder?

Wie befüllst Du denn den Wert Stromeinspeisung:state.av?
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-73-generic x86_64))  mit CUL V3.2 (Firmware 1.57 CUL868) für FS20 und CUL V3.4 (Firmware 1.57 CUL868) für HM + Arduino Mega
FHEM Revision: 27642
FS20-Schalter und Dimmer
HM Fensterkontakte, Heizungsthermostate, Temperatursensoren

PotatoFritz

Hier mein dummy Stromeinspeisung
defmod Stromeinspeisung dummy
attr Stromeinspeisung alias Stromeinspeisung
attr Stromeinspeisung group Strom
attr Stromeinspeisung room PHOTOVOLTAIK
attr Stromeinspeisung stateFormat {sprintf "%.0f Watt",ReadingsVal($name,"state",0)}
attr Stromeinspeisung userReadings state.av {sma("Stromeinspeisung","state",30)}

Ich habe es als userReading mit der sma-Funktion aus der myutils verbunden. Über die richtige Anzahl an Perioden (hier 30)  lässt sich vortrefflich streiten. 

Torxgewinde

Hallo Stobor 👋,
Ich bevorzuge DOIF im Vergleich zu Notify, da es über einige weitere nützliche Funktionen verfügt. Ich möchte dir ein DOIF empfehlen, das ich einmal als Codeschnipsel gepostet habe: https://forum.fhem.de/index.php?topic=133128.0

Das DOIF wertet den Stromzähler aus und steuert eine Last. Der Stromzähler liefert Informationen über den bezogenen oder eingespeisten Strom. Wenn ein Überschuss an Energie vorhanden ist, der größer ist als der Verbrauch des gewünschten Geräts, wird es nach einer einstellbaren Verzögerung eingeschaltet. Der Überschuss muss also für eine gewisse Zeit vorhanden sein, um Schaltzyklen zu reduzieren, was besonders bei höheren Lasten und Relais oder Schützen die Langlebigkeit fördert. Im verlinkten DOIF wird die Last innerhalb von 20 Sekunden wieder ausgeschaltet, falls der eingespeiste Strom gering ist oder man in den Bezug wechselt (bei weniger als 100 Watt Einspeisung). Bei einem Verbraucher wie einer Stromheizung kann man das schnelle Abschalten problemlos so einstellen. Bei anderen Geräten möchte man möglicherweise das Timing verlängern oder eine spezielle "Abschaltsequenz" ausführen. Dies ist jedoch nicht im verlinkten Beispiel enthalten.

Eine Verbesserungsmöglichkeit besteht darin, die Tagesprognose der Solaranlage zu berücksichtigen. Dies ist sinnvoll und notwendig für Verbraucher, die man nur einschalten möchte, wenn genügend Überschussenergie vorhanden ist und die dann auch für eine bestimmte Zeit oder Energiemenge betrieben werden müssen. Bevor man solche Verbraucher einschaltet, sollte man mithilfe der Solarprognose sicherstellen, dass der Zeitpunkt wirklich geeignet ist. Dies ist im verlinkten Beispiel nicht enthalten!

Als Einstieg empfehle ich dir das verlinkte DOIF. Falls es nicht zu deinem Verbraucher passt (weil er nicht schnell abgeschaltet werden kann), solltest du auch andere Lösungen in Betracht ziehen. Diese bieten noch weitere Tricks, erfordern jedoch auch etwas Einarbeitung.

Viel Erfolg!