RegisterPropertyInteger("MaxBatterieleistung", 0); $this->RegisterPropertyInteger("Batteriespannung", 50); $this->RegisterPropertyInteger("AufdasNachladen",0); $this->RegisterPropertyInteger("MinimumEntladen",0); $this->RegisterPropertyInteger("Batterieladezustand",0); $this->RegisterPropertyInteger("Batteriemanagement", 1); $this->RegisterPropertyInteger("MaxNachladen",0); $this->RegisterPropertyInteger("Netzbezug", 0); // Initialisierung mit 0 // Variabeln für Kommunkation mit Manager $this->RegisterVariableFloat("Entladeleistung","Entladeleistung", "",0); $this->RegisterVariableInteger("Batteriemanagement_Variabel","Batteriemanagement_Variabel", "",0); $this->RegisterVariableInteger("Laden3_Entladen4","Laden3_Entladen4", "",3); $this->RegisterVariableFloat("Ladeleistung","Ladeleistung", "",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->RegisterVariableBoolean("Hysterese", "Hysterese","",0); //$this->RegisterVariableBoolean("Hysterese_Netz", "Hysterese_Netz","",0); $this->RegisterVariableBoolean("Hysterese", "Hysterese","",false); $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(); $batterieManagement = $this->ReadPropertyInteger("Batteriemanagement"); $this->SetValue("Batteriemanagement_Variabel", $batterieManagement); } private function GeneratePowerSteps() { $maxleistung = $this->ReadPropertyInteger("MaxBatterieleistung"); $array_powersteps = []; $stepSize = 125; // Schrittgröße // Erstellen der PowerSteps for ($i = -$maxleistung; $i <= $maxleistung; $i += $stepSize) { $array_powersteps[] = $i; } return $array_powersteps; } public function RequestAction($Ident, $Value) { switch ($Ident) { case "SetAktuelle_Leistung": $this->SetValue("Power", (int)$Value); break; case "GetCurrentData": $this->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) { $batterieManagement = $this->ReadPropertyInteger("Batteriemanagement"); // Wechselrichter steuert das Laden/Entladen der Batterie if ($batterieManagement == 1) { $this->SetValue("Entladeleistung", 0); $this->SetValue("Ladeleistung", 0); return; } if($this->GetValue("Is_Peak_Shaving")==true){ if ($power >= 0) { $this->SetValue("Ladeleistung", $power); $this->SetValue("Entladeleistung", 0); $this->SetValue("Laden3_Entladen4", 3); } else { $this->SetValue("Entladeleistung", abs($power)); $this->SetValue("Ladeleistung", 0); $this->SetValue("Laden3_Entladen4", 4); } }else{ if ($power >= 0) { $this->SetValue("Ladeleistung", $power); $this->SetValue("Entladeleistung", 0); $this->SetValue("Laden3_Entladen4", 3); } else { $this->SetValue("Entladeleistung", abs($power)); $this->SetValue("Ladeleistung", 0); $this->SetValue("Laden3_Entladen4", 4); } } // 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", "Currentdata"); $array_powersteps = $this->GeneratePowerSteps(); $aufdasnachladen = $this->ReadPropertyInteger("AufdasNachladen"); $minimumentladen = $this->ReadPropertyInteger("MinimumEntladen"); $maxleistung = $this->ReadPropertyInteger("MaxBatterieleistung"); $dummy_array = []; $batterieladezustand = GetValue($this->ReadPropertyInteger("Batterieladezustand")); if ($this->ReadPropertyInteger("Batteriemanagement") == 1) { $dummy_array[] = 0; return $this->SetValue("PowerSteps", json_encode($dummy_array)); } $netzbezug = GetValue($this->ReadPropertyInteger("Netzbezug")); if (abs($netzbezug) > $maxleistung) { $netzbezug = $maxleistung * (-1); } if($batterieladezustand>(5+$aufdasnachladen)){ $this->SetValue("Hysterese", false); }elseif($batterieladezustand<$aufdasnachladen){ $this->SetValue("Hysterese", true); } $hyst = $this->GetValue("Hysterese"); if($Peak){ IPS_LogMessage("Batterie", "Im if teil"); if($batterieladezustand>=$aufdasnachladen && $hyst==false){ $dummy_array[] = $netzbezug; $this->SetValue("PowerSteps", json_encode($dummy_array)); }elseif($batterieladezustand>=$aufdasnachladen && $hyst==false){ $filtered_powersteps_entladen = array_filter($array_powersteps, function ($value) { return $value <= 0; }); $this->SetValue("PowerSteps", json_encode($filtered_powersteps_entladen)); }elseif($batterieladezustand>$minimumentladen){ $this->SetValue("PowerSteps", json_encode($array_powersteps)); } else{ $filtered_powersteps = array_filter($array_powersteps, function ($value) { return $value >= 0; }); $this->SetValue("PowerSteps", json_encode(array_values($filtered_powersteps))); } }else{ IPS_LogMessage("Batterie", "Im else teil"); if($batterieladezustand>99){ IPS_LogMessage("Batterie", "im 1"); $filtered_powersteps_entladen = array_filter($array_powersteps, function ($value) { return $value <= 0; }); $this->SetValue("PowerSteps", json_encode($filtered_powersteps_entladen)); }elseif($batterieladezustand>=$aufdasnachladen && $hyst==true){ $this->SetValue("PowerSteps", json_encode($array_powersteps)); IPS_LogMessage("Batterie", "im 2"); }elseif($batterieladezustand>=$aufdasnachladen && $hyst==false){ $filtered_powersteps_entladen = array_filter($array_powersteps, function ($value) { return $value >= 0; }); $this->SetValue("PowerSteps", json_encode($filtered_powersteps_entladen)); }else{ $dummy_array[] = $this->ReadPropertyInteger("MaxNachladen"); $this->SetValue("PowerSteps", json_encode($dummy_array)); IPS_LogMessage("Batterie", "im 3"); } } // $inhystere = $this->GetValue("Hysterese"); // $inhystere_netz = $this->GetValue("Hysterese_Netz"); /*$batterieManagement = $this->ReadPropertyInteger("Batteriemanagement"); if ($batterieManagement == 1) { $dummy_array[] = 0; return $this->SetValue("PowerSteps", json_encode($dummy_array)); } $batterieladezustandID = $this->ReadPropertyInteger("Batterieladezustand"); if ($batterieladezustandID > 0) { $batterieladezustand = GetValue($batterieladezustandID); } else { IPS_LogMessage("Batterie", "Fehler: Ungültige Batterieladezustand-ID."); return; } if ($Peak) { if ($batterieladezustand >= 5 + $aufdasnachladen) { $this->SetValue("Hysterese", false); $this->SetValue("Hysterese_Netz", true); } if ($batterieladezustand < $aufdasnachladen) { $this->SetValue("Hysterese_Netz", false); } if ($batterieladezustand <= $minimumentladen) { $filtered_powersteps = array_filter($array_powersteps, function ($value) { return $value >= 0; }); $filtered_powersteps_laden = array_values($filtered_powersteps); $this->SetValue("PowerSteps", json_encode($filtered_powersteps_laden)); $this->SetValue("Hysterese", true); IPS_LogMessage("Batterie", "Peak: unter minimum"); } elseif ($batterieladezustand > $minimumentladen) { if ($inhystere == true && $inhystere_netz == false) { $filtered_powersteps = array_filter($array_powersteps, function ($value) { return $value >= 0; }); $filtered_powersteps_laden = array_values($filtered_powersteps); $this->SetValue("PowerSteps", json_encode($filtered_powersteps_laden)); IPS_LogMessage("Batterie", ": peak: Hysterese"); IPS_LogMessage("Debug", "peak: Hysterese Hysterese_Netz: " . ($inhystere_netz ? "true" : "false")); IPS_LogMessage("Debug", "peak: Hysterese Hysterese: " . ($inhystere ? "true" : "false")); } elseif ($inhystere_netz == true && $inhystere == false) { $netzbezug = GetValue($this->ReadPropertyInteger("Netzbezug")); if (abs($netzbezug) > $maxleistung) { $dummy_array[] = $maxleistung * (-1); } else { $dummy_array[] = $netzbezug; } $this->SetValue("PowerSteps", json_encode($dummy_array)); IPS_LogMessage("Batterie", "Peak: netzbezug, keine hysterese"); IPS_LogMessage("Debug", "Peak: netzbezug, keine hysterese Hysterese_Netz: " . ($inhystere_netz ? "true" : "false")); IPS_LogMessage("Debug", "Peak: netzbezug, keine hysterese Hysterese: " . ($inhystere ? "true" : "false")); } elseif ($inhystere_netz == false && $inhystere == false) { $this->SetValue("PowerSteps", json_encode($array_powersteps)); IPS_LogMessage("Batterie", "Peak: alle Werte, keine hysterese"); } else { $dummy_array[] = 0; $this->SetValue("PowerSteps", json_encode($dummy_array)); IPS_LogMessage("Batterie", ": peak: Kein Fall"); } } } else { // Solar if ($batterieladezustand >= 5 + $aufdasnachladen) { $this->SetValue("Hysterese", false); $this->SetValue("Hysterese_Netz", true); } if ($batterieladezustand < $aufdasnachladen) { $this->SetValue("Hysterese", true); $this->SetValue("Hysterese_Netz", false); $nachladen = $this->ReadPropertyInteger("MaxNachladen"); $dummy_array[] = $nachladen; IPS_LogMessage("Batterie", ": MaxNachladen " . json_encode($dummy_array)); $this->SetValue("PowerSteps", json_encode($dummy_array)); } elseif ($batterieladezustand >= $aufdasnachladen) { if ($inhystere == true) { $filtered_powersteps = array_filter($array_powersteps, function ($value) { return $value >= 0; }); $filtered_powersteps_laden = array_values($filtered_powersteps); $this->SetValue("PowerSteps", json_encode($filtered_powersteps_laden)); IPS_LogMessage("Batterie", ": solar: Hysterese"); } else { $this->SetValue("PowerSteps", json_encode($array_powersteps)); IPS_LogMessage("Batterie", ": solar: Keine Hysterese"); } } else { $dummy_array[] = 0; $this->SetValue("PowerSteps", json_encode($dummy_array)); } if ($batterieladezustand >= 100) { $filtered_powersteps_entladen = array_filter($array_powersteps, function ($value) { return $value <= 0; }); $this->SetValue("PowerSteps", json_encode($filtered_powersteps_entladen)); IPS_LogMessage("Batterie", ": Solar über 100%" ); } }*/ } 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); } } } ?>