diff --git a/Bat_EV_SDL _V2/form.json b/Bat_EV_SDL _V2/form.json index 82b135b..b6d85a4 100644 --- a/Bat_EV_SDL _V2/form.json +++ b/Bat_EV_SDL _V2/form.json @@ -61,6 +61,25 @@ "type":"SelectVariable" } } + , + { + "caption":"Register Laden", + "name":"register_laden", + "width":"200px", + "add":0, + "edit":{ + "type":"SelectVariable" + } + }, + { + "caption":"Register Entladen", + "name":"register_entladen", + "width":"200px", + "add":0, + "edit":{ + "type":"SelectVariable" + } + } ] }, diff --git a/Bat_EV_SDL _V2/module.php b/Bat_EV_SDL _V2/module.php index 9add5f9..250c13d 100644 --- a/Bat_EV_SDL _V2/module.php +++ b/Bat_EV_SDL _V2/module.php @@ -502,10 +502,8 @@ class Bat_EV_SDL_V2 extends IPSModule } private function WriteBatteryPowerSetpoints(array $distribution): void - { - // chargeW und dischargeW sind in W. Wenn good hat muss in kW umrechnen - - // Batteries-Config laden (für Variable-IDs + typ) + { + // Batteries-Config laden (enthält register_laden / register_entladen) $batteriesCfg = json_decode($this->ReadPropertyString("Batteries"), true); if (!is_array($batteriesCfg) || empty($batteriesCfg)) { return; @@ -520,6 +518,8 @@ class Bat_EV_SDL_V2 extends IPSModule } $cfg = $batteriesCfg[$idx]; + + // typ aus distribution bevorzugen, sonst aus Config $typ = (string)($d["typ"] ?? ($cfg["typ"] ?? ("Bat " . ($idx + 1)))); // --- Sollwerte (Watt) --- @@ -528,32 +528,96 @@ class Bat_EV_SDL_V2 extends IPSModule // Sicherheitsnetz: nie gleichzeitig laden & entladen if ($chargeW > 0.0 && $dischargeW > 0.0) { - // Debug-Hinweis, falls Strategie Mist gebaut hat $this->SendDebug( "WriteBatteryPowerSetpoints", - "WARN: charge & discharge gleichzeitig > 0 bei $typ (idx=$idx)", + "WARN: charge & discharge gleichzeitig > 0 bei $typ (idx=$idx) -> setze beides 0", 0 ); $chargeW = 0.0; $dischargeW = 0.0; } - // --- Ziel-Variablen --- - $varCharge = (int)($cfg["powerbat_laden"] ?? 0); - $varDischarge = (int)($cfg["powerbat_entladen"] ?? 0); - - // --- Schreiben --- - if ($varCharge > 0 && IPS_VariableExists($varCharge)) { - SetValue($varCharge, (int)round($chargeW, 0)); - } - - if ($varDischarge > 0 && IPS_VariableExists($varDischarge)) { - SetValue($varDischarge, (int)round($dischargeW, 0)); - } - + // --- Vendor-/Default-Handling über Register schreiben --- + $this->WriteByVendorRegisters($typ, $cfg, $chargeW, $dischargeW); + // Optionales Debug + $this->SendDebug( + "Setpoints", + "$typ (idx=$idx): charge={$chargeW}W discharge={$dischargeW}W", + 0 + ); } } + private function WriteByVendorRegisters(string $typ, array $cfg, float $chargeW, float $dischargeW): void + { + $typLower = mb_strtolower($typ); + + // Register aus Formular + $regCharge = (int)($cfg["register_laden"] ?? 0); + $regDisch = (int)($cfg["register_entladen"] ?? 0); + + // ----------------------------- + // GOODWE → ein Register, signed + // ----------------------------- + if (strpos($typLower, "goodwe") !== false) { + + if ($regCharge > 0 && IPS_VariableExists($regCharge)) { + $signedW = 0.0; + + if ($chargeW > 0.0) { + $signedW = $chargeW; // Laden → + + } elseif ($dischargeW > 0.0) { + $signedW = -1.0 * $dischargeW; // Entladen → - + } + + SetValue($regCharge, (int)round($signedW, 0)); + } + + // optional: zweites Register auf 0 halten + if ($regDisch > 0 && IPS_VariableExists($regDisch)) { + SetValue($regDisch, 0); + } + + return; + } + + // -------------------------------- + // SOLAREDGE → getrennte Register + // -------------------------------- + if (strpos($typLower, "solaredge") !== false) { + + if ($regCharge > 0 && IPS_VariableExists($regCharge)) { + SetValue($regCharge, (int)round($chargeW, 0)); + } + + if ($regDisch > 0 && IPS_VariableExists($regDisch)) { + SetValue($regDisch, (int)round($dischargeW, 0)); + } + + return; + } + + // -------------------------------- + // DEFAULT → getrennt, fest: 1 / 2 + // -------------------------------- + // Laden = Register 1, Entladen = Register 2 + + if (IPS_VariableExists(1)) { + SetValue(1, (int)round($chargeW, 0)); + } + + if (IPS_VariableExists(2)) { + SetValue(2, (int)round($dischargeW, 0)); + } + + $this->SendDebug( + "WriteByVendorRegisters", + "DEFAULT ($typ): charge={$chargeW}W -> Reg1, discharge={$dischargeW}W -> Reg2", + 0 + ); + } + + } ?>