Energiemanager optimiert, Easee-Ladestation eingefügt.

This commit is contained in:
dh
2025-08-07 08:45:19 +02:00
parent 6ffada6d29
commit aa150f58be
18 changed files with 1347 additions and 232 deletions
+107 -39
View File
@@ -110,12 +110,12 @@ class HauptManager extends IPSModule
}
// Addiere die aktuell bereits verwendete Leistung auf, um sie bei der verteilung zu berücksichtigen
if(in_array(0, $user["PowerSteps"], true)){
//if(in_array(0, $user["PowerSteps"], true)){
// Addiere die aktuell bereits verwendete Leistung auf, um sie bei der verteilung zu berücksichtigen
$totalAktuelle_Leistung += ($user["Aktuelle_Leistung"]- $user["Leistung_Delta"]);
}
//}
}
// Berücksichtigung der bereits verteilten Leistungen (nachher kann dafür wieder bei 0 begonnen werden zu verteilen)
@@ -206,9 +206,11 @@ class HauptManager extends IPSModule
if (empty($samePriorityUsers)) {
continue;
}
$withZero = [];
$withoutZero = [];
// Verbraucher die nicht 0 Annhemen können, bekommen einfach den tiefsten wert
$withoutZeroHigh = [];
$withoutZeroLow = [];
/* Alter Verteilalgor. zu testzwecken auskommentiert, wird dann gelöscht wenns funktioniert.
foreach ($samePriorityUsers as $entry) {
if (min($entry["PowerSteps"]) <= 0) {
$withZero[] = $entry;
@@ -217,18 +219,55 @@ class HauptManager extends IPSModule
}
}
// Verbraucher die nicht 0 annhemen können erhalten nun den minimalwert
if (!empty($withoutZero)) {
foreach ($withoutZero as $entry) {
$resultArray[] = [
'user' => $user['InstanceID'],
'Writeback' => $user['Writeback'],
'Set_Leistung' => min($entry["PowerSteps"])
];
$instanceID = $entry["InstanceID"];
$minPowerStep = min($entry["PowerSteps"]);
IPS_RequestAction($instanceID,"SetAktuelle_Leistung",$minPowerStep);
//$remainingPower -= $entry["Aktuelle_Leistung"];
}
}
*/
/* Neuer Block */
foreach ($samePriorityUsers as $entry) {
$withZero[] = $entry;
if (min($entry["PowerSteps"]) > 0) {
$withoutZeroHigh[] = $entry;
}
if (max($entry["PowerSteps"]) < 0) {
$withoutZeroLow[] = $entry;
}
}
// Verbraucher die nicht 0 annhemen können erhalten nun den minimalwert
if (!empty($withoutZeroHigh)) {
foreach ($withoutZeroHigh as $entry) {
$instanceID = $entry["InstanceID"];
$minPowerStep = min($entry["PowerSteps"]);
$remainingPower -= $minPowerStep;
}
}
// Verbraucher die nicht 0 annhemen können erhalten nun den minimalwert
if (!empty($withoutZeroLow)) {
foreach ($withoutZeroLow as $entry) {
$instanceID = $entry["InstanceID"];
$minPowerStep = max($entry["PowerSteps"]);
$remainingPower += $minPowerStep;
}
}
/* Neuer Block Ende */
// Nun die verteilen, die 0 erhalten können.
$samePriorityUsers = $withZero;
@@ -299,22 +338,36 @@ class HauptManager extends IPSModule
// Prüfen, dass jeder User mindestens seinen minimalwert an Leistung bekommt
foreach ($userEnergyProv as $userInstanceID => $leistung) {
$minimalleitsung = min(
array_column(
array_filter($allSteps, function ($entry) use (
$userInstanceID
) {
return $entry["user"] == $userInstanceID;
}),
"step"
)
);
$positiveValues = array_filter(
array_column(
$samePriorityUsers,
'PowerSteps',
'InstanceID'
)[$userInstanceID],
function ($l) {
return $l >= 0;
}
);
// 2. Falls keine Werte ≥ 0 vorhanden sind, auf 0 zurückfallen
$fallbackMinimum = empty($positiveValues)
? max( array_column(
$samePriorityUsers,
'PowerSteps',
'InstanceID'
)[$userInstanceID])
: min($positiveValues);
IPS_LogMessage("Manager", $userInstanceID);
IPS_LogMessage("Manager", $minimalleitsung);
IPS_LogMessage("Manager", $remainingPower);
// Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen
$leistung = max($leistung["Set_Leistung"], $minimalleitsung);
// 3. minimalleistung = dieser Fallback
$minimalleistung = $fallbackMinimum;
// 4. den höheren Wert wählen und für IPS negativieren
//$schreibleistung = max($leistung, $minimalleistung);
if (abs($leistung["Set_Leistung"]) > abs($minimalleistung)) {
$leistung = $leistung["Set_Leistung"];
} else {
$leistung = $minimalleistung;
}
// Methode SetAktuelle_Leistung für jeden Verbraucher mit der entsprechenden Energie aufrufen
@@ -387,22 +440,37 @@ class HauptManager extends IPSModule
// Prüfen, dass jeder User mindestens seinen minimalwert an Leistung bekommt
foreach ($userEnergyProv as $userInstanceID => $leistung) {
$minimalleitsung = min(
array_column(
array_filter($allSteps, function ($entry) use (
$userInstanceID
) {
return $entry["user"] == $userInstanceID;
}),
"step"
)
);
$positiveValues = array_filter(
array_column(
$samePriorityUsers,
'PowerSteps',
'InstanceID'
)[$userInstanceID],
function ($l) {
return $l <= 0;
}
);
// 2. Falls keine Werte ≥ 0 vorhanden sind, auf 0 zurückfallen
$fallbackMinimum = empty($positiveValues)
? min( array_column(
$samePriorityUsers,
'PowerSteps',
'InstanceID'
)[$userInstanceID])
: max($positiveValues);
IPS_LogMessage("Manager", $userInstanceID);
IPS_LogMessage("Manager", $minimalleitsung);
IPS_LogMessage("Manager", $remainingPower);
// 3. minimalleistung = dieser Fallback
$minimalleistung = $fallbackMinimum;
// 4. den höheren Wert wählen und für IPS negativieren
//$schreibleistung = max($leistung, $minimalleistung);
if (abs($leistung["Set_Leistung"]) > abs($minimalleistung)) {
$leistung = $leistung["Set_Leistung"];
} else {
$leistung = $minimalleistung;
}
// Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen
$leistung = max($leistung["Set_Leistung"], $minimalleitsung)*-1;
// Methode SetAktuelle_Leistung für jeden Verbraucher mit der entsprechenden Energie aufrufen