diff --git a/Batterie/README.md b/Batterie/README.md new file mode 100644 index 0000000..e69de29 diff --git a/Batterie/form.json b/Batterie/form.json new file mode 100644 index 0000000..45af52e --- /dev/null +++ b/Batterie/form.json @@ -0,0 +1,52 @@ +{ + "elements": [ + { + "type": "Label", + "caption": "Konfiguration der Batterie für Peakshaving" + }, + { + "type": "NumberSpinner", + "name": "IdleCounterMax", + "caption": "Zyklen zwischen zwei Leisutungsänderungen", + "suffix": "" + }, + { + "type": "NumberSpinner", + "name": "MaxBatterieleistung", + "caption": "Maximale Batterieleistung", + "suffix": "" + }, + { + "type": "NumberSpinner", + "name": "AufdasNachladen", + "caption": "Auf so viel Prozent nachladen", + "suffix": "" + + }, + { + "type": "NumberSpinner", + "name": "MinimumEntladen", + "caption": "Minimum des Batterieladezustand", + "suffix": "" + }, + { + "type": "SelectVariable", + "name": "Entladestrom", + "caption": "Entladestrom", + "test": true + }, + { + "type": "SelectVariable", + "name": "Ladestrom", + "caption": "Ladestrom", + "test": true + }, + { + "type": "SelectVariable", + "name": "Batterieladezustand", + "caption": "Batterieladezustand", + "test": true + } + + ] +} diff --git a/Batterie/module.json b/Batterie/module.json new file mode 100644 index 0000000..468e0f8 --- /dev/null +++ b/Batterie/module.json @@ -0,0 +1,12 @@ +{ + "id": "{F6C6A4B2-C5BB-4D94-2629-01D8B0D4CAF5}", + "name": "Batterie", + "type": 3, + "vendor": "Belevo AG", + "aliases": [], + "parentRequirements": [], + "childRequirements": [], + "implemented": [], + "prefix": "GEF", + "url": "" +} \ No newline at end of file diff --git a/Batterie/module.php b/Batterie/module.php new file mode 100644 index 0000000..fc069e2 --- /dev/null +++ b/Batterie/module.php @@ -0,0 +1,177 @@ +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->RegisterVariableInteger("Ladestrom", "Ladestrom", "", 0); + $this->RegisterVariableInteger("Entladestrom", "Entladestrom", "", 0); + $this->RegisterVariableInteger("Aktuelle_Leistung", "Aktuelle_Leistung", "", 0); + $this->RegisterVariableString("PowerSteps", "PowerSteps"); + $this->RegisterVariableBoolean("Idle", "Idle", "", 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); + } + + 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": + $this->SetAktuelle_Leistung($Value); + break; + case "GetCurrentData": + return $this->GetCurrentData($Value); + default: + throw new Exception("Invalid Ident"); + } + } + + public function SetAktuelle_Leistung(int $power) + { + // Batterie-spezifische Eigenschaften abrufen + $spannung = $this->ReadPropertyInteger("Batteriespannung"); + $entladestrom = $this->ReadVariableInteger("Entladestrom"); + $ladestrom = $this->ReadVariableInteger("Ladestrom"); + $maxleistung = $this->ReadPropertyInteger("MaxBatterieleistung"); + + // Batterie entladen oder laden basierend auf der Leistung + if ($power > $maxleistung) { + $ladestrom = ($power - $maxleistung) / $spannung; + $this->SetValue("Ladestrom", $ladestrom); + } else { + $entladestrom = $power / $spannung; + $this->SetValue("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) + { + // Werte der registrierten Variablen abrufen und in Variablen speichern + $array_powersteps = $this->GeneratePowerSteps(); + $aufdasnachladen =$this->ReadPropertyInteger("AufdasNachladen"); + $minimumentladen = $this->ReadPropertyInteger("MinimumEntladen"); + $batterieladezustand = $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)); + + } 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)); + + } elseif ($batterieladezustand < $aufdasnachladen && $batterieladezustand > $minimumentladen) { + $this->SetValue("PowerSteps", json_encode($array_powersteps)); + + } else { + $this->SetValue("PowerSteps", json_encode($array_powersteps[0])); + } + + } 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)); + } + } + + + + 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); + } + } +} +?> \ No newline at end of file diff --git a/library.json b/library.json index b5b5f2f..b93cbf9 100644 --- a/library.json +++ b/library.json @@ -6,7 +6,11 @@ "compatibility": { "version": "7.1" }, +<<<<<<< HEAD "version": "0.173", +======= + "version": "0.189", +>>>>>>> 04d67d2e0d688a8c20edd9a347dad2b09ea62229 "build": 0, "date": 0 } \ No newline at end of file