diff --git a/Manager/module.php b/Manager/module.php index cdd3d1d..a53348b 100644 --- a/Manager/module.php +++ b/Manager/module.php @@ -353,25 +353,29 @@ class Manager extends IPSModule // Prüfen, dass jeder User mindestens seinen minimalwert an Leistung bekommt foreach ($userEnergyProv as $userInstanceID => $leistung) { - // 1. Innerhalb der Schleife: alle nicht-negativen Leistungen sammeln - $positiveValues = array_filter( - $userEnergyProv, - function ($l) { - return $l >= 0; + // 1. Fallback: Wert aus userEnergyProv, der betragsmäßig am nächsten bei 0 liegt + if (!empty($userEnergyProv)) { + $closestToZero = null; + foreach ($userEnergyProv as $val) { + if ($closestToZero === null || abs($val) < abs($closestToZero)) { + $closestToZero = $val; + } } - ); - // 2. Falls keine Werte ≥ 0 vorhanden sind, auf 0 zurückfallen - $fallbackMinimum = empty($positiveValues) - ? 0 - : min($positiveValues); + $minimalleistung = $closestToZero; + } else { + $minimalleistung = 0; + } - // 3. minimalleistung = dieser Fallback - $minimalleistung = $fallbackMinimum; + // 2. Welcher Wert liegt weiter von 0 entfernt? (größerer Absolutwert) + if (abs($leistung) >= abs($minimalleistung)) { + $chosen = $leistung; + } else { + $chosen = $minimalleistung; + } - // 4. den höheren Wert wählen und für IPS negativieren - $schreibleistung = max($leistung, $minimalleistung); + // 3. Für IPS negativieren und schreiben + $schreibleistung = $chosen; - // 5. Aktion ausführen if (IPS_InstanceExists($userInstanceID)) { IPS_RequestAction( $userInstanceID, @@ -380,7 +384,7 @@ class Manager extends IPSModule ); IPS_LogMessage( "Manager", - "aufgerufen setleistung (Berechnung in foreach): " . $schreibleistung + "aufgerufen setleistung (weiter von 0): " . $schreibleistung ); } } @@ -424,25 +428,29 @@ class Manager extends IPSModule // Prüfen, dass jeder User mindestens seinen minimalwert an Leistung bekommt foreach ($userEnergyProv as $userInstanceID => $leistung) { - // 1. Innerhalb der Schleife: alle nicht-negativen Leistungen sammeln - $positiveValues = array_filter( - $userEnergyProv, - function ($l) { - return $l <= 0; + // 1. Fallback: Wert aus userEnergyProv, der betragsmäßig am nächsten bei 0 liegt + if (!empty($userEnergyProv)) { + $closestToZero = null; + foreach ($userEnergyProv as $val) { + if ($closestToZero === null || abs($val) < abs($closestToZero)) { + $closestToZero = $val; + } } - ); - // 2. Falls keine Werte ≥ 0 vorhanden sind, auf 0 zurückfallen - $fallbackMinimum = empty($positiveValues) - ? 0 - : min($positiveValues); + $minimalleistung = $closestToZero; + } else { + $minimalleistung = 0; + } - // 3. minimalleistung = dieser Fallback - $minimalleistung = $fallbackMinimum*-1; + // 2. Welcher Wert liegt weiter von 0 entfernt? (größerer Absolutwert) + if (abs($leistung) >= abs($minimalleistung)) { + $chosen = $leistung*-1; + } else { + $chosen = $minimalleistung; + } - // 4. den höheren Wert wählen und für IPS negativieren - $schreibleistung = max($leistung, $minimalleistung) * -1; + // 3. Für IPS negativieren und schreiben + $schreibleistung = $chosen * -1; - // 5. Aktion ausführen if (IPS_InstanceExists($userInstanceID)) { IPS_RequestAction( $userInstanceID, @@ -451,7 +459,7 @@ class Manager extends IPSModule ); IPS_LogMessage( "Manager", - "aufgerufen setleistung (Berechnung in foreach): " . $schreibleistung + "aufgerufen setleistung (weiter von 0): " . $schreibleistung ); } }