diff --git a/Bat_EV_SDL_V3_Beta/module.php b/Bat_EV_SDL_V3_Beta/module.php index 8b13ab4..feb45be 100644 --- a/Bat_EV_SDL_V3_Beta/module.php +++ b/Bat_EV_SDL_V3_Beta/module.php @@ -116,6 +116,23 @@ class Bat_EV_SDL_V3_Beta extends IPSModule $EV_kWh_ges = 0.0; $totalCapKWh = 0.0; + // SDL-Gesamtkapazität aus Cache vorab berechnen + $SDL_kWh_ges_cfg = 0.0; + + foreach ($cache["bats"] as $bc) { + $SDL_kWh_ges_cfg += (float)($bc["SDL_kWh_total"] ?? 0.0); + } + + // aktueller virtueller SDL-Stand + $sdlVirtPct = ($SDL_kWh_ges_cfg > 0.0) + ? ($Esdl_kWh / $SDL_kWh_ges_cfg * 100.0) + : 0.0; + + $sdlVirtPct = max(0.0, min(100.0, $sdlVirtPct)); + + $sdlIsEmpty = ($sdlVirtPct <= 0.1); + $sdlIsFull = ($sdlVirtPct >= 99.9); + foreach ($cache["bats"] as $i => $c) { $capKWh = (float)($c["capKWh"] ?? 0.0); @@ -133,6 +150,24 @@ class Bat_EV_SDL_V3_Beta extends IPSModule $typ = (string)($c["typ"] ?? ("Bat " . ($i + 1))); $underKWh = (float)($c["underKWh"] ?? 0.0); $upKWh = (float)($c["upKWh"] ?? 0.0); + + // Standard: EV darf nur zwischen underKWh und upKWh arbeiten + $evUnderKWh = $underKWh; + $evUpKWh = $upKWh; + + // Wenn SDL virtuell leer ist, darf EV die untere SDL-Reserve verwenden + if ($sdlIsEmpty) { + $evUnderKWh = 0.0; + } + + // Wenn SDL virtuell voll ist, darf EV die obere SDL-Reserve verwenden + if ($sdlIsFull) { + $evUpKWh = $capKWh; + } + + $evWindowKWh = max(0.0, $evUpKWh - $evUnderKWh); + + $SDL_kWh = (float)($c["SDL_kWh_total"] ?? 0.0); $EV_kWh = (float)($c["EV_kWh_total"] ?? 0.0); @@ -155,8 +190,8 @@ class Bat_EV_SDL_V3_Beta extends IPSModule if ($underKWh <= $real_kWh && $real_kWh <= $upKWh) { // EV_SOC im Fenster dynamisch (0..100) - if ($EV_kWh > 0.0) { - $EV_SOC = 100.0 * ($real_kWh - $underKWh) / $EV_kWh; + if ($evWindowKWh > 0.0) { + $EV_SOC = 100.0 * ($real_kWh - $evUnderKWh) / $evWindowKWh; } else { $EV_SOC = 0.0; } @@ -176,10 +211,10 @@ class Bat_EV_SDL_V3_Beta extends IPSModule $sdlChKW = $sdlShareKW_laden; $evChKW = $evShareKW_laden; - $real_kWh_ev = $real_kWh - $underKWh; - $real_kWh_sdl = $underKWh; + $real_kWh_ev = max(0.0, min($evWindowKWh, $real_kWh - $evUnderKWh)); + $real_kWh_sdl = $real_kWh - $real_kWh_ev; - } elseif ($real_kWh > $upKWh) { + } elseif ($real_kWh > $evUpKWh) { // Obere Grenze: EV = 100% $EV_SOC = 100.0; @@ -202,7 +237,7 @@ class Bat_EV_SDL_V3_Beta extends IPSModule $real_kWh_ev = $capKWh - ($capKWh - $upKWh + $underKWh); $real_kWh_sdl = ($capKWh - $upKWh + $underKWh) - ($capKWh - $real_kWh); - } else { // $real_kWh < $underKWh + } elseif ($real_kWh < $evUnderKWh) { // Untere Grenze: EV = 0% $EV_SOC = 0.0;