<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Script NP-Regelung HMS-800-2t (ODTU) + HM 1950AC (KI)]]></title><description><![CDATA[<p dir="auto">Hallo zusammen,<br />
dieses Forum hat mir schon bei so manchen Problemen geholfen.<br />
Jetzt habe ich mal mit Hilfe der KI ein Script erstellt, welches folgende Bedingungen hatte:<br />
Solaranlage Erzeugung Datenpunkt:<br />
opendtu.0.total.power (in W)<br />
Solaranlage Limit: opendtu.0.----.power_control.current_limit_absolute (in W)<br />
Netzeinspeise Datenpunkt: shelly.0.shelly3em63g3#----#1.EM0.ActivePowerC (in W)<br />
Battery Datenpunkt: (negativer Wert bei Aufladung der Battery, positiver Wert bei Stromabgabe ins Netz):<br />
hoymiles-ms.0.MSA-----.realtime.bat_p (in W)<br />
Battery Steuerpunkt: (negativer Wert bei Aufladung der Battery, positiver Wert bei Stromabgabe ins Netz):<br />
opendtu.0.----.power_control.limit_nonpersistent_absolute (in W)<br />
Battery Akku Status: hoymiles-ms.0.MSA-----.realtime.soc (in %)</p>
<p dir="auto">Ziel: Nullpunkteinspeisung</p>
<ul>
<li>als erstes soll immer die Solaranlage produzieren,</li>
<li>wenn die Leisung der Solaranlage nicht ausreicht - differenz von Battery,</li>
<li>wenn Solaranlage mehr Strom als nötig produziert - Einspeisung in Battery</li>
<li>wenn Battery voll (100%), muss die Solaranlage limitiert werden</li>
</ul>
<p dir="auto">Tagsüber funktioniert das erstmal, abends werden wir sehen.<br />
Vielleicht habt ihr noch Ideen, Vorschläge, Änderungen?</p>
<pre><code>// =====================
// Solar / Batterie Nulleinspeisung
// =====================

const DP_PV_POWER = 'opendtu.0.total.power';
const DP_PV_LIMIT = 'opendtu.0.______.power_control.limit_nonpersistent_absolute';

const DP_GRID = 'shelly.0.shelly3em63g3#______#1.EM0.ActivePowerC';

const DP_BAT_POWER = 'hoymiles-ms.0.MSA-______.realtime.bat_p';
const DP_BAT_CTRL  = 'hoymiles-ms.0.MSA-______.power_ctrl.set';
const DP_BAT_SOC   = 'hoymiles-ms.0.MSA-______.realtime.soc';


// =====================
// Einstellungen
// =====================

// +1 = positiver Netz-Wert bedeutet Einspeisung
// -1 = negativer Netz-Wert bedeutet Einspeisung
const GRID_SIGN = -1;

// Zielbereich um 0 W
const DEADBAND = 30;

// Batterie-Limits anpassen!
const BAT_MAX_CHARGE = -800;     // max. Laden, negativer Wert
const BAT_MAX_DISCHARGE = 500;   // max. Entladen, positiver Wert

// PV-Limit
const PV_MAX_LIMIT = 800;       // maximale erlaubte PV-Leistung
const PV_MIN_LIMIT = 50;

// Regelung
const INTERVAL_MS = 5000;
const STEP_BAT = 80;             // max Änderung Batterie pro Regelzyklus
const STEP_PV_LIMIT = 100;       // max Änderung PV-Limit pro Regelzyklus


function num(id, def = 0) {
    const s = getState(id);
    const v = s ? Number(s.val) : def;
    return isNaN(v) ? def : v;
}

function clamp(v, min, max) {
    return Math.max(min, Math.min(max, v));
}

function moveStep(current, target, step) {
    if (target &gt; current + step) return current + step;
    if (target &lt; current - step) return current - step;
    return target;
}

function round(v) {
    return Math.round(v);
}


// =====================
// Hauptregelung
// =====================

function regulateSolarBattery() {
    const pvPower = num(DP_PV_POWER);
    const pvLimit = num(DP_PV_LIMIT, PV_MAX_LIMIT);

    const gridRaw = num(DP_GRID);
    const grid = gridRaw * GRID_SIGN;
    // grid &gt; 0 = Einspeisung
    // grid &lt; 0 = Netzbezug

    const batPower = num(DP_BAT_POWER);
    const batSoc = num(DP_BAT_SOC);

    let batTarget = batPower;
    let pvTargetLimit = pvLimit;

    // Batterie voll?
    const batteryFull = batSoc &gt;= 99;

    // 1. Batterie regelt immer zuerst, solange Akku nicht voll
    if (!batteryFull) {

        // PV soll frei produzieren dürfen
        pvTargetLimit = PV_MAX_LIMIT;

        if (Math.abs(grid) &gt; DEADBAND) {
            // Einspeisung positiv -&gt; Batterie stärker laden
            // Netzbezug negativ -&gt; Batterie stärker entladen
            batTarget = batPower - grid;
        }

        batTarget = clamp(batTarget, BAT_MAX_CHARGE, BAT_MAX_DISCHARGE);
        batTarget = moveStep(batPower, batTarget, STEP_BAT);

    } else {

        // Akku voll: Batterie nicht mehr laden
        if (batPower &lt; 0) {
            batTarget = 0;
        }

        // Bei Einspeisung PV begrenzen
        if (grid &gt; DEADBAND) {
            pvTargetLimit = pvPower - grid;
            pvTargetLimit = clamp(pvTargetLimit, PV_MIN_LIMIT, PV_MAX_LIMIT);
            pvTargetLimit = moveStep(pvLimit, pvTargetLimit, STEP_PV_LIMIT);
        }

        // Wenn keine Einspeisung mehr, PV-Limit langsam wieder erhöhen
        if (grid &lt; -DEADBAND) {
            pvTargetLimit = moveStep(pvLimit, PV_MAX_LIMIT, STEP_PV_LIMIT);
        }
    }

    setState(DP_BAT_CTRL, round(batTarget), false);
    setState(DP_PV_LIMIT, round(pvTargetLimit), false);

    log(
        `SolarRegelung | PV=${pvPower}W | Grid=${grid}W | Bat=${batPower}W | SOC=${batSoc}% | BatSet=${round(batTarget)}W | PVLimit=${round(pvTargetLimit)}W`
    );
}


// alle 5 Sekunden regeln
setInterval(regulateSolarBattery, INTERVAL_MS);

// Start direkt ausführen
regulateSolarBattery();
</code></pre>
]]></description><link>https://forum.iobroker.net/topic/84804/script-np-regelung-hms-800-2t-odtu-hm-1950ac-ki</link><generator>RSS for Node</generator><lastBuildDate>Sat, 20 Jun 2026 12:53:47 GMT</lastBuildDate><atom:link href="https://forum.iobroker.net/topic/84804.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 18 Jun 2026 11:05:14 GMT</pubDate><ttl>60</ttl></channel></rss>