Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Zendure zenSDK Lokal API, SmartMode, SolarFlow AC 800 Pro 2

NEWS

  • wichtiges UPDATE für controller 7.2.2 im stable
    HomoranH
    Homoran
    8
    1
    431

  • Neues YouTube-Video: Visualisierung im Devices-Adapter
    BluefoxB
    Bluefox
    14
    1
    2.7k

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    8
    1
    2.9k

Zendure zenSDK Lokal API, SmartMode, SolarFlow AC 800 Pro 2

Geplant Angeheftet Gesperrt Verschoben JavaScript
360 Beiträge 20 Kommentatoren 31.6k Aufrufe 18 Beobachtet
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • maxclaudiM maxclaudi

    @paul53 sagte:
    Es wäre schön, wenn Zendure die Bedeutung dieses Bits mitteilen würde.

    Zendure ist bzw. war in der Vergangenheit sehr sparsam mit Informationen.
    Oft ist die spärliche API-Dokumentation teilweise unvollständig oder nicht richtig.

    @paul53 sagte:
    Wenn es in neueren API-Versionen immer gesetzt ist, könnte man es auch maskieren.

    Darum frage ich ja.
    Diesen Schritt würde ich erst gehen, wenn die Dokumentation – wenn auch nur spärlich – überhaupt auf API 3 aktualisiert wird oder genügend eigene Untersuchungen dies bestätigen.

    @paul53 sagte:
    Wenn die Grenze erreicht ist, schaltet die Notstromdose ab und ioBroker läuft dann nicht mehr.

    Mich würde interessieren, unter welchen Bedingungen das beobachtet wurde.

    Für mich ist aktuell noch unklar, wie sich die Grid-Off-Steckdose verhält, wenn bei Erreichen von MinSoC gleichzeitig

    • ausreichend PV-Leistung vorhanden ist,
    • das Gerät mit dem Netz verbunden ist,
    • oder AC-Laden aktiviert ist.

    Dazu habe ich bislang leider keine eindeutige Aussage/Information von Zendure gefunden.

    Aus den verfügbaren Informationen geht lediglich hervor, dass die Off-Grid-Steckdose ein eigenständiger EPS-/Notstrom-Ausgang ist, der primär aus der Batterie versorgt wird.
    Der SF800 Pro kann gleichzeitig netzparallel arbeiten und die Off-Grid-Steckdose versorgen.

    Zendure Zitat:

    Kann der SolarFlow 800 Pro 2 sowohl im netzgekoppelten als auch im netzunabhängigen Modus gleichzeitig arbeiten?
    Ja, es unterstützt die gleichzeitige Nutzung der Off-Grid- und Netzeinspeisungsfunktion, wobei die Gesamtleistung 1000 W nicht überschreiten darf.
    Bei alleiniger Nutzung der Off-Grid-Funktion beträgt die maximale Entladeleistung der Off-Grid-AC-Schnittstelle 1000 W.
    Quelle: Zendure SolarFlow 800 Pro 2, FAQ

    Was ich bisher nicht finden konnte, ist eine Aussage dazu,

    • ob die Grid-Off-Steckdose bei Erreichen von MinSoC grundsätzlich abgeschaltet wird,
    • ob sie bei ausreichender PV-Leistung weiter betrieben werden kann,
    • oder ob ein vorhandener Netzanschluss dabei eine Rolle spielt.

    Zendure liefert auch hier wieder nur spärliche Infos.

    Viele Details lassen sich daher oft erst durch praktische Erfahrungen und eigene Tests herausfinden. Das war auch bei einigen Fragestellungen in der Vergangenheit so, bei denen ich selbst Messungen und Versuche durchgeführt habe, um das tatsächliche Verhalten der Geräte besser zu verstehen.

    Daher die Frage an alle:

    Hat das jemand bereits gezielt getestet?

    Beispielsweise bei einem SF800 Pro / SF800 Pro 2 mit:

    • aktivem Netzanschluss,
    • Dauerlast an der Grid-Off-Steckdose,
    • MinSoC z. B. 50 %.

    Was passiert genau, wenn die 50 % erreicht werden und gleichzeitig noch genügend PV-Leistung vorhanden ist?

    • Schaltet die Grid-Off-Steckdose sofort ab?
    • Wird lediglich die Batterie geschont und die Last direkt aus PV versorgt?
    • Oder verhält sich das System noch anders?
    paul53P Offline
    paul53P Offline
    paul53
    schrieb am zuletzt editiert von paul53
    #348

    @maxclaudi [sagte]: Hat das jemand bereits gezielt getestet?

    Zum Test habe ich anstelle von Mini-PC und Router einen 75 W Verbraucher an die Notstromsteckdose angeschlossen und folgendes beobachtet:

    • Es wird auch bei 75 W Last oberhalb von "socSet" mit 9 W weiter geladen
    • Das Weiterladen kann man verhindern, indem man "acMode" auf 2 (Entladen) und "outputLimit" auf einen Wert > 0 (15 W) setzt.
    • Bei Netzausfall sinkt SoC bis auf "minSoc" (Test mit 50) und es schaltet dann die Notstromdose aus (siehe Chart).

    PV ist Zur Zeit nicht angeschlossen.

    SoC50-75W.JPG

    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
    Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB

    maxclaudiM 1 Antwort Letzte Antwort
    1
    • paul53P paul53

      @maxclaudi [sagte]: Hat das jemand bereits gezielt getestet?

      Zum Test habe ich anstelle von Mini-PC und Router einen 75 W Verbraucher an die Notstromsteckdose angeschlossen und folgendes beobachtet:

      • Es wird auch bei 75 W Last oberhalb von "socSet" mit 9 W weiter geladen
      • Das Weiterladen kann man verhindern, indem man "acMode" auf 2 (Entladen) und "outputLimit" auf einen Wert > 0 (15 W) setzt.
      • Bei Netzausfall sinkt SoC bis auf "minSoc" (Test mit 50) und es schaltet dann die Notstromdose aus (siehe Chart).

      PV ist Zur Zeit nicht angeschlossen.

      SoC50-75W.JPG

      maxclaudiM Offline
      maxclaudiM Offline
      maxclaudi
      schrieb am zuletzt editiert von maxclaudi
      #349

      @paul53 sagte:

      Bei Netzausfall sinkt SoC bis auf "minSoc" (Test mit 50) und es schaltet dann die Notstromdose aus....

      Wert von socLimit:
      Welchen Wert meldet socLimit, sobald die Notstromdose wegen Erreichen des Entladelimits (minSoC) abgeschaltet hat?
      18?

      Einstellung gridOffMode:
      Welchen Wert hattest du während deines Tests für gridOffMode gesetzt (0 oder 1)?

      Danke dir für deine Unterstützung.

      Zendure zenSDK Lokal API, SmartMode, SolarFlow AC 800 Pro 2

      paul53P 2 Antworten Letzte Antwort
      0
      • maxclaudiM maxclaudi

        @paul53 sagte:

        Bei Netzausfall sinkt SoC bis auf "minSoc" (Test mit 50) und es schaltet dann die Notstromdose aus....

        Wert von socLimit:
        Welchen Wert meldet socLimit, sobald die Notstromdose wegen Erreichen des Entladelimits (minSoC) abgeschaltet hat?
        18?

        Einstellung gridOffMode:
        Welchen Wert hattest du während deines Tests für gridOffMode gesetzt (0 oder 1)?

        Danke dir für deine Unterstützung.

        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von paul53
        #350

        @maxclaudi [sagte]: Welchen Wert meldet socLimit, sobald die Notstromdose wegen Erreichen des Entladelimits (minSoC) abgeschaltet hat?

        Darauf habe ich leider nicht geachtet. Es wird seit einiger Zeit wieder geladen.

        @maxclaudi sagte:

        Welchen Wert hattest du während deines Tests für gridOffMode gesetzt (0 oder 1)?

        Immer 0 (normal).

        EDIT: Wenn weder Netz noch Verbraucher angeschlossen sind, wird die Batterie mit 14 W entladen ("Battery pack power").

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB

        maxclaudiM 1 Antwort Letzte Antwort
        0
        • paul53P paul53

          @maxclaudi [sagte]: Welchen Wert meldet socLimit, sobald die Notstromdose wegen Erreichen des Entladelimits (minSoC) abgeschaltet hat?

          Darauf habe ich leider nicht geachtet. Es wird seit einiger Zeit wieder geladen.

          @maxclaudi sagte:

          Welchen Wert hattest du während deines Tests für gridOffMode gesetzt (0 oder 1)?

          Immer 0 (normal).

          EDIT: Wenn weder Netz noch Verbraucher angeschlossen sind, wird die Batterie mit 14 W entladen ("Battery pack power").

          maxclaudiM Offline
          maxclaudiM Offline
          maxclaudi
          schrieb am zuletzt editiert von
          #351

          @paul53 sagte:
          EDIT: Wenn weder Netz noch Verbraucher angeschlossen sind, wird die Batterie mit 14 W entladen ("Battery pack power").

          Wenn die gridOff-Steckdose längere Zeit inaktiv sein soll, dann kannst Du gridOffMode:2 setzen.
          set gridOffMode; 0: Normal mode, 1: Economic mode, 2: OFF
          Das spart Strom.

          Zendure zenSDK Lokal API, SmartMode, SolarFlow AC 800 Pro 2

          paul53P 1 Antwort Letzte Antwort
          0
          • maxclaudiM maxclaudi

            @paul53 sagte:
            EDIT: Wenn weder Netz noch Verbraucher angeschlossen sind, wird die Batterie mit 14 W entladen ("Battery pack power").

            Wenn die gridOff-Steckdose längere Zeit inaktiv sein soll, dann kannst Du gridOffMode:2 setzen.
            set gridOffMode; 0: Normal mode, 1: Economic mode, 2: OFF
            Das spart Strom.

            paul53P Offline
            paul53P Offline
            paul53
            schrieb zuletzt editiert von
            #352

            @maxclaudi [sagte]: gridOffMode:2 setzen

            Das war die Werkseinstellung. Was passiert im Economic mode?

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB

            maxclaudiM 1 Antwort Letzte Antwort
            0
            • paul53P paul53

              @maxclaudi [sagte]: gridOffMode:2 setzen

              Das war die Werkseinstellung. Was passiert im Economic mode?

              maxclaudiM Offline
              maxclaudiM Offline
              maxclaudi
              schrieb zuletzt editiert von
              #353

              @paul53
              Der Economic mode soll angeblich den kombinierten Betrieb (gleichzeitiger In- und Output) ermöglichen und angeblich auch bei Inaktivität automatisch abschalten.
              Getestet und genutzt wird der Modus von mir nur als reiner 230V AC-Eingang.

              Bei mir ist dauerhaft gridOffMode:1 und gridReverse:1 gesetzt.
              Das ist für mein Setup zwingend erforderlich und von Vorteil, weil ich an der gridOff-Steckdose dauerhaft einen Hoymiles-Wechselrichter zur Einspeisung angeschlossen habe.
              Dabei verwende ich den Wechselrichter primär, um die Batterien zu laden.
              Wenn die Batterien voll sind, geht das Gerät (durch gridReverse: 1) in den Bypass und liefert die Leistung ins Hausnetz.

              Der angeschlossene Wechselrichter läuft damit absolut stabil.
              Das System schaltet hier bei mir entweder die gridOff-Steckdose gar nicht ab, oder die Abschaltung war/ist im Betrieb für mich bisher nicht wahrnehmbar und ungetestet.

              Weil mein System so gut funktioniert und ich bisher für mich keine Nachteile finden kann, sind für mich ein paar Watt hin oder her auch nicht relevant.
              Allgemein werte ich eigentlich immer den echten Stromzählerwert des Energieversorgers aus.

              Ich priorisiere derzeit – Step by Step – andere, neue Versuche, Keys und Parameter.

              Das Ganze sprengt leider schon sehr lange Zeit meinen Freizeitrahmen.

              Zendure zenSDK Lokal API, SmartMode, SolarFlow AC 800 Pro 2

              1 Antwort Letzte Antwort
              0
              • J Online
                J Online
                Jockel_Bln
                schrieb zuletzt editiert von Jockel_Bln
                #354

                @maxclaudi Vielen Dank für die Mühe die du dir hier machst 👍
                Ich besitze seit dem Wochenende einen SF2400AC+ und versuche gerade das Teil halbwegs sinnvoll zu steuern. Nachdem ich dein super dokumentiertes Skript gefunden habe, ist der solarflow Adapter gleich wieder in Rente gegangen.
                Ich habe von Skripten leider nur sehr weinig bis gar keine Ahnung und bin deshalb immer noch auf Vorlagen angewiesen.
                Da dein "Hauptskript" leider nicht öffentlich ist, habe ich mich mal bei @lesiflo bedient und versucht sein Script zum Laden/Entladen von Zendure Solarflow für mich an dei Skript anzupassen um erst einmal die grundlegenden Funktionen zu haben.

                @All Eventuell kann da mal jemand drüber gucken, ob ich da sehr grobe Schnitzer drin habe und eventuell meinen Speicher gleich wieder schrotte.
                c3f6ed6b-2a06-4cd6-9961-d7a77b592e1e-image.jpeg
                aa557486-29ea-4134-851d-d1796aab3f24-image.jpeg
                Hier nochmal der Blockly Export:

                <xml xmlns="https://developers.google.com/blockly/xml">
                 <variables>
                   <variable id="O}e3|VjTzH+.dHc-BE_:">output_begin</variable>
                   <variable id="Pmn^Rfs2`%vXob$!J=UX">input_begin</variable>
                   <variable id="C3%p`nQ`AJ8yklMQKidv">input_max</variable>
                   <variable id="8]~yHC.tW6]*GfkCbq)^">output_max</variable>
                   <variable id="u8CL)Wex?DocZ58y(/n*">output</variable>
                   <variable id="s3oTgk^d]QTYtWfpyOk6">input</variable>
                 </variables>
                 <block type="comment" id="aB?G:5$JZsZVN]k[FMf$" x="2623" y="-1423">
                   <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_begin</field>
                       <value name="VALUE">
                         <block type="math_number" id="Cd-LtKS?ZQR;3fE)1OfR">
                           <field name="NUM">10</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_begin</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">input_max</field>
                               <value name="VALUE">
                                 <block type="math_number" id="[h?+?1Bkt{sL]3tL~hWI">
                                   <field name="NUM">-2400</field>
                                 </block>
                               </value>
                               <next>
                                 <block type="variables_set" id="C7WP.yVY.~yLboTO)--M">
                                   <field name="VAR" id="8]~yHC.tW6]*GfkCbq)^">output_max</field>
                                   <value name="VALUE">
                                     <block type="math_number" id="!o~v`/:*+;(]p]{H?WTA">
                                       <field name="NUM">800</field>
                                     </block>
                                   </value>
                                   <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">smartmeter.0.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 gerundet auf 10W</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="?3ziYdvoAKuW!gQYp^H.">
                                                   <field name="OP">MULTIPLY</field>
                                                   <value name="A">
                                                     <shadow type="math_number" id="T~+opyPvwKX*Zt1YR;As">
                                                       <field name="NUM">1</field>
                                                     </shadow>
                                                     <block type="math_round" id=":`a3!T.9(}B/lJ^.KS(/">
                                                       <field name="OP">ROUND</field>
                                                       <value name="NUM">
                                                         <shadow type="math_number" id="g;oroW(D?cU31.`9~.1}">
                                                           <field name="NUM">3.1</field>
                                                         </shadow>
                                                         <block type="math_arithmetic" id="Au]!Mvid69-ThMTm]V96">
                                                           <field name="OP">DIVIDE</field>
                                                           <value name="A">
                                                             <shadow type="math_number" id="W.WcvG;|rSc%%(.T_W^c">
                                                               <field name="NUM">1</field>
                                                             </shadow>
                                                             <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_begin</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">0_userdata.0.zendure.SF2400ACplus.properties.outputHomePower</field>
                                                                 </block>
                                                               </value>
                                                             </block>
                                                           </value>
                                                           <value name="B">
                                                             <shadow type="math_number" id="GKj`)SUe,1zDzP~O_ZAs">
                                                               <field name="NUM">10</field>
                                                             </shadow>
                                                           </value>
                                                         </block>
                                                       </value>
                                                     </block>
                                                   </value>
                                                   <value name="B">
                                                     <shadow type="math_number" id="o{icAU.bf$`.qo0uY?nQ">
                                                       <field name="NUM">10</field>
                                                     </shadow>
                                                   </value>
                                                 </block>
                                               </value>
                                               <next>
                                                 <block type="comment" id="jfTMAZ*=]Yc9N:)Y_sD1">
                                                   <field name="COMMENT">Setzen der Eingangsleistung gerundet auf 10W</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="|CDI19aH]0wqD@rhgZk%">
                                                           <field name="OP">MULTIPLY</field>
                                                           <value name="A">
                                                             <shadow type="math_number" id="T~+opyPvwKX*Zt1YR;As">
                                                               <field name="NUM">1</field>
                                                             </shadow>
                                                             <block type="math_round" id="Ds#SgQMlU@LRBB?1[uU:">
                                                               <field name="OP">ROUND</field>
                                                               <value name="NUM">
                                                                 <shadow type="math_number" id="g;oroW(D?cU31.`9~.1}">
                                                                   <field name="NUM">3.1</field>
                                                                 </shadow>
                                                                 <block type="math_arithmetic" id="Xg=2?pCZa`_D@Ag3f+c)">
                                                                   <field name="OP">DIVIDE</field>
                                                                   <value name="A">
                                                                     <shadow type="math_number" id="W.WcvG;|rSc%%(.T_W^c">
                                                                       <field name="NUM">1</field>
                                                                     </shadow>
                                                                     <block type="math_arithmetic" id="~LBc9fG5Z6lJd12/)jT4">
                                                                       <field name="OP">MINUS</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="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="$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_begin</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">0_userdata.0.zendure.SF2400ACplus.properties.gridInputPower</field>
                                                                         </block>
                                                                       </value>
                                                                     </block>
                                                                   </value>
                                                                   <value name="B">
                                                                     <shadow type="math_number" id="+|]eEGPOjRvjdi)O;j]y">
                                                                       <field name="NUM">10</field>
                                                                     </shadow>
                                                                   </value>
                                                                 </block>
                                                               </value>
                                                             </block>
                                                           </value>
                                                           <value name="B">
                                                             <shadow type="math_number" id="2._8#L!KFobGGgkB!Y$A">
                                                               <field name="NUM">10</field>
                                                             </shadow>
                                                           </value>
                                                         </block>
                                                       </value>
                                                       <next>
                                                         <block type="controls_if" id="9{oE^c13a:31;2ut.DI$">
                                                           <mutation elseif="1" else="1"></mutation>
                                                           <value name="IF0">
                                                             <block type="logic_multi_and" id="K5vL6-k@2[o9(|E4`OqX">
                                                               <mutation xmlns="http://www.w3.org/1999/xhtml" items="2"></mutation>
                                                               <value name="AND0">
                                                                 <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="AND1">
                                                                 <block type="logic_compare" id="sxUAjFcy(N6Q59Byrc{5">
                                                                   <field name="OP">EQ</field>
                                                                   <value name="A">
                                                                     <block type="get_value" id=")?$qjl;c)((g)x%;f*1[">
                                                                       <field name="ATTR">val</field>
                                                                       <field name="OID">0_userdata.0.Speicher.Freigabe_Entladen</field>
                                                                     </block>
                                                                   </value>
                                                                   <value name="B">
                                                                     <block type="logic_boolean" id="W=F.#*.dh40F`d:.:9vl">
                                                                       <field name="BOOL">TRUE</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="B:~%LC[49c%qUwqiFyn3">
                                                                   <value name="IF0">
                                                                     <block type="logic_compare" id="kKJQjQ5XgbxE0lQ_s|)l">
                                                                       <field name="OP">GT</field>
                                                                       <value name="A">
                                                                         <block type="variables_get" id="G0e{06Hc]}TIX=S*];CK">
                                                                           <field name="VAR" id="u8CL)Wex?DocZ58y(/n*">output</field>
                                                                         </block>
                                                                       </value>
                                                                       <value name="B">
                                                                         <block type="variables_get" id="xu)L*d2Wlj7Tdp_x(?cE">
                                                                           <field name="VAR" id="8]~yHC.tW6]*GfkCbq)^">output_max</field>
                                                                         </block>
                                                                       </value>
                                                                     </block>
                                                                   </value>
                                                                   <statement name="DO0">
                                                                     <block type="variables_set" id="[)g-c]$Cv{gB|ilO-vQ;">
                                                                       <field name="VAR" id="u8CL)Wex?DocZ58y(/n*">output</field>
                                                                       <value name="VALUE">
                                                                         <block type="variables_get" id=":wgQ{EmOcWnjF?+Li*l]">
                                                                           <field name="VAR" id="8]~yHC.tW6]*GfkCbq)^">output_max</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">0_userdata.0.zendure.SF2400ACplus.control.auto_in_out_Limit</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>
                                                                     </block>
                                                                   </next>
                                                                 </block>
                                                               </next>
                                                             </block>
                                                           </statement>
                                                           <value name="IF1">
                                                             <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">08:00</field>
                                                                     </shadow>
                                                                   </value>
                                                                   <value name="END_TIME">
                                                                     <shadow type="text" id="KO`i!C([`f|6juoQ~d-d">
                                                                       <field name="TEXT">21:00</field>
                                                                     </shadow>
                                                                   </value>
                                                                 </block>
                                                               </value>
                                                               <value name="AND1">
                                                                 <block type="logic_compare" id="=;k+]!:`FgPIl(ffM)0z">
                                                                   <field name="OP">EQ</field>
                                                                   <value name="A">
                                                                     <block type="get_value" id="o55n7*4D=LYnb:P_11Mb">
                                                                       <field name="ATTR">val</field>
                                                                       <field name="OID">0_userdata.0.Speicher.Freigabe_Laden</field>
                                                                     </block>
                                                                   </value>
                                                                   <value name="B">
                                                                     <block type="logic_boolean" id="TR/7]h/Wr4=[w}2,:/d|">
                                                                       <field name="BOOL">TRUE</field>
                                                                     </block>
                                                                   </value>
                                                                 </block>
                                                               </value>
                                                               <value name="AND2">
                                                                 <block type="logic_compare" id="BdTZijA^#anVn3j{PwI*">
                                                                   <field name="OP">LT</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="DO1">
                                                             <block type="comment" id="zC5_szd6=wy}Q*]%d_Rb">
                                                               <field name="COMMENT">Laden</field>
                                                               <next>
                                                                 <block type="controls_if" id="pW$^ccLu1b}%C$y8h#iQ">
                                                                   <value name="IF0">
                                                                     <block type="logic_compare" id="?y|QF}?u)ssQqx^b-mF1">
                                                                       <field name="OP">LT</field>
                                                                       <value name="A">
                                                                         <block type="variables_get" id="I=IU!qT3iBK7EY~n[$Sj">
                                                                           <field name="VAR" id="s3oTgk^d]QTYtWfpyOk6">input</field>
                                                                         </block>
                                                                       </value>
                                                                       <value name="B">
                                                                         <block type="variables_get" id="G@NF62dM(QOk8r3y4(XE">
                                                                           <field name="VAR" id="C3%p`nQ`AJ8yklMQKidv">input_max</field>
                                                                         </block>
                                                                       </value>
                                                                     </block>
                                                                   </value>
                                                                   <statement name="DO0">
                                                                     <block type="variables_set" id="u@~xzq/wsLZ[`Ui~asm?">
                                                                       <field name="VAR" id="s3oTgk^d]QTYtWfpyOk6">input</field>
                                                                       <value name="VALUE">
                                                                         <block type="variables_get" id="Q{5~Zs$rGZLl_M}vfjA0">
                                                                           <field name="VAR" id="C3%p`nQ`AJ8yklMQKidv">input_max</field>
                                                                         </block>
                                                                       </value>
                                                                     </block>
                                                                   </statement>
                                                                   <next>
                                                                     <block type="control" id=";512Sny^l9[8H~)*$JIi">
                                                                       <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                                       <field name="OID">0_userdata.0.zendure.SF2400ACplus.control.auto_in_out_Limit</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>
                                                                     </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="control" id="Qhy=K`*Kim%|cM0RX[fs">
                                                                   <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                                   <field name="OID">0_userdata.0.zendure.SF2400ACplus.control.auto_in_out_Limit</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>
                                                                 </block>
                                                               </next>
                                                             </block>
                                                           </statement>
                                                           <next>
                                                             <block type="comment" id="*!ut{wn)jWUE5I$r}%,8">
                                                               <field name="COMMENT">Nachladen erst ab 95%</field>
                                                               <next>
                                                                 <block type="controls_if" id="rgq4u/kHcr:PfHb_DBA:">
                                                                   <mutation elseif="1"></mutation>
                                                                   <value name="IF0">
                                                                     <block type="logic_compare" id="ZB8B=/iNM1_y$zz;NUTs">
                                                                       <field name="OP">EQ</field>
                                                                       <value name="A">
                                                                         <block type="get_value" id="5IP8.FO(t!H?3dC(}QV;">
                                                                           <field name="ATTR">val</field>
                                                                           <field name="OID">0_userdata.0.zendure.SF2400ACplus.packData.JO2AEP3P1000431.socLevel</field>
                                                                         </block>
                                                                       </value>
                                                                       <value name="B">
                                                                         <block type="math_number" id="8RkLiOoN`{M92y!.dUGb">
                                                                           <field name="NUM">100</field>
                                                                         </block>
                                                                       </value>
                                                                     </block>
                                                                   </value>
                                                                   <statement name="DO0">
                                                                     <block type="update" id="mVuLG3Ds7%,MbrHy5UOb">
                                                                       <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                                       <field name="OID">0_userdata.0.Speicher.Freigabe_Laden</field>
                                                                       <field name="WITH_DELAY">FALSE</field>
                                                                       <value name="VALUE">
                                                                         <block type="logic_boolean" id="PoVJSVCu-x/P:.6osIO#">
                                                                           <field name="BOOL">FALSE</field>
                                                                         </block>
                                                                       </value>
                                                                     </block>
                                                                   </statement>
                                                                   <value name="IF1">
                                                                     <block type="logic_compare" id="8QX+DTlWn)^zgK_ZG,F!">
                                                                       <field name="OP">GT</field>
                                                                       <value name="A">
                                                                         <block type="get_value" id="?p9@Lnln2Hg)S39BcqM9">
                                                                           <field name="ATTR">val</field>
                                                                           <field name="OID">0_userdata.0.zendure.SF2400ACplus.packData.JO2AEP3P1000431.socLevel</field>
                                                                         </block>
                                                                       </value>
                                                                       <value name="B">
                                                                         <block type="math_number" id="^wP6)i)NRE|eA0g0Y~ve">
                                                                           <field name="NUM">95</field>
                                                                         </block>
                                                                       </value>
                                                                     </block>
                                                                   </value>
                                                                   <statement name="DO1">
                                                                     <block type="update" id="2%~gHm:@+OHGiV8mf$CI">
                                                                       <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                                       <field name="OID">0_userdata.0.Speicher.Freigabe_Laden</field>
                                                                       <field name="WITH_DELAY">FALSE</field>
                                                                       <value name="VALUE">
                                                                         <block type="logic_boolean" id="t-?IPhL9,4cnWLje#`C5">
                                                                           <field name="BOOL">TRUE</field>
                                                                         </block>
                                                                       </value>
                                                                     </block>
                                                                   </statement>
                                                                   <next>
                                                                     <block type="comment" id="]oDC2Cd9J`v{Y[I+tG;o">
                                                                       <field name="COMMENT">Entladen erst wieder ab 20%</field>
                                                                       <next>
                                                                         <block type="controls_if" id="_Fd4hlB3UPh_oTC{]6dV">
                                                                           <mutation elseif="1"></mutation>
                                                                           <value name="IF0">
                                                                             <block type="logic_compare" id="sA~y{~84I)V|J|7xWe(%">
                                                                               <field name="OP">LTE</field>
                                                                               <value name="A">
                                                                                 <block type="get_value" id="6[ucT_hz[NTZgoy-SIdR">
                                                                                   <field name="ATTR">val</field>
                                                                                   <field name="OID">0_userdata.0.zendure.SF2400ACplus.packData.JO2AEP3P1000431.socLevel</field>
                                                                                 </block>
                                                                               </value>
                                                                               <value name="B">
                                                                                 <block type="math_number" id=")o5Y(o]iP%B!hOn;p`K6">
                                                                                   <field name="NUM">10</field>
                                                                                 </block>
                                                                               </value>
                                                                             </block>
                                                                           </value>
                                                                           <statement name="DO0">
                                                                             <block type="update" id="0b?O!3MR{aU.JuE:?FpD">
                                                                               <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                                               <field name="OID">0_userdata.0.Speicher.Freigabe_Entladen</field>
                                                                               <field name="WITH_DELAY">FALSE</field>
                                                                               <value name="VALUE">
                                                                                 <block type="logic_boolean" id="@}S3a?-mx{zdDBfYX#P*">
                                                                                   <field name="BOOL">FALSE</field>
                                                                                 </block>
                                                                               </value>
                                                                             </block>
                                                                           </statement>
                                                                           <value name="IF1">
                                                                             <block type="logic_compare" id="MTmDqOiFGjuGqhi]eH*}">
                                                                               <field name="OP">GTE</field>
                                                                               <value name="A">
                                                                                 <block type="get_value" id="O%`;}8-bee3|f3(.g*FA">
                                                                                   <field name="ATTR">val</field>
                                                                                   <field name="OID">0_userdata.0.zendure.SF2400ACplus.packData.JO2AEP3P1000431.socLevel</field>
                                                                                 </block>
                                                                               </value>
                                                                               <value name="B">
                                                                                 <block type="math_number" id="%Sa-Ne`]Q=59iD+^jjPj">
                                                                                   <field name="NUM">20</field>
                                                                                 </block>
                                                                               </value>
                                                                             </block>
                                                                           </value>
                                                                           <statement name="DO1">
                                                                             <block type="update" id="PXUYyV6*ojZ$w{pi$m/k">
                                                                               <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                                               <field name="OID">0_userdata.0.Speicher.Freigabe_Entladen</field>
                                                                               <field name="WITH_DELAY">FALSE</field>
                                                                               <value name="VALUE">
                                                                                 <block type="logic_boolean" id="Gf*.C1.8xOYjW:C4,1z3">
                                                                                   <field name="BOOL">TRUE</field>
                                                                                 </block>
                                                                               </value>
                                                                             </block>
                                                                           </statement>
                                                                         </block>
                                                                       </next>
                                                                     </block>
                                                                   </next>
                                                                 </block>
                                                               </next>
                                                             </block>
                                                           </next>
                                                         </block>
                                                       </next>
                                                     </block>
                                                   </next>
                                                 </block>
                                               </next>
                                             </block>
                                           </next>
                                         </block>
                                       </statement>
                                     </block>
                                   </next>
                                 </block>
                               </next>
                             </block>
                           </next>
                         </block>
                       </next>
                     </block>
                   </next>
                 </block>
                </xml>
                


                Mein Hauszähler wird alle 10 Sekunden per IR-Lesekopf abgefragt, somit werden die Werte dann in diesem Rhythmus erneuert.
                Das Laden soll bei 100% beendet werden und frühstens wieder bei 95% starten. Ebenso das Entladen, Stopp bei 10% und frühster Start wieder bei 20%.

                Das Laden hat schonmal geklappt, ich werde das weiter beobachten.
                Falls ich da noch Denkfehler drin habe, würde ich mich über Aufklärung freuen.

                Nochmals danke für diesen tollen Adapter Ersatz!
                Leider gibt es noch nicht viele Vorlagen, die darauf aufbauen.

                EDIT: Beim Nachladen ab 95% muss es natürlch < 95 heißen.

                maxclaudiM 1 Antwort Letzte Antwort
                0
                • maxclaudiM maxclaudi

                  NEU
                  Zendure-Geräte Webserver: Steuerung über das zenSDK (HTTP)
                  2026.05.02_00.39h für das ioBroker-Forum; Update 24.05.26 00:15h globale Typsicherung
                  update axios 21.06.26 00:10h. Danke paul53 für die Idee und das Mitwirken.

                  Update 22.06.26 20:00h zenSDK API 3
                  API 2 funktioniert weiterhin.
                  Bitte Beschreibung im Script beachten.

                  In memory of Daisy 02.05.24 – miss you.

                  Viel Spaß!


                  // ioBroker JavaScript: Zendure zenSDK Adapter-Ersatz für ein Zendure-Gerät.
                  // Für alle Geräte ab 2025/2026, die zenSDK unterstützen, wie z. B.:
                  // SF800, SF800 PLUS, 800Pro (2), 1600AC, SF2400AC(+) usw.
                  // (c) maxclaudi 2026.05.02_00.39h für das ioBroker-Forum; update 24.05.26 00:15h globale Typsicherung.
                  // update axios 21.06.26 00:10h. Danke paul53 für die Idee und das Mitwirken.																			  
                  // update 22.06.26 20:00h API3 und API2 Unterstützung.
                  // 
                  // In memory of Daisy 02.05.24 – miss you.
                  //
                  //
                  // ACHTUNG: "socCompSwitch" ist neu und nur in API 3 verfügbar.
                  // API2 unterstützt NICHT socCompSwitch und auch nicht den control Datenpunkt "set socComp".
                  // Control: set socComp ist rein experimentell und nur zum testen. Tests und Benutzen auf eigenes Risiko und eigene Gefahr!
                  //
                  // 
                  // EIN WORT IN EIGENER SACHE:
                  // Dieses Skript basiert auf vielen Stunden Hardware-Tests und Analysen (besonders zum Flash-Schutz).
                  // In der Vergangenheit wurden meine Erkenntnisse oft ohne Erwähnung in andere Projekte übernommen.
                  // Ich teile diesen Code gerne. Wer diese Logik in öffentliche Adapter integriert, ist herzlich 
                  // eingeladen – ich bitte jedoch um die Fairness, die Quelle zu nennen. 
                  // Das ist der "Lohn" für meine Zeit und Forschung.
                  //----------------------------------------------------------------------------------------------------
                  //----------------------------------------------------------------------------------------------------
                  // Konfiguration
                  //
                  // Hinweis bei mehreren Zendure-Geräten:
                  //   -> Für jedes Gerät ein eigenes Skript mit individueller Konfiguration verwenden!
                  //   -> IP-Adresse anpassen.
                  //   -> maxInputLimit / maxOutputLimit (abhängig vom Gerätetyp) einstellen.
                  //   -> Intervall: getIntervalMs = 5000 ms (Standard). 
                  //      Bei Verbindungsproblemen oder WLAN-Lags wird ein Wert von mindestens 8000 ms empfohlen.
                  //
                  // Empfehlung zur Geräteanzahl:
                  //   • Bis zu 3 Geräte: völlig unkritisch.
                  //   • 4 Geräte: problemlos möglich.
                  //   • Mehr als 4 Geräte: nicht empfohlen. Aber abhängig von Systemleistung und Intervall prüfen.
                  //
                  // Das offizielle MQTT ist mit einer Aktualisierungsrate von bis zu 90 Sek. zu langsam.
                  // Ich empfehle die Nutzung des zenSDK.
                  // Hinweis: Das (De-)Aktivieren von MQTT sowie die MQTT-Verbindungsüberwachung werden nicht unterstützt.
                  //
                  // Damit neue Datenpunkte automatisch aus dem JSON erstellt werden können:
                  // -> Instanzen -> JavaScript-Adapter -> Allgemeine Einstellungen -> "Kommando 'setObject' erlauben" aktivieren!
                  //
                  // Bei kurzem Abfrageintervall:
                  // -> Instanzen -> JavaScript-Adapter -> Allgemeine Einstellungen -> 
                  //    "Maximale setState-Anfragen pro Minute pro Skript" auf 5000 erhöhen.
                  //    (Testweise reicht ein geringerer Wert wie 2000; das Skript wurde optimiert).
                  //
                  // Datenpunkte im Ordner "control" werden automatisch aktualisiert.
                  //----------------------------------------------------------------------------------------------------
                  //----------------------------------------------------------------------------------------------------
                  // CONFIG
                  //----------------------------------------------------------------------------------------------------
                   
                  // IP Zendure Gerät
                  //Beispiel: const IP = "192.168.40.20";
                  const IP = "192.168.40.20";  // IP des Zendure Geräts
                  // Bitte sicherstellen:
                  // richtige IP verwendet?
                  // Im Router dem Zendure-Gerät eine feste, dauerhafte IP zuweisen!
                   
                  //maximum inputLimit -> Maximal mögliche (unterstützte) Ladeleistung des Zendure-Geräts 
                  //Beispiele: SF800 800W / SF800 PRO: 1000W / 1600AC: 1600 / SF2400AC: 2400W
                  const maxInputLimit = 1600;
                   
                  //maximum outputLimit -> Maximal möglich (unterstützte) Entladeleistung des Zendure-Geräts
                  //Beispiele: SF800 800W / SF800 PRO: 800W / 1600AC: 1600 / SF2400AC: 2400W
                  const maxOutputLimit = 1600;
                   
                  // Haupt-Verzeichnis für das Zendure-Gerät
                  // Der Name für das Hauptverzeichnis kann frei gewählt werden.
                  // Muss aber bei mehreren Skripten und Zendure-Geräte unterschiedlich sein.
                  // Beispiel für "1600plus_01":
                  // const folderZendureApi = '0_userdata.0.zendure.' + "1600ACplus_01";
                  const folderZendureApi = '0_userdata.0.zendure.' + "zenSDK_01";
                  
                   
                  // Timout Handler HTTP GET /POST
                  // Wichtig:
                  // getTimeoutMs < getIntervalMs
                  // postTimeoutMs < getIntervalMs
                  // Bei instabiler Verbindung ggf. erhöhen (z. B. 3000–5000 ms).
                  const getTimeoutMs = 1500;  // Empfehlung: 2000 ms.
                  const postTimeoutMs = 1500; // Empfehlung: 2000 ms.
                   
                  // GET intervall
                  // Empfehlung: >= 5000 ms.
                  // Kleinere Werte möglich, aber m. M. nach sinnfrei und nicht empfohlen (Last / Stabilität).
                  const getIntervalMs = 5000; // Intervall für GET 5000ms. Bei Problemen erhöhen. NICHT < 5000!
                   
                  //----------------------------------------------------------------------------------------------------
                  // END CONFIG
                  //----------------------------------------------------------------------------------------------------
                   
                  let rxNewRam = "";
                  let rxOldRam = "";
                  let rxDiffRam = "";
                  let txRam = "";
                   
                  const dpSmartRAM = folderZendureApi + ".control.automaticKonfig.input_output_LimitMode_smartMode_RAM";
                  const dpSmartWatcher = folderZendureApi + ".control.automaticKonfig.smartModeWatcher";
                   
                  // helper
                  function getRxNew() { return rxNewRam; }
                  function setRxNew(val) {
                      rxNewRam = val;
                  }
                   
                  function getRxOld() { return rxOldRam; }
                  function setRxOld(val) {
                      rxOldRam = val;
                  }
                   
                  function getRxDiff() { return rxDiffRam; }
                  function setRxDiff(val) {
                      rxDiffRam = val;
                  }
                   
                  function setTx(val) {
                      txRam = val;
                  }
                  
                  const axios = require('axios'); 
                  const postCooldownMs = 2000;
                  const batchWindowMs = 300;
                   
                  let postActive = false;
                  let postQueue = {};
                  let batchTimer = null;
                  let getTimer = null;
                   
                  let retryCount = 0; 
                  const maxRetries = 2; 
                  let getErrorCount = 0; 
                  let SN = '';
                   
                  // Struktur sicherstellen
                  setTimeout(() => {
                      ensureStructure();
                  }, 100);
                   
                  function ensureStructure() {
                      const folders = [
                          folderZendureApi,
                          folderZendureApi + ".properties",
                          folderZendureApi + ".packData",
                          folderZendureApi + ".control",
                          folderZendureApi + ".control.automaticKonfig"
                      ];
                      folders.forEach(path => {
                          if (!existsObject(path)) {
                              setObject(path, {
                                  type: "folder",
                                  common: { name: path.split(".").pop() },
                                  native: {}
                              });
                          }
                      });
                      if (!existsState(dpSmartRAM)) {
                          createState(dpSmartRAM, false, { name: "Input/Output Limit Mode SmartMode RAM", type: "boolean", role: "switch", read: true, write: true });
                      }
                      if (!existsState(dpSmartWatcher)) {
                          createState(dpSmartWatcher, false, { name: "Smart Mode Watcher", type: "boolean", role: "switch", read: true, write: true });
                      }
                  	if (existsState(dpSmartRAM)) setState(dpSmartRAM, false, true);
                  	if (existsState(dpSmartWatcher)) setState(dpSmartWatcher, false, true);
                  }
                   
                  // Control
                  const schemaControl = {
                  	acMode: {
                          name: "set acMode; 1: input charge, 2: output discharge",
                          role: "level",
                          type: "number",
                          write: true,
                  		def: 1,
                          min: 1,
                          max: 2,
                          apiKey: "acMode",
                      },
                   
                  	chargeMaxLimit: {
                          name: "set Charge Max Limit",
                          unit: "W",
                          role: "level",
                          type: "number",
                          write: true,
                  		def: maxInputLimit,
                          min: 0,
                          max: maxInputLimit,
                          apiKey: "chargeMaxLimit",
                      },
                   
                  	gridOffMode: {
                          name: "set gridOffMode; 0: Normal mode, 1: Economic mode, 2: OFF",
                          role: "level",
                          type: "number",
                          write: true,
                  		def: 2,
                          min: 0,
                          max: 2,
                          apiKey: "gridOffMode",
                      },
                   
                  	gridReverse: {
                          name: "set gridReverse; 0: Disabled, 1: Allowed reverse flow, 2: Forbidden reverse flow",
                          role: "level",
                          type: "number",
                          write: true,
                  		def: 0,
                          min: 0,
                          max: 2,
                          apiKey: "gridReverse",
                      },
                   
                  	gridStandard: {
                          name: "set gridStandard; 0: Germany 1: France 2: Austria 3: Switzerland 4: Netherlands 5: Spain 6: Belgium 7: Greece 8: Denmark 9: Italy",
                          role: "level",
                          type: "number",
                          write: true,
                  		def: 0,
                          min: 0,
                          max: 9,
                          apiKey: "gridStandard",
                      },
                   
                  	inputLimit: {
                          name: "set inputLimit",
                          unit: "W",
                          role: "level",
                          type: "number",
                          write: true,
                  		def: 0,
                          min: 0,
                          max: maxInputLimit,
                          apiKey: "inputLimit",
                      },
                   
                  	inverseMaxPower: {
                          name: "set inverseMaxPower; Max inverter output Power Limit",
                          unit: "W",
                          role: "level",
                          type: "number",
                          write: true,
                  		def: maxOutputLimit,
                          min: 200,
                          max: maxOutputLimit,
                  		step: 100,
                          apiKey: "inverseMaxPower",
                      },
                   
                  	minSoc: {
                          name: "set minSoc; minimum SOC 0-50",
                          unit: "%",
                          role: "level",
                          type: "number",
                          write: true,
                  		def: 10,
                          min: 0,
                          max: 50,
                          apiKey: "minSoc",
                          transformWrite: (val) => val * 10
                      },
                   
                  	outputLimit: {
                          name: "set outputLimit",
                          unit: "W",
                          role: "level",
                          type: "number",
                          write: true,
                  		def: 0,
                          min: 0,
                          max: maxOutputLimit,
                          apiKey: "outputLimit",
                      },
                   
                  	smartMode: {
                          name: "set smartMode; parameter are written to: 1: RAM / 0: Flash",
                          role: "level",
                          type: "number",
                          write: true,
                  		def: 0,
                          min: 0,
                          max: 1,
                          apiKey: "smartMode",
                      },
                  	
                  	socCompSwitch: {
                          name: "set SoC Comp; Unauthorized modifications are not recommended",
                          role: "level",
                          type: "number",
                          write: true,
                  		def: 0,
                          min: 0,
                          max: 2, //0..1 test 2
                          apiKey: "socCompSwitch"
                      },
                   
                  	socSet: {
                          name: "set socSet; SOC Target 70%-100%",
                          unit: "%",
                          role: "level",
                          type: "number",
                          write: true,
                  		def: 100,
                          min: 70,
                          max: 100,
                          apiKey: "socSet",
                          transformWrite: (val) => val * 10
                      },
                   
                  	lampSwitch: {
                          name: "set lamp switch; 0: lamp off / 1: lamp on",
                          role: "level",
                          type: "number",
                          write: true,
                  		def: 1,
                          min: 0,
                          max: 1,
                          apiKey: "lampSwitch",
                      }
                  };
                   
                  createControlStates();
                   
                  function createControlStates() {
                      const base = folderZendureApi + ".control";
                      Object.keys(schemaControl).forEach(key => {
                          const def = schemaControl[key];
                          const dp = `${base}.${key}`;
                          if (!existsState(dp)) {
                              createState(dp, 0, {
                                  name: def.name, type: def.type, role: def.role, unit: def.unit,
                                  read: true, write: true, def: def.def, min: def.min, max: def.max
                              });
                          }
                      });
                  	
                  	const extraStates = [
                  		{ id: `${base}.auto_inputLimitMode`, name: "Set InputLimit (Automatic)", unit: "W", min: 0, max: maxInputLimit },
                  		{ id: `${base}.auto_outputLimitMode`, name: "Set OutputLimit (Automatic)", unit: "W", min: 0, max: maxOutputLimit },
                  		{ id: `${base}.auto_in_out_Limit`, name: "Set In/Out-Limit-Automatic: Negative: Charging; Positive: Discharging", unit: "W", min: (maxInputLimit * -1), max: maxOutputLimit }
                  	];
                  	extraStates.forEach(def => {
                  		if (!existsState(def.id)) {
                  			createState(def.id, 0, {
                  				name: def.name, type: "number", role: "level", unit: def.unit,
                  				read: true, write: true, min: def.min, max: def.max
                  			});
                  		}
                  	});
                  }
                   
                  on({ id: new RegExp(`^${folderZendureApi}\\.control\\.`), change: "ne" }, obj => {
                      if (obj.state.ack) return;
                      const key = obj.id.split('.').pop();
                      if (key === "auto_inputLimitMode") {
                          let val = Math.round(Number(obj.state.val)) || 0;
                          if (val < 0) val = 0;
                          if (val > maxInputLimit) val = maxInputLimit;
                          handleInputLimitMode(val);
                          setState(obj.id, val, true);
                          return;
                      }
                      if (key === "auto_outputLimitMode") {
                          let val = Math.round(Number(obj.state.val)) || 0;
                          if (val < 0) val = 0;
                          if (val > maxOutputLimit) val = maxOutputLimit;
                          handleOutputLimitMode(val);
                          setState(obj.id, val, true);
                          return;
                      }
                  	if (key === "auto_in_out_Limit") {
                  		let val = Math.round(Number(obj.state.val)) || 0;
                  		if (val > maxOutputLimit) val = maxOutputLimit;
                  		if ((-val) > maxInputLimit) val = -maxInputLimit;
                  		handleAuto_in_out_Limit(val);
                  		setState(obj.id, val, true);
                  		return;
                  	}
                      const def = schemaControl[key];
                      if (!def) return;
                      let val = obj.state.val;
                      if (def.type === "number") {
                          val = Math.round(Number(val)) || 0;
                      }
                      if (def.min !== undefined && val < def.min) val = def.min;
                      if (def.max !== undefined && val > def.max) val = def.max;
                  	let sendVal = val;
                  	if (def.transformWrite) { sendVal = def.transformWrite(val); }
                      sendToDevice(def.apiKey, sendVal);
                      setState(obj.id, val, true);
                  });
                   
                  function sendToDevice(apiKey, value) {
                  	if (!SN || SN === "null" || SN === "") return;
                      const payload = { sn: SN, properties: {} };
                      payload.properties[apiKey] = value;
                      setTx(JSON.stringify(payload));
                      queuePost({ [apiKey]: value });
                  }
                   
                  function queuePost(obj) {
                      Object.assign(postQueue, obj);
                      if (batchTimer) return;
                      batchTimer = setTimeout(() => {
                          batchTimer = null;
                          executePost();
                      }, batchWindowMs);
                  }
                   
                  function executePost() {
                      if (postActive) return;
                      if (Object.keys(postQueue).length === 0) return;
                      postActive = true;
                      stopGetLoop();  
                      const payload = { sn: SN, properties: { ...postQueue } };
                      postQueue = {};
                      setTx(JSON.stringify(payload));
                      axios
                      .post(`http://${IP}/properties/write`, payload, { 
                          timeout: postTimeoutMs, 
                          responseType: "json" 
                      })
                      .then((response) => {
                          const data = response.data;
                          if (data && data.success === true && data.code === 200) {
                              retryCount = 0;
                              finishPost(true);
                          } else {
                              throw new Error("Zendure success/code invalid"); 
                          }
                      })
                      .catch((err) => {
                          retryCount++;
                          if (retryCount <= maxRetries) {
                              log(`POST Retry ${retryCount}/${maxRetries} (${err.message || 'Zendure Error'})`, "warn");
                              setTimeout(() => {
                                  postQueue = { ...payload.properties };
                                  postActive = false;
                                  executePost();
                              }, postCooldownMs);
                              return;
                          }
                          log("POST endgültig fehlgeschlagen", "error");
                          retryCount = 0;
                          finishPost(false);
                      });
                  }
                   
                  function finishPost(success) {
                      if (!success) { syncControlFromProperties(); }
                  	setTimeout(() => { postActive = false; startGetLoop(); }, postCooldownMs);
                  	}
                   
                  function syncControlFromProperties() {
                      const baseCtrl = folderZendureApi + ".control";
                      const baseProp = folderZendureApi + ".properties";
                      Object.keys(schemaControl).forEach(ctrlKey => {
                          const def = schemaControl[ctrlKey];
                          const apiKey = def.apiKey || ctrlKey;
                          const propState = getState(`${baseProp}.${apiKey}`);
                          if (!propState || propState.val === undefined) return;
                          const ctrlId = `${baseCtrl}.${ctrlKey}`;
                  		const ctrlState = getState(ctrlId);
                  		const ctrlVal = ctrlState ? ctrlState.val : undefined;
                          const propVal = propState.val;
                          if (ctrlVal !== propVal) { setState(ctrlId, propVal, true); }
                      });
                      const inputProp = getState(`${baseProp}.inputLimit`)?.val;
                      if (inputProp !== undefined) {
                          const id = `${baseCtrl}.auto_inputLimitMode`;
                          if (getState(id)?.val !== inputProp) {
                              setState(id, inputProp, true);
                          }
                      }
                      const outputProp = getState(`${baseProp}.outputLimit`)?.val;
                      if (outputProp !== undefined) {
                          const id = `${baseCtrl}.auto_outputLimitMode`;
                          if (getState(id)?.val !== outputProp) {
                              setState(id, outputProp, true);
                          }
                      }
                  	const acModeProp = getState(`${baseProp}.acMode`)?.val;
                      if (acModeProp !== undefined && outputProp !== undefined && inputProp !== undefined) {
                          const id = `${baseCtrl}.auto_in_out_Limit`;
                  		if (getState(id)?.val !== outputProp && acModeProp === 2) {
                              setState(id, outputProp, true);
                          }
                  		if (getState(id)?.val !== inputProp * -1 && acModeProp === 1) {
                              setState(id, inputProp * -1, true);
                          }
                      }
                  }
                   
                  function startGetLoop() {
                      if (getTimer) { clearInterval(getTimer); }
                      getTimer = setInterval(() => {
                          if (postActive) return;
                          const url = `http://${IP}/properties/report`;
                          axios
                          .get(url, { timeout: getTimeoutMs, responseType: 'text' })
                          .then(function (response) {
                              if (getErrorCount > 0) log("Verbindung wieder OK", "info");
                              getErrorCount = 0;
                              if (!response.data) return;
                              setRxNew(response.data);
                              handleRxNewUpdate(response.data);
                          })
                          .catch(function (err) {
                              const errorMsg = err.response ? err.response.status : err.message;
                              getErrorCount++;
                              if (getErrorCount <= 3) log(`GET Fehler (${getErrorCount}): ${errorMsg}`, "info");
                              if (getErrorCount === 4) log("Keine Verbindung möglich. Zendure-Geräte IP prüfen!", "error");
                          });
                      }, getIntervalMs);
                  }
                   
                  function stopGetLoop() { if (getTimer) { clearInterval(getTimer); getTimer = null; } }
                   
                  function handleInputLimitMode(val) {
                      const currentAcMode = getState(folderZendureApi + ".properties.acMode")?.val;
                      const currentOutput = getState(folderZendureApi + ".properties.outputLimit")?.val;
                  	const currentSmartMode = getState(folderZendureApi + ".properties.smartMode")?.val;
                      const smartRAMActive = getState(dpSmartRAM)?.val;
                      const payload = {};
                      if (currentAcMode !== 1) payload.acMode = 1;
                      if (currentOutput !== 0) payload.outputLimit = 0;
                  	if (smartRAMActive === true && currentSmartMode !== 1) payload.smartMode = 1; 
                      payload.inputLimit = val;
                      sendBatch(payload);
                  }
                   
                  function handleOutputLimitMode(val) {
                      const currentAcMode = getState(folderZendureApi + ".properties.acMode")?.val;
                      const currentInput = getState(folderZendureApi + ".properties.inputLimit")?.val;
                  	const currentSmartMode = getState(folderZendureApi + ".properties.smartMode")?.val;
                      const smartRAMActive = getState(dpSmartRAM)?.val;
                      const payload = {};
                      if (currentAcMode !== 2) payload.acMode = 2;
                      if (currentInput !== 0) payload.inputLimit = 0;
                  	if (smartRAMActive === true && currentSmartMode !== 1) payload.smartMode = 1;
                      payload.outputLimit = val;
                      sendBatch(payload);
                  }
                  									 
                  function handleAuto_in_out_Limit(val) {
                      const currentAcMode = getState(folderZendureApi + ".properties.acMode")?.val;
                      const currentInput = getState(folderZendureApi + ".properties.inputLimit")?.val;
                  	const currentOutput = getState(folderZendureApi + ".properties.outputLimit")?.val;
                  	const currentSmartMode = getState(folderZendureApi + ".properties.smartMode")?.val;
                      const smartRAMActive = getState(dpSmartRAM)?.val;
                      const payload = {};
                  	if (val === 0) {
                  		if (currentInput !== 0) payload.inputLimit = 0;
                  		if (currentOutput !== 0) payload.outputLimit = 0;	
                  	}
                  	if (val > 0) {
                  		if (currentInput !== 0) payload.inputLimit = 0;
                  		if (currentAcMode !== 2) payload.acMode = 2;
                  		payload.outputLimit = val;	
                  	}
                  	if (val < 0) {
                  		if (currentOutput !== 0) payload.outputLimit = 0;
                  		if (currentAcMode !== 1) payload.acMode = 1;
                  		payload.inputLimit = val * -1;	
                  	}
                  	if (smartRAMActive === true && currentSmartMode !== 1) payload.smartMode = 1;
                      sendBatch(payload);
                  }
                   
                  function sendBatch(properties) {
                      if (!SN || SN === "null" || SN === "") return;
                      const payload = { sn: SN, properties: properties };
                      setTx(JSON.stringify(payload)); 
                  	queuePost(properties); 
                  }
                   
                  const schema = {
                      properties: {
                          BatVolt: {
                              name: "BatVolt - Average Battery Voltage of all Batteries",
                              unit: "V",
                              role: "value.voltage",
                              type: "number"
                          },
                  		Fanmode: {
                              name: "Fanmode - 0: Fan off, 1: Fan on. / Unauthorized modification is not recommended.",
                              role: "value",
                              type: "number"
                          },	
                  		Fanspeed: {
                              name: "Fanspeed - 0: Auto, 1: 1st gear, 2: 2nd gear / Unauthorized modification is not recommended.",
                              role: "value",
                              type: "number"
                          },
                  		acMode: {
                              name: "acMode - 1: input charge / 2: output discharge",
                              role: "value",
                              type: "number"
                          },
                  		acStatus: {
                              name: "AC state; 0: idle, 1: AC Flow out, 2: AC Flow in",
                              role: "value",
                              type: "number"
                          },
                  		batCalTime: {
                              name: "batCalTime - Battery Calibration Time. Unauthorized modifications are not recommended",
                  			unit: "min",
                              role: "value",
                              type: "number"
                          },
                  		chargeMaxLimit: {
                              name: "chargeMaxLimit - Max charge power",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		dataReady: {
                              name: "Data ready flag - 0: Data not ready, 1: Data ready",
                              role: "value",
                              type: "number"
                          },
                  		dcStatus: {
                              name: "DC State; 0: idle, 1: DC Flow out, 2: DC Flow in",
                              role: "value",
                              type: "number"
                          },
                  		electricLevel: {
                              name: "electricLevel - Average SOC of all Batterys",
                              unit: "%",
                              role: "value.battery",
                              type: "number"
                          },
                  		gridInputPower: {
                              name: "gridInputPower - Grid Input Power to Battery",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		gridOffMode: {
                              name: "gridOffMode - 0: Normal mode, 1: Economic mode, 2: OFF",
                              role: "value",
                              type: "number"
                          },
                  		gridOffPower: {
                              name: "gridOffPower - Off-grid power",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		gridReverse: {
                              name: "gridReverse - 0: Disabled, 1: Allowed reverse flow, 2: Forbidden reverse flow",
                              role: "value",
                              type: "number"
                          },
                  		gridStandard: {
                              name: "gridStandard - 0: Germany 1: France 2: Austria 3: Switzerland 4: Netherlands 5: Spain 6: Belgium 7: Greece 8: Denmark 9: Italy",
                              role: "value",
                              type: "number"
                          },
                  		gridState: {
                              name: "gridState - Grid connection state, 0: Not connected, 1: Connected",
                              role: "value",
                              type: "number"
                          },
                  		heatState: {
                              name: "heatState - Battery Heat State, 0: Not heating, 1: heating",
                              role: "value",
                              type: "number"
                          },
                  		hyperTmp: {
                              name: "Temperature (Zendure-Device)",
                              unit: "°C",
                              role: "value.temperature",
                              type: "number"
                          },
                  		inputLimit: {
                              name: "inputLimit - AC charging power limit to Battery",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		inverseMaxPower: {
                              name: "inverseMaxPower - Max inverter output Power Limit",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		lampSwitch: {
                              name: "lampSwitch - Lamp state, 0: lamp off / 1: lamp on",
                              role: "value",
                              type: "number"
                          },
                  		minSoc: {
                              name: "minSoc - Minimum SOC 0%-50%",
                              unit: "%",
                              role: "value",
                              type: "number"
                          },
                  		outputHomePower: {
                              name: "outputHomePower - Output to home",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		outputLimit: {
                              name: "outputLimit - Output power limit",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		outputPackPower: {
                              name: "outputPackPower - Battery charge power",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		packInputPower: {
                              name: "packInputPower - Battery discharge power",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		packNum: {
                              name: "packNum - Number of batteries",
                              role: "value",
                              type: "number"
                          },	
                  		packState: {
                              name: "packState - Battery State, 0: Standby, 1: Charging, 2: Discharging",
                              role: "value",
                              type: "number"
                          },
                  		pass: {
                              name: "pass - 0: Bypass Automatic, 1: Bypass OFF, 2: Bypass ON, 3: unknown",
                              role: "value",
                              type: "number"
                          },
                  		pvStatus: {
                              name: "pvStatus - PV State producing, 0: Stopped, 1: Running",
                              role: "value",
                              type: "number"
                          },
                  		remainOutTime: {
                              name: "remainOutTime - Estimated discharge time in minutes, if not predictable: 59940",
                  			unit: "min",
                              role: "value",
                              type: "number"
                          },
                  		reverseState: {
                              name: "reverseState - Reverse flow, 0: No, 1: Reverse flow",
                              role: "value",
                              type: "number"
                          },
                  		rssi: {
                              name: "rssi - Received Signal Strength Indicator",
                  			unit: "dBm",
                              role: "value",
                              type: "number"
                          },				  
                  		smartMode: {
                              name: "smartMode - 1: writes to RAM / 0: writes to Flash",
                              role: "value",
                              type: "number"
                          },
                  		socCompSwitch: { //api:3
                              name: "socCompSwitch; Unauthorized modifications are not recommended",
                              role: "value",
                              type: "number"
                          },					
                  		socLimit: {
                              name: "socLimit - 0: normal, 1: Charge limit reached, 2: Discharge limit reached, 3: unknown",
                              role: "value",
                              type: "number"
                          },		
                          socSet: {
                              name: "socSet - SOC Target 70%-100%",
                              unit: "%",
                              role: "value",
                              type: "number"
                          },
                  		socStatus: {
                              name: "socStatus - SOC calibration Info, 0: No Calibrating / 1: Calibrating",
                              role: "value",
                              type: "number"
                          },
                  		solarInputPower: {
                              name: "solarInputPower - Total Solar Input Power",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		solarPower1: {
                              name: "solarPower1 - Solar line 1 input power",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		solarPower2: {
                              name: "solarPower2 - Solar line 2 input power",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		solarPower3: {
                              name: "solarPower3 - Solar line 3 input power",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		solarPower4: {
                              name: "solarPower4 - Solar line 4 input power",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		solarPower5: {
                              name: "solarPower5 - Solar line 5 input power",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		solarPower6: {
                              name: "solarPower6 - Solar line 6 input power",
                  			unit: "W",
                              role: "value.power",
                              type: "number"
                          }
                      },
                      packData: {
                          batcur: {
                              name: "Battery Current flow - negativ: discharge / positiv: charge",
                              unit: "A",
                              role: "value.current",
                              type: "number"
                          },
                  		maxTemp: {
                              name: "Battery - max. Stored temperature value",
                              unit: "°C",
                              role: "value.temperature",
                              type: "number"
                          },
                  		maxVol: {
                              name: "maxVol - Max cell voltage",
                              unit: "V",
                              role: "value.voltage",
                              type: "number"
                          },
                  		minVol: {
                              name: "minVol - Min cell voltage",
                              unit: "V",
                              role: "value.voltage",
                              type: "number"
                          },
                  		packType: {
                              name: "Pack Type",
                              role: "indicator",
                              type: "number"
                          },
                  		power: {
                              name: "Battery pack power",
                              unit: "W",
                              role: "value.power",
                              type: "number"
                          },
                  		sn: {
                              name: "Battery pack serial number",
                              role: "indicator",
                              type: "string"
                          },
                  		socLevel: {
                              name: "socLevel - State of Charge in Percent",
                  			unit: "%",
                              role: "value.battery",
                              type: "number"
                          },
                  		state: {
                  			name: "Battery state, 0: Standby, 1: Charging, 2: Discharging",
                              role: "indicator",
                              type: "number"
                          },
                  		totalVol: {
                  			name: "Battery Total Voltage",
                              unit: "V",
                              role: "value.voltage",
                              type: "number"
                          }
                      }
                  };
                   
                  function formatTime(unix) {
                      if (unix === undefined || unix === null) return "";
                      const d = new Date(unix * 1000);
                      const timeOptions = { timeZone: "Europe/Berlin", hour: "2-digit", minute: "2-digit", second: "2-digit", hour12: false };
                      const dateOptions = { timeZone: "Europe/Berlin", day: "2-digit", month: "2-digit", year: "2-digit" };
                      return `${d.toLocaleTimeString("de-DE", timeOptions)}, ${d.toLocaleDateString("de-DE", dateOptions)}`;
                  }
                   
                  function getBatteryType(sn, model) {
                      let batType = "";
                      if (!sn || typeof sn !== "string") return "unknown";
                      if (sn.startsWith("A")) { batType = "AB1000"; } 
                      else if (sn.startsWith("B")) { batType = "AB1000S"; } 
                      else if (sn.startsWith("C")) {
                          const sub = sn.length > 3 ? sn[3] : "";
                          if (sub === "F") batType = "AB2000S";
                          else if (sub === "E") batType = "AB2000X";
                          else if (sub === "A") batType = "AB2000L";
                          else batType = "AB2000";
                      } 
                      else if (sn.startsWith("F")) { batType = "AB3000X"; }
                      else if (sn.startsWith("J")) {
                          const sub = sn.length > 3 ? sn[3] : "";
                          if (sub === "A") batType = "Internal 2,4kWh";
                          else batType = "unknown internal";
                      }
                      else if (sn.startsWith("G")) {
                          const sub = sn.length > 3 ? sn[3] : "";
                          if (sub === "A") batType = "AB3000L";
                          else batType = "unknown AB3000?";
                      }
                      if (model && typeof model === "string" && model.trim()) { batType = model.trim(); }
                      return batType || "unknown";
                  }
                   
                  function writeMainKeys(json) {
                      const keys = ["timestamp", "messageId", "sn", "version", "product"];
                      keys.forEach(key => {
                          if (json[key] === undefined) return;
                  		if (key === "sn" && SN === '') { SN = json[key]; }
                          const dp = `${folderZendureApi}.${key}`;
                  		const dpName = (key === "version") ? "zenSDK API Version" : key;
                          if (existsState(dp)) {
                              if (getState(dp).val !== json[key]) { setState(dp, json[key], true); }
                          } else {
                              createState(dp, json[key], { name: dpName, type: typeof json[key], role: "info", read: true, write: false });
                          }
                      });
                  }
                   
                  function writeProperties(obj) {
                      if (!obj) return;
                      const base = folderZendureApi + ".properties";
                      Object.keys(obj).forEach(key => {
                          const dp = `${base}.${key}`;
                          const val = obj[key];
                          const meta = schema.properties?.[key] || {};
                          if (existsState(dp)) {
                              if (getState(dp).val !== val) { setState(dp, val, true); }
                          } else {
                              createState(dp, val, { name: meta.name || key, type: meta.type || typeof val, role: meta.role || "value", unit: meta.unit, read: true, write: false });
                          }
                      });
                  }
                   
                  function writePackData(arr) {
                      if (!Array.isArray(arr)) return;
                      const base = folderZendureApi + ".packData";
                      arr.forEach(pack => {
                          if (!pack.sn) return;
                          const folder = `${base}.${pack.sn}`;
                          if (!existsObject(folder)) { setObject(folder, { type: "folder", common: { name: pack.sn }, native: {} }); }
                          Object.keys(pack).forEach(key => {
                              const dp = `${folder}.${key}`;
                              const val = pack[key];
                  			const meta = schema.packData?.[key] || {};
                              if (existsState(dp)) {
                                  if (getState(dp).val !== val) { setState(dp, val, true); }
                              } else {
                                  createState(dp, val, { name: meta.name || key, type: meta.type || typeof val, role: meta.role || "value", unit: meta.unit, read: true, write: false });
                              }
                          });
                      });
                  }
                   
                  function buildDiff(oldJson, newJson) {
                      if (!oldJson || !newJson) return null;
                      const diff = {};
                      const mainKeys = ["timestamp", "messageId", "sn", "version", "product"];
                  	mainKeys.forEach(key => {
                          if (newJson[key] !== undefined && newJson[key] !== oldJson[key]) { diff[key] = newJson[key]; }
                      });
                      if (newJson.properties) {
                          const propDiff = {};
                          Object.keys(newJson.properties).forEach(key => {
                              const newVal = newJson.properties[key];
                              const oldVal = oldJson.properties ? oldJson.properties[key] : undefined;
                              if (newVal !== oldVal) { propDiff[key] = newVal; }
                          });
                          if (Object.keys(propDiff).length > 0) { diff.properties = propDiff; }
                      }
                      if (Array.isArray(newJson.packData)) {
                          const packDiff = [];
                          const oldMap = {};
                          if (Array.isArray(oldJson.packData)) {
                              oldJson.packData.forEach(p => { if (p.sn) oldMap[p.sn] = p; }); }
                          newJson.packData.forEach(newPack => {
                              if (!newPack.sn) return;
                              const oldPack = oldMap[newPack.sn];
                              const singleDiff = { sn: newPack.sn };
                              let changed = false;
                              Object.keys(newPack).forEach(key => {
                                  if (key === "sn") return;
                                  const newVal = newPack[key];
                                  const oldVal = oldPack ? oldPack[key] : undefined;
                                  if (newVal !== oldVal) { singleDiff[key] = newVal; changed = true; }
                              });
                              if (changed) { packDiff.push(singleDiff); }
                          });
                          if (packDiff.length > 0) { diff.packData = packDiff; }
                      }
                      return Object.keys(diff).length === 0 ? null : diff;
                  }
                   
                  function handleRxNewUpdate(val) {
                      if (!val) return;
                      let newJson;
                      try { newJson = JSON.parse(val); } catch (e) { log("rxNew parse error: " + e, "warn"); return; }
                      const smartModeWatcher = getState(dpSmartWatcher)?.val;
                      if (smartModeWatcher === true && newJson.properties && newJson.properties.smartMode === 0) {
                          //log("SmartModeWatcher: smartMode ist 0! Erzwinge RAM-Modus (1)...", "info");
                          queuePost({ smartMode: 1 });
                      }
                      const oldStr = getRxOld(); 
                      if (!oldStr || oldStr === "null" || oldStr === "") {
                  		let full = transformJson(JSON.parse(JSON.stringify(newJson)));
                  		writeMainKeys(full);
                  		if (full.properties) {
                  			writeProperties(full.properties);
                  			const base = folderZendureApi + ".control";
                              Object.keys(schemaControl).forEach(ctrlKey => {
                                  const def = schemaControl[ctrlKey];
                                  const apiKey = def.apiKey || ctrlKey;
                                  if (full.properties[apiKey] !== undefined) { setState(`${base}.${ctrlKey}`, full.properties[apiKey], true); }
                              });
                              if (full.properties.inputLimit !== undefined) { setState(`${base}.auto_inputLimitMode`, full.properties.inputLimit, true); }
                              if (full.properties.outputLimit !== undefined) { setState(`${base}.auto_outputLimitMode`, full.properties.outputLimit, true); }
                  			if (full.properties.acMode === 2 && full.properties.outputLimit !== undefined) { setState(`${base}.auto_in_out_Limit`, full.properties.outputLimit, true); }
                  			if (full.properties.acMode === 1 && full.properties.inputLimit !== undefined) { setState(`${base}.auto_in_out_Limit`, full.properties.inputLimit * -1, true); }															  
                  		} 
                  		if (full.packData) { writePackData(full.packData); }
                  		setRxOld(val); setRxDiff(""); return;
                  	}
                      let oldJson;
                      try { oldJson = JSON.parse(oldStr); } catch (e) { setRxOld(val); return; }
                  	const isNewer = (newJson.timestamp && oldJson.timestamp && newJson.timestamp > oldJson.timestamp) || (!oldJson.timestamp && newJson.timestamp);
                      if (!isNewer) return;
                      const diff = buildDiff(oldJson, newJson);
                      if (diff && Object.keys(diff).length > 0) {
                          const diffStr = JSON.stringify(diff);
                          setRxDiff(diffStr); handleRxDiffUpdate(diffStr); 
                      } else { setRxDiff(""); }
                      setRxOld(val);
                  }
                   
                  function handleRxDiffUpdate(val) {
                      if (!val) return;
                      let diff;
                      try { diff = JSON.parse(val); } catch (e) { log("rxDiff parse error: " + e, "warn"); return; }
                      diff = transformJson(diff);
                  	if (diff.properties) { syncControlFromDiff(diff); }							   
                      writeMainKeys(diff);
                      if (diff.properties) { writeProperties(diff.properties); }
                      if (diff.packData) { writePackData(diff.packData); }
                  }
                   
                  function syncControlFromDiff(diff) {
                  	if (!diff || !diff.properties) return;
                      const base = folderZendureApi + ".control";
                      const acMode = diff.properties.acMode !== undefined ? diff.properties.acMode : getState(folderZendureApi + ".properties.acMode")?.val;
                      if (acMode === 2 && diff.properties.outputLimit !== undefined) { setState(`${base}.auto_in_out_Limit`, diff.properties.outputLimit, true); }
                      if (acMode === 1 && diff.properties.inputLimit !== undefined) { setState(`${base}.auto_in_out_Limit`, diff.properties.inputLimit * -1, true); }
                  	if (diff.properties.inputLimit !== undefined) { setState(`${base}.auto_inputLimitMode`, diff.properties.inputLimit, true); }
                  	if (diff.properties.outputLimit !== undefined) { setState(`${base}.auto_outputLimitMode`, diff.properties.outputLimit, true); }
                  	Object.keys(schemaControl).forEach(ctrlKey => {
                  		const def = schemaControl[ctrlKey];
                  		const apiKey = def.apiKey || ctrlKey;
                  		if (diff.properties[apiKey] !== undefined) { setState(`${base}.${ctrlKey}`, diff.properties[apiKey], true); }
                  	});
                  }
                   
                  function createOrSet(id, val, common) {
                      if (existsState(id)) {
                          if (getState(id).val !== val) { setState(id, val, true); }
                      } else { createState(id, val, { read: true, write: false, ...common }); }
                  }
                   
                  function transformJson(obj) {
                      if (!obj) return obj;
                      if (obj.timestamp !== undefined && obj.timestamp !== null) {
                          const formatted = formatTime(obj.timestamp);
                          createOrSet(`${folderZendureApi}.timeUpdateTimestamp`, formatted, { type: "string", role: "text", name: "TimeUpdate (timestamp)" });
                      }
                      if (obj.properties) {
                          Object.keys(obj.properties).forEach(key => {
                              let val = obj.properties[key];
                              switch (key) {
                  				case "BatVolt": val = val / 100; break;
                  				case "acCouplingState": {
                  					let states = [];
                  					if (val & (1 << 0)) states.push("AC-coupled input present");
                  					if (val & (1 << 1)) states.push("AC input present flag");
                  					if (val & (1 << 2)) states.push("AC-coupled overload");
                  					if (val & (1 << 3)) states.push("Excess AC input power");
                  					const statusText = states.length > 0 ? states.join(", ") : "Normal / No Flags";
                  					createOrSet(`${folderZendureApi}.properties.acCouplingState_String`, statusText, { type: "string", role: "text", name: "AC Coupling State (Text)" });
                  				} break;
                  				case "hyperTmp": val = (val - 2731) / 10.0; break;
                                  case "minSoc":
                  				case "socSet": val = val / 10; break;
                  				case "socLimit": {
                  					if (val >= 16) {
                  					val = val & 0x03;
                  					}
                  				} break;
                                  case "ts":
                  					if (val !== undefined && val !== null) {
                  						const formatted = formatTime(val);
                  						createOrSet(`${folderZendureApi}.properties.timeUpdateTs`, formatted, { type: "string", role: "text", name: "TimeUpdate (ts)" });
                  					} break;
                              }
                              obj.properties[key] = val;
                          });
                      }
                      if (Array.isArray(obj.packData)) {
                  		obj.packData.forEach(pack => {
                  			if (pack.sn) {
                  				const batType = getBatteryType(pack.sn, pack.model);
                  				createOrSet(`${folderZendureApi}.packData.${pack.sn}.model`, batType, { type: "string", role: "text", name: "Battery Model" });
                  			}
                  		}); 	
                          obj.packData.forEach(pack => {
                              Object.keys(pack).forEach(key => {
                                  let val = pack[key];
                                  switch (key) {
                  					case "batcur":
                  						if (val > 32767) { val = val - 65536; }
                  						val = val / 10; break;
                                      case "maxTemp": val = (val - 2731) / 10; break;
                  					case "maxVol":
                  					case "minVol":
                  					case "totalVol": val = val / 100; break;
                  					case "softVersion":
                                          const major = Math.floor(val / 4096);
                                          const minor = Math.floor((val % 4096) / 256);
                                          const patch = val % 256;
                                          val = `V${major}.${minor}.${patch}`; break;  
                                  }
                                  pack[key] = val;
                              });
                          });
                      }
                      return obj;
                  }
                   
                  startGetLoop();
                  
                  
                  
                  
                  maxclaudiM Offline
                  maxclaudiM Offline
                  maxclaudi
                  schrieb zuletzt editiert von
                  #355

                  Update 22.06.26 20:00h zenSDK API 3
                  API 2 funktioniert weiterhin.
                  Bitte Beschreibung im Script beachten.
                  zum Update / Script

                  Zendure zenSDK Lokal API, SmartMode, SolarFlow AC 800 Pro 2

                  1 Antwort Letzte Antwort
                  0
                  • J Jockel_Bln

                    @maxclaudi Vielen Dank für die Mühe die du dir hier machst 👍
                    Ich besitze seit dem Wochenende einen SF2400AC+ und versuche gerade das Teil halbwegs sinnvoll zu steuern. Nachdem ich dein super dokumentiertes Skript gefunden habe, ist der solarflow Adapter gleich wieder in Rente gegangen.
                    Ich habe von Skripten leider nur sehr weinig bis gar keine Ahnung und bin deshalb immer noch auf Vorlagen angewiesen.
                    Da dein "Hauptskript" leider nicht öffentlich ist, habe ich mich mal bei @lesiflo bedient und versucht sein Script zum Laden/Entladen von Zendure Solarflow für mich an dei Skript anzupassen um erst einmal die grundlegenden Funktionen zu haben.

                    @All Eventuell kann da mal jemand drüber gucken, ob ich da sehr grobe Schnitzer drin habe und eventuell meinen Speicher gleich wieder schrotte.
                    c3f6ed6b-2a06-4cd6-9961-d7a77b592e1e-image.jpeg
                    aa557486-29ea-4134-851d-d1796aab3f24-image.jpeg
                    Hier nochmal der Blockly Export:

                    <xml xmlns="https://developers.google.com/blockly/xml">
                     <variables>
                       <variable id="O}e3|VjTzH+.dHc-BE_:">output_begin</variable>
                       <variable id="Pmn^Rfs2`%vXob$!J=UX">input_begin</variable>
                       <variable id="C3%p`nQ`AJ8yklMQKidv">input_max</variable>
                       <variable id="8]~yHC.tW6]*GfkCbq)^">output_max</variable>
                       <variable id="u8CL)Wex?DocZ58y(/n*">output</variable>
                       <variable id="s3oTgk^d]QTYtWfpyOk6">input</variable>
                     </variables>
                     <block type="comment" id="aB?G:5$JZsZVN]k[FMf$" x="2623" y="-1423">
                       <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_begin</field>
                           <value name="VALUE">
                             <block type="math_number" id="Cd-LtKS?ZQR;3fE)1OfR">
                               <field name="NUM">10</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_begin</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">input_max</field>
                                   <value name="VALUE">
                                     <block type="math_number" id="[h?+?1Bkt{sL]3tL~hWI">
                                       <field name="NUM">-2400</field>
                                     </block>
                                   </value>
                                   <next>
                                     <block type="variables_set" id="C7WP.yVY.~yLboTO)--M">
                                       <field name="VAR" id="8]~yHC.tW6]*GfkCbq)^">output_max</field>
                                       <value name="VALUE">
                                         <block type="math_number" id="!o~v`/:*+;(]p]{H?WTA">
                                           <field name="NUM">800</field>
                                         </block>
                                       </value>
                                       <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">smartmeter.0.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 gerundet auf 10W</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="?3ziYdvoAKuW!gQYp^H.">
                                                       <field name="OP">MULTIPLY</field>
                                                       <value name="A">
                                                         <shadow type="math_number" id="T~+opyPvwKX*Zt1YR;As">
                                                           <field name="NUM">1</field>
                                                         </shadow>
                                                         <block type="math_round" id=":`a3!T.9(}B/lJ^.KS(/">
                                                           <field name="OP">ROUND</field>
                                                           <value name="NUM">
                                                             <shadow type="math_number" id="g;oroW(D?cU31.`9~.1}">
                                                               <field name="NUM">3.1</field>
                                                             </shadow>
                                                             <block type="math_arithmetic" id="Au]!Mvid69-ThMTm]V96">
                                                               <field name="OP">DIVIDE</field>
                                                               <value name="A">
                                                                 <shadow type="math_number" id="W.WcvG;|rSc%%(.T_W^c">
                                                                   <field name="NUM">1</field>
                                                                 </shadow>
                                                                 <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_begin</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">0_userdata.0.zendure.SF2400ACplus.properties.outputHomePower</field>
                                                                     </block>
                                                                   </value>
                                                                 </block>
                                                               </value>
                                                               <value name="B">
                                                                 <shadow type="math_number" id="GKj`)SUe,1zDzP~O_ZAs">
                                                                   <field name="NUM">10</field>
                                                                 </shadow>
                                                               </value>
                                                             </block>
                                                           </value>
                                                         </block>
                                                       </value>
                                                       <value name="B">
                                                         <shadow type="math_number" id="o{icAU.bf$`.qo0uY?nQ">
                                                           <field name="NUM">10</field>
                                                         </shadow>
                                                       </value>
                                                     </block>
                                                   </value>
                                                   <next>
                                                     <block type="comment" id="jfTMAZ*=]Yc9N:)Y_sD1">
                                                       <field name="COMMENT">Setzen der Eingangsleistung gerundet auf 10W</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="|CDI19aH]0wqD@rhgZk%">
                                                               <field name="OP">MULTIPLY</field>
                                                               <value name="A">
                                                                 <shadow type="math_number" id="T~+opyPvwKX*Zt1YR;As">
                                                                   <field name="NUM">1</field>
                                                                 </shadow>
                                                                 <block type="math_round" id="Ds#SgQMlU@LRBB?1[uU:">
                                                                   <field name="OP">ROUND</field>
                                                                   <value name="NUM">
                                                                     <shadow type="math_number" id="g;oroW(D?cU31.`9~.1}">
                                                                       <field name="NUM">3.1</field>
                                                                     </shadow>
                                                                     <block type="math_arithmetic" id="Xg=2?pCZa`_D@Ag3f+c)">
                                                                       <field name="OP">DIVIDE</field>
                                                                       <value name="A">
                                                                         <shadow type="math_number" id="W.WcvG;|rSc%%(.T_W^c">
                                                                           <field name="NUM">1</field>
                                                                         </shadow>
                                                                         <block type="math_arithmetic" id="~LBc9fG5Z6lJd12/)jT4">
                                                                           <field name="OP">MINUS</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="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="$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_begin</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">0_userdata.0.zendure.SF2400ACplus.properties.gridInputPower</field>
                                                                             </block>
                                                                           </value>
                                                                         </block>
                                                                       </value>
                                                                       <value name="B">
                                                                         <shadow type="math_number" id="+|]eEGPOjRvjdi)O;j]y">
                                                                           <field name="NUM">10</field>
                                                                         </shadow>
                                                                       </value>
                                                                     </block>
                                                                   </value>
                                                                 </block>
                                                               </value>
                                                               <value name="B">
                                                                 <shadow type="math_number" id="2._8#L!KFobGGgkB!Y$A">
                                                                   <field name="NUM">10</field>
                                                                 </shadow>
                                                               </value>
                                                             </block>
                                                           </value>
                                                           <next>
                                                             <block type="controls_if" id="9{oE^c13a:31;2ut.DI$">
                                                               <mutation elseif="1" else="1"></mutation>
                                                               <value name="IF0">
                                                                 <block type="logic_multi_and" id="K5vL6-k@2[o9(|E4`OqX">
                                                                   <mutation xmlns="http://www.w3.org/1999/xhtml" items="2"></mutation>
                                                                   <value name="AND0">
                                                                     <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="AND1">
                                                                     <block type="logic_compare" id="sxUAjFcy(N6Q59Byrc{5">
                                                                       <field name="OP">EQ</field>
                                                                       <value name="A">
                                                                         <block type="get_value" id=")?$qjl;c)((g)x%;f*1[">
                                                                           <field name="ATTR">val</field>
                                                                           <field name="OID">0_userdata.0.Speicher.Freigabe_Entladen</field>
                                                                         </block>
                                                                       </value>
                                                                       <value name="B">
                                                                         <block type="logic_boolean" id="W=F.#*.dh40F`d:.:9vl">
                                                                           <field name="BOOL">TRUE</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="B:~%LC[49c%qUwqiFyn3">
                                                                       <value name="IF0">
                                                                         <block type="logic_compare" id="kKJQjQ5XgbxE0lQ_s|)l">
                                                                           <field name="OP">GT</field>
                                                                           <value name="A">
                                                                             <block type="variables_get" id="G0e{06Hc]}TIX=S*];CK">
                                                                               <field name="VAR" id="u8CL)Wex?DocZ58y(/n*">output</field>
                                                                             </block>
                                                                           </value>
                                                                           <value name="B">
                                                                             <block type="variables_get" id="xu)L*d2Wlj7Tdp_x(?cE">
                                                                               <field name="VAR" id="8]~yHC.tW6]*GfkCbq)^">output_max</field>
                                                                             </block>
                                                                           </value>
                                                                         </block>
                                                                       </value>
                                                                       <statement name="DO0">
                                                                         <block type="variables_set" id="[)g-c]$Cv{gB|ilO-vQ;">
                                                                           <field name="VAR" id="u8CL)Wex?DocZ58y(/n*">output</field>
                                                                           <value name="VALUE">
                                                                             <block type="variables_get" id=":wgQ{EmOcWnjF?+Li*l]">
                                                                               <field name="VAR" id="8]~yHC.tW6]*GfkCbq)^">output_max</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">0_userdata.0.zendure.SF2400ACplus.control.auto_in_out_Limit</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>
                                                                         </block>
                                                                       </next>
                                                                     </block>
                                                                   </next>
                                                                 </block>
                                                               </statement>
                                                               <value name="IF1">
                                                                 <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">08:00</field>
                                                                         </shadow>
                                                                       </value>
                                                                       <value name="END_TIME">
                                                                         <shadow type="text" id="KO`i!C([`f|6juoQ~d-d">
                                                                           <field name="TEXT">21:00</field>
                                                                         </shadow>
                                                                       </value>
                                                                     </block>
                                                                   </value>
                                                                   <value name="AND1">
                                                                     <block type="logic_compare" id="=;k+]!:`FgPIl(ffM)0z">
                                                                       <field name="OP">EQ</field>
                                                                       <value name="A">
                                                                         <block type="get_value" id="o55n7*4D=LYnb:P_11Mb">
                                                                           <field name="ATTR">val</field>
                                                                           <field name="OID">0_userdata.0.Speicher.Freigabe_Laden</field>
                                                                         </block>
                                                                       </value>
                                                                       <value name="B">
                                                                         <block type="logic_boolean" id="TR/7]h/Wr4=[w}2,:/d|">
                                                                           <field name="BOOL">TRUE</field>
                                                                         </block>
                                                                       </value>
                                                                     </block>
                                                                   </value>
                                                                   <value name="AND2">
                                                                     <block type="logic_compare" id="BdTZijA^#anVn3j{PwI*">
                                                                       <field name="OP">LT</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="DO1">
                                                                 <block type="comment" id="zC5_szd6=wy}Q*]%d_Rb">
                                                                   <field name="COMMENT">Laden</field>
                                                                   <next>
                                                                     <block type="controls_if" id="pW$^ccLu1b}%C$y8h#iQ">
                                                                       <value name="IF0">
                                                                         <block type="logic_compare" id="?y|QF}?u)ssQqx^b-mF1">
                                                                           <field name="OP">LT</field>
                                                                           <value name="A">
                                                                             <block type="variables_get" id="I=IU!qT3iBK7EY~n[$Sj">
                                                                               <field name="VAR" id="s3oTgk^d]QTYtWfpyOk6">input</field>
                                                                             </block>
                                                                           </value>
                                                                           <value name="B">
                                                                             <block type="variables_get" id="G@NF62dM(QOk8r3y4(XE">
                                                                               <field name="VAR" id="C3%p`nQ`AJ8yklMQKidv">input_max</field>
                                                                             </block>
                                                                           </value>
                                                                         </block>
                                                                       </value>
                                                                       <statement name="DO0">
                                                                         <block type="variables_set" id="u@~xzq/wsLZ[`Ui~asm?">
                                                                           <field name="VAR" id="s3oTgk^d]QTYtWfpyOk6">input</field>
                                                                           <value name="VALUE">
                                                                             <block type="variables_get" id="Q{5~Zs$rGZLl_M}vfjA0">
                                                                               <field name="VAR" id="C3%p`nQ`AJ8yklMQKidv">input_max</field>
                                                                             </block>
                                                                           </value>
                                                                         </block>
                                                                       </statement>
                                                                       <next>
                                                                         <block type="control" id=";512Sny^l9[8H~)*$JIi">
                                                                           <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                                           <field name="OID">0_userdata.0.zendure.SF2400ACplus.control.auto_in_out_Limit</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>
                                                                         </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="control" id="Qhy=K`*Kim%|cM0RX[fs">
                                                                       <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                                       <field name="OID">0_userdata.0.zendure.SF2400ACplus.control.auto_in_out_Limit</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>
                                                                     </block>
                                                                   </next>
                                                                 </block>
                                                               </statement>
                                                               <next>
                                                                 <block type="comment" id="*!ut{wn)jWUE5I$r}%,8">
                                                                   <field name="COMMENT">Nachladen erst ab 95%</field>
                                                                   <next>
                                                                     <block type="controls_if" id="rgq4u/kHcr:PfHb_DBA:">
                                                                       <mutation elseif="1"></mutation>
                                                                       <value name="IF0">
                                                                         <block type="logic_compare" id="ZB8B=/iNM1_y$zz;NUTs">
                                                                           <field name="OP">EQ</field>
                                                                           <value name="A">
                                                                             <block type="get_value" id="5IP8.FO(t!H?3dC(}QV;">
                                                                               <field name="ATTR">val</field>
                                                                               <field name="OID">0_userdata.0.zendure.SF2400ACplus.packData.JO2AEP3P1000431.socLevel</field>
                                                                             </block>
                                                                           </value>
                                                                           <value name="B">
                                                                             <block type="math_number" id="8RkLiOoN`{M92y!.dUGb">
                                                                               <field name="NUM">100</field>
                                                                             </block>
                                                                           </value>
                                                                         </block>
                                                                       </value>
                                                                       <statement name="DO0">
                                                                         <block type="update" id="mVuLG3Ds7%,MbrHy5UOb">
                                                                           <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                                           <field name="OID">0_userdata.0.Speicher.Freigabe_Laden</field>
                                                                           <field name="WITH_DELAY">FALSE</field>
                                                                           <value name="VALUE">
                                                                             <block type="logic_boolean" id="PoVJSVCu-x/P:.6osIO#">
                                                                               <field name="BOOL">FALSE</field>
                                                                             </block>
                                                                           </value>
                                                                         </block>
                                                                       </statement>
                                                                       <value name="IF1">
                                                                         <block type="logic_compare" id="8QX+DTlWn)^zgK_ZG,F!">
                                                                           <field name="OP">GT</field>
                                                                           <value name="A">
                                                                             <block type="get_value" id="?p9@Lnln2Hg)S39BcqM9">
                                                                               <field name="ATTR">val</field>
                                                                               <field name="OID">0_userdata.0.zendure.SF2400ACplus.packData.JO2AEP3P1000431.socLevel</field>
                                                                             </block>
                                                                           </value>
                                                                           <value name="B">
                                                                             <block type="math_number" id="^wP6)i)NRE|eA0g0Y~ve">
                                                                               <field name="NUM">95</field>
                                                                             </block>
                                                                           </value>
                                                                         </block>
                                                                       </value>
                                                                       <statement name="DO1">
                                                                         <block type="update" id="2%~gHm:@+OHGiV8mf$CI">
                                                                           <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                                           <field name="OID">0_userdata.0.Speicher.Freigabe_Laden</field>
                                                                           <field name="WITH_DELAY">FALSE</field>
                                                                           <value name="VALUE">
                                                                             <block type="logic_boolean" id="t-?IPhL9,4cnWLje#`C5">
                                                                               <field name="BOOL">TRUE</field>
                                                                             </block>
                                                                           </value>
                                                                         </block>
                                                                       </statement>
                                                                       <next>
                                                                         <block type="comment" id="]oDC2Cd9J`v{Y[I+tG;o">
                                                                           <field name="COMMENT">Entladen erst wieder ab 20%</field>
                                                                           <next>
                                                                             <block type="controls_if" id="_Fd4hlB3UPh_oTC{]6dV">
                                                                               <mutation elseif="1"></mutation>
                                                                               <value name="IF0">
                                                                                 <block type="logic_compare" id="sA~y{~84I)V|J|7xWe(%">
                                                                                   <field name="OP">LTE</field>
                                                                                   <value name="A">
                                                                                     <block type="get_value" id="6[ucT_hz[NTZgoy-SIdR">
                                                                                       <field name="ATTR">val</field>
                                                                                       <field name="OID">0_userdata.0.zendure.SF2400ACplus.packData.JO2AEP3P1000431.socLevel</field>
                                                                                     </block>
                                                                                   </value>
                                                                                   <value name="B">
                                                                                     <block type="math_number" id=")o5Y(o]iP%B!hOn;p`K6">
                                                                                       <field name="NUM">10</field>
                                                                                     </block>
                                                                                   </value>
                                                                                 </block>
                                                                               </value>
                                                                               <statement name="DO0">
                                                                                 <block type="update" id="0b?O!3MR{aU.JuE:?FpD">
                                                                                   <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                                                   <field name="OID">0_userdata.0.Speicher.Freigabe_Entladen</field>
                                                                                   <field name="WITH_DELAY">FALSE</field>
                                                                                   <value name="VALUE">
                                                                                     <block type="logic_boolean" id="@}S3a?-mx{zdDBfYX#P*">
                                                                                       <field name="BOOL">FALSE</field>
                                                                                     </block>
                                                                                   </value>
                                                                                 </block>
                                                                               </statement>
                                                                               <value name="IF1">
                                                                                 <block type="logic_compare" id="MTmDqOiFGjuGqhi]eH*}">
                                                                                   <field name="OP">GTE</field>
                                                                                   <value name="A">
                                                                                     <block type="get_value" id="O%`;}8-bee3|f3(.g*FA">
                                                                                       <field name="ATTR">val</field>
                                                                                       <field name="OID">0_userdata.0.zendure.SF2400ACplus.packData.JO2AEP3P1000431.socLevel</field>
                                                                                     </block>
                                                                                   </value>
                                                                                   <value name="B">
                                                                                     <block type="math_number" id="%Sa-Ne`]Q=59iD+^jjPj">
                                                                                       <field name="NUM">20</field>
                                                                                     </block>
                                                                                   </value>
                                                                                 </block>
                                                                               </value>
                                                                               <statement name="DO1">
                                                                                 <block type="update" id="PXUYyV6*ojZ$w{pi$m/k">
                                                                                   <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                                                   <field name="OID">0_userdata.0.Speicher.Freigabe_Entladen</field>
                                                                                   <field name="WITH_DELAY">FALSE</field>
                                                                                   <value name="VALUE">
                                                                                     <block type="logic_boolean" id="Gf*.C1.8xOYjW:C4,1z3">
                                                                                       <field name="BOOL">TRUE</field>
                                                                                     </block>
                                                                                   </value>
                                                                                 </block>
                                                                               </statement>
                                                                             </block>
                                                                           </next>
                                                                         </block>
                                                                       </next>
                                                                     </block>
                                                                   </next>
                                                                 </block>
                                                               </next>
                                                             </block>
                                                           </next>
                                                         </block>
                                                       </next>
                                                     </block>
                                                   </next>
                                                 </block>
                                               </next>
                                             </block>
                                           </statement>
                                         </block>
                                       </next>
                                     </block>
                                   </next>
                                 </block>
                               </next>
                             </block>
                           </next>
                         </block>
                       </next>
                     </block>
                    </xml>
                    


                    Mein Hauszähler wird alle 10 Sekunden per IR-Lesekopf abgefragt, somit werden die Werte dann in diesem Rhythmus erneuert.
                    Das Laden soll bei 100% beendet werden und frühstens wieder bei 95% starten. Ebenso das Entladen, Stopp bei 10% und frühster Start wieder bei 20%.

                    Das Laden hat schonmal geklappt, ich werde das weiter beobachten.
                    Falls ich da noch Denkfehler drin habe, würde ich mich über Aufklärung freuen.

                    Nochmals danke für diesen tollen Adapter Ersatz!
                    Leider gibt es noch nicht viele Vorlagen, die darauf aufbauen.

                    EDIT: Beim Nachladen ab 95% muss es natürlch < 95 heißen.

                    maxclaudiM Offline
                    maxclaudiM Offline
                    maxclaudi
                    schrieb zuletzt editiert von
                    #356

                    @Jockel_Bln
                    Herzlich willkommen :-)
                    Leider habe ich momentan sehr wenig Zeit.

                    Wenn bitte @paul53 vielleicht über Dein Blockly schauen kann.
                    "Schrotten" wirst Du den Speicher nicht so schnell.

                    Die Blocklys von @lesiflo sind eigentlich ok und müssten sich leicht umstellen lassen.

                    Zendure zenSDK Lokal API, SmartMode, SolarFlow AC 800 Pro 2

                    1 Antwort Letzte Antwort
                    0
                    • maxclaudiM maxclaudi

                      @paul53 sagte:

                      Bei Netzausfall sinkt SoC bis auf "minSoc" (Test mit 50) und es schaltet dann die Notstromdose aus....

                      Wert von socLimit:
                      Welchen Wert meldet socLimit, sobald die Notstromdose wegen Erreichen des Entladelimits (minSoC) abgeschaltet hat?
                      18?

                      Einstellung gridOffMode:
                      Welchen Wert hattest du während deines Tests für gridOffMode gesetzt (0 oder 1)?

                      Danke dir für deine Unterstützung.

                      paul53P Offline
                      paul53P Offline
                      paul53
                      schrieb zuletzt editiert von
                      #357

                      @maxclaudi [sagte]: Welchen Wert meldet socLimit, sobald die Notstromdose wegen Erreichen des Entladelimits (minSoC) abgeschaltet hat?

                      Wert 18.

                      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                      Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB

                      maxclaudiM 1 Antwort Letzte Antwort
                      1
                      • paul53P paul53

                        @maxclaudi [sagte]: Welchen Wert meldet socLimit, sobald die Notstromdose wegen Erreichen des Entladelimits (minSoC) abgeschaltet hat?

                        Wert 18.

                        maxclaudiM Offline
                        maxclaudiM Offline
                        maxclaudi
                        schrieb zuletzt editiert von maxclaudi
                        #358

                        @paul53 sagte:

                        @maxclaudi [sagte]: Welchen Wert meldet socLimit, sobald die Notstromdose wegen Erreichen des Entladelimits (minSoC) abgeschaltet hat?

                        Wert 18.

                        update ist schon raus :-)

                        Edit/PS: Herzlichen Dank für deine aktive Mitarbeit hier im Forum. Ohne deine schnellen Rückmeldungen würde das Ganze immer viel länger dauern.

                        @daniel-8 vermisse ich auch – hoffentlich ist bei ihm alles gut.

                        Zendure zenSDK Lokal API, SmartMode, SolarFlow AC 800 Pro 2

                        1 Antwort Letzte Antwort
                        0
                        • R Offline
                          R Offline
                          Rico Sander
                          schrieb zuletzt editiert von
                          #359

                          @maxclaudi
                          Sorry, falls ich nerve.
                          Vieles was hier diskutiert wird im Zusammenhang mit der Firmware- und HEMS-Aktualisierung trifft für mich nicht zu.
                          Laden über AC-Anschluss, Entladen über AC-Anschluss - sonst nix.
                          Bypass-Funktion und Grid-Dose benötige ich nicht.

                          Daher: Kann ich gefahrlos bei Verwendung des HTTP-Scriptes die Updates fahren oder gibt es Probleme mit dem SSL- und Port-Problem?

                          Vermutlich nicht, da ich ja kein MQTT nutze - richtig?

                          Danke für Aufklärung ...

                          Wenns nicht geht, wie man will
                          - muss mans tun, wie man kann.
                          1 Antwort Letzte Antwort
                          0
                          • D Online
                            D Online
                            Daniel 8
                            schrieb zuletzt editiert von Daniel 8
                            #360

                            @maxclaudi
                            Bei mir ist alles gut. Hab nur grad ein bisschen den Faden hier verloren. Wenn ich das aber richtig gesehen habe, hat Zendure bei Hems 2 und den neuen Firmwares was geändert.
                            Ich habe noch kein Update gemacht. Bin etwas vorsichtig, da im Zendure Forum sehr viele Probleme haben.

                            Was ist eigentlich der socCompSwitch?

                            Solarflow 800 Pro mit 1,3 Kwp / Iobroker / Homematic / Shellys / Mediola / Intertechno

                            1 Antwort Letzte Antwort
                            0

                            Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                            Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

                            Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                            Registrieren Anmelden
                            Antworten
                            • In einem neuen Thema antworten
                            Anmelden zum Antworten
                            • Älteste zuerst
                            • Neuste zuerst
                            • Meiste Stimmen


                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            497

                            Online

                            33.0k

                            Benutzer

                            83.3k

                            Themen

                            1.3m

                            Beiträge
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                            ioBroker Community 2014-2026
                            logo
                            • Anmelden

                            • Du hast noch kein Konto? Registrieren

                            • Anmelden oder registrieren, um zu suchen
                            • Erster Beitrag
                              Letzter Beitrag
                            0
                            • Home
                            • Aktuell
                            • Tags
                            • Ungelesen 0
                            • Kategorien
                            • Unreplied
                            • Beliebt
                            • GitHub
                            • Docu
                            • Hilfe