From f74aeda2b02e4fcf6b3b8afc806eb5a747a4141c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=A4fliger?= Date: Mon, 18 Nov 2024 10:28:42 +0100 Subject: [PATCH] =?UTF-8?q?logging=20bei=20manager=20ge=C3=A4ndert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Manager/module.php | 195 +++++++++++++++++++++------------------------ library.json | 2 +- 2 files changed, 94 insertions(+), 103 deletions(-) diff --git a/Manager/module.php b/Manager/module.php index 077c84b..66a0e2b 100644 --- a/Manager/module.php +++ b/Manager/module.php @@ -1,86 +1,85 @@ RegisterPropertyInteger("Peakleistung", 0); $this->RegisterPropertyInteger("Ueberschussleistung", 0); $this->RegisterPropertyInteger("Netzbezug", 0); // Initialisierung mit 0 $this->RegisterPropertyString("EnergyUserList", "[]"); - + // Timer registrieren $this->RegisterTimer("Timer_DistributeEnergy", 5000, 'IPS_RequestAction(' . $this->InstanceID . ', "DistributeEnergy", "");'); } - - public function ApplyChanges() { + + public function ApplyChanges() + { parent::ApplyChanges(); - + // Zusätzliche Konfigurationslogik hier hinzufügen $energyUserList = $this->ReadPropertyString("EnergyUserList"); - IPS_LogMessage("Manager", "EnergyUserList: " . $energyUserList); } - - public function RequestAction($Ident, $Value) { + + public function RequestAction($Ident, $Value) + { switch ($Ident) { case "DistributeEnergy": $this->DistributeEnergy(); break; case "ApplyChanges": $this->ApplyChanges(); - break; + break; default: throw new Exception("Invalid Ident"); } } - - - public function DistributeEnergy() { + + public function DistributeEnergy() + { // Systemvariablen abrufen - $Netzbezug = GetValue(($this->ReadPropertyInteger('Netzbezug'))); + $Netzbezug = GetValue($this->ReadPropertyInteger('Netzbezug')); $Peakleistung = $this->ReadPropertyInteger('Peakleistung'); $Ueberschussleistung = $this->ReadPropertyInteger('Ueberschussleistung'); - IPS_LogMessage("Leistung", $Ueberschussleistung); - IPS_LogMessage("Netzbezug", $Netzbezug); - IPS_LogMessage("Peak", $Peakleistung); - + + // Fallunterscheidung if ($Netzbezug < ($Peakleistung - $Ueberschussleistung) / 2) { - $remainingPower = (-1) * ((-1 * $Ueberschussleistung) + $Netzbezug); + $remainingPower = -1 * (-1 * $Ueberschussleistung + $Netzbezug); $getCurrentDataParam = false; } else { - $remainingPower = ($Peakleistung - $Netzbezug); + $remainingPower = $Peakleistung - $Netzbezug; $getCurrentDataParam = true; } - + // EnergyUserList auslesen und dekodieren $energyUserListJSON = $this->ReadPropertyString("EnergyUserList"); $energyUserList = json_decode($energyUserListJSON, true); - + if (empty($energyUserList)) { // Liste ist leer, daher nichts zu tun return; } - + // Schleife, um IPS_RequestAction für alle Benutzer auszuführen foreach ($energyUserList as $user) { if (IPS_InstanceExists($user['EnergyUser'])) { IPS_RequestAction($user['EnergyUser'], 'GetCurrentData', $getCurrentDataParam); } } - + $filteredEnergyUsers = []; $allIdle = true; // Variable zur Überprüfung, ob alle Benutzer Idle = true sind $totalCurrentPower = 0; // Variable zur Summierung der CurrentPower Werte - + foreach ($energyUserList as $user) { if (!IPS_InstanceExists($user['EnergyUser'])) { - IPS_LogMessage("Manager", "Instance does not exist: " . $user['EnergyUser']); continue; } - + // Werte direkt von der EnergyUser-Instanz abrufen $currentPower = GetValue(IPS_GetObjectIDByIdent('CurrentPower', $user['EnergyUser'])); $usedEnergy = GetValue(IPS_GetObjectIDByIdent('UsedEnergy', $user['EnergyUser'])); @@ -89,8 +88,7 @@ class Manager extends IPSModule { $idle = GetValue(IPS_GetObjectIDByIdent('Idle', $user['EnergyUser'])); $powerStepsJson = GetValue(IPS_GetObjectIDByIdent('PowerSteps', $user['EnergyUser'])); $powerSteps = json_decode($powerStepsJson, true); - IPS_LogMessage("Manager", "PowerSteps for EnergyUser {$user['EnergyUser']}: " . print_r($powerSteps, true)); - + // EnergyUser-Daten zum gefilterten Array hinzufügen $filteredEnergyUsers[] = [ 'EnergyUser' => $user['EnergyUser'], @@ -100,123 +98,116 @@ class Manager extends IPSModule { 'UserPrio' => $userPrio, 'LockPrio' => $lockPrio, 'Idle' => $idle, - 'PowerSteps' => $powerSteps // PowerSteps direkt hier hinzufügen + 'PowerSteps' => $powerSteps, // PowerSteps direkt hier hinzufügen ]; - + // Überprüfen, ob alle Benutzer Idle = true sind if (!$idle) { $allIdle = false; } - - // Add the totalCurrentPower to the remainingPower - $totalCurrentPower += $currentPower; - } - $remainingPower += $totalCurrentPower; - // Debug-Ausgabe der gefilterten EnergyUser-Instanzen - IPS_LogMessage("Manager", "Filtered Energy Users: " . print_r($filteredEnergyUsers, true)); - IPS_LogMessage("Manager", "Remaining Power after adding CurrentPower: " . $remainingPower); - + // Add the totalCurrentPower to the remainingPower + $totalCurrentPower += $currentPower; + } + $remainingPower += $totalCurrentPower; + + if (empty($filteredEnergyUsers)) { return; } - + // Wenn nicht alle Benutzer Idle = true sind, rufe SetCurrentPower mit CurrentPower Werten auf if (!$allIdle) { foreach ($filteredEnergyUsers as $user) { IPS_RequestAction($user['InstanceID'], 'SetCurrentPower', $user['CurrentPower']); - IPS_LogMessage("Manager", "SetCurrentPower for instance {$user['InstanceID']} to {$user['CurrentPower']} (Idle = false)"); } return; } - - // Sortiere die EnergyUser nach Priorität basierend auf dem Parameter - usort($filteredEnergyUsers, function($a, $b) use ($getCurrentDataParam) { - $primaryKey = $getCurrentDataParam ? 'LockPrio' : 'UserPrio'; - - if ($a[$primaryKey] == $b[$primaryKey]) { - return $a['UsedEnergy'] <=> $b['UsedEnergy']; - } - - return $a[$primaryKey] <=> $b[$primaryKey]; - }); - - // Primärschlüssel für die Priorität basierend auf dem Parameter auswählen + + // Sortiere die EnergyUser nach Priorität basierend auf dem Parameter + usort($filteredEnergyUsers, function ($a, $b) use ($getCurrentDataParam) { + $primaryKey = $getCurrentDataParam ? 'LockPrio' : 'UserPrio'; + + if ($a[$primaryKey] == $b[$primaryKey]) { + return $a['UsedEnergy'] <=> $b['UsedEnergy']; + } + + return $a[$primaryKey] <=> $b[$primaryKey]; + }); + + // Primärschlüssel für die Priorität basierend auf dem Parameter auswählen $priorityKey = $getCurrentDataParam ? 'LockPrio' : 'UserPrio'; -// Schleife durch alle Prioritäten -$priorities = array_unique(array_column($filteredEnergyUsers, $priorityKey)); -foreach ($priorities as $priority) { - // EnergyUser mit gleicher Priorität sammeln - $samePriorityUsers = array_filter($filteredEnergyUsers, function ($user) use ($priority, $priorityKey) { - return $user[$priorityKey] == $priority; - }); + // Schleife durch alle Prioritäten + $priorities = array_unique(array_column($filteredEnergyUsers, $priorityKey)); + foreach ($priorities as $priority) { + // EnergyUser mit gleicher Priorität sammeln + $samePriorityUsers = array_filter($filteredEnergyUsers, function ($user) use ($priority, $priorityKey) { + return $user[$priorityKey] == $priority; + }); - // Wenn keine EnergyUser mit gleicher Priorität vorhanden sind, überspringen - if (empty($samePriorityUsers)) { - continue; - } + // Wenn keine EnergyUser mit gleicher Priorität vorhanden sind, überspringen + if (empty($samePriorityUsers)) { + continue; + } - // Array für die verteilte Energie pro User erstellen - $userEnergyProv = array_fill_keys(array_column($samePriorityUsers, 'InstanceID'), 0); // Initialisierung für jeden Benutzer auf 0 setzen + // Array für die verteilte Energie pro User erstellen + $userEnergyProv = array_fill_keys(array_column($samePriorityUsers, 'InstanceID'), 0); // Initialisierung für jeden Benutzer auf 0 setzen + IPS_LogMessage("Manager", $userEnergyProv); - // Alle Schritte der Benutzer in einem Array sammeln - $allSteps = []; - foreach ($samePriorityUsers as $user) { - foreach ($user['PowerSteps'] as $step) { - $allSteps[] = ['user' => $user['InstanceID'], 'step' => $step]; - } - } + // 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']; - }); - IPS_LogMessage("Allesteps", "Alle Steps :" . print_r($allSteps, true)); + // 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]); + $remainingPower -= $powerstep - $userEnergyProv[$user]; $userEnergyProv[$user] = $powerstep; } //else { - // Wenn nicht genug Energie vorhanden ist, setze die verbleibende Energie - // Test dieses break rauszunehmen ... break; + // Wenn nicht genug Energie vorhanden ist, setze die verbleibende Energie + // Test dieses break rauszunehmen ... break; //} } - + // Energie für jeden EnergyUser verbrauchen und loggen foreach ($userEnergyProv as $userInstanceID => $energy) { + $weui = min( + array_column( + array_filter($allSteps, function ($entry) use ($userInstanceID) { + return $entry['user'] == $userInstanceID; + }), + 'step' + ) + ); - $weui = min(array_column(array_filter($allSteps, function($entry) use ($userInstanceID) { - return $entry['user'] == $userInstanceID; - }), 'step')); - ; - IPS_LogMessage("Neuerlog", "aktuell ist energy $energy und powersteps min ist $weui und powersteps ist "); - - $energy = max($energy, $weui); // Testzeile - IPS_LogMessage("Neuerlog", "nun ist energy $energy "); + $energy = max($energy, $weui); // Testzeile // Methode SetCurrentPower für jeden EnergyUser aufrufen if (IPS_InstanceExists($userInstanceID)) { IPS_RequestAction($userInstanceID, 'SetCurrentPower', $energy); // Annahme: SetCurrentPower wird über eine Aktionsanfrage ausgeführt - IPS_LogMessage("Manager", "SetCurrentPower for instance $userInstanceID to $energy"); } } - } // Debug-Ausgabe von allSteps und userEnergyProv - IPS_LogMessage("Manager", "Final allSteps: " . print_r($allSteps, true)); - IPS_LogMessage("Manager", "Final userEnergyProv: " . print_r($userEnergyProv, true)); - + } + // Debug-Ausgabe des Endzustands foreach ($filteredEnergyUsers as $user) { IPS_LogMessage("Manager", "Final state for instance {$user['InstanceID']}: CurrentPower = {$user['CurrentPower']}, UsedEnergy = {$user['UsedEnergy']}"); } } - } -?> \ No newline at end of file +?> diff --git a/library.json b/library.json index 8a7e07a..d55baab 100644 --- a/library.json +++ b/library.json @@ -6,7 +6,7 @@ "compatibility": { "version": "7.1" }, - "version": "0.134", + "version": "0.136", "build": 0, "date": 0 } \ No newline at end of file