RegisterPropertyInteger("MaxBatterieleistung", 0); $this->RegisterPropertyInteger("Batteriespannung", 50); $this->RegisterPropertyInteger("AufdasNachladen",0); $this->RegisterPropertyInteger("MinimumEntladen",0); $this->RegisterPropertyInteger("Batterieladezustand",0); // Variabeln für Kommunkation mit Manager $this->RegisterVariableFloat("Ladestrom", "Ladestrom", "", 0); $this->RegisterVariableFloat("Entladestrom", "Entladestrom", "", 0); $this->RegisterVariableInteger("Aktuelle_Leistung", "Aktuelle_Leistung", "", 0); $this->RegisterVariableString("PowerSteps", "PowerSteps"); $this->RegisterVariableBoolean("Idle", "Idle", "", 0); $this->RegisterVariableInteger("Sperre_Prio", "Sperre_Prio"); $this->RegisterVariableInteger("PV_Prio", "PV_Prio"); $this->RegisterVariableInteger("Power", "Power"); $this->RegisterVariableBoolean("Is_Peak_Shaving", "Is_Peak_Shaving"); $this->RegisterVariableFloat("Bezogene_Energie", "Bezogene_Energie", "", 0); // Hilfsvariabeln für Idle zustand $this->RegisterPropertyInteger("IdleCounterMax", 2); $this->RegisterVariableInteger("IdleCounter", "IdleCounter", "", 0); $this->SetValue("IdleCounter", 0); // Initialisiere Idle $this->SetValue("Idle", true); $this->RegisterTimer("Timer_Do_UserCalc",5000,"IPS_RequestAction(" .$this->InstanceID .', "Do_UserCalc", "");'); } public function ApplyChanges() { parent::ApplyChanges(); } private function GeneratePowerSteps() { $maxleistung = $this->ReadPropertyInteger("MaxBatterieleistung"); $array_powersteps = []; $stepSize = 250; // Schrittgröße // Erstellen der PowerSteps for ($i = 0; $i <= $maxleistung * 2; $i += $stepSize) { $array_powersteps[] = $i; } return $array_powersteps; } public function RequestAction($Ident, $Value) { switch ($Ident) { case "SetAktuelle_Leistung": SetValue("Power", (int)$Value); break; case "GetCurrentData": SetValue("Is_Peak_Shaving", (bool)$Value); break; case "Do_UserCalc": $this->SetAktuelle_Leistung($this->GetValue("Power")); $this->GetCurrentData($this->GetValue("Is_Peak_Shaving")); break; default: throw new Exception("Invalid Ident"); } } public function SetAktuelle_Leistung(int $power) { $batterieladezustand = $this->ReadPropertyInteger("Batterieladezustand"); // Als Property gelesen $maxleistung = $this->ReadPropertyInteger("MaxBatterieleistung"); // Als Property gelesen $spannung = $this->ReadPropertyInteger("Batteriespannung"); // Spannung ebenfalls als Property $ladestrom = GetValue($this->GetIDForIdent("Ladestrom")); $entladestrom = GetValue($this->GetIDForIdent("Entladestrom")); IPS_LogMessage("Batterie", "power: " . $power); if ($spannung <= 0) { IPS_LogMessage("Batterie", "Fehler: Batteriespannung ist 0 oder ungültig."); return; } // Batterie entladen oder laden basierend auf der Leistung if ($power > $maxleistung) { $ladestrom = ($power - $maxleistung) / $spannung; $this->SetValue("Ladestrom", $ladestrom); $this->SetValue("Entladestrom", 0); //IPS_LogMessage("Batterie", "Ladestrom: " . $ladestrom); } else { $entladestrom = $power / $spannung; $this->SetValue("Entladestrom", $entladestrom); $this->SetValue("Ladestrom", 0); //IPS_LogMessage("Batterie", "Entladestrom: " . $entladestrom); } // Prüfe auf Änderung der Leistung im Vergleich zur letzten Einstellung $lastPower = GetValue($this->GetIDForIdent("Aktuelle_Leistung")); if ($power != $lastPower) { $this->SetValue("Idle", false); $this->SetValue( "IdleCounter", $this->ReadPropertyInteger("IdleCounterMax") ); } // Setze die neue aktuelle Leistung $this->SetValue("Aktuelle_Leistung", $power); // IdleCounter verarbeiten $this->ProcessIdleCounter(); } public function GetCurrentData(bool $Peak) { IPS_LogMessage("Batterie", "peak: " . ($Peak ? "true" : "false")); $array_powersteps = $this->GeneratePowerSteps(); $aufdasnachladen = $this->ReadPropertyInteger("AufdasNachladen"); $minimumentladen = $this->ReadPropertyInteger("MinimumEntladen"); $batterieladezustand = GetValue($this->ReadPropertyInteger("Batterieladezustand")); $maxleistung = $this->ReadPropertyInteger("MaxBatterieleistung"); if ($Peak) { if ($batterieladezustand <= $minimumentladen) { $filtered_powersteps = array_filter($array_powersteps, function ($value) use ($maxleistung) { return $value > $maxleistung; // Hochpass filtern }); $filtered_powersteps_laden = array_values($filtered_powersteps); $this->SetValue("PowerSteps", json_encode($filtered_powersteps_laden)); IPS_LogMessage("Batterie", "Batterie laden: "); } elseif ($batterieladezustand >= $aufdasnachladen) { $filtered_powersteps_entladen = array_filter($array_powersteps, function ($value) use ($maxleistung) { return $value < $maxleistung; // Tiefpass filtern }); $this->SetValue("PowerSteps", json_encode($filtered_powersteps_entladen)); IPS_LogMessage("Batterie", "Batterie entladen: " ); } elseif ($batterieladezustand < $aufdasnachladen && $batterieladezustand > $minimumentladen) { $this->SetValue("PowerSteps", json_encode($array_powersteps)); IPS_LogMessage("Batterie", "In Hysterese: "); } else { $this->SetValue("PowerSteps", json_encode($array_powersteps[0])); IPS_LogMessage("Batterie", "Weder noch: "); } } else { // Solar $filtered_powersteps_solar = array_filter($array_powersteps, function ($value) use ($maxleistung) { return $value > $maxleistung; // Hochpass filtern }); $this->SetValue("PowerSteps", json_encode($filtered_powersteps_solar)); IPS_LogMessage("Batterie", "Solarmodus"); } } private function CheckIdle($power) { $lastpower = GetValue("Aktuelle_Leistung"); if ($lastpower != GetValue("Aktuelle_Leistung")) { $this->SetValue("Idle", false); $this->SetValue( "IdleCounter", $this->ReadPropertyInteger("IdleCounterMax") ); } // IdleCounter auslesen und verarbeiten $idleCounter = $this->GetValue("IdleCounter"); if ($idleCounter > 0) { $this->SetValue("Idle", false); $this->SetValue("IdleCounter", $idleCounter - 1); } else { $this->SetValue("Idle", true); } } private function ProcessIdleCounter() { // IdleCounter auslesen und verarbeiten $idleCounter = $this->GetValue("IdleCounter"); if ($idleCounter > 0) { $this->SetValue("Idle", false); $this->SetValue("IdleCounter", $idleCounter - 1); } else { $this->SetValue("Idle", true); } } } ?>