Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. maxclaudi

    NEWS

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Wir empfehlen: Node.js 22.x

    • Profile
    • Following 0
    • Followers 0
    • Topics 4
    • Posts 255
    • Best 24
    • Groups 2

    maxclaudi

    @maxclaudi

    24
    Reputation
    28
    Profile views
    255
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    maxclaudi Follow
    Pro Starter

    Best posts made by maxclaudi

    • RE: OpenDTU-onBattery Blockly DPL Ein/Aus

      einfacher:

      Dynamic Power Limiter nur über einen Datenpunkt ein- und ausschalten.

      Wird der DPL über ein Script ausgeschaltet, behält der Inverter das letzte Limit (non persistent) bei.

      Deshalb wird im folgenden Blockly beim Auschalten des DPL auch das Limit wieder auf 100% gesetzt.

      Der DPL kann einfach per Datenpunkt in einem Blockly ein- oder ausgeschaltet werden.
      Dazu wird der Datenpunkt zum Einschalten aktualisiert mit wahr.
      Zum Ausschalten mit falsch.

      01-dpl-ein-aus.png


      Im Blockly sind 2 Inverter zur DPL Steuerung berücksichtigt.
      Wird nur 1 Inverter zur DPL Steuerung verwendet, kann die Variable und der Block gelöscht werden oder einfach bei beiden Variablen die gleiche Seriennummer eintragen.
      Falls doch mal später 2 Inverter für DPL aktiviert werden sollen.

      Seriennummer werden nur nach dem Ausschalten verwendet, damit der/die Inverter wieder volle Leistung liefern.

      Werte werden nur non-persistent gesetzt, wie bei der DPL-Steuerung.


      Für das Script wurde manuell 1 Verzeichnis und 1 Datenpunkt angelegt:

      Verzeichnis:
      openDTUoB
      0_userdata.0.Datenpunkte.openDTUoB

      Datenpunkt:
      dplEinAus
      "type": "boolean"
      0_userdata.0.Datenpunkte.openDTUoB.dplEinAus


      Vor dem Ausführen des Scripts müsen folgende Eintragungen vorgenommen werden:

      IP OpenDTUon Battery
      Password
      1te Seriennummer des Inverters für die DPL-Steuerung
      2te Seriennummer des Inverters, der auch DPL steuert (bei nur einem aktivierten Inverter einfach die gleiche Seriennummer vom ersten Inverter eintragen).

      04-dpl-ein-aus.png


      Blockly:

      <xml xmlns="https://developers.google.com/blockly/xml">
        <variables>
          <variable id="P.,=V-_lWMTIt*,^9bWa">jsonObj</variable>
          <variable id="?Ekt8|,iPfa0uAPY)N%A">attr</variable>
          <variable id="y`qH:gKyqipx04VGZ@;=">val</variable>
          <variable id="T[fn@X+yakzmBpi9]n*E">openDTUonBatteryIP</variable>
          <variable id="nh}jM|3k}%Qhny;,Etjk">OpenDTUonBatteryPassword</variable>
          <variable id="/X1](JXiM-@K#NE`C4,%">InverterSerial</variable>
          <variable id="b+E=vG0=nXY*@8jhUpT1">InverterSerial2</variable>
          <variable id="2|vbm;5buC6^$eogp=fe">urlDPLstate</variable>
          <variable id="PWsI)BqL)EeZPzj!8-VY">set</variable>
          <variable id="JppG`(9.sfDt)j^gha}{">cUrlLimitPart1</variable>
          <variable id="Xy47v*SILC`=7N1mM,:5">cUrlLimitPart2</variable>
          <variable id="_+8y375~59B=8rd!@Ae%">jsonObjekt</variable>
        </variables>
        <block type="comment" id="g{c,O//*067~CDT{26F+" x="212" y="-112">
          <field name="COMMENT">OpenDTUonBattery&amp;#10;DPL Ein/Aus</field>
          <next>
            <block type="on_ext" id="MpdxhvC3:):%?cL5ChV-">
              <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="j)L11f:Db#X;sEL6awg/">
                  <field name="oid">0_userdata.0.Datenpunkte.openDTUoB.dplEinAus</field>
                </shadow>
              </value>
              <statement name="STATEMENT">
                <block type="comment" id="wPs7.T(3#lmg-Q#YnMcz">
                  <field name="COMMENT">IP von OpenDTUonBattery:</field>
                  <next>
                    <block type="variables_set" id="xiC72+QQD{FQ44VC6wQn">
                      <field name="VAR" id="T[fn@X+yakzmBpi9]n*E">openDTUonBatteryIP</field>
                      <value name="VALUE">
                        <block type="text" id="3|rd+!6W]T02z}tGd1/m">
                          <field name="TEXT">192.170.178.250</field>
                        </block>
                      </value>
                      <next>
                        <block type="comment" id="8!|A_f5hyHJr/:f!|;r.">
                          <field name="COMMENT">OpenDTUonBattery Passwort:</field>
                          <next>
                            <block type="variables_set" id="ItJFflir$91[$;pF5+MA">
                              <field name="VAR" id="nh}jM|3k}%Qhny;,Etjk">OpenDTUonBatteryPassword</field>
                              <value name="VALUE">
                                <block type="text" id="xYm]l*(;=w@0xJQnWi5-">
                                  <field name="TEXT">openDTU42</field>
                                </block>
                              </value>
                              <next>
                                <block type="variables_set" id="u:x]^bL1{Q9m2)/M*CRl">
                                  <field name="VAR" id="/X1](JXiM-@K#NE`C4,%">InverterSerial</field>
                                  <value name="VALUE">
                                    <block type="text" id="m)|9(*pwq()mn.3Ron~:">
                                      <field name="TEXT">11611111111</field>
                                    </block>
                                  </value>
                                  <next>
                                    <block type="variables_set" id="++@7g{b1u:LHh]h:CEq+">
                                      <field name="VAR" id="b+E=vG0=nXY*@8jhUpT1">InverterSerial2</field>
                                      <value name="VALUE">
                                        <block type="text" id="m8cbvw?0pnZNAUaiU8Zq">
                                          <field name="TEXT">112122222222</field>
                                        </block>
                                      </value>
                                      <next>
                                        <block type="comment" id="8ezl|ED@6X29f4k@:.2H">
                                          <field name="COMMENT">----</field>
                                          <next>
                                            <block type="variables_set" id="!#IE.`!)HPf,NcPW*miy">
                                              <field name="VAR" id="2|vbm;5buC6^$eogp=fe">urlDPLstate</field>
                                              <value name="VALUE">
                                                <block type="text_join" id="F#[x6:MOpP{a#hljyq@2">
                                                  <mutation items="5"></mutation>
                                                  <value name="ADD0">
                                                    <block type="text" id="!@~5;?O8`oIO%oN]bLJa">
                                                      <field name="TEXT">curl -u "admin:</field>
                                                    </block>
                                                  </value>
                                                  <value name="ADD1">
                                                    <block type="variables_get" id="SFT0:Zq378qj5]2?a5#b">
                                                      <field name="VAR" id="nh}jM|3k}%Qhny;,Etjk">OpenDTUonBatteryPassword</field>
                                                    </block>
                                                  </value>
                                                  <value name="ADD2">
                                                    <block type="text" id="5}ok+uklC%b/F}gtZr`^">
                                                      <field name="TEXT">" http://</field>
                                                    </block>
                                                  </value>
                                                  <value name="ADD3">
                                                    <block type="variables_get" id="C|ac)ks!*i8cZS5zb!0?">
                                                      <field name="VAR" id="T[fn@X+yakzmBpi9]n*E">openDTUonBatteryIP</field>
                                                    </block>
                                                  </value>
                                                  <value name="ADD4">
                                                    <block type="text" id="!=iiY$6m(O#=Q|km-7W1">
                                                      <field name="TEXT">/api/powerlimiter/config</field>
                                                    </block>
                                                  </value>
                                                </block>
                                              </value>
                                              <next>
                                                <block type="variables_set" id="Nw*-3DKlvV=)l.++!yg%">
                                                  <field name="VAR" id="PWsI)BqL)EeZPzj!8-VY">set</field>
                                                  <value name="VALUE">
                                                    <block type="text_join" id="b3+b3^R@5s5Vbpj^o9!6">
                                                      <mutation items="2"></mutation>
                                                      <value name="ADD0">
                                                        <block type="variables_get" id="%UJkDROf_mMO^oE4EKW.">
                                                          <field name="VAR" id="2|vbm;5buC6^$eogp=fe">urlDPLstate</field>
                                                        </block>
                                                      </value>
                                                      <value name="ADD1">
                                                        <block type="text" id="o}*[n$;A?-]x1P{Ppan.">
                                                          <field name="TEXT"> -d 'data=</field>
                                                        </block>
                                                      </value>
                                                    </block>
                                                  </value>
                                                  <next>
                                                    <block type="variables_set" id="1%5eOCEM.zYy[-sZ0a43">
                                                      <field name="VAR" id="JppG`(9.sfDt)j^gha}{">cUrlLimitPart1</field>
                                                      <value name="VALUE">
                                                        <block type="text_join" id="B,v7UaJQkq-DSzv41b;v">
                                                          <mutation items="5"></mutation>
                                                          <value name="ADD0">
                                                            <block type="text" id=";4j$FAn0X}CSE_D5:/kl">
                                                              <field name="TEXT">curl -u "admin:</field>
                                                            </block>
                                                          </value>
                                                          <value name="ADD1">
                                                            <block type="variables_get" id="Ea#Og5Jr^hwL!_Oh-[Ua">
                                                              <field name="VAR" id="nh}jM|3k}%Qhny;,Etjk">OpenDTUonBatteryPassword</field>
                                                            </block>
                                                          </value>
                                                          <value name="ADD2">
                                                            <block type="text" id="kBsI#4)FR#3@EAh.=@b]">
                                                              <field name="TEXT">" http://</field>
                                                            </block>
                                                          </value>
                                                          <value name="ADD3">
                                                            <block type="variables_get" id=",/9?^Tx*?hC1YP`-X]37">
                                                              <field name="VAR" id="T[fn@X+yakzmBpi9]n*E">openDTUonBatteryIP</field>
                                                            </block>
                                                          </value>
                                                          <value name="ADD4">
                                                            <block type="text" id="p5zvA0V{e$4V$#_9gWcY">
                                                              <field name="TEXT">/api/limit/config -d 'data={"serial":"</field>
                                                            </block>
                                                          </value>
                                                        </block>
                                                      </value>
                                                      <next>
                                                        <block type="variables_set" id="u|60ca%8U|+rvrL1*bdK">
                                                          <field name="VAR" id="Xy47v*SILC`=7N1mM,:5">cUrlLimitPart2</field>
                                                          <value name="VALUE">
                                                            <block type="text" id="`Z^Zv4qi(GN;drYs.f6I">
                                                              <field name="TEXT">","limit_value":100,"limit_type":1}'</field>
                                                            </block>
                                                          </value>
                                                          <next>
                                                            <block type="comment" id="Y+nX-p}*xExWw]O`OX~{">
                                                              <field name="COMMENT">aktueller DPL state:</field>
                                                              <next>
                                                                <block type="exec" id="I~3.fAPDzJ[1T(TlzoOT">
                                                                  <mutation xmlns="http://www.w3.org/1999/xhtml" with_statement="true"></mutation>
                                                                  <field name="WITH_STATEMENT">TRUE</field>
                                                                  <field name="LOG"></field>
                                                                  <value name="COMMAND">
                                                                    <shadow type="text" id="9;-TT-}BY,qROECr/9_6">
                                                                      <field name="TEXT"></field>
                                                                    </shadow>
                                                                    <block type="variables_get" id="i4]srTbBS]Jm}Z^t,,i^">
                                                                      <field name="VAR" id="2|vbm;5buC6^$eogp=fe">urlDPLstate</field>
                                                                    </block>
                                                                  </value>
                                                                  <statement name="STATEMENT">
                                                                    <block type="variables_set" id="U*PNhv3v$WIWPSb|ja,I">
                                                                      <field name="VAR" id="_+8y375~59B=8rd!@Ae%">jsonObjekt</field>
                                                                      <value name="VALUE">
                                                                        <block type="convert_json2object" id="y.{-xr4=@LsO?lm{BV16">
                                                                          <value name="VALUE">
                                                                            <block type="exec_result" id="6ho:XZ{%G?n+B=|[OsSQ">
                                                                              <field name="ATTR">result</field>
                                                                            </block>
                                                                          </value>
                                                                        </block>
                                                                      </value>
                                                                      <next>
                                                                        <block type="comment" id="A(14glg}PvpJG@9qX7Z+">
                                                                          <field name="COMMENT">DPL Ein:</field>
                                                                          <next>
                                                                            <block type="controls_if" id=")aeo4TK/:D$bt5(cFhVN">
                                                                              <value name="IF0">
                                                                                <block type="logic_compare" id="%pI.k62s._dcfZnb8SHC">
                                                                                  <field name="OP">EQ</field>
                                                                                  <value name="A">
                                                                                    <block type="on_source" id="C-u,UgBdHv4sZCblY)(F">
                                                                                      <field name="ATTR">state.val</field>
                                                                                    </block>
                                                                                  </value>
                                                                                  <value name="B">
                                                                                    <block type="logic_boolean" id="e..27D@{cN0JPJc_@bv;">
                                                                                      <field name="BOOL">TRUE</field>
                                                                                    </block>
                                                                                  </value>
                                                                                </block>
                                                                              </value>
                                                                              <statement name="DO0">
                                                                                <block type="procedures_callcustomnoreturn" id="D9g{#*qgs_-7rfz6|TYD">
                                                                                  <mutation name="change">
                                                                                    <arg name="jsonObj"></arg>
                                                                                    <arg name="attr"></arg>
                                                                                    <arg name="val"></arg>
                                                                                  </mutation>
                                                                                  <value name="ARG0">
                                                                                    <block type="variables_get" id="yi4H-8|bl|J[{ecr@w?*">
                                                                                      <field name="VAR" id="_+8y375~59B=8rd!@Ae%">jsonObjekt</field>
                                                                                    </block>
                                                                                  </value>
                                                                                  <value name="ARG1">
                                                                                    <block type="text" id="/1aiKrRmt}{2sRQ`BE^S">
                                                                                      <field name="TEXT">enabled</field>
                                                                                    </block>
                                                                                  </value>
                                                                                  <value name="ARG2">
                                                                                    <block type="logic_boolean" id="]!TrP#dnQ%e`r1%@n;)0">
                                                                                      <field name="BOOL">TRUE</field>
                                                                                    </block>
                                                                                  </value>
                                                                                  <next>
                                                                                    <block type="exec" id="xWQm84D2~+;KrfUenNP|">
                                                                                      <mutation xmlns="http://www.w3.org/1999/xhtml" with_statement="false"></mutation>
                                                                                      <field name="WITH_STATEMENT">FALSE</field>
                                                                                      <field name="LOG"></field>
                                                                                      <value name="COMMAND">
                                                                                        <shadow type="text" id="Y[J#ti:!)V_p[~D/~=BP">
                                                                                          <field name="TEXT">pwd</field>
                                                                                        </shadow>
                                                                                        <block type="text_join" id="?#1pjgc[4w-Nbot8xQpL">
                                                                                          <mutation items="3"></mutation>
                                                                                          <value name="ADD0">
                                                                                            <block type="variables_get" id=";wn*ZeQHpIf@a_40]mk$">
                                                                                              <field name="VAR" id="PWsI)BqL)EeZPzj!8-VY">set</field>
                                                                                            </block>
                                                                                          </value>
                                                                                          <value name="ADD1">
                                                                                            <block type="convert_object2json" id="`s4:$VMpnCx?$#E/lH89">
                                                                                              <field name="PRETTIFY">FALSE</field>
                                                                                              <value name="VALUE">
                                                                                                <block type="variables_get" id="akzUA)PF0iBQcIE,ZBTo">
                                                                                                  <field name="VAR" id="_+8y375~59B=8rd!@Ae%">jsonObjekt</field>
                                                                                                </block>
                                                                                              </value>
                                                                                            </block>
                                                                                          </value>
                                                                                          <value name="ADD2">
                                                                                            <block type="text" id="tazI8QS$S%YmkBw8,!R]">
                                                                                              <field name="TEXT">'</field>
                                                                                            </block>
                                                                                          </value>
                                                                                        </block>
                                                                                      </value>
                                                                                    </block>
                                                                                  </next>
                                                                                </block>
                                                                              </statement>
                                                                              <next>
                                                                                <block type="comment" id="zV97]OnS?/IjoV1xAl_T">
                                                                                  <field name="COMMENT">DPL Aus:</field>
                                                                                  <next>
                                                                                    <block type="controls_if" id="7{aiQa33_g$QnlPw!:;F">
                                                                                      <value name="IF0">
                                                                                        <block type="logic_compare" id="XYHuB8ZNE3]RuqS}0zLa">
                                                                                          <field name="OP">EQ</field>
                                                                                          <value name="A">
                                                                                            <block type="on_source" id="kRJjzY0xkd07ZrzDPb1?">
                                                                                              <field name="ATTR">state.val</field>
                                                                                            </block>
                                                                                          </value>
                                                                                          <value name="B">
                                                                                            <block type="logic_boolean" id="{2pCy)Ah-nq3V.,{DVo1">
                                                                                              <field name="BOOL">FALSE</field>
                                                                                            </block>
                                                                                          </value>
                                                                                        </block>
                                                                                      </value>
                                                                                      <statement name="DO0">
                                                                                        <block type="procedures_callcustomnoreturn" id="-Hz0vX5GM=t[9OHH8]Wg">
                                                                                          <mutation name="change">
                                                                                            <arg name="jsonObj"></arg>
                                                                                            <arg name="attr"></arg>
                                                                                            <arg name="val"></arg>
                                                                                          </mutation>
                                                                                          <value name="ARG0">
                                                                                            <block type="variables_get" id="v[6xm8C%Otou%c3=g710">
                                                                                              <field name="VAR" id="_+8y375~59B=8rd!@Ae%">jsonObjekt</field>
                                                                                            </block>
                                                                                          </value>
                                                                                          <value name="ARG1">
                                                                                            <block type="text" id="tL?JD.@HaQSk5`{9Wm]{">
                                                                                              <field name="TEXT">enabled</field>
                                                                                            </block>
                                                                                          </value>
                                                                                          <value name="ARG2">
                                                                                            <block type="logic_boolean" id="WMimixsaaPP)fhHu2.J$">
                                                                                              <field name="BOOL">FALSE</field>
                                                                                            </block>
                                                                                          </value>
                                                                                          <next>
                                                                                            <block type="exec" id="/p+Uv~V#hIePApTb=KTR">
                                                                                              <mutation xmlns="http://www.w3.org/1999/xhtml" with_statement="false"></mutation>
                                                                                              <field name="WITH_STATEMENT">FALSE</field>
                                                                                              <field name="LOG"></field>
                                                                                              <value name="COMMAND">
                                                                                                <shadow type="text" id="Y[J#ti:!)V_p[~D/~=BP">
                                                                                                  <field name="TEXT">pwd</field>
                                                                                                </shadow>
                                                                                                <block type="text_join" id="?fTh]i~D]=Ue}GsE8^;i">
                                                                                                  <mutation items="3"></mutation>
                                                                                                  <value name="ADD0">
                                                                                                    <block type="variables_get" id="$!],od*U?4dNiG;_YIzl">
                                                                                                      <field name="VAR" id="PWsI)BqL)EeZPzj!8-VY">set</field>
                                                                                                    </block>
                                                                                                  </value>
                                                                                                  <value name="ADD1">
                                                                                                    <block type="convert_object2json" id="|pyw%?Kwve~3iciql_#f">
                                                                                                      <field name="PRETTIFY">FALSE</field>
                                                                                                      <value name="VALUE">
                                                                                                        <block type="variables_get" id="z0~!%^yv(pHWcQpw)5``">
                                                                                                          <field name="VAR" id="_+8y375~59B=8rd!@Ae%">jsonObjekt</field>
                                                                                                        </block>
                                                                                                      </value>
                                                                                                    </block>
                                                                                                  </value>
                                                                                                  <value name="ADD2">
                                                                                                    <block type="text" id="/g9Zs!_,BY#!LKzHEF`/">
                                                                                                      <field name="TEXT">'</field>
                                                                                                    </block>
                                                                                                  </value>
                                                                                                </block>
                                                                                              </value>
                                                                                              <next>
                                                                                                <block type="comment" id="ql1mac4Qf*!]/(y:*HR+">
                                                                                                  <field name="COMMENT">DPLinverter01  Limit 100%</field>
                                                                                                  <next>
                                                                                                    <block type="exec" id="iNs^J_^oAm89Vr+p^dcU">
                                                                                                      <mutation xmlns="http://www.w3.org/1999/xhtml" with_statement="false"></mutation>
                                                                                                      <field name="WITH_STATEMENT">FALSE</field>
                                                                                                      <field name="LOG"></field>
                                                                                                      <value name="COMMAND">
                                                                                                        <shadow type="text" id="C9zK,I#|DhseRSSl*?8X">
                                                                                                          <field name="TEXT"></field>
                                                                                                        </shadow>
                                                                                                        <block type="text_join" id="~7~(vzW]+%{R35ES=iGn">
                                                                                                          <mutation items="3"></mutation>
                                                                                                          <value name="ADD0">
                                                                                                            <block type="variables_get" id=".v]Hhm{LD(-@){kzp()2">
                                                                                                              <field name="VAR" id="JppG`(9.sfDt)j^gha}{">cUrlLimitPart1</field>
                                                                                                            </block>
                                                                                                          </value>
                                                                                                          <value name="ADD1">
                                                                                                            <block type="variables_get" id="OZY@nUX[m`.Rp[12/e{g">
                                                                                                              <field name="VAR" id="/X1](JXiM-@K#NE`C4,%">InverterSerial</field>
                                                                                                            </block>
                                                                                                          </value>
                                                                                                          <value name="ADD2">
                                                                                                            <block type="variables_get" id="]wG/EOqQ!/tw6ZlRcab0">
                                                                                                              <field name="VAR" id="Xy47v*SILC`=7N1mM,:5">cUrlLimitPart2</field>
                                                                                                            </block>
                                                                                                          </value>
                                                                                                        </block>
                                                                                                      </value>
                                                                                                      <next>
                                                                                                        <block type="comment" id="aI[_!O+Ua%`p6/mqrCjz">
                                                                                                          <field name="COMMENT">DPLinverter02  Limit 100%</field>
                                                                                                          <next>
                                                                                                            <block type="exec" id="v[cN9cA@.Ejy;Z1G81kX">
                                                                                                              <mutation xmlns="http://www.w3.org/1999/xhtml" with_statement="false"></mutation>
                                                                                                              <field name="WITH_STATEMENT">FALSE</field>
                                                                                                              <field name="LOG"></field>
                                                                                                              <value name="COMMAND">
                                                                                                                <shadow type="text" id="C9zK,I#|DhseRSSl*?8X">
                                                                                                                  <field name="TEXT"></field>
                                                                                                                </shadow>
                                                                                                                <block type="text_join" id="Wd`VvP4NqCJ}/*|~IbTV">
                                                                                                                  <mutation items="3"></mutation>
                                                                                                                  <value name="ADD0">
                                                                                                                    <block type="variables_get" id="hy+6K,WWY.Y`%h-+p;v1">
                                                                                                                      <field name="VAR" id="JppG`(9.sfDt)j^gha}{">cUrlLimitPart1</field>
                                                                                                                    </block>
                                                                                                                  </value>
                                                                                                                  <value name="ADD1">
                                                                                                                    <block type="variables_get" id="W/O@o[J$nrG+r..LB`}A">
                                                                                                                      <field name="VAR" id="b+E=vG0=nXY*@8jhUpT1">InverterSerial2</field>
                                                                                                                    </block>
                                                                                                                  </value>
                                                                                                                  <value name="ADD2">
                                                                                                                    <block type="variables_get" id="q%FGBbHAZ^N/`|V3wzs%">
                                                                                                                      <field name="VAR" id="Xy47v*SILC`=7N1mM,:5">cUrlLimitPart2</field>
                                                                                                                    </block>
                                                                                                                  </value>
                                                                                                                </block>
                                                                                                              </value>
                                                                                                            </block>
                                                                                                          </next>
                                                                                                        </block>
                                                                                                      </next>
                                                                                                    </block>
                                                                                                  </next>
                                                                                                </block>
                                                                                              </next>
                                                                                            </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>
                                  </next>
                                </block>
                              </next>
                            </block>
                          </next>
                        </block>
                      </next>
                    </block>
                  </next>
                </block>
              </statement>
            </block>
          </next>
        </block>
        <block type="procedures_defcustomnoreturn" id="nxZk[TB}x%yvkJ058U]o" x="738" y="862">
          <mutation statements="false">
            <arg name="jsonObj" varid="P.,=V-_lWMTIt*,^9bWa"></arg>
            <arg name="attr" varid="?Ekt8|,iPfa0uAPY)N%A"></arg>
            <arg name="val" varid="y`qH:gKyqipx04VGZ@;="></arg>
          </mutation>
          <field name="NAME">change</field>
          <field name="SCRIPT">anNvbk9ialthdHRyXSA9IHZhbDs=</field>
          <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
        </block>
      </xml>
      

      Damit kann in jedem Script der Dynamic Power Limiter ein- oder ausgeschaltet werden.

      Ist bestimmt brauchbar.

      Vorschläge oder Verbesserungen willkommen.

      Würde mich mal über eine Rückmeldung oder einen Beitrag freuen.
      Nicht, dass ich hier Alleinunterhalter bin 🙂

      posted in Blockly
      maxclaudi
      maxclaudi
    • RE: Test Adapter Zendure Solarflow

      @rene55

      also ich hab vorher noch sichergestellt, dass der Server 100% keine Anmeldedaten verlangt und port 1883 frei von anderen Instanzen ist.

      edit:
      passt, laut den Bildern von Arne muss nicht mal der Port angegeben werden 🙂
      Wird wohl intern automatisch auf port 1883 gesetzt.
      Sollte der Adapter nicht die Objekte erstellen, dann einfach Port mit angeben.

      posted in Tester
      maxclaudi
      maxclaudi
    • RE: OpenDTU-onBattery

      edit:
      einfacher -> OpenDTU-onBattery Blockly DPL Ein/Aus


      @lesiflo , @Totte23

      @lesiflo sagte in OpenDTU-onBattery:

      Hallo zusammen,

      ich möchte vom iobroker aus den Dynamic Power Limiter aus/einschalten. Geht das überhaupt?

      b785d376-4856-4125-b94f-c17380740367-image.png
      Hab den openDTU Adapter installiert und openDTU über mqtt eingebunden. Hab schon einiges ausprobiert, finde aber keinen Parameter mit dem das geht.

      Das Thema ist zwar alt, aber bestimmt benötigt mal wieder jemand Hilfe dazu 🙂
      Man findet die Antwort auch nicht im Netz, deswegen habe ich die requests gelogt.

      Man kann über blockly oder javascript den OpenDTUonBattery DPL ein-, ausschalten.
      Theoretisch auch alles andere.
      Wenn's nur ums einschalten und ausschalten mit den voreingestellten Werten geht,
      z. B . mit Blockly:
      Bei Aktionen "exec Befehl" auswählen.

      Ausschalten:

      curl -u "admin:yyyyyyyy" http://xxx.xxx.xxx.xxx/api/powerlimiter/config -d 'data={"enabled": false}'
      

      Einschalten:

      curl -u "admin:yyyyyyyy" http://xxx.xxx.xxx.xxx/api/powerlimiter/config -d 'data={"enabled": true}'
      

      yyyyyyyy => Passwort
      xxx.xxx.xxx.xxx => IP von der OpenDTU

      Stark verkürzt, man kann auch alle einstellbaren Werte verändern und mit übergeben.
      Hilft bestimmt mal jemand weiter.

      Frohe Ostern 😉

      posted in Einbindung von Geräten
      maxclaudi
      maxclaudi
    • RE: Zendure Solar Flow ohne Cloud MQTT-Broker MIT Authentication

      @rene55
      👍
      DeviceID ist klar denke ich?

      Nennt sich beim Solar Flow Adapter: Device Key

      posted in Blockly
      maxclaudi
      maxclaudi
    • RE: Test Adapter Zendure Solarflow

      @lesiflo
      Lokal ist super.
      Es wird zuverlässig, schnell und oft aktualisiert 🙂

      posted in Tester
      maxclaudi
      maxclaudi
    • RE: Zendure Solar Flow ohne Cloud MQTT-Broker MIT Authentication

      @rene55
      und Alle:

      Die generierten Passwörter wurden getestet, sind richtig und funktionieren.

      Aber:
      Der iobroker SolarFlow-Adapter hat keine Zugangsdaten für den lokalen Betrieb!
      Deshalb funktioniert der Adapter von @nograx NUR wenn mann die Anmeldedaten mit in die URL übergibt.

      Es wäre schön, wenn @nograx irgendwann in der Instanz des solarflow-Adapters eine Möglichkeit zum abspeichern von User und Password für einen lokalen MQTT-Server einpflegen würde.
      Geht aber auch so!

      Mit mosquitto-Server ausführlich getestet.

      Wenn ein mosquitto-Server läuft verbinden sich die Zendure Geräte mit Passwörtern lokal einwandfrei.

      posted in Blockly
      maxclaudi
      maxclaudi
    • RE: Test Adapter Zendure Solarflow

      @nograx

      gleich installiert.
      werde es testen. Danke.


      edit: Erste 3h ohne Neustart sind vorbei.
      Läuft bis jetzt einwandrei.
      ACE1500 hat nichts zu tun Akku voll.
      Hub+ACE connected.
      Super schnelle Aktualisierung der Datenpunkte.
      ...to be continued


      18.06h
      6h ohne Neustart
      alles ok.


      21.10h
      über 9h ohne Neustart.
      alles ok.

      Unter Protokolle iobroker:
      Keine Meldung(en).
      Weder vom Solarflow-Adapter, noch vom mqtt-Server 1883, seit Start v1.13.0 (Mi, 30.04.2025 11.59h).
      Nicht mal ne Info.

      Datenpunkt-Aktualisierungen kommen schnell.
      Steuerung funktioniert.


      posted in Tester
      maxclaudi
      maxclaudi
    • RE: OpenDTU-onBattery Blockly DPL Ein/Aus

      @beowolf sagte in OpenDTU-onBattery Blockly DPL Ein/Aus:

      @maxclaudi sagte in OpenDTU-onBattery Blockly DPL Ein/Aus:

      Würde mich mal über eine Rückmeldung oder einen Beitrag freuen.
      Nicht, dass ich hier Alleinunterhalter bin

      Danke für das Blockly.

      gerne 👍

      Was geht:

      DPL wird per Datenpunkt ein ein und aus geschaltet.

      Nach dem Einschalten läuft DPL wie gewohnt.

      Nach dem Ausschalten werden meine WR (HM-800 und HM-600) auch auf 100% gestellt.

      Was nicht geht:

      Die bleiben nicht bei 100%.

      Ein paar Sekunden später sind sie auf 7,5 % bzw. 10 % (Minimales Leistungslimit im DPL) gestellt.

      Warum passiert das?

      Weil die Zeit dazwischen zu kurz ist. Die Wechselrichter haben bestimmt noch den state Pending.

      Das habe ich auch schon bei einigen Hoymiles festgestellt.

      Ergänzend zu Deiner Beobachtung:
      DPL ist weiterhin ausgeschaltet aber die Werte haben sich mit ausgeschaltetem Zustand auf Minimum verändert.

      Funktioniert auch so einwandfrei:
      Nach dem DPL Ausschalten warten (ca. 10sek.), dann das Limit vergleichen:
      Falls Datenpunkt(e) (mqtt von openDTUonBattery der entsprechenden Wechselrichter) limit_relative ≠ 100 dann mittels curl auf 100% setzen.

      oder man kann nach ausschalten vom DPL und nach timeout von ~10sek einfach 100% Limit setzen.
      Das wird dann beibehalten.

      Die ca. 10 sekunden Wartezeit sind nötig.
      Vielleicht etwas zu kurz, einfach testen, weil der Hoymiles Zeit benötigt um Befehle hintereinander auszuführen. Pending muss abgeschlossen sein.
      Normalerweise könnte man pollen, auswerten, abwarten und dann senden.
      Aber für so einfache Dinge unnötig.

      Man schaltet ja normal nur 1x am Tag DPL ein oder aus (für Bypass?).

      Um es Dir leichter zu machen habe ich dafür noch ein Blockly für beide Wechselrichter zusammengeklickt:

      b542583e-9708-473a-9432-8eabf07be746-image.png

      blockly als import:

      <block xmlns="https://developers.google.com/blockly/xml" type="variables_set" id="6acw^x;DnOzQr,+1QMY~" x="-912" y="13063">
        <field name="VAR" id="03lE}K#LAiE6UIn{TSpe">openDTUoB_pwd</field>
        <value name="VALUE">
          <block type="text" id=".Gzymx[U58ZC5@#_eI1O">
            <field name="TEXT">topSecret</field>
          </block>
        </value>
        <next>
          <block type="variables_set" id="s*[FyKXx,06qe75!Ql(H">
            <field name="VAR" id="Q[Ul.eSqTa`ja|Cts-+/">HM800_serial</field>
            <value name="VALUE">
              <block type="text" id="2sNdysyulvZDNM6yeP8H">
                <field name="TEXT">123456789011</field>
              </block>
            </value>
            <next>
              <block type="variables_set" id="~/@Acy]v_1,b~:Bn[L_+">
                <field name="VAR" id="]TAF~$|vQbu%71?%TIMg">HM600_serial</field>
                <value name="VALUE">
                  <block type="text" id="f;}RPMU,=+?6Q7VrPX[$">
                    <field name="TEXT">123456789012</field>
                  </block>
                </value>
                <next>
                  <block type="variables_set" id="n9utWkCmZ~5O=d;qD`/Y">
                    <field name="VAR" id="DvrV|7SgL3%[J#.tMQYu">ip</field>
                    <value name="VALUE">
                      <block type="text" id="XM-2mM4T[^{0`;c!`RPw">
                        <field name="TEXT">192.168.2.200</field>
                      </block>
                    </value>
                    <next>
                      <block type="comment" id="pHVW34|})@%~DNJ(tX3f">
                        <field name="COMMENT">Limit_100%</field>
                        <next>
                          <block type="variables_set" id="YGofdo8=[F6.o!Qp^XF+">
                            <field name="VAR" id="9G;7cx}YMIq[e`lw6*X~">HM800_curl</field>
                            <value name="VALUE">
                              <block type="text_join" id="zv%(}:f|zmP5HG:fD09(">
                                <mutation items="7"></mutation>
                                <value name="ADD0">
                                  <block type="text" id="XAm?]VyB/h{~mRaM1bsf">
                                    <field name="TEXT">curl -u "admin:</field>
                                  </block>
                                </value>
                                <value name="ADD1">
                                  <block type="variables_get" id="%XVNmv0mDVw(k}BQGk_?">
                                    <field name="VAR" id="03lE}K#LAiE6UIn{TSpe">openDTUoB_pwd</field>
                                  </block>
                                </value>
                                <value name="ADD2">
                                  <block type="text" id="^p-]`Q~oVv2Eh[045E)c">
                                    <field name="TEXT">" http://</field>
                                  </block>
                                </value>
                                <value name="ADD3">
                                  <block type="variables_get" id="T{Tp#*68~o$/f%-3@4=!">
                                    <field name="VAR" id="DvrV|7SgL3%[J#.tMQYu">ip</field>
                                  </block>
                                </value>
                                <value name="ADD4">
                                  <block type="text" id=")l]/Nhc,h|Rg:#*Ka0Q(">
                                    <field name="TEXT">/api/limit/config -d 'data={"serial":"</field>
                                  </block>
                                </value>
                                <value name="ADD5">
                                  <block type="variables_get" id="-iy+n+|)dc=K/8NqL~*E">
                                    <field name="VAR" id="Q[Ul.eSqTa`ja|Cts-+/">HM800_serial</field>
                                  </block>
                                </value>
                                <value name="ADD6">
                                  <block type="text" id=".ZX[eqqM@Hf-6HHnLe[X">
                                    <field name="TEXT">","limit_value":100,"limit_type":1}'</field>
                                  </block>
                                </value>
                              </block>
                            </value>
                            <next>
                              <block type="variables_set" id="itIS@8Y63,ktSrsgW5.F">
                                <field name="VAR" id="b;`WR[z]dikov!wE@,}j">HM600_curl</field>
                                <value name="VALUE">
                                  <block type="text_join" id="*I6(R5oBcHQuA=dX6mSv">
                                    <mutation items="7"></mutation>
                                    <value name="ADD0">
                                      <block type="text" id="oUpBy-8zKLYpodhxSIf9">
                                        <field name="TEXT">curl -u "admin:</field>
                                      </block>
                                    </value>
                                    <value name="ADD1">
                                      <block type="variables_get" id="QuBN*njkx@{j1+c[+ZmZ">
                                        <field name="VAR" id="03lE}K#LAiE6UIn{TSpe">openDTUoB_pwd</field>
                                      </block>
                                    </value>
                                    <value name="ADD2">
                                      <block type="text" id=";pv}`0?1q%g!#_s5~/y%">
                                        <field name="TEXT">" http://</field>
                                      </block>
                                    </value>
                                    <value name="ADD3">
                                      <block type="variables_get" id="o[)lM|Pmbvb7OKUi*NuS">
                                        <field name="VAR" id="DvrV|7SgL3%[J#.tMQYu">ip</field>
                                      </block>
                                    </value>
                                    <value name="ADD4">
                                      <block type="text" id="V8FZuQaNdG6{3d83*Vfy">
                                        <field name="TEXT">/api/limit/config -d 'data={"serial":"</field>
                                      </block>
                                    </value>
                                    <value name="ADD5">
                                      <block type="variables_get" id="qi!d0-X1Z-#=8-deCnKw">
                                        <field name="VAR" id="]TAF~$|vQbu%71?%TIMg">HM600_serial</field>
                                      </block>
                                    </value>
                                    <value name="ADD6">
                                      <block type="text" id="^C*6RVCe.]c[_:It59N)">
                                        <field name="TEXT">","limit_value":100,"limit_type":1}'</field>
                                      </block>
                                    </value>
                                  </block>
                                </value>
                                <next>
                                  <block type="exec" id="z~uv`gd4.T-c?jLD!w`q">
                                    <mutation xmlns="http://www.w3.org/1999/xhtml" with_statement="false"></mutation>
                                    <field name="WITH_STATEMENT">FALSE</field>
                                    <field name="LOG"></field>
                                    <value name="COMMAND">
                                      <shadow type="text" id="{M)j=M5AjT,.J`1?|4n4">
                                        <field name="TEXT">pwd</field>
                                      </shadow>
                                      <block type="variables_get" id="2pE#.amP4,xu4{2Q,D%{">
                                        <field name="VAR" id="b;`WR[z]dikov!wE@,}j">HM600_curl</field>
                                      </block>
                                    </value>
                                    <next>
                                      <block type="exec" id="{]ZETu!ip1~2tjg$bQ`P">
                                        <mutation xmlns="http://www.w3.org/1999/xhtml" with_statement="false"></mutation>
                                        <field name="WITH_STATEMENT">FALSE</field>
                                        <field name="LOG"></field>
                                        <value name="COMMAND">
                                          <shadow type="text" id=",tNN#:Wd`$Q^xxlYDxuS">
                                            <field name="TEXT">pwd</field>
                                          </shadow>
                                          <block type="variables_get" id="jo++g^rXVk`{euOClG%?">
                                            <field name="VAR" id="9G;7cx}YMIq[e`lw6*X~">HM800_curl</field>
                                          </block>
                                        </value>
                                      </block>
                                    </next>
                                  </block>
                                </next>
                              </block>
                            </next>
                          </block>
                        </next>
                      </block>
                    </next>
                  </block>
                </next>
              </block>
            </next>
          </block>
        </next>
      </block>
      

      kannst ja anpassen für Dein Blockly. Variablen von Passwort für OpenDTU, IP und Seriennumern müsstest schon integriert haben und kannst die dann nehmen/ersetzen.

      Alternativ starten manche den Wechselrichter nach DPL ausschalten neu, damit die non-persistenten Werte weg sind und der Wechselrichter wieder auf 100% ist.

      Viel Spaß und Erfolg.

      PS: Blockly mag ich eigentlich nicht. Lieber js. Ist man nicht so eingeschränkt und geht schneller.

      posted in Blockly
      maxclaudi
      maxclaudi
    • RE: Test Adapter Zendure Solarflow

      @nograx sagte in Test Adapter Zendure Solarflow:

      Moin, mit der Version 1.13.2 wird der AC Mode beim ACE 1500 nun auch korrekt gesetzt. Musste erstmal checken das Zendure hier den selben Datenpunkt bei Geräten für unterschiedliche Dinge nutzt.

      Die Version 1.13.2 ist noch in Arbeit?

      Und
      die Passwort-Generierung funktioniert ja jetzt.
      Bist Du so lieb und würdest optionale mqtt-Zugangsdaten in die UI für lokalen Betrieb einpflegen?

      Mir ist klar, dass die Daten ohne SSL bzw. TLS sowieso im Klartext gesendet werden, aber es wäre schön, wenn die nicht offen in der Instanz sichtbar wären.
      (Einfachste Lösung die Verkettung des IP String?)

      Bitte.


      edit/ps:
      Von mir aus kannst auch die Passwortgenerierung mit in den Adapter einpflegen.
      Wenn Du möchtest.

      posted in Tester
      maxclaudi
      maxclaudi
    • RE: OpenDTU-onBattery Blockly DPL Ein/Aus

      @beowolf
      Habe den Fehler im OpenDTU-OnBattery code gefunden.

      Verhalten und Ablauf wenn DPL ausgeschaltet wird (enabled:false):

      Die Konfiguration wird zwar gespeichert, aber:
      Der PowerLimiter macht keinen expliziten „Reset“ der Limits auf 100%.
      Stattdessen hängt es davon ab, ob im LimitManager gerade noch ein alter Limit-Wert aktiv ist.

      Deshalb passiert, dass manchmal noch der alte Wert aus der aktiven Regelung stehen bleibt (z. B. 60 %), manchmal springt es auf 100 %.

      Warum dieses Verhalten?
      Im Code sieht man, dass beim Abschalten (enabled=false) die Logik nicht aktiv eine Rücksetzung triggert.
      Das bedeutet praktisch:

      Beim Einschalten → aktiver Eingriff in die Limits.
      Beim Ausschalten → kein Eingriff → Limit bleibt zufällig auf dem letzten Stand.

      Lösung:
      Firmware patchen (sauberste Lösung)
      Im onAdminPost oder PowerLimiter::disable() explizit ein Setzen auf 100 % Limit einbauen, z. B.:

      src/WebApi_powerlimiter.cpp, angepasst für onAdminPost()


      void WebApiPowerLimiterClass::onAdminPost(AsyncWebServerRequest *request, JsonDocument &root)
      {
          if (root.containsKey("enabled")) {
              PowerLimiter.Enabled = root["enabled"];
              PowerLimiter.saveConfig();
      
              if (!PowerLimiter.Enabled) {
                  // Wenn PowerLimiter deaktiviert wird, Limit für alle bekannten Wechselrichter auf 100% setzen
                  for (auto &invCfg : PowerLimiter.config.inverters) {
                      LimitManager.setLimit(invCfg.serial, 100, LimitType::PERCENT);
                  }
              }
          }
      
          if (root.containsKey("verbose_logging")) {
              PowerLimiter.config.VerboseLogging = root["verbose_logging"];
          }
      
          if (root.containsKey("solar_passthrough_enabled")) {
              PowerLimiter.config.SolarPassthroughEnabled = root["solar_passthrough_enabled"];
          }
      
          if (root.containsKey("conduction_losses")) {
              PowerLimiter.config.ConductionLosses = root["conduction_losses"];
          }
      
          if (root.containsKey("battery_always_use_at_night")) {
              PowerLimiter.config.BatteryAlwaysUseAtNight = root["battery_always_use_at_night"];
          }
      
          if (root.containsKey("target_power_consumption")) {
              PowerLimiter.config.TargetPowerConsumption = root["target_power_consumption"];
          }
      
          if (root.containsKey("target_power_consumption_hysteresis")) {
              PowerLimiter.config.TargetPowerConsumptionHysteresis = root["target_power_consumption_hysteresis"];
          }
      
          if (root.containsKey("base_load_limit")) {
              PowerLimiter.config.BaseLoadLimit = root["base_load_limit"];
          }
      
          if (root.containsKey("ignore_soc")) {
              PowerLimiter.config.IgnoreSoc = root["ignore_soc"];
          }
      
          if (root.containsKey("battery_soc_start_threshold")) {
              PowerLimiter.config.BatterySocStartThreshold = root["battery_soc_start_threshold"];
          }
      
          if (root.containsKey("battery_soc_stop_threshold")) {
              PowerLimiter.config.BatterySocStopThreshold = root["battery_soc_stop_threshold"];
          }
      
          if (root.containsKey("voltage_start_threshold")) {
              PowerLimiter.config.VoltageStartThreshold = root["voltage_start_threshold"];
          }
      
          if (root.containsKey("voltage_stop_threshold")) {
              PowerLimiter.config.VoltageStopThreshold = root["voltage_stop_threshold"];
          }
      
          if (root.containsKey("voltage_load_correction_factor")) {
              PowerLimiter.config.VoltageLoadCorrectionFactor = root["voltage_load_correction_factor"];
          }
      
          if (root.containsKey("full_solar_passthrough_soc")) {
              PowerLimiter.config.FullSolarPassthroughSoc = root["full_solar_passthrough_soc"];
          }
      
          if (root.containsKey("full_solar_passthrough_start_voltage")) {
              PowerLimiter.config.FullSolarPassthroughStartVoltage = root["full_solar_passthrough_start_voltage"];
          }
      
          if (root.containsKey("full_solar_passthrough_stop_voltage")) {
              PowerLimiter.config.FullSolarPassthroughStopVoltage = root["full_solar_passthrough_stop_voltage"];
          }
      
          if (root.containsKey("inverter_serial_for_dc_voltage")) {
              PowerLimiter.config.InverterSerialForDcVoltage = root["inverter_serial_for_dc_voltage"].as<String>();
          }
      
          if (root.containsKey("inverter_channel_id_for_dc_voltage")) {
              PowerLimiter.config.InverterChannelIdForDcVoltage = root["inverter_channel_id_for_dc_voltage"];
          }
      
          if (root.containsKey("inverter_restart_hour")) {
              PowerLimiter.config.InverterRestartHour = root["inverter_restart_hour"];
          }
      
          if (root.containsKey("total_upper_power_limit")) {
              PowerLimiter.config.TotalUpperPowerLimit = root["total_upper_power_limit"];
          }
      
          if (root.containsKey("inverters")) {
              for (JsonObject inv : root["inverters"].as<JsonArray>()) {
                  String serial = inv["serial"];
                  auto *cfg = PowerLimiter.findInverterConfig(serial);
                  if (cfg) {
                      if (inv.containsKey("is_governed")) cfg->IsGoverned = inv["is_governed"];
                      if (inv.containsKey("is_behind_power_meter")) cfg->IsBehindPowerMeter = inv["is_behind_power_meter"];
                      if (inv.containsKey("power_source")) cfg->PowerSource = inv["power_source"];
                      if (inv.containsKey("use_overscaling_to_compensate_shading")) cfg->UseOverscalingToCompensateShading = inv["use_overscaling_to_compensate_shading"];
                      if (inv.containsKey("lower_power_limit")) cfg->LowerPowerLimit = inv["lower_power_limit"];
                      if (inv.containsKey("upper_power_limit")) cfg->UpperPowerLimit = inv["upper_power_limit"];
                      if (inv.containsKey("scaling_threshold")) cfg->ScalingThreshold = inv["scaling_threshold"];
                  }
              }
          }
      
          PowerLimiter.saveConfig();
          request->send(200, "application/json", "{\"success\":true}");
      }
      
      

      Effekt der Änderung:

      • Wenn enabled:true: alles wie bisher.

      • Wenn enabled:false: alle in config.inverters gelisteten WR bekommen sofort ein Limit von 100 %.

      Danach reicht ein einziger curl-DPL-Aufruf enabled:false.


      Habe bei github ein issue erstellt, in der Hoffnung, dass das künftig berücksichtigt wird.

      Dann würde der Code ohne Timeout und Limit setzen funktionieren, so wie es sein sollte.


      3 Alternativen:

      • API-Seite belassen (Workaround), wie bisher hier, mit timeout und mit Limit danach setzen.

      • oder:
        kleine Watchdog-Logik einbauen: Wenn false, prüft ein Timer alle paar Sekunden, ob Limits ≠ 100% sind, und setzt diese bei Bedarf dann zurück auf 100%.

      • oder
        nach DPL ausschalten: Wechselrichter Neustart durchführen, dann gehen non-presistente Werte auch verloren.

      Fazit:
      Dass das Limit nicht immer auf 100 % springt, liegt daran, dass die Firmware beim Abschalten keine Limit-Rücksetzung vornimmt. Es bleibt der „letzte gesetzte Wert“ bestehen, bis jemand ihn überschreibt.

      Vielleicht wird das ja mal geändert.

      posted in Blockly
      maxclaudi
      maxclaudi

    Latest posts made by maxclaudi

    • RE: Test Adapter Zendure Solarflow

      @astuermer sagte in Test Adapter Zendure Solarflow:

      ... wenn ich Bypass komplett an mache speist er ein (halt alles was anliegt), aber eben abends bis zum Letzten Watt Bypass und ohne Einspeisung durch den Akku - erst wenn die Sonne komplett weg ist. Das macht dann so keinen Sinn für mich.

      @maxclaudi sagte in Test Adapter Zendure Solarflow:

      Bei mir steht Bypass normal auf automatic.
      Der Bypass wird per script ausgeschaltet, wenn PV-Eingangsleistung <20W über 3min und frühestens 4 Stunden vor Sonnenuntergang.
      <20W ist eigentlich keine Leistung für ein Relais und müsste es leicht aushalten.
      Wann schaltet der automatic-Modus (passMode:0) um?
      automatic Modus schaltet allein um, wenn ca 20W über eine Zeit von >= 5min ist und zusätzlich ein weiterer Parameter (den ich bisher nicht sicher ausfindig machen konnte) wirkt. Vermutlich auch die Zeit.
      ...
      Das funktionierte für mich mal gut, mal weniger gut.
      Deshalb schaltet mein script den automatic-Modus bei sehr geringer Eingangsleistung und abhängig vom Sonnenuntergang um.
      Den Bypass auf automatic schalte ich in der Nacht wieder ein.

      Bypass

      Du schreibst, dass Du einen HM600 benutzt.
      Wenn Du während des Bypass nicht voll einspeisen möchtest und eine DPL-Regelung haben möchtest, dann kann ich Dir empfehlen zusätzlich OpenDTU-OnBattery zu verwenden.
      Nur während des Zendure-Bypass kannst Du dann OpDTUB DPL aktivieren.
      Für die Umschaltung habe ich ein Blockly und eine angepasste OpDTUoB geschrieben.

      posted in Tester
      maxclaudi
      maxclaudi
    • RE: Test Adapter Zendure Solarflow

      @michi-0 sagte in Test Adapter Zendure Solarflow:

      Neues zum Thema Flash/RAM.

      Hier die Antwort von Zendure zum Thema Schreiben von Werten:

      Die theoretische Lebensdauer des Flash-Speichers beträgt 100.000 Schreibzyklen. Bitte setzen Sie beim Ändern der Stromversorgung den Smartmode auf 1, um Schreibvorgänge im Flash-Speicher zu verhindern.

      1. Für den Smartmode ist ZenSDK erforderlich.
      2. Bitte beachten Sie den GitHub-Link und die beigefügten Screenshots: https://github.com/Zendure/zenSDK/blob/main/docs/en_properties.md

      Problem bei meinem 2400 ac: Über MQTT bekomme ich kein Objekt "Smartmode". Mit dem vom Support angesprochenen ZenSDK kann ich nix anfangen.

      Herzlichen Dank, das bestätigt meine Tests und Analysen.
      Auch wenn ich Dir nicht weiterhelfen kann, hast Du mir sehr geholfen mit der Bestätigung.
      Dankeschön.

      posted in Tester
      maxclaudi
      maxclaudi
    • RE: Test Adapter Zendure Solarflow

      @nograx
      Für mich ist das Thema an dieser Stelle abgeschlossen. Ob und wann die Cloud Befehle sendet oder eingreift, lässt sich ausschließlich durch gezielte Messungen (z. B. Proxy oder MQTT-Debug) sicher nachweisen. Spekulationen dazu führen nicht weiter.

      posted in Tester
      maxclaudi
      maxclaudi
    • RE: Test Adapter Zendure Solarflow

      @nograx sagte in Test Adapter Zendure Solarflow:

      Das mit dem lokal habe ich immer noch nicht verstanden. Wenn ich über die Cloud verbunden bin, sendet ioBroker den invoke Befehl an den Cloud MQTT und das verbundene Gerät empfängt die Aktualisierung und verarbeitet diese. "Lokal" kann ich da gar nichts an das Gerät schicken weil dieses nur Befehle vom verbundenen MQTT Server entgegen nimmt.

      Das einzige Problem das ich mir hier vorstellen kann, ist das Szenario das man hier unter Devices in der Zendure App noch einen Shelly oder ähnlich eingebunden hat und durch die Änderung des Mode dieser wieder aktiv geschaltet wird und somit der nachgelagerte Server bei Zendure wieder Befehle schickt. Dann versuchen natürlich 2 Steuerungen das Gerät zu steuern. Da kann es dann natürlich zu Konflikten kommen.

      Lokaler MQTT-Broker (z. B. Mosquitto):
      Der Broker macht nichts Eigenes. Er verteilt nur Nachrichten zwischen Clients (z. B. ioBroker, Hyper). Er ist reiner „Postverteiler“ und erfindet keine Befehle.

      Cloud-MQTT bei Zendure:
      Die Cloud ist nicht nur Broker, sondern zusätzlich auch aktiver Client.
      Sie empfängt Nachrichten von App oder Automatikmodellen, erzeugt selbst Befehle (z. B. , SmartMatching, Preis-Automatik) und schreibt diese ins gleiche Topic.
      So verteilt sie ihre Befehle ebenfalls an alle Clients (z. B. ioBroker, Hyper).

      Ergebnis: Wenn ioBroker deviceAutomation publisht, landet das beim Cloud-Broker. Gleichzeitig publisht die Cloud (als Client) eigene Werte ins selbe Topic (function/invoke).
      Das Zendure-Gerät empfängt also beide Quellen über denselben Kanal – und führt immer den zuletzt empfangenen Befehl aus.

      posted in Tester
      maxclaudi
      maxclaudi
    • RE: Test Adapter Zendure Solarflow

      Ich möchte mich an dieser Stelle zurückziehen, da ich den Adapter selbst nicht mehr nutze und stattdessen auf eine eigene Lösung umgestiegen bin.

      Meine bisherigen Hinweise basierten ausschließlich auf eigener Analyse und Tests – jeder kann das bei Interesse selbst nachvollziehen.

      Vielen Dank an alle hier für den Austausch und die vielen Ideen, die indirekt auch zu meiner eigenen Lösung beigetragen haben 👍

      Da ich den Adapter selbst nicht mehr einsetze, schaue ich nur noch ab und zu vorbei und beschränke mich künftig eher aufs Mitlesen.

      Nochmals ein herzliches Dankeschön an alle 🙂

      posted in Tester
      maxclaudi
      maxclaudi
    • RE: Test Adapter Zendure Solarflow

      @Felli
      Bei mir läuft es mit einer HUB2000 + ACE1500 Kombi.
      Überschussladen mache ich ebenfalls klassisch per Script über autoModel:0, acMode, inputLimit und outputLimit, alles in Verbindung mit smartMode:1 – und mit möglichst wenigen Schreibvorgängen.

      posted in Tester
      maxclaudi
      maxclaudi
    • RE: Test Adapter Zendure Solarflow

      @nograx sagte in Test Adapter Zendure Solarflow:

      Ich gehe aktuell davon aus das es von der HA Integration noch deutlich mehr Installationen vorhanden sind als vom ioBroker Adapter. Hier müsste es doch also ne Menge Leute geben die Probleme haben. Auch hier gibt es Stand jetzt nur @lesiflo und ggf. dich?
      Wenn hier so viele Hyper regelmäßig aussteigen würden, wäre das in den Github Issues deutlich sichtbar...

      Einige Nutzer haben über MQTT-Probleme berichtet, die möglicherweise von dieser Funktion stammen.
      Auf die Schnelle fallen mir hier @Bernd1967 und @Murphy-0 ein (letzterer setzt nur sehr wenige Schreibvorgänge, 90–150).

      Es wird sicherlich viele User geben, die gar nicht wissen, woher die Probleme kommen, und etwas anderes vermuten – z. B. Router, Broker etc. – liest man doch häufiger.

      Auffällig ist nur, dass die Probleme in Verbindung mit der neuen Funktion auftreten.
      Einige Nutzer sind vermutlich auch nicht so technisch versiert.


      Zum aktuellen HA Code Zendure-HA-1.1.4-pre2:

      • in allen Geräteklassen (hyper2000.py, hub2000.py, aio2400.py, …) wird "function": "deviceAutomation" gesendet – das ist der lokale Befehl.

      • In device.py taucht topic_function auf:

      self.topic_function = f"iot/{self.prodkey}/{self.deviceId}/function/invoke"
      self.mqttPublish(self.topic_function, command)
      
      

      Das ist der MQTT-Topic für Befehle.
      Dort gibt es auch mqttProperties, die eingehende Cloud-/Gerätenachrichten verarbeiten.

      Das bedeutet:

      • Lokal gesetzte deviceAutomation -> MQTT-Publish geht raus.
      • Cloud aktiv -> über dasselbe Topic kommt ebenfalls ein Befehl (function/invoke).
      • Das Gerät empfängt also lokal und Cloud-Befehle über denselben Kanal.

      Konfliktmechanismus (Cloud vs. Lokal):

      • setDeviceAutomationInOutLimit schickt fixe Werte.
      • Die Cloud schickt ebenfalls deviceAutomation (ihre Automatik-Parameter).
      • Beide nutzen dasselbe Topic -> das Gerät führt den letzten Befehl aus.

      Fazit:

      • Ob mit oder ohne Freeze, der Ablauf ist logisch, weil man im SmartMatchingMode ist.
      • Sobald Cloud verbunden und Mode 8 aktiv -> Cloud sendet kontinuierlich neue Automatik-Parameter.
      • der lokale Code „hackt“ sich zwar rein, verliert aber gegen die Cloud-Syncs.

      Wer die Situation selbst nachvollziehen möchte, kann bei aktiver Cloud-Verbindung lokal einen Proxy dazwischenschalten und den MQTT-Verkehr mitloggen. So lässt sich das Zusammenspiel von lokalen Befehlen und Cloud-Sync beobachten.

      posted in Tester
      maxclaudi
      maxclaudi
    • RE: Test Adapter Zendure Solarflow

      @nograx

      Tut mir leid, Issues lese ich gar nicht. Ich analysiere Code, teste, logge und werte aus – mehr ist das nicht.
      Ich bin auch nicht fehlerfrei und möchte niemandem etwas unterstellen. Ich teile nur, was ich selbst analysiert und/oder getestet habe.

      Im aktuellen Code – Zendure-HA-1.1.4-pre2 von HA, wenn er so verwendet wird – kann der Konflikt nicht behoben sein.
      Ich wüsste nicht, wie die Firmware zwischen einem externen invoke und der App in einem Modus unterscheiden sollte. Im aktuellen Code ist das für mich nicht erkennbar.

      posted in Tester
      maxclaudi
      maxclaudi
    • RE: Test Adapter Zendure Solarflow

      @maxclaudi sagte in Test Adapter Zendure Solarflow:

      Die Nutzung von setDeviceAutomationInOutLimit bzw. der HA-Integration deviceAutomation invoke führt in Verbindung mit der Cloud definitiv zu Konflikten.

      Wer mit der Cloud arbeitet und einen Proxy zum Mitschneiden nutzt, kann das auch selbst nachvollziehen.

      Das könnte ein Hinweis darauf sein, dass nicht jede Code-Funktion auf GitHub offiziell abgenommen ist – möglicherweise reicht es, wenn jemand mit „Maintainer“-Rechten den Code einstellt oder pflegt.

      @lesiflo
      Die Schwierigkeiten bei dir hängen nicht mit einem Cloud-Fehler zusammen, sondern damit, dass setDeviceAutomationInOutLimit in deiner Konfiguration verwendet wird.
      Mit Cloud-Anbindung kann diese Funktion technisch bedingt nicht konfliktfrei laufen.

      Um das Thema für mich abzuschließen, hier noch einmal der aktuelle Stand – rein als technische Information für alle:

      Der Konflikt entsteht nicht dadurch, dass man setDeviceAutomationInOutLimit verwenden möchte, sondern weil diese Funktion zwingend den SmartMatchingMode benötigt, um korrekt zu funktionieren.
      Sobald ein Wert über setDeviceAutomationInOutLimit gesetzt wird, wird automatisch der SmartMatchingMode aktiviert.

      In diesem Modus übernimmt die Cloud die Steuerung anhand der aktuell über die App gesetzten Parameter und synchronisiert die Werte kontinuierlich.
      Dadurch entstehen Konflikte:

      • Die Cloud überschreibt die von setDeviceAutomationInOutLimit gesetzten Werte mit ihren eigenen, was zu unerwarteten Änderungen führt.

      • Wird anschließend erneut ein Wert über setDeviceAutomationInOutLimit gesetzt, überschreibt die Cloud diesen wieder – dieser Kreislauf kann Fehlverhalten wie „Freeze“ oder MQTT-Probleme erzeugen.

      Das ist vorprogrammiert und logisch nachvollziehbar.
      Deshalb ist eine konfliktfreie Nutzung von setDeviceAutomationInOutLimit bei gleichzeitiger Verwendung der App mit Cloud-Anbindung nicht möglich.

      Ganz isoliert, nur lokal, könnte setDeviceAutomationInOutLimit vielleicht fehlerfrei verwendet werden, da hier weder App noch Cloud beteiligt sind.
      Das kann ich nicht beurteilen, weil ich nicht setDeviceAutomationInOutLimit/DeviceAutomation invoke in einem AutomatikMode verwenden möchte.

      posted in Tester
      maxclaudi
      maxclaudi
    • RE: Test Adapter Zendure Solarflow

      Die Nutzung von setDeviceAutomationInOutLimit bzw. der HA-Integration deviceAutomation invoke führt in Verbindung mit der Cloud definitiv zu Konflikten.

      Wer mit der Cloud arbeitet und einen Proxy zum Mitschneiden nutzt, kann das auch selbst nachvollziehen.

      Das könnte ein Hinweis darauf sein, dass nicht jede Code-Funktion auf GitHub offiziell abgenommen ist – möglicherweise reicht es, wenn jemand mit „Maintainer“-Rechten den Code einstellt oder pflegt.

      @lesiflo
      Die Schwierigkeiten bei dir hängen nicht mit einem Cloud-Fehler zusammen, sondern damit, dass setDeviceAutomationInOutLimit in deiner Konfiguration verwendet wird.
      Mit Cloud-Anbindung kann diese Funktion technisch bedingt nicht konfliktfrei laufen.

      posted in Tester
      maxclaudi
      maxclaudi
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo