DOIF_Readings|event_Readings mit Berechnung und Limits | InselPV, AC-Coupling

Begonnen von holle75, 20 Oktober 2025, 19:49:23

Vorheriges Thema - Nächstes Thema

holle75

Saublöde Frage:

defmod XtenderSet_Max_Solar DOIF ([Studer485_VT:PV_Power_W])\
    (set openDTU/1164a011518f/cmd/limit_nonpersistent_absolute ZuBerechnendeGesamtleistung)
attr XtenderSet_Max_Solar DOIF_Readings ZuBerechnendeGesamtleistung:(2800 - [Studer485_VT:PV_Power_W])
attr XtenderSet_Max_Solar do always

wird ZuBerechnendeGesamtleistung im set den Mikrowechselrichters dann mit dem aktuellen Wert setten, oder mit dem alten Wert?
Ich weiss nichtmal, wie ich die Frage sinnvoll formulieren soll, aber ich hoffe, ihr wisst was ich meine?

Ich möchte durch Event PV_Power_W der Hauptsolaranlage dem Mikrowechselrichter mitteilen, dass er max die Differenz zu 2800W generieren darf.

EDIT: und eine weniger blöde Frage, wie bekomme ich ZuBerechnendeGesamtleistung über webCmd, StateFormat in Kombi mit DevStateIcon angezeigt?

Die volle Definition sieht gerade so aus und ich bekomme ZuBerechnendeGesamtleistung nicht eingebaut

defmod XtenderSet_Max_Solar DOIF ([Studer485_VT:PV_Power_W])\
    (set openDTU/1164a011518f/cmd/limit_nonpersistent_absolute ZuBerechnendeGesamtleistung)
attr XtenderSet_Max_Solar DOIF_Readings ZuBerechnendeGesamtleistung:(2800 - [Studer485_VT:PV_Power_W])
attr XtenderSet_Max_Solar devStateIcon disabled:general_aus@red:initialize initialize:general_an@yellow:disable initialized:general_an@yellow:disable cmd_1.*:general_an@green:disable
attr XtenderSet_Max_Solar do always

Damian

DOIF_Readings werden zuerst berechnet, um sie dann in der Bedingung auszuwerten.

also:

defmod XtenderSet_Max_Solar DOIF ([$SELF:ZuBerechnendeGesamtleistung] > 0)
...

Deine Lösung triggert zwar auf das gleiche Event, sollte aber dennoch funktionieren, wenn du den set-Befehl korrekt definierst:

(set openDTU/1164a011518f/cmd/limit_nonpersistent_absolute [$SELF:ZuBerechnendeGesamtleistung])
Noch einfacher geht es allerdings mit dem Einzeiler ohne zusätzliche Attribute:

defmod XtenderSet_Max_Solar DOIF {fhem_set("openDTU/1164a011518f/cmd/limit_nonpersistent_absolute ".(2800-[Studer485_VT:PV_Power_W])}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

Ah, lag ich also mal wieder umfassend komplett daneben mit meiner Syntax ;)
Danke Damian

holle75

#3
Es ist jetzt das geworden. DOIF_readings noch gegen event_Readings getauscht um auch extern zugreifen zu können. Und mit diesem stateFormat wird auch Info/Icon untereinander angezeigt.

defmod XtenderSet_Max_Solar DOIF ([$SELF:ZuBerechnendeGesamtleistung] > 0 and [$SELF:ZuBerechnendeGesamtleistung] < 2000)\
(set openDTU/1164a011518f/cmd/limit_nonpersistent_absolute [$SELF:ZuBerechnendeGesamtleistung])
attr XtenderSet_Max_Solar devStateIcon disabled:general_aus@red:initialize initialize:general_an@yellow:disable initialized:general_an@yellow:disable cmd_1.*:general_an@green:disable
attr XtenderSet_Max_Solar do always
attr XtenderSet_Max_Solar event_Readings ZuBerechnendeGesamtleistung:(2800 - [Studer485_VT:PV_Power_W])
attr XtenderSet_Max_Solar stateFormat state\
<br>\
ZuBerechnendeGesamtleistung

