NEWS
Script zum Laden/Entladen von Zendure Solarflow
-
Hallo zusammen,
ich habe mal meinem Blocky zum Laden/Entladen von Zendure Solarflow ein eigenes Thema spendiert.
Ihr könnt damit euren Hub+ACE oder Hyper ohne die App und auch ohne openDTU steuern.Es beinhaltet:
Laden nach Preis, z.B. Tibber (Tibberadapter notwendig)
Entladen mit Hilfe eines Shelly 3EM oder Smartmeter (Triggerwert)
PV Leistung im Haus verbrauchen
Bypass wenn Akku voll
Überschussladen, z.B. von externer PVBenötigt wird dafür der Zendure Solarflow Adapter von @nograx
Im oberen Teil des Blockly könnt ihr eigene Schwellwerte festlegen:
output_Abzug: Wert der von der Ausgangsleistung eures Hub/Hyper abgezogen wird
input_Abzug: Wert der von einer externen AC-Ladequelle (z.B. andere PV Anlage) abgezogen wird.
entladen_ab_PV_Leistung: Ab welcher PV Leistung der Mini PV Soll eine Einspeisung ins Haus erfolgen
min_PV_Leistung_laden: Mit welcher minimale PV Leistung soll der Akku aus der Mini PV geladen werden.
ausgang_max_soll: Maximal Leistungsabgabe ans Haus
Ohne Tibber müsst ihr die Teile im Script rausnehmen.
Release v1.01, Stand 23.04.2025
Änderung
- Zusätzlicher Timer beim Umschalten in den Ausgabe-Modus
Script: Energie.Hyper_V1.01.txt
-
Vielen Dank, @lesiflo, für das großartige Skript.
Ich verwende eine ESP Leskopf und kann die OBIS-Werte aus meinem Stromzähler auslesen. Leider habe ich Tibber nicht, was bewirkt in deinem Skript:
Womit könnte ich das füllen?
leider verstehe ich auch nach deinen ausführlichen Beschreibung die Schwellwerte nicht.
output_Abzug: Wert der von der Ausgangsleistung eures Hub/Hyper abgezogen wird
Welche Aspekte sollte ich beachten, wenn ich den Hyper mit Akku und PV-Modul nutze? Wozu führt der Wert?input_Abzug: Wert der von einer externen AC-Ladequelle (z.B. andere PV Anlage) abgezogen wird.
Ich habe eine weitere Mikroanlage mit 600 Wp und würde diese 600 W in die Berechnung einbeziehen, aber ich verstehe nicht, welche Konsequenzen sich daraus ergeben.entladen_ab_PV_Leistung: Ab welcher PV Leistung der Mini PV Soll eine Einspeisung ins Haus erfolgen
Priorität 1 sollte sein, dass der Akku geladen wird. Sollte dann noch Leistung übrig sein, wird das Haus versorgt. Ist die Batterie voll, wird die überschüssige Energie wieder ins Haus geleitet. Wenn die Leistung der zweiten Anlage mit 600 W den Verbrauch abdeckt, soll die Batterie geladen werden.min_PV_Leistung_laden: Mit welcher minimale PV Leistung soll der Akku aus der Mini PV geladen werden.
Alles sollt abhängig vom tatsächlichem Hausverbrauch sein.ausgang_max_soll: Maximal Leistungsabgabe ans Haus
max 1200 bzw. das was das Haus aktuell bracht. -
@tege0 Die beiden Werte der "oder" Verknüpfung kannst du löschen, werden nur bei Tibber benötigt.
output_Abzug
Wenn der Wert auf z.B. 50 steht werden 50 Watt weniger als benötigt in Haus vom BKW eingespeist. Wertebereich sollte so zwischen 30 bis 60 sein. Je kleiner der Wert desto eher kann es passieren das was ins öffentliche Netz einspeist wird.input_Abzug
Sollte deine andere Anlage dafür sorgen, das Strom ins öffentliche Netz eingespeist wird, so kannst du mit diesem Wert festlegen um wieviel dieser Wert reduziert wird.
Beispiel
300 Watt gehen ins Netz, der Wert steht auf 50, dann wird dein BKW über den Hyper oder ACE mit 250 Watt über AC geladen. Je grösser der Wert desto weniger werden deine Akkus über die zweite Anlage geladen. Ist er zu klein, wird eventuell aus dem öffentlichen Netz geladen, Bereich zwischen 50 und 80.entladen_ab_PV_Leistung und min_PV_Leistung_laden
Damit wird festgelegt das z.B. wie hier ab 100 W dein Haus/Wohnung bevorzugt aus dem BKW versorgt wird,
Beispiel
Die PV Panels deines BKW erzeugen z.B. 400 Watt. Da dieser Wert grösser ist als die 100 Watt von entladen_ab_PV_Leistung wird Strom von deinem BKW ins Haus eingespeist,. Aber immer um Wert min_PV_Leistung_laden reduziert. Somit gehen in dem Fall 350 W ins Haus und 50 W in deine Akkus.ausgang_max_soll:
max 1200 bzw. das was das Haus aktuell bracht. -> Ja, korrekt. -
@lesiflo Hi danke nochmal für deine Unterstützung, der Adapter und das Script läuft aber der Speicher bleibt weiterhin voll, bzw. ich habe nicht das Gefühl das Energie aus dem Speicher genommen wird. Nachdem der Speicher einmal geladen worden ist ist er jetzt im Bypass
-
@tege0 Moin, wie sieht denn dein Script aus?
-
@lesiflo Moin,
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="O}e3|VjTzH+.dHc-BE_:">output_Abzug</variable> <variable id="Pmn^Rfs2`%vXob$!J=UX">input_Abzug</variable> <variable id="C3%p`nQ`AJ8yklMQKidv">entladen_ab_PV_Leistung</variable> <variable id="[ZaP{gfTZqGf@aQ2FZ~q">min_PV_Leistung_laden</variable> <variable id="8]~yHC.tW6]*GfkCbq)^">ausgang_max_soll</variable> <variable id="u8CL)Wex?DocZ58y(/n*">output</variable> <variable id="s3oTgk^d]QTYtWfpyOk6">input</variable> <variable type="timeout" id="timeout4">timeout4</variable> <variable id="4.#!}3STBog53dwlcFl-">ausgang_max</variable> </variables> <block type="comment" id="aB?G:5$JZsZVN]k[FMf$" x="2512" y="-1538"> <field name="COMMENT">Setzen der Variablen </field> <next> <block type="variables_set" id="%T^F?(~}g~8Mo.96hbPc"> <field name="VAR" id="O}e3|VjTzH+.dHc-BE_:">output_Abzug</field> <value name="VALUE"> <block type="math_number" id="Cd-LtKS?ZQR;3fE)1OfR"> <field name="NUM">50</field> </block> </value> <next> <block type="variables_set" id="Kd6%X$(E%a#8:/4N[o[d"> <field name="VAR" id="Pmn^Rfs2`%vXob$!J=UX">input_Abzug</field> <value name="VALUE"> <block type="math_number" id="6chO$JcvEJqo#aCjc+es"> <field name="NUM">50</field> </block> </value> <next> <block type="variables_set" id="uB]{;BN[bdupMg$7^N%|"> <field name="VAR" id="C3%p`nQ`AJ8yklMQKidv">entladen_ab_PV_Leistung</field> <value name="VALUE"> <block type="math_number" id="[h?+?1Bkt{sL]3tL~hWI"> <field name="NUM">100</field> </block> </value> <next> <block type="variables_set" id="Nh!l?R;)f=75+K9:iO@v"> <field name="VAR" id="[ZaP{gfTZqGf@aQ2FZ~q">min_PV_Leistung_laden</field> <value name="VALUE"> <block type="math_number" id="oOA~o%:[)dg2rqcignZi"> <field name="NUM">50</field> </block> </value> <next> <block type="variables_set" id="C7WP.yVY.~yLboTO)--M"> <field name="VAR" id="8]~yHC.tW6]*GfkCbq)^">ausgang_max_soll</field> <value name="VALUE"> <block type="math_number" id="!o~v`/:*+;(]p]{H?WTA"> <field name="NUM">1200</field> </block> </value> <next> <block type="comment" id="DJvkJQJ02otHqWQ#`O-O"> <field name="COMMENT">Entladen</field> <next> <block type="on_ext" id="/S(;`QABriIC^M+!}7T:"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="w^]7^w1{B-!$n`7Iy491"> <field name="oid">mqtt.0.iot.smartmeter.sensor.1.obis.1-0:16.7.0.255.value</field> </shadow> </value> <statement name="STATEMENT"> <block type="comment" id="cN$0iHH^ClAq2iXC%h2f"> <field name="COMMENT">Setzen der Ausgangsleistung</field> <next> <block type="variables_set" id="S2o8L=RQS++7ipXOjjW5"> <field name="VAR" id="u8CL)Wex?DocZ58y(/n*">output</field> <value name="VALUE"> <block type="math_arithmetic" id="hYf4Qb{Ih$jw*N;WscVV"> <field name="OP">ADD</field> <value name="A"> <shadow type="math_number" id="9gy04mb1^QNucYMt=}0h"> <field name="NUM">50</field> </shadow> <block type="math_arithmetic" id="*1]Xu7P5!!NOH(N|hVz:"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number" id="b{`6?WEyk*89jf,ZZB$."> <field name="NUM">50</field> </shadow> <block type="on_source" id="fT5WF[G1:geas5bB(dK_"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <shadow type="math_number" id="fm2M,2zo4VbkMa}j=/{E"> <field name="NUM">40</field> </shadow> <block type="variables_get" id="P_*d{TGR}~6)FGp?beAd"> <field name="VAR" id="O}e3|VjTzH+.dHc-BE_:">output_Abzug</field> </block> </value> </block> </value> <value name="B"> <shadow type="math_number" id="3(GI4:w3kpQ]XWp!0hOr"> <field name="NUM">1</field> </shadow> <block type="get_value" id="Qo}VOqo;3/)bnhXo)WG?"> <field name="ATTR">val</field> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.outputHomePower</field> </block> </value> </block> </value> <next> <block type="comment" id="jfTMAZ*=]Yc9N:)Y_sD1"> <field name="COMMENT">Setzen der Eingangsleistung</field> <next> <block type="variables_set" id="=I!*y|ga6BOdj=O!X0BN"> <field name="VAR" id="s3oTgk^d]QTYtWfpyOk6">input</field> <value name="VALUE"> <block type="math_arithmetic" id="~LBc9fG5Z6lJd12/)jT4"> <field name="OP">ADD</field> <value name="A"> <shadow type="math_number" id="9gy04mb1^QNucYMt=}0h"> <field name="NUM">50</field> </shadow> <block type="math_arithmetic" id="7*xCVML~1.vqU9HsbESx"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number" id="b{`6?WEyk*89jf,ZZB$."> <field name="NUM">50</field> </shadow> <block type="math_arithmetic" id="h8,cPd68a?7lws8h++F@"> <field name="OP">MULTIPLY</field> <value name="A"> <shadow type="math_number" id="K%zdB%]da)JMw$_M{`0A"> <field name="NUM">1</field> </shadow> <block type="on_source" id="4-h:R`sm6~t8DD=?|~bF"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <shadow type="math_number" id="ruG^sz:{eEwbTM5f6,,3"> <field name="NUM">-1</field> </shadow> </value> </block> </value> <value name="B"> <shadow type="math_number" id="$D6ZCKCT8FTu_$opwTau"> <field name="NUM">80</field> </shadow> <block type="variables_get" id="l1AP,7Z]*amiz~W%-%1U"> <field name="VAR" id="Pmn^Rfs2`%vXob$!J=UX">input_Abzug</field> </block> </value> </block> </value> <value name="B"> <shadow type="math_number" id="3(GI4:w3kpQ]XWp!0hOr"> <field name="NUM">1</field> </shadow> <block type="get_value" id="^#eZ+R?)2{J(aB:7ue?R"> <field name="ATTR">val</field> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.gridInputPower</field> </block> </value> </block> </value> <next> <block type="controls_if" id="9{oE^c13a:31;2ut.DI$"> <mutation elseif="2" else="1"></mutation> <value name="IF0"> <block type="logic_operation" id="FM{=CcWqi$cZiLrTUt|c" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="8T*pvHzokS3$DFxF[cJw"> <field name="OP">GT</field> <value name="A"> <block type="variables_get" id="~PO!:gZkJmZA*2|eHeLF"> <field name="VAR" id="u8CL)Wex?DocZ58y(/n*">output</field> </block> </value> <value name="B"> <block type="math_number" id="[w:QpHOP~OO[[A!*WhCR"> <field name="NUM">0</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="h,i~#@yPRw(6/9i72ti]"> <field name="OP">GT</field> <value name="A"> <block type="get_value" id="-+SJ366xWJKVS[GlnD+M"> <field name="ATTR">val</field> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.solarInputPower</field> </block> </value> <value name="B"> <block type="variables_get" id="cH,sON~zP`WQrqn3m2ZP"> <field name="VAR" id="C3%p`nQ`AJ8yklMQKidv">entladen_ab_PV_Leistung</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="comment" id="U9B/k%5s]K%^b3s)xv(L"> <field name="COMMENT">1. Entladen</field> <next> <block type="controls_if" id="lqfMN+oTfpMH$r=IF.]*"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="jraX-U4NvmG~iU5_!b_-"> <field name="OP">GT</field> <value name="A"> <block type="get_value" id="RJ{ZOBC`JZxk?Wh2AUqw"> <field name="ATTR">val</field> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.solarInputPower</field> </block> </value> <value name="B"> <block type="variables_get" id="a81S}b!V{aCPJeQ@5ZVB"> <field name="VAR" id="C3%p`nQ`AJ8yklMQKidv">entladen_ab_PV_Leistung</field> </block> </value> </block> </value> <statement name="DO0"> <block type="comment" id="BCb_o;s~#Iozzv%Cas0r"> <field name="COMMENT">PV Leistung in Hausverbrauch</field> <next> <block type="variables_set" id="^q}qt_N]BU5Q%/J!*t]v"> <field name="VAR" id="4.#!}3STBog53dwlcFl-">ausgang_max</field> <value name="VALUE"> <block type="math_arithmetic" id="8~SRMHO?%%VAP*(QC#;f"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number" id="Oro!0u03Bc+Eq-2~1;/v"> <field name="NUM">1</field> </shadow> <block type="get_value" id="2aEM-Q)HyYfnX|7M~YPe"> <field name="ATTR">val</field> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.solarInputPower</field> </block> </value> <value name="B"> <shadow type="math_number" id="`~i$BG^Jk:{8Au^!MQP:"> <field name="NUM">50</field> </shadow> <block type="variables_get" id="}/~/H[`cKB?7xVui=l;-"> <field name="VAR" id="[ZaP{gfTZqGf@aQ2FZ~q">min_PV_Leistung_laden</field> </block> </value> </block> </value> </block> </next> </block> </statement> <statement name="ELSE"> <block type="variables_set" id="/3-);`|8@{UwDnWT6ksK"> <field name="VAR" id="4.#!}3STBog53dwlcFl-">ausgang_max</field> <value name="VALUE"> <block type="variables_get" id="I%qi{|oZzXlO9z5nSJu?"> <field name="VAR" id="8]~yHC.tW6]*GfkCbq)^">ausgang_max_soll</field> </block> </value> </block> </statement> <next> <block type="controls_if" id="C##I)|jndO21{Wa2E/f)"> <value name="IF0"> <block type="logic_compare" id="}iB?SwpSesKSeva}j?mw"> <field name="OP">GT</field> <value name="A"> <block type="variables_get" id="*SIAUI61WHJZJ[9o%^2d"> <field name="VAR" id="u8CL)Wex?DocZ58y(/n*">output</field> </block> </value> <value name="B"> <block type="variables_get" id="B2Z^A/08Ee)7/RPmaoO:"> <field name="VAR" id="4.#!}3STBog53dwlcFl-">ausgang_max</field> </block> </value> </block> </value> <statement name="DO0"> <block type="variables_set" id="SagM`KaJL1rMfwm7Y#3k"> <field name="VAR" id="u8CL)Wex?DocZ58y(/n*">output</field> <value name="VALUE"> <block type="variables_get" id="Pte_tl99JT[=-/(cgh{3"> <field name="VAR" id="4.#!}3STBog53dwlcFl-">ausgang_max</field> </block> </value> </block> </statement> <next> <block type="controls_if" id="ot$lj:w=.bWFXSy+#U!!"> <value name="IF0"> <block type="logic_compare" id="S]$B_(:yN`iD@#4cnrbt"> <field name="OP">NEQ</field> <value name="A"> <block type="get_value" id="tKYKdGEvJ{(Ap`z33|3/"> <field name="ATTR">val</field> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.acMode</field> </block> </value> <value name="B"> <block type="math_number" id="*-lP0bAkarz+MWbKMpD!"> <field name="NUM">2</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="hkXp_(9CI|Tlx6@w4O;-"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.control.acMode</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="5kp15tIIz~ILp@rb3kgW"> <field name="NUM">2</field> </block> </value> </block> </statement> <next> <block type="control" id=";Db^:4O1EN|E83*|k[36"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.control.setOutputLimit</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="variables_get" id="cj|vI+5rE;a$Z}XkQz`B"> <field name="VAR" id="u8CL)Wex?DocZ58y(/n*">output</field> </block> </value> <next> <block type="timeouts_cleartimeout" id="cP-3iM|ldCLOjhu8Y-ws"> <field name="NAME">output_Abzug</field> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> <value name="IF1"> <block type="logic_multi_and" id="rcwQ-{!+**l.RM.=S8yt"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="2"></mutation> <value name="AND0"> <block type="logic_compare" id="vOs6dWh(3vUrB_2{m/NV"> <field name="OP">GTE</field> <value name="A"> <block type="get_value" id="cyB@uS2tIbt2~(|B$ZF]"> <field name="ATTR">val</field> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.electricLevel</field> </block> </value> <value name="B"> <block type="math_number" id=";3DCR]/^X8u}`5XE|_-("> <field name="NUM">99</field> </block> </value> </block> </value> <value name="AND1"> <block type="logic_compare" id="[0jp6f!|5%:|l7y7[6t="> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="x`(O@JLy{A,mc*K[~glM"> <field name="ATTR">val</field> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.solarInputPower</field> </block> </value> <value name="B"> <block type="math_number" id="h{g.7y^5fuBZ(x}%o,8!"> <field name="NUM">0</field> </block> </value> </block> </value> </block> </value> <statement name="DO1"> <block type="comment" id="%R+{KG.$/r5$P+|4?%Cw"> <field name="COMMENT">2. Bypass ein wenn Akku voll, AC Modus auf Output 2. Mode</field> <next> <block type="control" id=";naGVGNG%EO3]/D7la@,"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.control.acMode</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="_1woz/)YsVt:d!FqS=:i"> <field name="NUM">2</field> </block> </value> </block> </next> </block> </statement> <value name="IF2"> <block type="logic_multi_and" id="RpscAq3vo.ceGvt}lzM;"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="3"></mutation> <value name="AND0"> <block type="time_compare_ex" id="4Mh;.M3%8}QAkhPEtcv$"> <mutation xmlns="http://www.w3.org/1999/xhtml" end_time="true" actual_time="true"></mutation> <field name="USE_ACTUAL_TIME">TRUE</field> <field name="OPTION">between</field> <value name="START_TIME"> <shadow type="text" id="2Km3*[bQnyaNB:XI6]9%"> <field name="TEXT">06:00</field> </shadow> </value> <value name="END_TIME"> <shadow type="text" id="KO`i!C([`f|6juoQ~d-d"> <field name="TEXT">22:59</field> </shadow> </value> </block> </value> <value name="AND1"> <block type="logic_compare" id="=;k+]!:`FgPIl(ffM)0z"> <field name="OP">LT</field> <value name="A"> <block type="get_value" id="o55n7*4D=LYnb:P_11Mb"> <field name="ATTR">val</field> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.electricLevel</field> </block> </value> <value name="B"> <block type="math_number" id="`))[;%51tDu_Jj9qhYs}"> <field name="NUM">100</field> </block> </value> </block> </value> <value name="AND2"> <block type="logic_compare" id="BdTZijA^#anVn3j{PwI*"> <field name="OP">GT</field> <value name="A"> <block type="variables_get" id="TtqY39_BvS=6H}t)mLEe"> <field name="VAR" id="s3oTgk^d]QTYtWfpyOk6">input</field> </block> </value> <value name="B"> <block type="math_number" id="wjR@%Hg`by9T-|5Qupoe"> <field name="NUM">0</field> </block> </value> </block> </value> </block> </value> <statement name="DO2"> <block type="comment" id="zC5_szd6=wy}Q*]%d_Rb"> <field name="COMMENT">3. Laden mit PV Überschuss Hyper</field> <next> <block type="control" id=";512Sny^l9[8H~)*$JIi"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.control.setInputLimit</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="variables_get" id="_p]0p.2.)e;=_p)|+$|v"> <field name="VAR" id="s3oTgk^d]QTYtWfpyOk6">input</field> </block> </value> <next> <block type="controls_if" id="0rLs]HZ7;/1{okt~*dfX"> <value name="IF0"> <block type="logic_compare" id="Wbb3SQ#qDz^yYA2cpc,Q"> <field name="OP">NEQ</field> <value name="A"> <block type="get_value" id=")^qtiMQK)k{e-0Ni$R*{"> <field name="ATTR">val</field> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.acMode</field> </block> </value> <value name="B"> <block type="math_number" id="!F;R8(I#,#[B*X:#oO~."> <field name="NUM">1</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="CCIQ_ICwzn9aV7t#9o%7"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.control.acMode</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="tX)1OdbEtqK(Q:y^C3Z^"> <field name="NUM">1</field> </block> </value> </block> </statement> <next> <block type="timeouts_cleartimeout" id="@T7,,}^VeetBp^h*!pnp"> <field name="NAME">output_Abzug</field> </block> </next> </block> </next> </block> </next> </block> </statement> <statement name="ELSE"> <block type="comment" id="T1mOiNRi*1jPnM#~?:mM"> <field name="COMMENT">4. Ein/Ausgangsleistung auf 0 setzen</field> <next> <block type="timeouts_settimeout" id="?(Ecr)F7}.Cd/9{8%v+="> <field name="NAME">timeout4</field> <field name="DELAY">30</field> <field name="UNIT">sec</field> <statement name="STATEMENT"> <block type="control" id="Qhy=K`*Kim%|cM0RX[fs"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.control.setOutputLimit</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="_E5[`;YcRI]zD#G$VW2C"> <field name="NUM">0</field> </block> </value> <next> <block type="control" id="|[L_^Xt!x3J6MHCL]Mbz"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">zendure-solarflow.0.gDa3tb.nGY7x38q.control.setInputLimit</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="N!gtEfKU|I%=EMCI:Pm@"> <field name="NUM">0</field> </block> </value> </block> </next> </block> </statement> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </xml>
-
@tege0 Wenn du keine andere Bedingung ausser "output" beim Entladen hast solltest du die 2. Bedingung rausnehmen. Ansonsten wird nur entladen wenn deine PV Leistung über dem Schwellwert ist. Nachts dann natürlich nicht.
-
@lesiflo bin echt nicht so drin im Thema sorry, aber viele Dank für diene Unterstützung.
Was meinst du mit zweiter Bedingung?
2. Bypass ein wenn Akku voll, AC Modus auf Output
Oder
Vielleicht von meiner bedingung her heraus.
Ich habe zwei Anlagen:- 1 Anlage: Zendure Hyper 2000 mit AB200S 4x JAM60S20 a 385 Wp Süd eine einzel angeschlossen
- 2 Anlage: Microwechselrichter mit zwei mppt Ost 330wp und West 330wp
Ich nutze einen ESP Lesekopf der mir per mqtt die Werte an iob gibt.
Ich stelle mir vor, dass der Speicher je nach aktueller Quelle (entweder Anlage 1 über DC oder Anlage 2 über AC) geladen wird, und dass ich danach meinen Strombedarf möglichst aus der PV-Anlage und der Batterie decken kann.
-
@tege0 Ich meine damit die und-Verknüpfung direkt über "1.Entladen". Die rausnehmen und nur "output > 0" rein.
-
@lesiflo danke
-
Neue Version
Release v1.01, Stand 23.04.2025Änderung
- Zusätzlicher Timer beim Umschalten in den Ausgabe-Modus
-
@lesiflo Danke dir erstmal für deine Arbeit. Ich will das jetzt auch gerne mal angehen endlich und habe aber keinen Hyper und kein Tibber, sondern nur einen Hub2000. Da ist demnach einiges in deinem Script, was ich nicht brauche bzw. nutzen kann. Jetzt versuche ich grad mal mein Glück, aber so recht blicke ich noch nicht durch, was benötigt ist und was nicht. Wäre dir dankbar, wenn du mal drüber schauen würdest, ob ich da auf dem richtigen Weg bin...
So sieht es aktuell bei mir aus:
EDIT: Die Eingangsleistung kann ich ja eigentlich rausnehmen, oder? Die kann ja immer auf dem Max stehen.
-
@the_stig Ja, sieht schon gut aus. Ich würde aber den "sonst falls"-Zweig fürs Laden komplett rausnehmen. Den Bypass würde ich auf Auto (Wert 0) setzen oder jeweils ein- (2) und ausschalten (1).
So etwa:
-
@lesiflo Danke dir für die schnelle Rückmeldung. Schaue ich mir an. Habe deine Logik offen gesagt noch nicht verstanden und überlege gerade, es mir selbst aufzubauen, damit ich es auch verstehe, was ich steuere
Aber da deine Lösung ja offenbar schon lange gut funktioniert ist das eigentlich auch verschwendete Zeit. Ich werde mal basteln.
Noch etwas: ich habe derzeit ein anderes Script, dass morgens meinen Min-Soc von den standardmäßigen 10% temporär auf 5% reduziert. Hintergrund des Gedankens ist, dass ich damit nicht immer dieses morgendliche Auf- und Entladen haben, welches die Zendure-Steuerung macht (bei Min Soc 10% lädt er erst auf 13% und entlädt dann wieder). Bis dann genug PV-LEistung für die Nulleinspeisung da ist, passiert das ein paar Mal. Das möchte ich verhindern. Kann ich dann vor dein Script sowas hier einfach davor packen - oder steht sich da dann die Regelungen gegenseitig im Weg?
-
@the_stig Das kannst du so alleine stehen lassen. Der min SOC wird ja in meinem Script nicht berücksichtigt.
-
@lesiflo Danke dir. Da ich ehrlich gesagt wirklich einige deiner Schleifen nicht verstehe, habe ich mal selbst angefangen zu basteln. Deins ist vermutlich deutlich durchdachter, aber so könnte ich mich doch erstmal ranwagen und die ersten Tests starten, oder?
Den 10-Sek Timeout hast du eingebaut, damit nicht sekündlich oder noch mehr nachgeregelt wird, richtig?
-
@the_stig sagte in Script zum Laden/Entladen von Zendure Solarflow:
Den 10-Sek Timeout hast du eingebaut, damit nicht sekündlich oder noch mehr nachgeregelt wird, richtig?
Nein, der ist dazu da, dass nicht sofort zwischen entladen und PV-Laden umgeschaltet wird. Beim Hyper braucht man keinen Timer, der regelt sehr schnell.
Wenn du das so macht's wie oben solltest du im "sonst" Zweig einen Timeout einbauen je nachdem wie schnell der Hub ist und im "mache" Zweig mit "stop timeout" wieder aufheben. Somit wird verhindert, das bei der kleinsten Unterschreitung von 0 der Ausgangswert auf 0 geht und sich dann wieder langsam hochregeln muß.
Dein "Zielwert_Einspeisung" sollte auch nicht mit bei der Berechnung des "output" rein. Der dient dazu z.B. 30 Watt von der benötigten Leistung abzuziehen um zu verhindern, das was eingespeist wird.
Was genau verstehst du sonst nicht?
-
@lesiflo said in Script zum Laden/Entladen von Zendure Solarflow:
Was genau verstehst du sonst nicht?
Ich versuchs mal strukturiert:
-> du setzt hier den Wert Output mit dem output_Abzug, aber warum addierst du den Regelwert einzustellende Ausgangsleistung (das ist doch der in der vorherigen REgelung gesetzte Output-Wert, oder? Verstehe ich logisch einfach nicht.
-> das verstehe ich auch nicht. ausgang_max setzt du warum?
-> Fortfolgend dazu: warum wird dann output mit ausgang_max gesetzt?Generell: irgendwie fehlt mir noch das Verständnis, wo da Bezug auf den aktuellen Verbrauch genommen wird. Irgendwo müsste doch der output durch einen Verweis auf den aktuellen Gesamtverbrauch genommen werden. Wie gesagt - sorry. Bin da irgendwie ziemlich planlos...
-
@the_stig sagte in Script zum Laden/Entladen von Zendure Solarflow:
@lesiflo said in Script zum Laden/Entladen von Zendure Solarflow:
Was genau verstehst du sonst nicht?
Ich versuchs mal strukturiert:
-> du setzt hier den Wert Output mit dem output_Abzug, aber warum addierst du den Regelwert einzustellende Ausgangsleistung (das ist doch der in der vorherigen REgelung gesetzte Output-Wert, oder? Verstehe ich logisch einfach nicht.
-> das verstehe ich auch nicht. ausgang_max setzt du warum?
-> Fortfolgend dazu: warum wird dann output mit ausgang_max gesetzt?Generell: irgendwie fehlt mir noch das Verständnis, wo da Bezug auf den aktuellen Verbrauch genommen wird. Irgendwo müsste doch der output durch einen Verweis auf den aktuellen Gesamtverbrauch genommen werden. Wie gesagt - sorry. Bin da irgendwie ziemlich planlos...
Zu 1.
"output_Abzug" nehme ich als Puffer um die Ausgabeleistung etwas abzusenken damit zwischen zwei Regelungen keine Einspeisung erfolgt.
Bsp.:
Wert = 300 Watt (ist der Wert aus dem Trigger)
output_Abzug = 50 Watt (kann auch kleiner oder grösser gewählt werden)
out ist dann = 250 WattDie Ausgangsleistung muss addiert werden um das was mit output gesetzt wird wieder auszugleichen. Dabei ist der Wert der Ausgangsleistung immer der vorherige Wert.
- ausgang_max ist der maximale Wert, der vom BKW ins Netz geht wenn Bedarf besteht
PV = 500
min_PV_Leistung_laden = 100
500 - 100 = 400 Watt gehen dann maximal ins Netz und 100 in den Akku- Begrenzung des output und somit der einzustellenden Ausgangsleistung
Der Verweis auf den aktuellen Gesamtverbrauch erfolgt hiermit:
Wert = Triggervariable
-
@lesiflo Merci vielmals. So wird einiges klarer. Ich teste weiter...