NEWS
Regelung eines Hoymiles Solarinverters (Nulleinspeisung)
-
@carsaab
Ich habe mal etwas gespielt.
Mit dem openDTU-Adapter klappt es wunderbar. Alle Werte wurden nach 5-10 Sekunden im WR eingestellt.

Verstehe ich gerade nicht. Meinst du AC vom ZĂ€hler?

@gonzokalle
Zur Formel hast Du recht ist AC habe es oben korrigiert.
Deine Lösung mit der Liste sieht gut aus.
Die Formel fĂŒr mehrere WR sĂ€he dann so aus. Das ist halt keine Batterieladung inkludiert. Nulleinspeisung ohne berĂŒcksichtigten Akku.

habe noch die Worddatei mit der Formel hochgeladen.
Der Formeleditor ist besser - ich nutze aber Textmaker privat.
formel nulleinspeisung.docx -
@gonzokalle
Zur Formel hast Du recht ist AC habe es oben korrigiert.
Deine Lösung mit der Liste sieht gut aus.
Die Formel fĂŒr mehrere WR sĂ€he dann so aus. Das ist halt keine Batterieladung inkludiert. Nulleinspeisung ohne berĂŒcksichtigten Akku.

habe noch die Worddatei mit der Formel hochgeladen.
Der Formeleditor ist besser - ich nutze aber Textmaker privat.
formel nulleinspeisung.docx@carsaab
Ich habe dein Blockly mal nachgebaut.

Der Stromverbrauch (Shelly 3EM) und das Limit von WR geht andauernd hoch und runter.
Ist das bei dir auch so?@ alle
Ich wĂŒrde das Blockly vom Anfang des Threads gerne mal probieren.
Kann jemand ein einfaches Blockly fĂŒr nur einen WR mal posten? -
@carsaab
Ich habe dein Blockly mal nachgebaut.

Der Stromverbrauch (Shelly 3EM) und das Limit von WR geht andauernd hoch und runter.
Ist das bei dir auch so?@ alle
Ich wĂŒrde das Blockly vom Anfang des Threads gerne mal probieren.
Kann jemand ein einfaches Blockly fĂŒr nur einen WR mal posten?@gonzokalle
Ja das ist bei mir auch so.
Der Trigger ist immer die Ănderung im Stromverbrauch. Dann setzt das Script ein neues Limit sofern die Solaranlage mehr als die 30% liefert. Bei mir dann 450W.
Wenn der Stromverbrauch hochgeht, dann geht das Limit hoch und auch wieder runter, wenn der Verbrauch sinkt.
Sollte dann die Solaranlage bei gleichem Verbrauch mehr liefern, dann sinkt der Stromverbrauch aber das Limit bleibt gleich, weil sich die Summe aus Solarenergie und Stromverbrauch nicht Àndert.
Ich habe auch nur einen WR.
Weil aber mein Hichi nur alle 10sek einen neuen Wert schickt, ist das ganze natĂŒrlich nicht genau, aber fĂŒr unsere Zwecke reicht es.
Vom Shelly 3EM mĂŒsste ja der Gesamtverbrauch gemessen werden. Wenn der Shelly im Sekundentakt einen Wert liefert, dann schreibt das Script auch jede Sekunde.Aber das Prinzip ist das gleiche. Ich nehme an, Du hast einen 600W WR im Einsatz.
-
@gonzokalle
Ja das ist bei mir auch so.
Der Trigger ist immer die Ănderung im Stromverbrauch. Dann setzt das Script ein neues Limit sofern die Solaranlage mehr als die 30% liefert. Bei mir dann 450W.
Wenn der Stromverbrauch hochgeht, dann geht das Limit hoch und auch wieder runter, wenn der Verbrauch sinkt.
Sollte dann die Solaranlage bei gleichem Verbrauch mehr liefern, dann sinkt der Stromverbrauch aber das Limit bleibt gleich, weil sich die Summe aus Solarenergie und Stromverbrauch nicht Àndert.
Ich habe auch nur einen WR.
Weil aber mein Hichi nur alle 10sek einen neuen Wert schickt, ist das ganze natĂŒrlich nicht genau, aber fĂŒr unsere Zwecke reicht es.
Vom Shelly 3EM mĂŒsste ja der Gesamtverbrauch gemessen werden. Wenn der Shelly im Sekundentakt einen Wert liefert, dann schreibt das Script auch jede Sekunde.Aber das Prinzip ist das gleiche. Ich nehme an, Du hast einen 600W WR im Einsatz.
@Carsaab
Ja, der Shelly liefert im Sekundentakt.
So schnell kann ich die Werte aber nicht in den WR schreiben.
Deswegen habe ich den Trigger auf alle 10 Sekunden gesetzt.
Ja, habe 600 W WR. -
So - ich habe zu experimentellen Zwecken mir noch einen HM300 von einem Kumpel geliehen.
Steuern tue ich alles ĂŒber den MQTT Adapter. Der erkennt die openDTU und die dort eingebunden Wechselrichter. Damit die Steuerung funktioniert muĂ der MQTT Adapter ohne "retain" flag senden! Sonst geht es nicht.