holle75

#4
Kann ich in event_Readings auch noch berechnen, dass wenn der Wert größer als 2000 ist, 2000 ausgespuckt wird? Mal wieder die Frage nach der Syntax ...

A la
userReadings
Power__W_Bereinigt:Power__W.* {if (ReadingsVal("Xtender_AC_in","Power__W",0) < 0) {return 0;} else {return ReadingsVal("Xtender_AC_in","Power__W",0);};}

Damian

Ja das geht. Ich würde es mit dem ternären Operator in Perl lösen:

attr XtenderSet_Max_Solar event_Readings Power__W_Bereinigt: {[Xtender_AC_in:Power__W] < 0 ? 0 : [Xtender_AC_in:Power__W]}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

#6
Wow, das funktioniert (und Stunden mit der anderen Syntax erfolglos rumprobiert). Danke. Hatte noch einen Fehler im set. Jetzt:

defmod XtenderSet_Max_Solar DOIF ([$SELF:ZuBerechnendeGesamtleistung] > 0 and [$SELF:ZuBerechnendeGesamtleistung] <= 2000)\
(set MQTT2_openDTU limit_absolute [$SELF:ZuBerechnendeGesamtleistung])
attr XtenderSet_Max_Solar devStateIcon disabled:general_aus@red:initialize initialize:general_an@yellow:disable initialized:general_an@yellow:disable cmd_1.*:general_an@green:disable
attr XtenderSet_Max_Solar do always
attr XtenderSet_Max_Solar event_Readings ZuBerechnendeGesamtleistung: {2800 - [Studer485_VT:PV_Power_W] > 2000 ? 2000 : [Studer485_VT:PV_Power_W]}
attr XtenderSet_Max_Solar group System_2
attr XtenderSet_Max_Solar room Xtender
attr XtenderSet_Max_Solar sortby 4
attr XtenderSet_Max_Solar stateFormat state\
<br>\
ZuBerechnendeGesamtleistung

holle75

.... und jetzt wird es doch wieder zur Knobelaufgabe. Falls jemand Lust hat mitzudenken:

Ich hol ein bißchen aus ...

InselPVanlage mit AC-gekoppelten Mikrowechselrichter. Max Leistung Hauptanlage Solar, je nach Jahreszeit 2400Wp. Der Mikro knapp 2000Wp.
GesamtStrom im Inselnetz darf 2800W nicht übersteigen (1:0-Regel). Das war die Ursprungsidee.

Bis anhin musste ich hart ca 6 mal im Jahr das Limit des Mikros manuell festlegen. So geht einiges an PV verloren, da dieses Limit immer entsprechend der zu erwartenden Maximalleistung der Hauptanlage gesetzt sein musste.

Jetzt dachte ich, ich kann das mit dem erarbeiteten DOIF optimieren.

Der Denkfehler: Wir stellen uns den perfekten Frühlingstag mit ein paar Wolken vor. Wolke verdeckt die Sonne, HauptPV fährt auf imaginäre 500W runter, das DOIF regelt den Mikro auf 2000W hoch ..... Wolke geht weg, wahrscheinlich reichen die 3 Sekunden die die HauptPV ausgelesen wird nicht aus, um den Mikro runterzuregeln und ich habe plötzlich ~ 4400W im InselNetz. Das gilt es dringenst zu vermeiden.

Schön wäre es, wenn der Mikro generell langsam hochfährt, dann könnte der Inselwechselrichter über die NetzFrequenz entspannt den Mikro runterregeln. HauptPV wie auch der Mikro regeln jedoch nach letzten Beobachtungen recht plötzlich hoch (was ich aber nochmal verifizieren werde).

Jetzt suche ich eine bessere Logik. Habe aber keine Idee, wie die Problematik abgefangen werden könnte. Noch nichtmal einen Ansatz.