diff --git a/Ladestation_Universal/module.php b/Ladestation_Universal/module.php index 465917a..690c0ca 100644 --- a/Ladestation_Universal/module.php +++ b/Ladestation_Universal/module.php @@ -29,8 +29,8 @@ class Ladestation_Universal extends IPSModule $this->RegisterPropertyInteger("MaxLeistung_1ph", 7800); $this->RegisterPropertyString("IP_Adresse", "0.0.0.0"); - $this->RegisterVariableBoolean("Ladebereit", "Ladebereit", "~Switch", 11); - $this->RegisterVariableBoolean("Solarladen", "Solarladen", "~Switch", 11); + $this->RegisterVariableBoolean("Ladebereit", "Ladebereit", "~Switch", 1); + $this->RegisterVariableBoolean("Solarladen", "Solarladen", "~Switch", 0); $this->RegisterVariableInteger("Fahrzeugstatus", "Fahrzeugstatus", "", 0); $this->RegisterVariableInteger("Lademodus", "Lademodus", "", 0); $this->RegisterVariableFloat("Ladeleistung_Effektiv", "Ladeleistung_Effektiv", "", 0); diff --git a/Manager/module.php b/Manager/module.php index 3d07434..2c37cd8 100644 --- a/Manager/module.php +++ b/Manager/module.php @@ -13,20 +13,13 @@ class Manager extends IPSModule $this->RegisterPropertyString("EnergyUserList", "[]"); // Timer registrieren - $this->RegisterTimer( - "Timer_DistributeEnergy", - 5000, - "IPS_RequestAction(" . - $this->InstanceID . - ', "DistributeEnergy", "");' - ); + $this->RegisterTimer("Timer_DistributeEnergy",5000,"IPS_RequestAction(" .$this->InstanceID .', "DistributeEnergy", "");'); } public function ApplyChanges() { parent::ApplyChanges(); - - // Zusätzliche Konfigurationslogik hier hinzufügen + //Liste aller Verbraucher einlesen $energyUserList = $this->ReadPropertyString("EnergyUserList"); } @@ -49,43 +42,37 @@ class Manager extends IPSModule // Systemvariablen abrufen $Netzbezug = GetValue($this->ReadPropertyInteger("Netzbezug")); $Peakleistung = $this->ReadPropertyInteger("Peakleistung"); - $Ueberschussleistung = $this->ReadPropertyInteger( - "Ueberschussleistung" - ); + $Ueberschussleistung = $this->ReadPropertyInteger("Ueberschussleistung"); - // Fallunterscheidung + // Fallunterscheidung ob auf Solarladen oder Peakshaving gerregelt wird. if ($Netzbezug < ($Peakleistung - $Ueberschussleistung) / 2) { $remainingPower = -1 * (-1 * $Ueberschussleistung + $Netzbezug); - $getCurrentDataParam = false; + $Is_Peak_Shaving = false; } else { $remainingPower = $Peakleistung - $Netzbezug; - $getCurrentDataParam = true; + $Is_Peak_Shaving = true; } - // EnergyUserList auslesen und dekodieren - $energyUserListJSON = $this->ReadPropertyString("EnergyUserList"); - $energyUserList = json_decode($energyUserListJSON, true); + // Alle Energieverbraucher auslesen und dekodieren + $energyUserList = json_decode($this->ReadPropertyString("EnergyUserList"), true); if (empty($energyUserList)) { // Liste ist leer, daher nichts zu tun return; } - // Schleife, um IPS_RequestAction für alle Benutzer auszuführen + // Frage alle Energieverbraucher ab, was sie für Leistungen benötigen könnten foreach ($energyUserList as $user) { if (IPS_InstanceExists($user["EnergyUser"])) { - IPS_RequestAction( - $user["EnergyUser"], - "GetCurrentData", - $getCurrentDataParam - ); + IPS_RequestAction($user["EnergyUser"],"GetCurrentData",$Is_Peak_Shaving); } } - $filteredEnergyUsers = []; + $filteredEnergyUsers = []; // Array das später mit allen Verbrauchsdaten der Energieverbraucher gefüllt wird $allIdle = true; // Variable zur Überprüfung, ob alle Benutzer Idle = true sind $totalCurrentPower = 0; // Variable zur Summierung der CurrentPower Werte + // Fülle das Array mit allen entsprechenden Werten der Verbraucher ab foreach ($energyUserList as $user) { if (!IPS_InstanceExists($user["EnergyUser"])) { continue; @@ -109,50 +96,47 @@ class Manager extends IPSModule "UserPrio" => $userPrio, "LockPrio" => $lockPrio, "Idle" => $idle, - "PowerSteps" => $powerSteps, // PowerSteps direkt hier hinzufügen + "PowerSteps" => $powerSteps, ]; - // Überprüfen, ob alle Benutzer Idle = true sind + // Überprüfen, ob alle Benutzer Idle = true sind, wenn einer nicht ist, wird später verworfen... if (!$idle) { $allIdle = false; } - // Add the totalCurrentPower to the remainingPower + // Addiere die aktuell bereits verwendete Leistung auf, um sie bei der verteilung zu berücksichtigen $totalCurrentPower += $currentPower; } + // Berücksichtigung der bereits verteilten Leistungen (nachher kann dafür wieder bei 0 begonnen werden zu verteilen) $remainingPower += $totalCurrentPower; + // Abbrechen wenn es keine gefilterten User gibt if (empty($filteredEnergyUsers)) { return; } - // Wenn nicht alle Benutzer Idle = true sind, rufe SetCurrentPower mit CurrentPower Werten auf + // Wenn nicht alle Benutzer Idle = true sind, rufe SetCurrentPower mit CurrentPower Werten auf, (alle Verbraucher behalten die aktuelle Leistung) if (!$allIdle) { foreach ($filteredEnergyUsers as $user) { - IPS_RequestAction( - $user["InstanceID"], - "SetCurrentPower", - $user["CurrentPower"] - ); + IPS_RequestAction($user["InstanceID"],"SetCurrentPower",$user["CurrentPower"]); } return; } - // Sortiere die EnergyUser nach Priorität basierend auf dem Parameter + // Sortiere die Verbruacher nach Priorität entweder der PV_Prio oder der Peak Prio usort($filteredEnergyUsers, function ($a, $b) use ( - $getCurrentDataParam + $Is_Peak_Shaving ) { - $primaryKey = $getCurrentDataParam ? "LockPrio" : "UserPrio"; - + $primaryKey = $Is_Peak_Shaving ? "LockPrio" : "UserPrio"; + // Wenn die Prio geleich ist, sortiere danach welcher verbraucher bisher am wenigsten Energie bekommen hat. 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"; + // Primärschlüssel für die Priorität basierend auf dem Parameter auswählen (für sortierung in gruppen anschliessend) + $priorityKey = $Is_Peak_Shaving ? "LockPrio" : "UserPrio"; // Schleife durch alle Prioritäten $priorities = array_unique( @@ -168,7 +152,7 @@ class Manager extends IPSModule } ); } - // Jetzt kannst du die Benutzer gruppenweise verarbeiten + // Jetzt werden die energien pro gruppe verteilt (Immer alle pro prio in einer gruppe miteinander) foreach ($groupedUsers as $priority => $users) { // EnergyUser mit gleicher Priorität sammeln $samePriorityUsers = isset($groupedUsers[$priority]) @@ -189,28 +173,23 @@ class Manager extends IPSModule $withoutZero[] = $entry; } } - // Methode für alle im withoutZero-Array aufrufen + // 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"]); - // Simulierte Methode (Debug-Ausgabe) - IPS_RequestAction( - $instanceID, - "SetCurrentPower", - $minPowerStep + IPS_RequestAction($instanceID,"SetCurrentPower",$minPowerStep ); $remainingPower -= $entry["CurrentPower"]; } } + + // 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 + $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 = []; @@ -238,17 +217,16 @@ class Manager extends IPSModule // Aktualisiere die verbleibende Energie und die bereitgestellte Energie für den Benutzer $remainingPower -= $powerstep - $userEnergyProv[$user]; $userEnergyProv[$user] = $powerstep; - } //else { - // Wenn nicht genug Energie vorhanden ist, setze die verbleibende Energie - //} + } + } - // Energie für jeden EnergyUser verbrauchen und loggen - foreach ($userEnergyProv as $userInstanceID => $energy) { - $weui = min( + // 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 + $userInstanceID ) { return $entry["user"] == $userInstanceID; }), @@ -256,15 +234,12 @@ class Manager extends IPSModule ) ); - $energy = max($energy, $weui); // Testzeile + // Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen + $leistung = max($leistung, $minimalleitsung); - // Methode SetCurrentPower für jeden EnergyUser aufrufen + // Methode SetCurrentPower für jeden EnergyUser mit der entsprechenden Energie aufrufen if (IPS_InstanceExists($userInstanceID)) { - IPS_RequestAction( - $userInstanceID, - "SetCurrentPower", - $energy - ); // Annahme: SetCurrentPower wird über eine Aktionsanfrage ausgeführt + IPS_RequestAction($userInstanceID,"SetCurrentPower",$leistung); } } } diff --git a/library.json b/library.json index ddd6e5d..0e0802e 100644 --- a/library.json +++ b/library.json @@ -6,7 +6,7 @@ "compatibility": { "version": "7.1" }, - "version": "0.156", + "version": "0.157", "build": 0, "date": 0 } \ No newline at end of file