Dann muĂ fĂŒr jeden Hoymiles noch manuell der channel "cmd" und der state "limit_nonpersistent_relative" angelegt werden.

Die Befehle findet Ihr hier: https://www.opendtu.solar/firmware/mqtt_topics/#inverter-limit-specific-topics
Unter Alias könnt Ihr Euch dann die wichtigen Objekte erstellen oder Ihr verweist im Script direkt auf die Objekte.Eine Sequenz von 10Sekunden reichen mir - das regel ich ĂŒber den Hichi Lesekopf, der den Stromverbrauch nur alle 10 Sekunden verschickt. Der Versuch in Echtzeit zu reagieren ist meistens ohnehin zum Scheitern verurteilt. Zum einen kann unsere "billige" Hardware das sowieso nicht, und dann gibt es ja noch die Physik https://de.wikipedia.org/wiki/Nyquist-Shannon-Abtasttheorem. Ich beabsichtige nicht daran was zu Ă€ndern.
FĂŒr 2 Wechselrichter und ohne Benutzung von Scriptvarialblen funktioniert mein Script wie folgt:

Das lĂ€sst sich zur Not auch fĂŒr eine 30KW-peak Anlage mit 70 Panelen und 35 MicroWR und 9 DTUen ausbauen. Dem Iobroker ist das egal. Nur die Stromerzeugung ĂŒber alle DTUen mĂŒsste man adieren.
Um Fragen vorzubeugen:
- das Teilen durch 18 ist oben erklÀrt.
- ich habe keinen Speicher und will eine Nulleinspeisung - auch oben erklÀrt
- Ja - es geht bestimmt eleganter - ich berechne fĂŒr jeden WR das Limit separat obwohl sie dasselbe Limit bekommen.
Ein Script mir einer berechnete Variablen wie hier funktioniert auch.

