From 2eab6b60ec83d922c8ace1ebc0c5fcd8382c8e4b Mon Sep 17 00:00:00 2001 From: "belevo\\mh" Date: Mon, 26 Jan 2026 14:04:35 +0100 Subject: [PATCH] no message --- Bat_EV_SDL/form.json | 10 +++++-- Bat_EV_SDL/module.php | 70 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 70 insertions(+), 10 deletions(-) diff --git a/Bat_EV_SDL/form.json b/Bat_EV_SDL/form.json index 191ac69..dad2635 100644 --- a/Bat_EV_SDL/form.json +++ b/Bat_EV_SDL/form.json @@ -102,8 +102,14 @@ }, { "type": "NumberSpinner", - "name": "SDL_Leistung", - "caption": "SDL_Leistung", + "name": "SDL_Lade_Leistung", + "caption": "SDL_Lade_Leistung", + "suffix": "W" + }, + { + "type": "NumberSpinner", + "name": "SDL_Entlade_Leistung", + "caption": "SDL_Entlade_Leistung", "suffix": "W" }, { diff --git a/Bat_EV_SDL/module.php b/Bat_EV_SDL/module.php index 97365e7..bfc5e21 100644 --- a/Bat_EV_SDL/module.php +++ b/Bat_EV_SDL/module.php @@ -8,7 +8,8 @@ class Bat_EV_SDL extends IPSModule // Properties $this->RegisterPropertyString("Batteries", "[]"); - $this->RegisterPropertyInteger("SDL_Leistung", 0); // W + $this->RegisterPropertyInteger("SDL_Lade_Leistung", 0); + $this->RegisterPropertyInteger("SDL_Entlade_Leistung", 0); // W $this->RegisterPropertyInteger("UpdateInterval", 5); // Minuten // Status @@ -69,11 +70,45 @@ class Bat_EV_SDL extends IPSModule $batteries = []; } + + //-------------------------------------------------- + $sdlTotalW = (float)$this->ReadPropertyInteger("SDL_Leistung"); // W if ($sdlTotalW < 0) $sdlTotalW = 0; $sdlTotalkW = $sdlTotalW / 1000.0; + + + + //--------------------------------------------- + + $sdlTotalLadeW = (float)$this->ReadPropertyInteger("SDL_Lade_Leistung"); // W + if ($sdlTotalLadeW < 0) $sdlTotalLadeW = 0; + + $sdlTotalLadekW = $sdlTotalLadeW / 1000.0; + + + $sdlTotalEntladeW = (float)$this->ReadPropertyInteger("SDL_Entlade_Leistung"); // W + if ($sdlTotalEntladeW < 0) $sdlTotalEntladeW = 0; + + $sdlTotalEntladekW = $sdlTotalEntladeW / 1000.0; + + + + if ($sdlTotalLadekW > $sdlTotalEntladekW) { + $sdlTotalkW = $sdlTotalLadekW; + $mode = 'charge'; + } elseif ($sdlTotalLadekW < $sdlTotalEntladekW) { + $sdlTotalkW = $sdlTotalEntladekW; + $mode = 'discharge'; + } else { + $sdlTotalkW = $sdlTotalEntladekW; + $mode = 'equal'; + } + + //--------------------------------------------- + // 30 Minuten Fenster $hours = 0.5; @@ -93,7 +128,8 @@ class Bat_EV_SDL extends IPSModule $calc = [ "inputs" => [ - "SDL_Leistung_W" => round($sdlTotalW, 0), + "SDL_Entlade_Leistung_W" => round($sdlTotalEntladeW, 0), + "SDL_Lade_Leistung_W" => round($sdlTotalLadeW, 0), "SumBatPower_W" => round($sumBatPowerW, 0), "hours" => $hours ], @@ -151,17 +187,35 @@ class Bat_EV_SDL extends IPSModule continue; } + // Deine Logik: SDL/EV Aufteilung über Leistungsanteil + $sdlShareKW = ($sumBatPowerkW > 0.0) ? ($sdlTotalkW / $sumBatPowerkW * $pBatkW) : 0.0; $evShareKW = $pBatkW - $sdlShareKW; - // untere Grenze für SDL (wichtig: zuerst setzen, dann clamp) - $underKWh = $sdlShareKW * $hours; - $underKWh = max(0.0, min($underKWh, $capKWh / 2.0)); - $upKWh = $capKWh - $underKWh; - $SDL_kWh = 2.0 * $underKWh; - $EV_kWH = max(0.0, $capKWh - $SDL_kWh); + if ($mode == 'charge') { + $ver = $sdlTotalLadekW / $sdlTotalEntladekW; + $underKWh = ($sdlShareKW * $hours) / $ver; + $upKWh = $capKWh - ($sdlShareKW * $hours); + } elseif ($mode == 'discharge' ) { + + $ver = $sdlTotalEntladekW / $sdlTotalLadekW; + $underKWh = ($sdlShareKW * $hours) ; + $upKWh = $capKWh - ($sdlShareKW * $hours) / $ver; + + }else { + // untere Grenze für SDL (wichtig: zuerst setzen, dann clamp) + $underKWh = $sdlShareKW * $hours; + $underKWh = max(0.0, min($underKWh, $capKWh / 2.0)); + + $upKWh = $capKWh - $underKWh; + $SDL_kWh = 2.0 * $underKWh; + $EV_kWH = max(0.0, $capKWh - $SDL_kWh); + } + + + $real_kWh = $capKWh / 100.0 * $socPct;