Auf Stand V2.001 gebracht, Sofarmodul ist jetzt integriert.

This commit is contained in:
2025-06-04 11:42:10 +02:00
parent b7bb55b7fa
commit fa3232c736
10 changed files with 706 additions and 44 deletions

View File

@@ -14,6 +14,7 @@ class HauptManager extends IPSModule
$this->RegisterPropertyInteger("Interval", 3); // Recheninterval
$this->RegisterVariableInteger("Gesamtnetzbezug", "Gesamtnetzbezug", "", 0);
$this->RegisterVariableBoolean("Is_Peak_Shaving", "Peakshaving", "", false);
// Timer registrieren
$this->RegisterTimer("Timer_DistributeEnergy",$this->ReadPropertyInteger("Interval")*1000,"IPS_RequestAction(" .$this->InstanceID .', "DistributeEnergy", "");');
@@ -53,9 +54,9 @@ class HauptManager extends IPSModule
$decodedUser = json_decode(GetValue($user["User_Up"]), true);
if (isset($decodedUser["Timestamp"]) && (($currentTime - $decodedUser["Timestamp"])) < 30) {
if (isset($decodedUser["Timestamp"]) && ((($currentTime - $decodedUser["Timestamp"])) < 30) && array_key_exists('User', $decodedUser)) {
foreach ($decodedUser["Users"] as $subuser) {
foreach ($decodedUser["User"] as $subuser) {
$subuser['Writeback'] = $user["User_Down"];
$Verbraucher_Liste_Korr[0]["User"][] = $subuser;
@@ -64,7 +65,7 @@ class HauptManager extends IPSModule
$Netzbezug += $decodedUser["Netzbezug"];
}else{
RequestAction($user["User_Down"],'{"timestamp":'.time().',"Is_Peak_Shaving":'.true.',"User":[]}');
SetValue($user["User_Down"],'{"Timestamp":'.time().',"Is_Peak_Shaving":'.true.',"User":[]}');
}
}
@@ -76,8 +77,10 @@ class HauptManager extends IPSModule
$Peakleistung = $this->ReadPropertyInteger("Peakleistung");
$Ueberschussleistung = $this->ReadPropertyInteger("Ueberschussleistung");
$Is_Peak_Shaving = false;
// Fallunterscheidung ob auf Solarladen oder Peakshaving gerregelt wird.
if ($Netzbezug < ($Peakleistung - $Ueberschussleistung) / 2) {
if ($Netzbezug < ($Peakleistung + $Ueberschussleistung) / 2) {
$remainingPower = -1 * (-1 * $Ueberschussleistung + $Netzbezug);
$Is_Peak_Shaving = false;
} else {
@@ -90,7 +93,6 @@ class HauptManager extends IPSModule
if (empty($Verbraucher_Liste_Korr[0]["User"])) {
// Liste ist leer, daher nichts zu tun
IPS_LogMessage("Manager", "aufgerufen leere liste");
return;
}
@@ -120,7 +122,7 @@ class HauptManager extends IPSModule
$remainingPower += $totalAktuelle_Leistung;
// Wenn nicht alle Benutzer Idle = true sind, rufe SetAktuelle_Leistung mit Aktuelle_Leistung Werten auf, (alle Verbraucher behalten die aktuelle Leistung)
if (!$allIdle) {
if (!$allIdle || ($Is_Peak_Shaving != $this->GetValue("Is_Peak_Shaving"))) {
// Schritt 1: Benutzer nach Writeback-Wert aufteilen
$writebackArrays = [];
foreach ($Verbraucher_Liste_Korr[0]["User"] as $user) {
@@ -154,8 +156,11 @@ class HauptManager extends IPSModule
// Schritt 4: RequestAction aufrufen
RequestAction($writeback, $resultString);
}
$this->SetValue("Is_Peak_Shaving", $Is_Peak_Shaving);
return;
}
$this->SetValue("Is_Peak_Shaving", $Is_Peak_Shaving);
// Sortiere die Verbruacher nach Priorität entweder der PV_Prio oder der Peak Prio
usort($Verbraucher_Liste_Korr[0]["User"], function ($a, $b) use (
@@ -269,14 +274,15 @@ class HauptManager extends IPSModule
$aktleistung = array_filter($userEnergyProv, function($entry2) use ($user, $manager) {
return $entry2["user"] == $user && $entry2["Writeback"] == $manager;
});
IPS_LogMessage("Aktuelle LEistung vor foreahc", print_r($aktleistung));
foreach($aktleistung as $entry){
$aktleistung = $entry;
}
IPS_LogMessage("Aktuelle LEistung Mnaagear", print_r($aktleistung));
// Ü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
@@ -359,6 +365,7 @@ class HauptManager extends IPSModule
return $entry2["user"] == $user && $entry2["Writeback"] == $manager;
});
foreach($aktleistung as $entry){
$aktleistung = $entry;
}
@@ -426,7 +433,7 @@ class HauptManager extends IPSModule
// Schritt 2: Foreach-Schleife pro Writeback-Array
foreach ($writebackArrays as $writeback => $users) {
$resultArray = [
'timestamp' => time(),
'Timestamp' => time(),
'Is_Peak_Shaving' => $Is_Peak_Shaving,
'User' => []
];
@@ -442,7 +449,7 @@ class HauptManager extends IPSModule
$resultString = json_encode($resultArray);
// Schritt 4: RequestAction aufrufen
RequestAction($writeback, $resultString);
SetValue($writeback, $resultString);
}