From bc916b313eb33fd53887d567df685dd7cbf64c88 Mon Sep 17 00:00:00 2001 From: "belevo\\mh" Date: Wed, 11 Dec 2024 15:10:57 +0100 Subject: [PATCH] =?UTF-8?q?Batterie=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Batterie/README.md | 0 Batterie/form.json | 51 +++++++++++ Batterie/modul.json | 12 +++ Batterie/module.php | 205 ++++++++++++++++++++++++++++++++++++++++++++ library.json | 2 +- 5 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 Batterie/README.md create mode 100644 Batterie/form.json create mode 100644 Batterie/modul.json create mode 100644 Batterie/module.php 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..5ebfe70 --- /dev/null +++ b/Batterie/form.json @@ -0,0 +1,51 @@ +{ + "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": "Leistug Teillast", + "suffix": "" + }, + { + "type": "SelectVariable", + "name": "AufdasNachladen", + "caption": "Auf so viel Prozent nachladen", + "test": true + }, + { + "type": "SelectVariable", + "name": "MinimumEntladen", + "caption": "Minimum des Batterieladezustand", + "test": true + }, + { + "type": "SelectVariable", + "name": "Nachladestrom", + "caption": "Nachladestrom", + "test": true + }, + { + "type": "SelectVariable", + "name": "Ladestrom", + "caption": "Ladestrom", + "test": true + }, + { + "type": "SelectVariable", + "name": "Batterieladezustand", + "caption": "Batterieladezustand", + "test": true + } + + ] +} diff --git a/Batterie/modul.json b/Batterie/modul.json new file mode 100644 index 0000000..87369c5 --- /dev/null +++ b/Batterie/modul.json @@ -0,0 +1,12 @@ +{ + "id": "{17759E3B-3F45-69A5-E7C0-34DE6D7577CF}", + "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..177dd0a --- /dev/null +++ b/Batterie/module.php @@ -0,0 +1,205 @@ +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); + } + } + + + + } + +} +?> \ No newline at end of file diff --git a/library.json b/library.json index 910ffee..b5b5f2f 100644 --- a/library.json +++ b/library.json @@ -6,7 +6,7 @@ "compatibility": { "version": "7.1" }, - "version": "0.172", + "version": "0.173", "build": 0, "date": 0 } \ No newline at end of file