Energiemanager optimiert, Easee-Ladestation eingefügt.

This commit is contained in:
2025-08-07 08:45:19 +02:00
parent 6ffada6d29
commit aa150f58be
18 changed files with 1347 additions and 232 deletions

View File

@@ -169,12 +169,12 @@ class Manager extends IPSModule
IPS_LogMessage("Manager", "nciht idle");
}
if(in_array(0, $powerSteps, true)){
//if(in_array(0, $powerSteps, true)){
// Addiere die aktuell bereits verwendete Leistung auf, um sie bei der verteilung zu berücksichtigen
$totalAktuelle_Leistung += ($Aktuelle_Leistung-$delta);
}
// }
}
// Berücksichtigung der bereits verteilten Leistungen (nachher kann dafür wieder bei 0 begonnen werden zu verteilen)
@@ -238,8 +238,15 @@ class Manager extends IPSModule
continue;
}
$withZero = [];
$withoutZero = [];
$withoutZeroHigh = [];
$withoutZeroLow = [];
// Verbraucher die nicht 0 Annhemen können, bekommen einfach den tiefsten wert
/* Alter Verteilalgor. zu testzwecken auskommentiert, wird dann gelöscht wenns funktioniert.
foreach ($samePriorityUsers as $entry) {
if (min($entry["PowerSteps"]) <= 0) {
$withZero[] = $entry;
@@ -247,6 +254,7 @@ class Manager extends IPSModule
$withoutZero[] = $entry;
}
}
// Verbraucher die nicht 0 annhemen können erhalten nun den minimalwert
if (!empty($withoutZero)) {
foreach ($withoutZero as $entry) {
@@ -257,6 +265,45 @@ class Manager extends IPSModule
//$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.
@@ -301,35 +348,51 @@ class Manager extends IPSModule
}
//else
// mache invertierte verteilung
// Prüfen, dass jeder User mindestens seinen minimalwert an Leistung bekommt
foreach ($userEnergyProv as $userInstanceID => $leistung) {
$minimalleitsung = min(
// 1. Innerhalb der Schleife: alle nicht-negativen Leistungen sammeln
$positiveValues = array_filter(
array_column(
array_filter($allSteps, function ($entry) use (
$userInstanceID
) {
return $entry["user"] == $userInstanceID;
}),
"step"
)
$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);
// Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen
$leistung = max($leistung, $minimalleitsung);
// 3. minimalleistung = dieser Fallback
$minimalleistung = $fallbackMinimum;
// 4. den höheren Wert wählen und für IPS negativieren
//$schreibleistung = max($leistung, $minimalleistung);
// Methode SetAktuelle_Leistung für jeden Verbraucher mit der entsprechenden Energie aufrufen
if (abs($leistung) > abs($minimalleistung)) {
$schreibleistung = $leistung;
} else {
$schreibleistung = $minimalleistung;
}
// 5. Aktion ausführen
if (IPS_InstanceExists($userInstanceID)) {
IPS_RequestAction($userInstanceID,"SetAktuelle_Leistung",$leistung);
IPS_LogMessage("Manager", "aufgerufen setleistung if". $leistung);
IPS_RequestAction(
$userInstanceID,
"SetAktuelle_Leistung",
$schreibleistung
);
IPS_LogMessage(
"Manager",
"aufgerufen setleistung (Berechnung in foreach): " . $schreibleistung
);
}
}
}
@@ -341,7 +404,7 @@ class Manager extends IPSModule
if($step<=0){
$allSteps[] = [
"user" => $user["InstanceID"],
"Leistung_Delta" => $user["Leistung_Delta"],
//"Leistung_Delta" => $user["Leistung_Delta"],
"step" => -1*$step,
];}
}
@@ -352,7 +415,6 @@ class Manager extends IPSModule
return $a["step"] <=> $b["step"];
});
$remainingPower = $remainingPower *-1;
// Iteriere durch alle Schritte
foreach ($allSteps as $entry) {
@@ -371,28 +433,50 @@ class Manager extends IPSModule
// Prüfen, dass jeder User mindestens seinen minimalwert an Leistung bekommt
foreach ($userEnergyProv as $userInstanceID => $leistung) {
$minimalleitsung = min(
foreach ($userEnergyProv as $userInstanceID => $leistung) {
// 1. Innerhalb der Schleife: alle nicht-negativen Leistungen sammeln
$positiveValues = array_filter(
array_column(
array_filter($allSteps, function ($entry) use (
$userInstanceID
) {
return $entry["user"] == $userInstanceID;
}),
"step"
)
$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);
// Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen
$schreibleistung = max($leistung, $minimalleitsung)*-1;
// 3. minimalleistung = dieser Fallback
$minimalleistung = $fallbackMinimum;
// 4. den höheren Wert wählen und für IPS negativieren
//$schreibleistung = max($leistung, $minimalleistung);
// Methode SetAktuelle_Leistung für jeden Verbraucher mit der entsprechenden Energie aufrufen
if (abs($leistung) > abs($minimalleistung)) {
$schreibleistung = $leistung*-1;
} else {
$schreibleistung = $minimalleistung;
}
// 5. Aktion ausführen
if (IPS_InstanceExists($userInstanceID)) {
IPS_RequestAction($userInstanceID,"SetAktuelle_Leistung",$schreibleistung);
IPS_LogMessage("Manager", "aufgerufen setleistung else ".$schreibleistung);
IPS_RequestAction(
$userInstanceID,
"SetAktuelle_Leistung",
$schreibleistung
);
IPS_LogMessage(
"Manager",
"aufgerufen setleistung (Berechnung in foreach): " . $schreibleistung
);
}
}
}