no message
This commit is contained in:
@@ -61,6 +61,25 @@
|
|||||||
"type":"SelectVariable"
|
"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
|
private function WriteBatteryPowerSetpoints(array $distribution): void
|
||||||
{
|
{
|
||||||
// chargeW und dischargeW sind in W. Wenn good hat muss in kW umrechnen
|
// Batteries-Config laden (enthält register_laden / register_entladen)
|
||||||
|
|
||||||
// Batteries-Config laden (für Variable-IDs + typ)
|
|
||||||
$batteriesCfg = json_decode($this->ReadPropertyString("Batteries"), true);
|
$batteriesCfg = json_decode($this->ReadPropertyString("Batteries"), true);
|
||||||
if (!is_array($batteriesCfg) || empty($batteriesCfg)) {
|
if (!is_array($batteriesCfg) || empty($batteriesCfg)) {
|
||||||
return;
|
return;
|
||||||
@@ -520,6 +518,8 @@ class Bat_EV_SDL_V2 extends IPSModule
|
|||||||
}
|
}
|
||||||
|
|
||||||
$cfg = $batteriesCfg[$idx];
|
$cfg = $batteriesCfg[$idx];
|
||||||
|
|
||||||
|
// typ aus distribution bevorzugen, sonst aus Config
|
||||||
$typ = (string)($d["typ"] ?? ($cfg["typ"] ?? ("Bat " . ($idx + 1))));
|
$typ = (string)($d["typ"] ?? ($cfg["typ"] ?? ("Bat " . ($idx + 1))));
|
||||||
|
|
||||||
// --- Sollwerte (Watt) ---
|
// --- Sollwerte (Watt) ---
|
||||||
@@ -528,32 +528,96 @@ class Bat_EV_SDL_V2 extends IPSModule
|
|||||||
|
|
||||||
// Sicherheitsnetz: nie gleichzeitig laden & entladen
|
// Sicherheitsnetz: nie gleichzeitig laden & entladen
|
||||||
if ($chargeW > 0.0 && $dischargeW > 0.0) {
|
if ($chargeW > 0.0 && $dischargeW > 0.0) {
|
||||||
// Debug-Hinweis, falls Strategie Mist gebaut hat
|
|
||||||
$this->SendDebug(
|
$this->SendDebug(
|
||||||
"WriteBatteryPowerSetpoints",
|
"WriteBatteryPowerSetpoints",
|
||||||
"WARN: charge & discharge gleichzeitig > 0 bei $typ (idx=$idx)",
|
"WARN: charge & discharge gleichzeitig > 0 bei $typ (idx=$idx) -> setze beides 0",
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
$chargeW = 0.0;
|
$chargeW = 0.0;
|
||||||
$dischargeW = 0.0;
|
$dischargeW = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Ziel-Variablen ---
|
// --- Vendor-/Default-Handling über Register schreiben ---
|
||||||
$varCharge = (int)($cfg["powerbat_laden"] ?? 0);
|
$this->WriteByVendorRegisters($typ, $cfg, $chargeW, $dischargeW);
|
||||||
$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));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
// 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