Anpassgunen an zeitintervallen, hauptmanager auf manager angepasst (achtung nciht updaten muss ncoht fertig werden)

This commit is contained in:
2025-03-14 15:57:56 +01:00
parent ec80612c04
commit f71cb57e7c
14 changed files with 179 additions and 26 deletions

View File

@@ -11,16 +11,19 @@ class HauptManager extends IPSModule
$this->RegisterPropertyInteger("Ueberschussleistung", 0);
$this->RegisterPropertyInteger("Netzbezug", 0); // Initialisierung mit 0
$this->RegisterPropertyString("Verbraucher_Liste", "[]");
$this->RegisterPropertyInteger("Interval", 3); // Recheninterval
$this->RegisterVariableInteger("Gesamtnetzbezug", "Gesamtnetzbezug", "", 0);
// Timer registrieren
$this->RegisterTimer("Timer_DistributeEnergy",5000,"IPS_RequestAction(" .$this->InstanceID .', "DistributeEnergy", "");');
$this->RegisterTimer("Timer_DistributeEnergy",$this->ReadPropertyInteger("Interval")*1000,"IPS_RequestAction(" .$this->InstanceID .', "DistributeEnergy", "");');
}
public function ApplyChanges()
{
parent::ApplyChanges();
$this->SetTimerInterval("Timer_DistributeEnergy",$this->ReadPropertyInteger("Interval")*1000);
//Liste aller Verbraucher einlesen
}
@@ -59,6 +62,9 @@ class HauptManager extends IPSModule
}
$Netzbezug += $decodedUser["Netzbezug"];
}else{
SetValue($user["User_Up"],'{"timestamp":'.time().',"Is_Peak_Shaving":'true',"User":[]}');
}
}
@@ -102,8 +108,14 @@ class HauptManager extends IPSModule
}
// Addiere die aktuell bereits verwendete Leistung auf, um sie bei der verteilung zu berücksichtigen
$totalAktuelle_Leistung += $user["Aktuelle_Leistung"];
}
if(in_array(0, $user["PowerSteps"], true)){
// Addiere die aktuell bereits verwendete Leistung auf, um sie bei der verteilung zu berücksichtigen
$totalAktuelle_Leistung += $Aktuelle_Leistung;
}
}
// Berücksichtigung der bereits verteilten Leistungen (nachher kann dafür wieder bei 0 begonnen werden zu verteilen)
$remainingPower += $totalAktuelle_Leistung;
@@ -209,7 +221,7 @@ class HauptManager extends IPSModule
'Writeback' => $user['Writeback'],
'Set_Leistung' => min($entry["PowerSteps"])
];
$remainingPower -= $entry["Aktuelle_Leistung"];
//$remainingPower -= $entry["Aktuelle_Leistung"];
}
}
@@ -226,6 +238,7 @@ class HauptManager extends IPSModule
];
}
if($remainingPower>=0){
// Alle Schritte der Benutzer in einem Array sammeln
$allSteps = [];
foreach ($samePriorityUsers as $user) {
@@ -294,12 +307,8 @@ class HauptManager extends IPSModule
IPS_LogMessage("Manager", $remainingPower);
IPS_LogMessage("Manager", $leistung);
// Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen
if($leistung <= $remainingPower){
$leistung = max($leistung, $minimalleitsung);
}elseif($remainingPower<=$minimalleitsung){
$leistung = min($leistung, $minimalleitsung);
}
// Methode SetAktuelle_Leistung für jeden Verbraucher mit der entsprechenden Energie aufrufen
@@ -312,7 +321,93 @@ class HauptManager extends IPSModule
}
}
else{
// Alle Schritte der Benutzer in einem Array sammeln
$allSteps = [];
foreach ($samePriorityUsers as $user) {
foreach ($user["PowerSteps"] as $step) {
$allSteps[] = [
"user" => $user["InstanceID"],
"Writeback" => $user["Writeback"],
"step" => $step*-1,
];
}
}
// Sortiere die Schritte nach Größe
usort($allSteps, function ($a, $b) {
return $a["step"] <=> $b["step"];
});
$remainingPower = $remainingPower *-1;
// Iteriere durch alle Schritte
foreach ($allSteps as $entry) {
$user = $entry["user"];
$manager = $entry["Writeback"];
$powerstep = $entry["step"];
$aktleistung = array_filter($userEnergyProv, function($entry2) use ($user, $manager) {
return $entry2["user"] == $user && $entry2["Writeback"] == $manager;
});
foreach($aktleistung as $entry){
$aktleistung = $entry;
}
// Überprüfe, ob noch genügend verbleibende Energie für den nächsten Schritt vorhanden ist
if ($remainingPower >= $powerstep - $aktleistung['Set_Leistung']) {
// Aktualisiere die verbleibende Energie und die bereitgestellte Energie für den Benutzer
$remainingPower -= $powerstep - $aktleistung['Set_Leistung'];
array_walk($userEnergyProv, function(&$entry3) use ($user, $manager, $powerstep) {
if ($entry3["user"] == $user && $entry3["Writeback"] == $manager) {
$entry3["Set_Leistung"] = $powerstep;
}
});
}
}
$remainingPower = $remainingPower *-1;
// 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"
)
);
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
$leistung = max($leistung, $minimalleitsung)*-1;
// Methode SetAktuelle_Leistung für jeden Verbraucher mit der entsprechenden Energie aufrufen
$resultArray[] = $userEnergyProv[$userInstanceID]; //[
// 'InstanceID' => $user['InstanceID'],
// 'Writeback' => $user['Writeback'],
// 'Set_Leistung' => $leistung
// ];
}
}
}
//IPS_LogMessage("Manager", print_r($resultArray));