diff --git a/Manager/module.php b/Manager/module.php index cfe5aff..46dabdc 100644 --- a/Manager/module.php +++ b/Manager/module.php @@ -330,130 +330,16 @@ class Manager extends IPSModule "Timestamp" => time() ]; + RequestAction($this->ReadPropertyInteger("DatenHoch"), json_encode($sendarray)); - // Sortiere die Verbruacher nach Priorität entweder der PV_Prio oder der Peak Prio - usort($filteredVerbraucher, function ($a, $b) use ( - $Is_Peak_Shaving - ) { - $primaryKey = $Is_Peak_Shaving ? "Sperre_Prio" : "PV_Prio"; - // Wenn die Prio geleich ist, sortiere danach welcher verbraucher bisher am wenigsten Energie bekommen hat. - if ($a[$primaryKey] == $b[$primaryKey]) { - return $a["Bezogene_Energie"] <=> $b["Bezogene_Energie"]; - } - return $a[$primaryKey] <=> $b[$primaryKey]; - }); + $answerArray = json_decode(GetValue($this->ReadPropertyInteger("DatenZuruck")), true); - // Primärschlüssel für die Priorität basierend auf dem Parameter auswählen (für sortierung in gruppen anschliessend) - $priorityKey = $Is_Peak_Shaving ? "Sperre_Prio" : "PV_Prio"; - - // Schleife durch alle Prioritäten - $priorities = array_unique( - array_column($filteredVerbraucher, $priorityKey) - ); - $groupedUsers = []; - - foreach ($priorities as $priority) { - $groupedUsers[$priority] = array_filter( - $filteredVerbraucher, - function ($user) use ($priority, $priorityKey) { - return $user[$priorityKey] == $priority; - } - ); - } - // Jetzt werden die energien pro gruppe verteilt (Immer alle pro prio in einer gruppe miteinander) - foreach ($groupedUsers as $priority => $users) { - // Verbraucher mit gleicher Priorität sammeln - $samePriorityUsers = isset($groupedUsers[$priority]) - ? $groupedUsers[$priority] - : []; - - // Wenn keine Verbraucher mit gleicher Priorität vorhanden sind, überspringen - if (empty($samePriorityUsers)) { - continue; - } - $withZero = []; - $withoutZero = []; - // Verbraucher die nicht 0 Annhemen können, bekommen einfach den tiefsten wert - foreach ($samePriorityUsers as $entry) { - if (min($entry["PowerSteps"]) <= 0) { - $withZero[] = $entry; - } else { - $withoutZero[] = $entry; - } - } - // Verbraucher die nicht 0 annhemen können erhalten nun den minimalwert - if (!empty($withoutZero)) { - foreach ($withoutZero as $entry) { - $instanceID = $entry["InstanceID"]; - $minPowerStep = min($entry["PowerSteps"]); - - IPS_RequestAction($instanceID,"SetAktuelle_Leistung",$minPowerStep); - $remainingPower -= $entry["Aktuelle_Leistung"]; - } - } - - // Nun die verteilen, die 0 erhalten können. - $samePriorityUsers = $withZero; - // Array für die verteilte Energie pro User erstellen - $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, - ]; - } - } - - // 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]) { - // 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); - IPS_LogMessage("Manager", "aufgerufen setleistung normal"); - - } - } - } + foreach($answerArray["User"] as $user){} + IPS_RequestAction($user["InstanceID"],"SetAktuelle_Leistung",$user["Set_Leistung"]); + IPS_RequestAction($user["InstanceID"],"GetCurrentData", $answerArray["Is_Peak_Shaving"]); + diff --git a/library.json b/library.json index 2ed3408..6ef4008 100644 --- a/library.json +++ b/library.json @@ -6,7 +6,7 @@ "compatibility": { "version": "7.1" }, - "version": "1.216", + "version": "1.217", "build": 0, "date": 0 } \ No newline at end of file