no message
This commit is contained in:
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
]
|
||||
},
|
||||
|
||||
@@ -503,9 +503,7 @@ 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
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
?>
|
||||
|
||||
Reference in New Issue
Block a user