no message
This commit is contained in:
+118
-1
@@ -262,6 +262,8 @@ class Bat_EV_SDL_V2 extends IPSModule
|
|||||||
];
|
];
|
||||||
|
|
||||||
$this->SetIdentValue("CalcJSON", json_encode($calc, JSON_PRETTY_PRINT));
|
$this->SetIdentValue("CalcJSON", json_encode($calc, JSON_PRETTY_PRINT));
|
||||||
|
$this->ApplySetpoints();
|
||||||
|
|
||||||
|
|
||||||
} catch (Throwable $e) {
|
} catch (Throwable $e) {
|
||||||
$this->SendDebug("Update ERROR", $e->getMessage() . " @ " . $e->getFile() . ":" . $e->getLine(), 0);
|
$this->SendDebug("Update ERROR", $e->getMessage() . " @ " . $e->getFile() . ":" . $e->getLine(), 0);
|
||||||
@@ -437,6 +439,121 @@ class Bat_EV_SDL_V2 extends IPSModule
|
|||||||
|
|
||||||
return $soc;
|
return $soc;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
public function ApplySetpoints(): void
|
||||||
|
{
|
||||||
|
$pEvW = (float) GetValue($this->GetIDForIdent("Nennleistung_Soll_EV"));
|
||||||
|
$pSdlW = (float) GetValue($this->GetIDForIdent("Nennleistung_Soll_SDL"));
|
||||||
|
//Diverenz zwischen EV und SDl berechnen
|
||||||
|
|
||||||
|
|
||||||
|
// Methode für priorisierung
|
||||||
|
$distribution = $this->CalculateBatteryDistribution($pEvW,$pSdlW);
|
||||||
|
|
||||||
|
|
||||||
|
$this->WriteBatteryPowerSetpoints($distribution);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private function CalculateBatteryDistribution(float $pEvW, float $pSdlW): array
|
||||||
|
{
|
||||||
|
|
||||||
|
// Holt das berechnete Json aus, also das Debug json, wo in der Konsole angezeigt wird
|
||||||
|
$calcJsonId = $this->GetIDForIdent("CalcJSON");
|
||||||
|
$calc = json_decode((string)GetValue($calcJsonId), true);
|
||||||
|
|
||||||
|
if (!is_array($calc) || empty($calc["batteries"])) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($calc["batteries"] as $bat) {
|
||||||
|
|
||||||
|
$idx = (int)$bat["idx"];
|
||||||
|
$typ = (string)$bat["typ"];
|
||||||
|
|
||||||
|
$evSoc = (float)$bat["EV_SOC"];
|
||||||
|
$sdlSoc = (float)$bat["SDL_SOC"];
|
||||||
|
|
||||||
|
$sdlChargeKW = (float)$bat["SDL_Charge_kW"];
|
||||||
|
$sdlDischargeKW = (float)$bat["SDL_Discharge_kW"];
|
||||||
|
$evChargeKW = (float)$bat["EV_Charge_kW"];
|
||||||
|
$evDischargeKW = (float)$bat["EV_Discharge_kW"];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Return sieht so aus:
|
||||||
|
return :[
|
||||||
|
"idx" => 0,
|
||||||
|
"typ":"1",
|
||||||
|
"chargeW" => 0.0,
|
||||||
|
"dischargeW" => 3000.0
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"idx" => 1,
|
||||||
|
"typ":"2",
|
||||||
|
"chargeW" => 0.0,
|
||||||
|
"dischargeW" => 1000.0
|
||||||
|
];
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
$batteriesCfg = json_decode($this->ReadPropertyString("Batteries"), true);
|
||||||
|
if (!is_array($batteriesCfg) || empty($batteriesCfg)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($distribution as $d) {
|
||||||
|
|
||||||
|
// --- Batterie bestimmen ---
|
||||||
|
$idx = (int)($d["idx"] ?? -1);
|
||||||
|
if ($idx < 0 || !isset($batteriesCfg[$idx])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$cfg = $batteriesCfg[$idx];
|
||||||
|
$typ = (string)($d["typ"] ?? ($cfg["typ"] ?? ("Bat " . ($idx + 1))));
|
||||||
|
|
||||||
|
// --- Sollwerte (Watt) ---
|
||||||
|
$chargeW = max(0.0, (float)($d["chargeW"] ?? 0.0));
|
||||||
|
$dischargeW = max(0.0, (float)($d["dischargeW"] ?? 0.0));
|
||||||
|
|
||||||
|
// 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)",
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
|
|||||||
Reference in New Issue
Block a user