- Es lÀuft wie geschmiert - bei mir. Es wird bei Euch ohne etwas Frickelei nicht direkt aus der Box laufen vermute ich.
-
@flo71 ich hab das Script fĂŒr den zweiten WR so angepasst, dass er erst regelt wenn der erste entweder am oberen oder unteren Limit angekommen ist, oder aber dass die geforderte Leistung höher ist als die, die gerade zur verfĂŒgung steht...
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="?~:J:;gqC%-pt?=zNsH:">Sunrise</variable> <variable id="UJ`JGN{Ezb$K7jJ[4P}j">Sunset</variable> <variable id="BN!a@q$SEAU4^)xo:SRJ">maxSolarPower</variable> <variable id="AcYpB0Ty+wVObL7=Y.a.">measuredPower</variable> <variable id="1}Q0686mMw0ZGk)e+r?(">measuredSolarPower</variable> <variable id="le#}gR{6G.yhW=x|6pS8">neededPower</variable> <variable id="X-B3:`dA%wy5$?]at5W-">NeededPowerPercent</variable> <variable id=":U;.Z4:pYNy(TwM9X-dL">storedNeededPower</variable> <variable id="}s`y%Qd}~t2t(jU$8(ud">upperLimit</variable> <variable id="P^1|W+9iVy?PgNp}9!.S">lowerLimit</variable> <variable id=")2]D^Y|D:QS6S[A}9J=/">SolarLimit</variable> </variables> <block type="schedule" id="!P+uzJ#%y!_wHsKqo2~M" x="-443" y="-618"> <field name="SCHEDULE">*/20 * * * * *</field> <statement name="STATEMENT"> <block type="variables_set" id="~v~t5u;a_q(#kb+E{(FH"> <field name="VAR" id="?~:J:;gqC%-pt?=zNsH:">Sunrise</field> <value name="VALUE"> <block type="time_astro" id="Svgszky6QE2/10f8vck1"> <field name="TYPE">sunrise</field> <field name="OFFSET">0</field> </block> </value> <next> <block type="variables_set" id="~/087{!i@]6[`rKxsw]j"> <field name="VAR" id="UJ`JGN{Ezb$K7jJ[4P}j">Sunset</field> <value name="VALUE"> <block type="time_astro" id="BO/%++Qd.ktL4PfK.r3?"> <field name="TYPE">sunset</field> <field name="OFFSET">0</field> </block> </value> <next> <block type="controls_if" id="xaOp|xXgB@BB44iq}cJ."> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_operation" id="|K,B[pWUT`!LyJsB6,pK"> <field name="OP">AND</field> <value name="A"> <block type="time_compare_ex" id="Y8n@Iqzd:%qZbp|#P_v^"> <mutation xmlns="http://www.w3.org/1999/xhtml" end_time="false" actual_time="true"></mutation> <field name="USE_ACTUAL_TIME">TRUE</field> <field name="OPTION">>=</field> <value name="START_TIME"> <shadow type="text" id="]-0N3DkP*7?ghtYzXwX!"> <field name="TEXT">12:00</field> </shadow> <block type="variables_get" id="!,6PYgrHnSxh#Evn[Yie"> <field name="VAR" id="?~:J:;gqC%-pt?=zNsH:">Sunrise</field> </block> </value> </block> </value> <value name="B"> <block type="time_compare_ex" id="qRYvI=rC7,D?`B=PV@^6"> <mutation xmlns="http://www.w3.org/1999/xhtml" end_time="false" actual_time="true"></mutation> <field name="USE_ACTUAL_TIME">TRUE</field> <field name="OPTION"><=</field> <value name="START_TIME"> <shadow type="text"> <field name="TEXT">12:00</field> </shadow> <block type="variables_get" id="LMy)6-$QN(f3d9klxV`O"> <field name="VAR" id="UJ`JGN{Ezb$K7jJ[4P}j">Sunset</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="variables_set" id="~p6WKGjCNU[UXfc{|$8|"> <field name="VAR" id="BN!a@q$SEAU4^)xo:SRJ">maxSolarPower</field> <value name="VALUE"> <block type="math_number" id="Z(v(#cMkS]/o.,;iyE/|"> <field name="NUM">1500</field> </block> </value> <next> <block type="variables_set" id="Ih%sQzzK`!Ec=`tscEm-"> <field name="VAR" id="AcYpB0Ty+wVObL7=Y.a.">measuredPower</field> <value name="VALUE"> <block type="get_value" id="E60zTd:yszZT-@pD[YB#"> <field name="ATTR">val</field> <field name="OID">shelly.0.SHEM-3#E8DB84D68CFF#1.Total.InstantPower</field> </block> </value> <next> <block type="variables_set" id=":rlAB32E^@yPP9Jh?EMO"> <field name="VAR" id="1}Q0686mMw0ZGk)e+r?(">measuredSolarPower</field> <value name="VALUE"> <block type="get_value" id="Q8pLDlgI~N(N2-6)X@Qu"> <field name="ATTR">val</field> <field name="OID">opendtu.0.116180216966.ac.phase_1.power</field> </block> </value> <next> <block type="variables_set" id="t8-xB+K`%rr)x]%:Q5cN"> <field name="VAR" id="le#}gR{6G.yhW=x|6pS8">neededPower</field> <value name="VALUE"> <block type="math_arithmetic" id="2FaDMR/kS5K9d!j=`dK3"> <field name="OP">ADD</field> <value name="A"> <shadow type="math_number" id="2FEk%?jHI2)Hvf4}p|*;"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="Z`YZ!4FileGG?5VwaP-/"> <field name="VAR" id="AcYpB0Ty+wVObL7=Y.a.">measuredPower</field> </block> </value> <value name="B"> <shadow type="math_number" id="+10nRI6/x]hugF{/lmxM"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="n0BqKn~p@qPw.Jvfrj,s"> <field name="VAR" id="1}Q0686mMw0ZGk)e+r?(">measuredSolarPower</field> </block> </value> </block> </value> <next> <block type="variables_set" id="$61h{3os=)%X-VEx9M:i"> <field name="VAR" id="X-B3:`dA%wy5$?]at5W-">NeededPowerPercent</field> <value name="VALUE"> <block type="math_round" id="3$tH.4.P)ukPPcI4xw.A"> <field name="OP">ROUND</field> <value name="NUM"> <shadow type="math_number" id="{D8W1ElJ#97Cg:]vDkM;"> <field name="NUM">3.1</field> </shadow> <block type="math_arithmetic" id="ju~9S8j-`0c/OF%2$7-o"> <field name="OP">MULTIPLY</field> <value name="A"> <shadow type="math_number" id="6:p#t,*^;)z:Wb:@dc|3"> <field name="NUM">100</field> </shadow> </value> <value name="B"> <shadow type="math_number" id=".fYZ,3H9RSS}:wD=%Bvk"> <field name="NUM">1</field> </shadow> <block type="math_arithmetic" id="Z9S-r-/8^FbCeq,[{ULB"> <field name="OP">DIVIDE</field> <value name="A"> <shadow type="math_number" id="jul_lM$(9.yj`:ZH8}%@"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="_mPBX.l-0%hNvWtND[z1"> <field name="VAR" id="le#}gR{6G.yhW=x|6pS8">neededPower</field> </block> </value> <value name="B"> <shadow type="math_number" id="{Q+JfjzDv.)Z1KRbU*uv"> <field name="NUM">600</field> </shadow> <block type="variables_get" id="M!sN^/9!7$b}.ru.lqgC"> <field name="VAR" id="BN!a@q$SEAU4^)xo:SRJ">maxSolarPower</field> </block> </value> </block> </value> </block> </value> </block> </value> <next> <block type="variables_set" id="g3gA+F5X4*$4x2),%sJV"> <field name="VAR" id=":U;.Z4:pYNy(TwM9X-dL">storedNeededPower</field> <value name="VALUE"> <block type="get_value" id="7wbrC,7l;@ahCGcw2/pL"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.PV-Anlage.storedNeededPower</field> </block> </value> <next> <block type="variables_set" id="2KI]WdQd`0MzEf%mOPaL"> <field name="VAR" id="}s`y%Qd}~t2t(jU$8(ud">upperLimit</field> <value name="VALUE"> <block type="math_round" id="Ha.~N]M`[1eWboby_aYe"> <field name="OP">ROUND</field> <value name="NUM"> <shadow type="math_number" id=":C/cpWh)P`-jK9}]IN*4"> <field name="NUM">3.1</field> </shadow> <block type="math_arithmetic" id="v}v!|Jkv3JHVqQR7poM0"> <field name="OP">ADD</field> <value name="A"> <shadow type="math_number"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="{dg*rTfc(I5I1PoYYN;l"> <field name="VAR" id=":U;.Z4:pYNy(TwM9X-dL">storedNeededPower</field> </block> </value> <value name="B"> <shadow type="math_number"> <field name="NUM">1</field> </shadow> <block type="math_arithmetic" id="#Aa[sC!ija_TtL9Go*jl"> <field name="OP">MULTIPLY</field> <value name="A"> <shadow type="math_number"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="?YS@_}6Hup[`ZsLR!Z45"> <field name="VAR" id=":U;.Z4:pYNy(TwM9X-dL">storedNeededPower</field> </block> </value> <value name="B"> <shadow type="math_number" id="YxGb?xk[MY37)!7O-Cqe"> <field name="NUM">0.05</field> </shadow> </value> </block> </value> </block> </value> </block> </value> <next> <block type="variables_set" id="+KJ71_Z(eLN.a(uoEuci"> <field name="VAR" id="P^1|W+9iVy?PgNp}9!.S">lowerLimit</field> <value name="VALUE"> <block type="math_round" id="=HYNg!vGE)^Z7m{+e$cs"> <field name="OP">ROUND</field> <value name="NUM"> <shadow type="math_number" id="|d.50MyF$Zxnn(B]!gq~"> <field name="NUM">3.1</field> </shadow> <block type="math_arithmetic" id="?8HAOa[X,LM#h`p]lLc4"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number" id="(8p!3BSrd)N0m`PVj}cd"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="?$cU!rsg;wkU}CP.VsR."> <field name="VAR" id=":U;.Z4:pYNy(TwM9X-dL">storedNeededPower</field> </block> </value> <value name="B"> <shadow type="math_number" id="@kP8*eoC!D4/Wa?%grKM"> <field name="NUM">1</field> </shadow> <block type="math_arithmetic" id="D$_kryX`Gb5eu$gnYS_q"> <field name="OP">MULTIPLY</field> <value name="A"> <shadow type="math_number"> <field name="NUM">1</field> </shadow> <block type="variables_get" id="nrL6t1UCC{jy1*U[O|Xq"> <field name="VAR" id=":U;.Z4:pYNy(TwM9X-dL">storedNeededPower</field> </block> </value> <value name="B"> <shadow type="math_number" id="||~-FC.nb3oU=fuLJzw}"> <field name="NUM">0.1</field> </shadow> </value> </block> </value> </block> </value> </block> </value> <next> <block type="debug" id="8cGY=ms*^/Fbn#Cde4/e"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="QUQf.~7J|ziuD3sLdl)|"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="lGPf[Ci!QdAF4j#Bn34-"> <field name="TEXT">Sonnenaufgang; </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="kwmbl:u%6-!)]lE{Bhdj"> <field name="VAR" id="?~:J:;gqC%-pt?=zNsH:">Sunrise</field> </block> </value> </block> </value> <next> <block type="debug" id="yaFK]t~sZKg}j1WzH!TL"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="g_%Dq-ksE!p;Tib-dWoB"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="(bZZUaTT0bt~IQ|a~%#R"> <field name="TEXT">Sonnenuntergang; </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="weuYcyZ5+:mfnpSK9UiP"> <field name="VAR" id="UJ`JGN{Ezb$K7jJ[4P}j">Sunset</field> </block> </value> </block> </value> <next> <block type="debug" id="1|f1K~GhCe(a;/q4o_X]"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="2Zo2{I0w6J%`$2:qEY1l"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="+YI.VRyx;em.YT$D(|bs"> <field name="TEXT">Istwert: </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="z%3ACfZd0~)KLgj0p}%@"> <field name="VAR" id=":U;.Z4:pYNy(TwM9X-dL">storedNeededPower</field> </block> </value> </block> </value> <next> <block type="debug" id="r+xN[i`4xS-M`OYDBpb."> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="(f(78JM#Hy0@?Z0hJe~l"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="~}`O(MW.TU:J%_oS)#Xu"> <field name="TEXT">obere Grenze: </field> </block> </value> <value name="ADD1"> <block type="variables_get" id=",vBoJg7x{3!@v.c5w4q]"> <field name="VAR" id="}s`y%Qd}~t2t(jU$8(ud">upperLimit</field> </block> </value> </block> </value> <next> <block type="debug" id="qBNh2:P3U}F#$|$6FZFn"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="2kPK8(t-SdR9TZvb.%-l"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="}cq5v9RJT$55w(=?6BX)"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="*q^TTVgJ+?:b!z,x/S;V"> <field name="TEXT">untere Grenze: </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="Vh$)4$K%:ZHW:~MiMXet"> <field name="VAR" id="P^1|W+9iVy?PgNp}9!.S">lowerLimit</field> </block> </value> </block> </value> <next> <block type="debug" id="k}*+@}8y%^u*6nB1JGm^"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="9O/.cB+R0J#M=YHuIJn?"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="3Uv-x,Irz%wnP{oXU!s^"> <field name="TEXT">benötigte Power in Prozent:</field> </block> </value> <value name="ADD1"> <block type="variables_get" id="T);Yxf;X[xS0z_7}_YkI"> <field name="VAR" id="X-B3:`dA%wy5$?]at5W-">NeededPowerPercent</field> </block> </value> </block> </value> <next> <block type="controls_if" id="//Rx),f%pyif!qW8O/?G"> <mutation elseif="1" else="1"></mutation> <value name="IF0"> <block type="logic_operation" id="6|n{EZ*g-L?wwMuw~`pt"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="@s)ep$AZC}nn4%[Y{zXv"> <field name="OP">GTE</field> <value name="A"> <block type="variables_get" id="rLGQIwoD@(-[)i.@Gek1"> <field name="VAR" id="X-B3:`dA%wy5$?]at5W-">NeededPowerPercent</field> </block> </value> <value name="B"> <block type="math_number" id="i.8)/]r6EY5E@{+61}ch"> <field name="NUM">100</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="M%7gn=%*6!Oo0Iy!N0HE"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="FPBUa4}8MCdw~u2(u=Z4"> <field name="VAR" id=":U;.Z4:pYNy(TwM9X-dL">storedNeededPower</field> </block> </value> <value name="B"> <block type="math_number" id="])#t~DUCT78?qe_~1/X)"> <field name="NUM">100</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="debug" id="_|aD2Z`JU`?BoQCCcfTz"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="wcNA/`cj2DUcJLr26^bd"> <field name="TEXT">keine Ănderung, Wert ist gleich gespeichertem Wert</field> </shadow> </value> </block> </statement> <value name="IF1"> <block type="logic_operation" id="4WJuW,40dOlCCnG8!=A("> <field name="OP">OR</field> <value name="A"> <block type="logic_compare" id="0U*fZT58L0uKFJsD)N{;"> <field name="OP">GT</field> <value name="A"> <block type="variables_get" id="%=U`G7.6z`w:8|:XtgTI"> <field name="VAR" id="X-B3:`dA%wy5$?]at5W-">NeededPowerPercent</field> </block> </value> <value name="B"> <block type="variables_get" id="IE{(_NPVQP{:.^rxbG?4"> <field name="VAR" id="}s`y%Qd}~t2t(jU$8(ud">upperLimit</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="7GGwP6lHcmy!ILxZJvYk"> <field name="OP">LT</field> <value name="A"> <block type="variables_get" id="EN^7brshgWEicI7V4)C!"> <field name="VAR" id="X-B3:`dA%wy5$?]at5W-">NeededPowerPercent</field> </block> </value> <value name="B"> <block type="variables_get" id="7B.88d1a^Hr`R-b6!iMZ"> <field name="VAR" id="P^1|W+9iVy?PgNp}9!.S">lowerLimit</field> </block> </value> </block> </value> </block> </value> <statement name="DO1"> <block type="controls_if" id="P8/_4.KJ/zZ6qh9iBh+o"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="mk*xKT^,LdqKZpmRr}r4"> <field name="OP">LTE</field> <value name="A"> <block type="variables_get" id=".d_KP;p/?wytr_{S7(db"> <field name="VAR" id="le#}gR{6G.yhW=x|6pS8">neededPower</field> </block> </value> <value name="B"> <block type="variables_get" id="R!EQmKR0*lP1iR`NTG%f"> <field name="VAR" id="BN!a@q$SEAU4^)xo:SRJ">maxSolarPower</field> </block> </value> </block> </value> <statement name="DO0"> <block type="variables_set" id="v_^pc%4YAqueF4@xp/Ph"> <field name="VAR" id=")2]D^Y|D:QS6S[A}9J=/">SolarLimit</field> <value name="VALUE"> <block type="variables_get" id="rba!2I;EQyijkPfjo!Ze"> <field name="VAR" id="X-B3:`dA%wy5$?]at5W-">NeededPowerPercent</field> </block> </value> <next> <block type="update" id="E7HJvqAC,*BNAxN~e8sd"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.PV-Anlage.storedNeededPower</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="variables_get" id="hR1[WimPbd@1ICN+UAdn"> <field name="VAR" id="X-B3:`dA%wy5$?]at5W-">NeededPowerPercent</field> </block> </value> </block> </next> </block> </statement> <statement name="ELSE"> <block type="variables_set" id="iqqD`P-h34,:2q7p$CH|"> <field name="VAR" id=")2]D^Y|D:QS6S[A}9J=/">SolarLimit</field> <value name="VALUE"> <block type="math_number" id="dowAhu.+=iz#Wc-F]p:X"> <field name="NUM">100</field> </block> </value> <next> <block type="update" id="*?5=;cANP)NJ|KuX_[PF"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.PV-Anlage.storedNeededPower</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="7vXqNl1zb}n*oh6q3:]4"> <field name="NUM">100</field> </block> </value> </block> </next> </block> </statement> <next> <block type="controls_if" id="]^/I[vJo!sr5LpkbcFB!"> <value name="IF0"> <block type="logic_compare" id="%50d#)U*~RScC:F-kp{g"> <field name="OP">LTE</field> <value name="A"> <block type="variables_get" id="KVYNgaA$~@zFf4U(-2G("> <field name="VAR" id=")2]D^Y|D:QS6S[A}9J=/">SolarLimit</field> </block> </value> <value name="B"> <block type="math_number" id="!0pj`kNb_!ZOVov*^)[3"> <field name="NUM">4</field> </block> </value> </block> </value> <statement name="DO0"> <block type="variables_set" id="/4+e9gEK~pdujzM|}ksi"> <field name="VAR" id=")2]D^Y|D:QS6S[A}9J=/">SolarLimit</field> <value name="VALUE"> <block type="math_number" id="c+YG2dsZvm-}l6dXt[1Z"> <field name="NUM">5</field> </block> </value> </block> </statement> <next> <block type="controls_if" id="ZH?n)}/A8xDqvLu;mM3m"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_operation" id="vVy#@8N({zRaYhlMew]c"> <field name="OP">OR</field> <value name="A"> <block type="logic_compare" id="PIGb)h}(L;=:AD;5r=W$"> <field name="OP">LTE</field> <value name="A"> <block type="get_value" id="Hn,:c1}lRncb$M*c37T["> <field name="ATTR">val</field> <field name="OID">0_userdata.0.PV-Anlage.Solarlimit_HM400.Solarlimit_HM400</field> </block> </value> <value name="B"> <block type="math_number" id="O/l%Uh0A@?HPfD;/4eRW"> <field name="NUM">5</field> </block> </value> </block> </value> <value name="B"> <block type="logic_operation" id="x8],WeAvz)P5RbWxBqKU"> <field name="OP">OR</field> <value name="A"> <block type="logic_compare" id="D1Vr-[UHVwz,0UMcxf~t"> <field name="OP">GTE</field> <value name="A"> <block type="get_value" id="*^o)uk]A48Tjk%pvj2pB"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.PV-Anlage.Solarlimit_HM400.Solarlimit_HM400</field> </block> </value> <value name="B"> <block type="math_number" id="az|/|Fl[JpJ{rB83ed[p"> <field name="NUM">100</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="1f.~}_NZHFWHi$U;Bl[E"> <field name="OP">LT</field> <value name="A"> <block type="get_value" id="o%XYKF2zkxK+dE|3E%-_"> <field name="ATTR">val</field> <field name="OID">opendtu.0.112183217812.ac.phase_1.power</field> </block> </value> <value name="B"> <block type="get_value" id="uM~uo~N[nRQ?i9!fzRA!"> <field name="ATTR">val</field> <field name="OID">opendtu.0.112183217812.power_control.current_limit_absolute</field> </block> </value> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="W+gr)Q`C;VMjG:,mB)8r"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">opendtu.0.116180216966.power_control.limit_nonpersistent_relative</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="variables_get" id="0O[l*@b$eWz(z6Nj5;8Z"> <field name="VAR" id=")2]D^Y|D:QS6S[A}9J=/">SolarLimit</field> </block> </value> <next> <block type="debug" id="4(mO4hae0d8|yCEDlMj~"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="GhK9E*i9z*IoFuBKSaq1"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="K$7:Tw;%Pm?f$3/:xV?V"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="tzX795?CuQ=.SGL`i!ns"> <field name="TEXT">gesetztes Limit: </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="`hpd|~6gnaa1#A:#I^ku"> <field name="VAR" id=")2]D^Y|D:QS6S[A}9J=/">SolarLimit</field> </block> </value> </block> </value> </block> </next> </block> </statement> <statement name="ELSE"> <block type="debug" id="Pv3KiYZaGuo2FdU}gjig"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="t2%tFy.G9l;?j^VyEMCa"> <field name="TEXT">keine Ănderung</field> </shadow> </value> </block> </statement> </block> </next> </block> </next> </block> </statement> <statement name="ELSE"> <block type="debug" id="k-_yI!1YR}Cw@^zA*2By"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="pOzzR,#7b~P,=jhm/QLz"> <field name="TEXT">keine Ănderung</field> </shadow> </value> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> <statement name="ELSE"> <block type="debug" id="6hv2w66u%V}c3Ij`Q?pi"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="LmPU])Tk80,#%40`K:m4"> <field name="TEXT">Zeit ist auĂerhalb der Reglungszeit.</field> </shadow> </value> </block> </statement> </block> </next> </block> </next> </block> </statement> </block> </xml>
-
@gonzokalle
Ja das ist bei mir auch so.
Der Trigger ist immer die Ănderung im Stromverbrauch. Dann setzt das Script ein neues Limit sofern die Solaranlage mehr als die 30% liefert. Bei mir dann 450W.
Wenn der Stromverbrauch hochgeht, dann geht das Limit hoch und auch wieder runter, wenn der Verbrauch sinkt.
Sollte dann die Solaranlage bei gleichem Verbrauch mehr liefern, dann sinkt der Stromverbrauch aber das Limit bleibt gleich, weil sich die Summe aus Solarenergie und Stromverbrauch nicht Àndert.
Ich habe auch nur einen WR.
Weil aber mein Hichi nur alle 10sek einen neuen Wert schickt, ist das ganze natĂŒrlich nicht genau, aber fĂŒr unsere Zwecke reicht es.
Vom Shelly 3EM mĂŒsste ja der Gesamtverbrauch gemessen werden. Wenn der Shelly im Sekundentakt einen Wert liefert, dann schreibt das Script auch jede Sekunde.Aber das Prinzip ist das gleiche. Ich nehme an, Du hast einen 600W WR im Einsatz.
@carsaab
Hi,
kannst du vielleicht das komplette Blockly mal einstellen ? Ich habe da etwas Schwierigkeiten, beim nachbauen. -
@carsaab
Hi,
kannst du vielleicht das komplette Blockly mal einstellen ? Ich habe da etwas Schwierigkeiten, beim nachbauen.Zum Thema Nulleinspeisung (oder 'Panelbeheizung', wie ich es nenne):
-
@carsaab
Hi,
kannst du vielleicht das komplette Blockly mal einstellen ? Ich habe da etwas Schwierigkeiten, beim nachbauen.@tosca76 Null-Einspeiseregelung_0.xml
Das ist das File.
Ansonsten ist das Bild auch das Script.
Die Objekte muĂt Du leider selber finden, ich nutze gerade 2 Wechselrichter die hier gesteuert werden.
BTW: Das Video ist mir bekannt und er hat auch Recht. Es ist aber kein Widerspruch zu meiner Regelung, weil ich die Null garnicht unbedingt erreichen will. Der grobe Daumen reicht, ist aber auch oben schon erklÀrt. -
@tosca76 Null-Einspeiseregelung_0.xml
Das ist das File.
Ansonsten ist das Bild auch das Script.
Die Objekte muĂt Du leider selber finden, ich nutze gerade 2 Wechselrichter die hier gesteuert werden.
BTW: Das Video ist mir bekannt und er hat auch Recht. Es ist aber kein Widerspruch zu meiner Regelung, weil ich die Null garnicht unbedingt erreichen will. Der grobe Daumen reicht, ist aber auch oben schon erklÀrt.@carsaab
Super dank dir đ -
Hallo,
ich habe mich mal daran versucht, ein Blockly zu erstellen, welches dazu dient, einen Hoymiles Wechselrichter fĂŒr ein Balkonkraftwerk zu regeln.
Dazu gibt es im Netz schon einige, aber die, die ich gefunden hatte, gingen immer von dem Ansatz aus, das reagiert wird, wenn die Anlage in die Einspeisung geht, also mehr Strom erzeugt wird, als benötigt wird.
Mein Ansatz verfolgt einen anderen Weg. Und zwar den, dass die Anlage immer maximal soviel Strom liefert, wie von den Verbrauchern verlangt wird. Meinen StromzÀhler lese ich mit einem Hichi aus, der negative Werte anzeigt, wenn eingespeist wird. Die benötigte Strommenge ergibt sich aus der Summe dessen, was der Hichi ausliest und der momentanen Leistung der PV-Anlage.
Meine Regelung erfolgt alle 30 Sekunden und nur zwischen Sonnenauf- und Sonnenuntergang. Um zu hĂ€ufige Regelungen zu vermeiden, habe ich eine Hysterese eingebaut, wobei die Regelung nur dann erfolgt, wenn der gemessene Strombedarf mehr als 10% vom vorher eingestellten abweicht. Den eingestellten Wert speichere ich dazu in einem Datenpunkt. Die Regelung erfolgt ĂŒber MQTT non-persistent und in Prozent, also relativ.
Ich hoffe, das Skript ist einigermaĂen lesbar und wĂŒrde mich mich ĂŒber Hinweise zu Fehlern oder VerbesserungsvorschlĂ€ge freuen.
Hier nun das Blockly;
viele GrĂŒĂe
Kymchy@kymchy
Vielen Dank fĂŒr deine WR Steuerung.
Funktioniert!

Habe das Blockly noch etwas verÀndert. Bin da aber leider kein Fachmann.

Interessant wĂ€hre noch die Steuerung fĂŒr einen zweiten WR. -
Hallo Zusammen,
Ich möchte dieses Thema Nocheinmal aufgereifen. Ich habe das Blockly von Carsaab nachgebaut. eigenlich das was ich die ganzezeit gesucht habe.
das Blockly rechnet die Prozente aus die ich in eine DummyVariable schreibe. Getriggert von der Wert anderung des StromzÀhlers ca alle 10 Sekunden. Möchte ich nun den Wert in den Open -DTU Adapter schreiben (Limit_nonpersistent_relativ) schreiben, scheind sich die Komunikation zwischen Adapter und DTU aufzuhÀngen.
das heist es werden keine Aktualdaten von der DTU an den Adapter zurĂŒck ĂŒbermittelt. wenn nur Sporadisch und nicht wie gewohnt alle 10 Sekunden.
ich habe auch schon gedacht das zuviel daten gesendet werden und habe es ĂŒber einen Cronjob alle 5 min versucht.
Sobald ich einmal auf die variable schreibe ist Feierabend. stoppe ich das Blockly normalisiert sich wieder alles .
Schreibe ich aber mehrfach in die Variable hĂ€ngen sich die DTU auf. Auch die Webseite auf dem ESP bleibt bei der Daten ĂŒbertragung hĂ€ngen.Mein Setup
HM 1500
Open DTU auf ESP 32 Neuste Firmware
Open DTU Adapter auf Raspi4 8 GBJemand eine Idee Woran es liegen könnte.

Im Sonnenuntergang ist mit Absicht noch der Dummy drin
GruĂ Thomas
-
Hallo Zusammen,
Ich möchte dieses Thema Nocheinmal aufgereifen. Ich habe das Blockly von Carsaab nachgebaut. eigenlich das was ich die ganzezeit gesucht habe.
das Blockly rechnet die Prozente aus die ich in eine DummyVariable schreibe. Getriggert von der Wert anderung des StromzÀhlers ca alle 10 Sekunden. Möchte ich nun den Wert in den Open -DTU Adapter schreiben (Limit_nonpersistent_relativ) schreiben, scheind sich die Komunikation zwischen Adapter und DTU aufzuhÀngen.
das heist es werden keine Aktualdaten von der DTU an den Adapter zurĂŒck ĂŒbermittelt. wenn nur Sporadisch und nicht wie gewohnt alle 10 Sekunden.
ich habe auch schon gedacht das zuviel daten gesendet werden und habe es ĂŒber einen Cronjob alle 5 min versucht.
Sobald ich einmal auf die variable schreibe ist Feierabend. stoppe ich das Blockly normalisiert sich wieder alles .
Schreibe ich aber mehrfach in die Variable hĂ€ngen sich die DTU auf. Auch die Webseite auf dem ESP bleibt bei der Daten ĂŒbertragung hĂ€ngen.Mein Setup
HM 1500
Open DTU auf ESP 32 Neuste Firmware
Open DTU Adapter auf Raspi4 8 GBJemand eine Idee Woran es liegen könnte.

Im Sonnenuntergang ist mit Absicht noch der Dummy drin
GruĂ Thomas
-
@gonzokalle said in Regelung eines Hoymiles Solarinverters (Nulleinspeisung):
@lieggie
Hast du es schon einmal mit dem openDTU-Adapter und
probiert?
Das ist die Variable aus dem dtu Adapter
GruĂ Thomas -
@gonzokalle said in Regelung eines Hoymiles Solarinverters (Nulleinspeisung):
@lieggie
Hast du es schon einmal mit dem openDTU-Adapter und
probiert?
Das ist die Variable aus dem dtu Adapter
GruĂ Thomas@lieggie said in Regelung eines Hoymiles Solarinverters (Nulleinspeisung):
@gonzokalle said in Regelung eines Hoymiles Solarinverters (Nulleinspeisung):
@lieggie
Hast du es schon einmal mit dem openDTU-Adapter und
probiert?
Das ist die Variable aus dem Open DTU Adapter die nutze ich auch.
GruĂ Thomas -
Ich habe die Regelung von Kymchy noch ein bisschen geÀndert. Der WR hat jetzt Grenzen.
Ich hĂ€tte es gerne, dass das obere Limit fĂŒr 1 Minute gehalten wird.
Falls noch ein höheres Limit, soll das dann gehalten werden.
Also höher geht immer, runter nach einer Minute.
Mir fehlt da die Idee, wie ich da ran gehen soll.
-
Nun hatte ich doch eine Idee. So scheint es zu funktionieren.

-
Ich habe dein Script auch mal verwendet und lasse es seit gestern laufen.
Sieht ziemlich gut aus auch wenn ich mich ein bisschen rein fuchsen musste, weil die Werte des Tibberpulse fĂŒr Production und bezug nicht so cool sind.
Nehme jetzt fĂŒr den Bezug den Tibber Wert und fĂŒr die Produktion den aus MQTT - das klappt sehr gut.Danke dir!
-
Ich habe dein Script auch mal verwendet und lasse es seit gestern laufen.
Sieht ziemlich gut aus auch wenn ich mich ein bisschen rein fuchsen musste, weil die Werte des Tibberpulse fĂŒr Production und bezug nicht so cool sind.
Nehme jetzt fĂŒr den Bezug den Tibber Wert und fĂŒr die Produktion den aus MQTT - das klappt sehr gut.Danke dir!
@schumi1992
Meinst du das letzte Script? -
@schumi1992
Meinst du das letzte Script?@gonzokalle Ne habe das UrsprĂŒngliche von Kimchy verwendet :-)
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen BeitrĂ€ge zu scrollen? Wenn du dich fĂŒr ein Konto anmeldest, kommst du immer genau dorthin zurĂŒck, wo du zuvor warst, und kannst dich ĂŒber neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und BeitrĂ€ge positiv bewerten, um anderen Community-Mitgliedern deine WertschĂ€tzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden đ
Registrieren Anmelden

