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.
Schau dir doch mal das Modul SolarForecast (https://wiki.fhem.de/wiki/SolarForecast_-_Solare_Prognose_(PV_Erzeugung)_und_Verbrauchersteuerung) an.
Forum: https://forum.fhem.de/index.php?topic=117864.0
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.
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
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?
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");
}
}
}
Wo ist denn das notify? Wie sieht das aus?
Fehlt vor Deinem "Stromeinspeisung:state.av:.* { ..." das notify?
In state steckt Deine aktuelle Einspeiseleistung?
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.
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
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?
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;
}
}
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 :-) (https://forum.fhem.de/index.php?msg=1277221)
Und hier habe ich mal meine Eigenverbrauchssteuerung abgelegt. (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus#PV_Eigenverbrauch-Steuerung)
Das sind dann verschiedene Devices, die man ja nach Verbrausverhalten auswählen kann und dann natürlich noch adaptiert.
VG Christian
Zitat von: stobor am 29 Mai 2023, 22:45:18Zitat 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?
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.
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 (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!
Hallo zusammen,
für die PV-Leistungsprognose habe ich eine Implementierung mit KI erstellt. Es gehen nur DWD Daten und der Ertrag der PV-Anlage auf Stundenbasis rein.
Das ganze verwendet allerding DbLog als Basis und auch DOIF.
Im unteren Bereich sind Statistiken und Informationen vom Smartmeter, WR und Speicher.
1.JPG
Weiterhin gibt es dan auch noch zu verschiedenen Verbrauchern Muster mit gleichem Erscheinungsbild.
Das ganze ist zwar für Kostal Plenticore, kann aber natürlich angepasst werden.
VG Christian