diff --git a/Manager/module.php b/Manager/module.php index 6b612a9..1888618 100644 --- a/Manager/module.php +++ b/Manager/module.php @@ -224,69 +224,135 @@ class Manager extends IPSModule $userEnergyProv = []; $userEnergyProv = array_fill_keys(array_column($samePriorityUsers, "InstanceID"), 0); // Initialisierung für jeden Benutzer auf 0 setzen - // Alle Schritte der Benutzer in einem Array sammeln - $allSteps = []; - foreach ($samePriorityUsers as $user) { - foreach ($user["PowerSteps"] as $step) { - $allSteps[] = [ - "user" => $user["InstanceID"], - "step" => $step, - ]; + + if($remainingPower>=0){ + // Alle Schritte der Benutzer in einem Array sammeln + $allSteps = []; + foreach ($samePriorityUsers as $user) { + foreach ($user["PowerSteps"] as $step) { + if($step>=0){ + $allSteps[] = [ + "user" => $user["InstanceID"], + "step" => $step, + ];} + } } - } - // Sortiere die Schritte nach Größe - usort($allSteps, function ($a, $b) { - return $a["step"] <=> $b["step"]; - }); + // Sortiere die Schritte nach Größe + usort($allSteps, function ($a, $b) { + return $a["step"] <=> $b["step"]; + }); - // Iteriere durch alle Schritte - foreach ($allSteps as $entry) { - $user = $entry["user"]; - $powerstep = $entry["step"]; - // Überprüfe, ob noch genügend verbleibende Energie für den nächsten Schritt vorhanden ist - if ($remainingPower >= $powerstep - $userEnergyProv[$user] || ($remainingPower<0 && $powerstep<0)) { // oder bedingung testen - // Aktualisiere die verbleibende Energie und die bereitgestellte Energie für den Benutzer - $remainingPower -= $powerstep - $userEnergyProv[$user]; - $userEnergyProv[$user] = $powerstep; + //if remaining power >0 + // Iteriere durch alle Schritte + foreach ($allSteps as $entry) { + $user = $entry["user"]; + $powerstep = $entry["step"]; + + // Überprüfe, ob noch genügend verbleibende Energie für den nächsten Schritt vorhanden ist + if ($remainingPower >= $powerstep - $userEnergyProv[$user]) { // oder bedingung testen + // Aktualisiere die verbleibende Energie und die bereitgestellte Energie für den Benutzer + $remainingPower -= $powerstep - $userEnergyProv[$user]; + $userEnergyProv[$user] = $powerstep; + } + } - - } - // 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" - ) - ); + //else - IPS_LogMessage("Manager", $userInstanceID); - IPS_LogMessage("Manager", $minimalleitsung); - IPS_LogMessage("Manager", $remainingPower); - IPS_LogMessage("Manager", $leistung); - // Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen - if($leistung <= $remainingPower){ + + // mache invertierte verteilung + + + // 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" + ) + ); + + // Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen $leistung = max($leistung, $minimalleitsung); - }elseif($remainingPower<=$minimalleitsung){ - $leistung = min($leistung, $minimalleitsung); - } - - // Methode SetAktuelle_Leistung für jeden Verbraucher mit der entsprechenden Energie aufrufen - if (IPS_InstanceExists($userInstanceID)) { - IPS_RequestAction($userInstanceID,"SetAktuelle_Leistung",$leistung); - IPS_LogMessage("Manager", "aufgerufen setleistung normal"); + + // Methode SetAktuelle_Leistung für jeden Verbraucher mit der entsprechenden Energie aufrufen + if (IPS_InstanceExists($userInstanceID)) { + IPS_RequestAction($userInstanceID,"SetAktuelle_Leistung",$leistung); + IPS_LogMessage("Manager", "aufgerufen setleistung normal"); + } } } + else{ + // Alle Schritte der Benutzer in einem Array sammeln + $allSteps = []; + foreach ($samePriorityUsers as $user) { + foreach ($user["PowerSteps"] as $step) { + if($step<=0){ + $allSteps[] = [ + "user" => $user["InstanceID"], + "step" => -1*$step, + ];} + } + } + + // Sortiere die Schritte nach Größe + usort($allSteps, function ($a, $b) { + return $b["step"] <=> $a["step"]; + }); + + + $remainingPower = $remainingPower *-1; + // Iteriere durch alle Schritte + foreach ($allSteps as $entry) { + $user = $entry["user"]; + $powerstep = $entry["step"]; + + // Überprüfe, ob noch genügend verbleibende Energie für den nächsten Schritt vorhanden ist + if ($remainingPower >= $powerstep - $userEnergyProv[$user]) { // oder bedingung testen + // Aktualisiere die verbleibende Energie und die bereitgestellte Energie für den Benutzer + $remainingPower -= $powerstep - $userEnergyProv[$user]; + $userEnergyProv[$user] = $powerstep; + } + + } + + + // 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" + ) + ); + + // Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen + $leistung = max($leistung, $minimalleitsung); + + + + // Methode SetAktuelle_Leistung für jeden Verbraucher mit der entsprechenden Energie aufrufen + if (IPS_InstanceExists($userInstanceID)) { + IPS_RequestAction($userInstanceID,"SetAktuelle_Leistung",$leistung*-1); + IPS_LogMessage("Manager", "aufgerufen setleistung normal"); + + } + } + } + } diff --git a/library.json b/library.json index 5c4278a..c35a3af 100644 --- a/library.json +++ b/library.json @@ -6,7 +6,7 @@ "compatibility": { "version": "7.1" }, - "version": "1.172", + "version": "1.173", "build": 0, "date": 0 } \ No newline at end of file