From b57cef1bec85492f0fd1a86f046f4998eeae0ce9 Mon Sep 17 00:00:00 2001 From: "belevo\\mh" Date: Wed, 29 Apr 2026 08:37:42 +0200 Subject: [PATCH] no message --- Bat_EV_SDL_V3_Beta/module.php | 65 +++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/Bat_EV_SDL_V3_Beta/module.php b/Bat_EV_SDL_V3_Beta/module.php index 83de37f..de57dc1 100644 --- a/Bat_EV_SDL_V3_Beta/module.php +++ b/Bat_EV_SDL_V3_Beta/module.php @@ -38,6 +38,7 @@ class Bat_EV_SDL_V3_Beta extends IPSModule $this->SetTimerInterval("UpdateTimer", ($intervalSec > 0) ? $intervalSec * 1000 : 0); // Cache neu bauen (force) $this->BuildBatteryCache(true); + $this->ResetSDLTo50Percent(); $this->Update(); } public function RequestAction($Ident, $Value) @@ -89,12 +90,6 @@ class Bat_EV_SDL_V3_Beta extends IPSModule $Esdl_kWh = 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); - } // Beim allerersten Lauf NICHT mit 0 % starten, // sondern virtuell auf Mitte setzen. @@ -362,35 +357,26 @@ class Bat_EV_SDL_V3_Beta extends IPSModule $intHash = $cacheHash; } - // Wenn Hash gewechselt hat => Definition von SDL-Fenster hat sich geändert - if ($cacheHash !== "" && $cacheHash !== $intHash) { + if ($cacheHash !== "" && $cacheHash !== $intHash) { - // Physikalisches Resync: passt sofort zu den aktuellen SoCs / neuem SDL-Fenster - $Esdl_kWh = $real_kWh_sdl_ges; + // Bei Cache-/SDL-Leistungsänderung wieder auf 50 % + $Esdl_kWh = $SDL_kWh_ges_cfg * 0.5; - // Optional: Zeitstempel neu setzen, damit dt nicht "nachläuft" - $lastTs = $now; - $this->SetBuffer("Int_LastTs", (string)$now); + $lastTs = $now; + $this->SetBuffer("Int_LastTs", (string)$now); - // Hash aktualisieren - $this->SetBuffer("Int_CFG_HASH", $cacheHash); + $this->SetBuffer("Int_CFG_HASH", $cacheHash); + $this->SetBuffer("Int_Init_SDL", "1"); - // Optional: Init-Flag setzen (damit klar ist: Konto ist gültig) - $this->SetBuffer("Int_Init_SDL", "1"); + $this->SendDebug("SDL", "Reset wegen CacheHash-Change auf 50%: Esdl_kWh=" . round($Esdl_kWh, 3), 0); + } - $this->SendDebug("SDL", "Resync wegen CacheHash-Change: Esdl_kWh=" . round($Esdl_kWh, 3), 0); - } - // Init SDL-Konto einmalig auf physikalische Referenz (nur beim ersten Lauf) - if ($this->GetBufferSafe("Int_Init_SDL") !== "1") { - $Esdl_kWh = $real_kWh_sdl_ges; - $this->SetBuffer("Int_Init_SDL", "1"); - } // Init SDL-Konto einmalig auf physikalische Referenz (nur beim ersten Lauf) if ($this->GetBufferSafe("Int_Init_SDL") !== "1") { - $Esdl_kWh = $real_kWh_sdl_ges; + $Esdl_kWh = $SDL_kWh_ges_cfg * 0.5; $this->SetBuffer("Int_Init_SDL", "1"); } @@ -991,5 +977,34 @@ private function WriteByVendorRegistersSingleMode(string $typ, array $cfg, float // $setInt($varMode, 0); } +private function ResetSDLTo50Percent(): void +{ + $cache = json_decode($this->GetBufferSafe("BatCacheJSON"), true); + + if (!is_array($cache) || empty($cache["bats"])) { + return; + } + + $sdlKWhTotal = 0.0; + + foreach ($cache["bats"] as $bat) { + $sdlKWhTotal += (float)($bat["SDL_kWh_total"] ?? 0.0); + } + + if ($sdlKWhTotal <= 0.0) { + return; + } + + $this->SetBuffer("Int_E_SDL_kWh", (string)($sdlKWhTotal * 0.5)); + $this->SetBuffer("Int_Init_SDL", "1"); + $this->SetBuffer("Int_LastTs", (string)microtime(true)); + + // wichtig: Hash merken, damit direkt danach kein Resync kommt + $cacheHash = (string)$this->GetBufferSafe("BatCacheHash"); + if ($cacheHash !== "") { + $this->SetBuffer("Int_CFG_HASH", $cacheHash); + } +} + } ?>