RegisterPropertyInteger("MaxBatterieleistung", 0); $this->RegisterPropertyInteger("Batteriespannung", 50); // Batterie spezifische Variablen $this->RegisterVariableInteger("AufdasNachladen","AufdasNachladen","",0); $this->RegisterVariableInteger("MinimumEntladen","MinimumEntladen","",0); $this->RegisterVariableInteger("Entladestrom","Entladestrom","",0); $this->RegisterVariableInteger("Ladestrom","Ladestrom","",0); $this->RegisterVariableInteger("Batterieladezustand","Batterieladezustand","",0); // Variabeln für Kommunkation mit Manager $this->RegisterVariableInteger("Aktuelle_Leistung", "Aktuelle_Leistung", "", 0); $this->RegisterVariableString("PowerSteps", "PowerSteps"); // Hilfsvariabeln für Idle zustand $this->RegisterPropertyInteger("IdleCounterMax", 2); $this->RegisterVariableInteger("IdleCounter", "IdleCounter", "", 0); $this->SetValue("IdleCounter", 0); // Initialisiere Idle $this->SetValue("Idle", true); } public function ApplyChanges() { parent::ApplyChanges(); $maxleistung = $this->ReadPropertyInteger("MaxBatterieleistung"); $array_powersteps = []; //Schrittgrösse $stepSize = 250; for ($i = 0; $i <= $maxleistung * 2; $i += $stepSize) { $array_powersteps[] = $i; } } public function RequestAction($Ident, $Value) { switch ($Ident) { case "SetAktuelle_Leistung": $this->SetAktuelle_Leistung($Value); break; case "GetCurrentData": return $this->GetCurrentData($Value); default: throw new Exception("Invalid Ident"); } } public function SetAktuelle_Leistung(int $power){ $spannung = $this->ReadPropertyInteger("Batteriespannung"); $entladestrom = $this->ReadVariableInteger("Entladestrom"); $ladestrom = $this->ReadVariableInteger("Ladestrom"); $maxleistung = $this->ReadPropertyInteger("MaxBatterieleistung"); //Batterie entladen < MaxBatterieleistung &&&&& MaxBatterieleistung < Batterie laden if ($power > $maxleistung) { $ladestrom = ($power - $maxleistung) / $spannung; $this->SetValue("Ladestrom", $ladestrom); } else { $entladestrom = $power / $spannung; $this->SetValue("Entladestrom", $nachladestrom); } // Prüfe auf Änderung der Power 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) { // Werte der registrierten Variablen abrufen und in Variablen speichern $aufdasnachladen = $this->ReadVariableInteger("AufdasNachladen"); $minimumentladen = $this->ReadVariableInteger("Minimumentladen"); $batterieladezustand = $this->ReadPropertyInteger("Batterieladezustand"); $maxleistung = $this->ReadPropertyInteger("MaxBatterieleistung"); if ($Peak) { if ($batterieladezustand <= $minimumentladen){ // Filterung des Arrays $filtered_powersteps = array_filter($array_powersteps, function ($value) { return $value > $maxleistung ; //Hochpassfiltern }); $filtered_powersteps_laden = array_values($filtered_powersteps); $this->SetValue( "PowerSteps", json_encode($filtered_powersteps_laden) ); } elseif ($batterieladezustand >= $aufdasnachladen) { $filtered_powersteps_entladen = array_filter($array_powersteps, function ($value) { return $value < $maxleistung ; //Tiefpassfiltern }); $filtered_powersteps = array_values($filtered_powersteps); $this->SetValue( "PowerSteps", json_encode($filtered_powersteps_entladen) ); } elseif ($batterieladezustand < $aufdasnachladen && $batterieladezustand > $minimumentladen) { $this->SetValue( "PowerSteps", json_encode($array_powersteps) ); } else { $this->SetValue( "PowerSteps", json_encode($array_powersteps[0]) ); } } else {//Solar // Filterung des Arrays $filtered_powersteps = array_filter($array_powersteps, function ($value) { return $value > $maxleistung ; //Hochpassfiltern }); $filtered_powersteps = array_values($filtered_powersteps); $this->SetValue( "PowerSteps", json_encode($filtered_powersteps) ); } 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); } } } } ?>