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

@@ -17,6 +17,8 @@ class Manager extends IPSModule
$this->RegisterPropertyInteger("DatenZuruck", 0); // Initialisierung mit 0
$this->RegisterPropertyInteger("Interval", 2); // Recheninterval
$this->RegisterVariableBoolean("Is_Peak_Shaving", false);
// Timer registrieren
$this->RegisterTimer("Timer_DistributeEnergy",$this->ReadPropertyInteger("Interval")*1000,"IPS_RequestAction(" .$this->InstanceID .', "DistributeEnergy", "");');
@@ -38,18 +40,44 @@ class Manager extends IPSModule
$data = json_decode(GetValue($this->ReadPropertyInteger("DatenZuruck")), true);
IPS_LogMessage("Manager", print_r($data));
IPS_LogMessage("Manager", $data["timestamp"]);
IPS_LogMessage("Manager", $data["Timestamp"]);
if (isset($data["timestamp"])) {
$timestamp = $data["timestamp"];
if (isset($data["Timestamp"])) {
$timestamp = $data["Timestamp"];
$currentTime = time();
IPS_LogMessage("Manager", ($currentTime - $timestamp));
IPS_LogMessage("Manager", "im here ist so halb gut");
if (($currentTime - $timestamp) < 3600) {
$this->DistributeEnergy_Extern();
}
} else {
IPS_LogMessage("Manager", "im here ist gut");
} else {
$sendarray = [
"Netzbezug" => GetValue($this->ReadPropertyInteger("Netzbezug")),
"Timestamp" => time()
];
SetValue($this->ReadPropertyInteger("DatenHoch"), json_encode($sendarray));
$this->DistributeEnergy();
IPS_LogMessage("Manager", "im here ist schlecht");
}
} else {
$sendarray = [
"Netzbezug" => GetValue($this->ReadPropertyInteger("Netzbezug")),
"Timestamp" => time()
];
SetValue($this->ReadPropertyInteger("DatenHoch"), json_encode($sendarray));
$this->DistributeEnergy();
IPS_LogMessage("Manager", "im here ist schlecht");
}
}else{
@@ -73,7 +101,7 @@ class Manager extends IPSModule
$Ueberschussleistung = $this->ReadPropertyInteger("Ueberschussleistung");
// 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 {
@@ -141,7 +169,7 @@ class Manager extends IPSModule
IPS_LogMessage("Manager", "nciht idle");
}
if(in_array(0, $powerSteps, true)){
if(in_array(0, $powerSteps, true)){
// Addiere die aktuell bereits verwendete Leistung auf, um sie bei der verteilung zu berücksichtigen
$totalAktuelle_Leistung += ($Aktuelle_Leistung-$delta);
@@ -158,16 +186,18 @@ class Manager extends IPSModule
return;
}
// Wenn nicht alle Benutzer Idle = true sind, rufe SetAktuelle_Leistung mit Aktuelle_Leistung Werten auf, (alle Verbraucher behalten die aktuelle Leistung)
if (!$allIdle) {
// Wenn nicht alle Benutzer Idle = true sind, oder sich der zustand von Is_Peak_shaving gerade verändert hat rufe SetAktuelle_Leistung mit Aktuelle_Leistung Werten auf, (alle Verbraucher behalten die aktuelle Leistung)
if (!$allIdle || ($Is_Peak_Shaving != $this->GetValue("Is_Peak_Shaving"))) {
foreach ($filteredVerbraucher as $user) {
IPS_RequestAction($user["InstanceID"],"SetAktuelle_Leistung",$user["Aktuelle_Leistung"]);
IPS_LogMessage("Manager", "aufgerufen nicht alle idle");
}
$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($filteredVerbraucher, function ($a, $b) use (
$Is_Peak_Shaving
@@ -418,13 +448,13 @@ class Manager extends IPSModule
$sendarray = [];
$sendarray = [
"Users" => $filteredVerbraucher,
"User" => $filteredVerbraucher,
"Netzbezug" => $Netzbezug,
"Timestamp" => time()
];
RequestAction($this->ReadPropertyInteger("DatenHoch"), json_encode($sendarray));
SetValue($this->ReadPropertyInteger("DatenHoch"), json_encode($sendarray));
$answerArray = json_decode(GetValue($this->ReadPropertyInteger("DatenZuruck")), true);