NEWS
OpenDTU-onBattery DPL Inverter dynamisch (de-)aktivieren
-
Die folgende Funktion für den Einbau in ein Blockly kann verwendet werden,
um einen einzelnen Inverter in der DPL-Steuerung von OpenDTU-onBattery mit einzubeziehen oder auszuschließen.Das funktioniert sowohl bei aktivierter als auch bei deaktivierter DPL-Steuerung im laufenden Betrieb.
Voraussetzungen:
Um die Funktion nutzen zu können, werden neben der OpenDTU-onBattery nur drei Angaben benötigt:- IP-Adresse der OpenDTU-onBattery
- Admin-Passwort
- Seriennummer des gewünschten Inverters

Tipp zur Seriennummer:
Die Seriennummer des Inverters findet man leicht in der WebUI der OpenDTU-onBattery in der Live-Ansicht.
Einfach den gewünschten Inverter anklicken – in der Informationsleiste steht die Seriennummer, die dort direkt markiert und kopiert werden kann.
Danach wird sie einfach im Blockly eingefügt.
Damit ist eine fehlerhafte Eingabe fast ausgeschlossen.Wie die Funktion arbeitet:
-
Wenn die Funktion ausgeführt wird, liest sie zuerst per API-GET-Request die aktuelle DPL-Konfiguration aus.
Diese wird im ioBroker-Log ausgegeben: "aktuelle DPL-Einstellungen:...." -
Danach wird mittels Timeout 5 Sekunden gewartet.
Dies ist unbedingt notwendig, um dem ESP32 auf der OpenDTU-onBattery genug Zeit für die Verarbeitung zu geben. -
Nun wird geprüft, ob die Seriennummer des Inverters in der aktuellen Konfiguration enthalten ist.
Sollte sie fehlen, bricht die Funktion ab mit der Log-Ausgabe: "Inverter nicht bekannt." -
Ist die Seriennummer bekannt, wird anhand des Wertes der Variablen enabled die DPL-Zugehörigkeit umgeschaltet:
-
enabled: wahr
Der Inverter wird in die DPL-Steuerung integriert und ab jetzt automatisch geregelt. -
enabled: falsch
Der Inverter verhält sich normal, wird von der DPL ignoriert und läuft (je nach Firmware) auf maximalem Limit.
- Jetzt wird ein POST mit der geänderten Konfiguration an die OpenDTU-onBattery gesendet.
War das POST erfolgreich, steht der neue Wert im Log.
Beispiel: Inverter <Seriennummer>: is_governed=true.
Damit ist die Funktion abgeschlossen.
Hinweise:
-
Verzögerung, auch in der Web-Ui-Ansicht:
Der eigentliche Vorgang läuft im Hintergrund relativ schnell ab (ca. 10 Sekunden).
Bei aktiver DPL-Regelung funktioniert die Umschaltung intern schneller, als es in der WebUI sichtbar ist.
Bis die WebUI den Zustand korrekt anzeigt, können unter Umständen > 30 Sekunden vergehen. -
Flash-Speicher:
Konfigurationsänderungen werden immer in den FLASH geschrieben.
Daher schreibt auch diese Funktion in den Flash-Speicher.
Das sollte nicht zu oft und nicht zu schnell hintereinander geschehen.
In der Praxis ist das auch nicht öfter als 2- bis 4-mal am Tag nötig. -
Wear-Leveling:
OpenDTU-onBattery nutzt im zugrundeliegenden Framework ein gutes Wear-Leveling für den Flash-Speicher, weshalb das Schreiben unkritisch ist.
Man sollte es dennoch nicht übertreiben (keine Schleifen im Minuten- oder Sekundentakt!). -
Firmware-Verhalten:
Bei der Verwendung der Firmware-Version aus diesem Thread: OpenDTU-onBattery Blockly DPL Ein/Aus wird der Inverter bei
enabled: falsch
automatisch auf das maximale Limit gesetzt.
Ob das bei der offiziellen OpenDTU-onBattery-Version exakt genauso reagiert, dürft ihr gerne selbst testen.
Ich habe es nicht überprüft, da ich nur die Firmware aus meinem verlinkten Thread verwende.
Für was sollte ich das überhaupt benötigen?
Warum das Ganze? Was bringt mir das in der Praxis?Hier mein Anwendungsbeispiel aus der Praxis:
Es sind mehrere Hoymiles-Inverter vorhanden, die über OpenDTU-onBattery DPL geregelt werden.
Einer dieser Inverter speist jedoch in die Off-Grid-Steckdose eines Zendure 1600ACplus ein.-
Batterien laden mit maximaler PV-Leistung.
Solange die Batterien des Zendure nicht voll sind, soll der daran angeschlossene Wechselrichter mit voller Leistung laufen, um die Batterien mit maximal vorhandener PV-Leistung zu laden.
Die restlichen Inverter im Haus regeln ganz normal über DPL. -
Bypass
Sobald die Batterien voll sind, schaltet das Zendure-System in den Bypass und liefert die volle Leistung direkt ins Hausnetz.
Ab diesem Moment soll der Inverter am Zendure ebenfalls wieder von der DPL-Steuerung berücksichtigt und heruntergeregelt werden.
Dieses Szenario lässt sich mit der bereitgestellten Funktion nun ganz leicht und vollautomatisch realisieren.
Normalerweise realisiere ich meine Steuerungen direkt in JavaScript.
Weil ich aber weiß, dass aller Anfang schwer ist und viele auf Blockly angewiesen sind, stelle ich immer wieder mal Ausschnitte meiner Skripte als Blockly zur Verfügung, damit möglichst viele das auch nutzen können.
Hoffe, es hilft dem oder der einen oder anderen etwas weiter.Wer sich bedanken möchte:
Ein positives Voting ist mehr als genug.Viel Spaß damit!
Blockly:
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="~ftPCTQp~2L#94MM5QcD">OpDtuIp</variable> <variable id="w5c+Rte!:_MdazYVm|ha">password</variable> <variable id="Q7P2Gs`1rw|7mvBOmP=|">serial</variable> <variable id="ji}d8u#ATjk`g7/9*64p">enabled</variable> <variable id="XqgTC0Gq.[lG$:/oqv`I">inverterOpenDtuDplAktiv</variable> </variables> <block type="comment" id="a41MJWN=/:`-jYr/B+M_" x="-612" y="13"> <field name="COMMENT">(de-) aktiviert einzelnen Inverter in der&#10;OpenDtuOb-DPL-Steuerung,&#10;im laufenden Betrieb&#10;sowie im deaktivierten Zustand der DPL.&#10;(Dauer: ca. 6–8 Sek. durch &#10;Sicherheits-Pause)&#10;maxclaudi 03.06.2026</field> <next> <block type="variables_set" id="!El)7BV+6zMLztWV5n.n"> <field name="VAR" id="XqgTC0Gq.[lG$:/oqv`I">inverterOpenDtuDplAktiv</field> <value name="VALUE"> <block type="logic_boolean" id=",Ht$%!)0PW]{S6l3~z?-"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="controls_if" id="pt!EU{L`w9$A4O+~`N?="> <value name="IF0"> <block type="logic_compare" id="h-yiigByMw8iQ^}]Ze:H"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="+fzOtQ%0E~EcdEtYl^RY"> <field name="VAR" id="XqgTC0Gq.[lG$:/oqv`I">inverterOpenDtuDplAktiv</field> </block> </value> <value name="B"> <block type="logic_boolean" id="r3JI,RJs}KLT#X3+D1+u"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <statement name="DO0"> <block type="procedures_callcustomnoreturn" id="K{D}q_H9;J;?^x$)_)Ns"> <mutation name="setDpl_InverterState"> <arg name="OpDtuIp"></arg> <arg name="password"></arg> <arg name="serial"></arg> <arg name="enabled"></arg> </mutation> <value name="ARG0"> <block type="text" id="v;@qW%r8:?oSyn]lM7Y*"> <field name="TEXT">192.168.40.200</field> </block> </value> <value name="ARG1"> <block type="text" id="J7GSO0rc1X(KeTOL=Xls"> <field name="TEXT">secret</field> </block> </value> <value name="ARG2"> <block type="text" id="T$`q`y/%ropKl|lMHK?P"> <field name="TEXT">100000000001</field> </block> </value> <value name="ARG3"> <block type="logic_boolean" id="[UWX:.A4hUor|porzCvI"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="variables_set" id="=)wSr3xbI=1A@.];8U),"> <field name="VAR" id="XqgTC0Gq.[lG$:/oqv`I">inverterOpenDtuDplAktiv</field> <value name="VALUE"> <block type="logic_boolean" id="k5cg]$m2Q[1kfk=JLdzJ"> <field name="BOOL">FALSE</field> </block> </value> </block> </next> </block> </statement> </block> </next> </block> </next> </block> <block type="procedures_defcustomnoreturn" id="N-:Q%c)r8Apfxc1G|4[!" x="-262" y="113"> <mutation statements="false"> <arg name="OpDtuIp" varid="~ftPCTQp~2L#94MM5QcD"></arg> <arg name="password" varid="w5c+Rte!:_MdazYVm|ha"></arg> <arg name="serial" varid="Q7P2Gs`1rw|7mvBOmP=|"></arg> <arg name="enabled" varid="ji}d8u#ATjk`g7/9*64p"></arg> </mutation> <field name="NAME">setDpl_InverterState</field> <field name="SCRIPT">Ly8gaW9Ccm9rZXIgSmF2YVNjcmlwdC1GdW5jdGlvbiBzZXREcGxfSW52ZXJ0ZXJTdGF0ZShPcER0dUlwLCBwYXNzd29yZCwgc2VyaWFsLCBlbmFibGVkKQ0KLy8gKGMpIG1heGNsYXVkaSAwMy4wNi4yMDI2XzA5LjE1aCBmw7xyIGRhcyBpb0Jyb2tlci1Gb3J1bQ0KLy8gSW4gbWVtb3J5IG9mIERhaXN5IDAyLjA1LjI0IOKAkyBtaXNzIHlvdS4NCi8vIA0KLy8gRUlOIFdPUlQgSU4gRUlHRU5FUiBTQUNIRToNCi8vIERpZXNlKHMpIEZ1bmN0aW9uL1NrcmlwdCBiYXNpZXJ0IGF1ZiB2aWVsZW4gU3R1bmRlbiBUZXN0cyB1bmQgQW5hbHlzZW4uDQovLyBJbiBkZXIgVmVyZ2FuZ2VuaGVpdCB3dXJkZW4gbWVpbmUgRXJrZW5udG5pc3NlIG9mdCBvaG5lIEVyd8OkaG51bmcgaW4gYW5kZXJlIFByb2pla3RlIMO8YmVybm9tbWVuLg0KLy8gSWNoIHRlaWxlIGRpZXNlbiBDb2RlIGdlcm5lLiBXZXIgZGllc2UgTG9naWsgaW4gw7ZmZmVudGxpY2hlIFByb2pla3RlIGludGVncmllcnQsIGlzdCBoZXJ6bGljaCANCi8vIGVpbmdlbGFkZW4g4oCTIGljaCBiaXR0ZSBqZWRvY2ggdW0gZGllIEZhaXJuZXNzLCBkaWUgUXVlbGxlIHp1IG5lbm5lbi4gDQovLyBEYXMgaXN0IGRlciAiTG9obiIgZsO8ciBtZWluZSBaZWl0IHVuZCBGb3JzY2h1bmcuDQogICAgIHRyeSB7DQogICAgICAgIGNvbnN0IGF4aW9zID0gcmVxdWlyZSgnYXhpb3MnKTsNCiAgICAgICAgLy8gYWt0dWVsbGUgS29uZmlnIGFuZm9yZGVybg0KICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldCgNCiAgICAgICAgICAgIGBodHRwOi8vJHtPcER0dUlwfS9hcGkvcG93ZXJsaW1pdGVyL2NvbmZpZ2AsDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgYXV0aDogew0KICAgICAgICAgICAgICAgICAgICB1c2VybmFtZTogJ2FkbWluJywNCiAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICB0aW1lb3V0OiAyMDAwLA0KICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnDQogICAgICAgICAgICB9DQogICAgICAgICk7DQogICAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhOw0KICAgICAgICBsb2coJ2FrdHVlbGxlIERQTC1FaW5zdGVsdW5nZW46ICcgKyBkYXRhKTsNCiAgICAgICAgLy8gNXNlayB0aW1lb3V0DQogICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDAwKSk7DQogICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UoZGF0YSk7DQogICAgICAgIGNvbnN0IGludmVydGVyID0gY29uZmlnLmludmVydGVycy5maW5kKA0KICAgICAgICAgICAgaW52ID0+IFN0cmluZyhpbnYuc2VyaWFsKSA9PT0gU3RyaW5nKHNlcmlhbCkNCiAgICAgICAgKTsNCiAgICAgICAgLy91bmJla2FubnRlIHNlcmlhbA0KICAgICAgICBpZiAoIWludmVydGVyKSB7DQogICAgICAgICAgICBsb2coJ0ludmVydGVyIG5pY2h0IGJla2FubnQuJyk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgaW52ZXJ0ZXIuaXNfZ292ZXJuZWQgPSBlbmFibGVkOw0KICAgICAgICBhd2FpdCBheGlvcy5wb3N0KA0KICAgICAgICAgICAgYGh0dHA6Ly8ke09wRHR1SXB9L2FwaS9wb3dlcmxpbWl0ZXIvY29uZmlnYCwNCiAgICAgICAgICAgICdkYXRhPScgKyBKU09OLnN0cmluZ2lmeShjb25maWcpLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGF1dGg6IHsNCiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6ICdhZG1pbicsDQogICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZA0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgaGVhZGVyczogew0KICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICk7DQogICAgICAgIGxvZyhgSW52ZXJ0ZXIgJHtzZXJpYWx9OiBpc19nb3Zlcm5lZD0ke2VuYWJsZWR9YCk7DQogICAgfSBjYXRjaCAoZXJyKSB7DQogICAgICAgIGxvZyhgRmVobGVyOiAke2Vyci5tZXNzYWdlfWAsICdlcnJvcicpOw0KICAgIH0NCg==</field> <comment pinned="true" h="80" w="160">(de-) aktiviert Inverter in OpenDtuOb-DPL-Steuerung</comment> </block> </xml>
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