diff --git a/Batterie/form.json b/Batterie/form.json index 091c79c..e0a7f31 100644 --- a/Batterie/form.json +++ b/Batterie/form.json @@ -7,9 +7,15 @@ { "type": "NumberSpinner", "name": "IdleCounterMax", - "caption": "Zyklen zwischen zwei Leisutungsänderungen", + "caption": "Zyklen zwischen zwei Leistungsänderungen (Multipliziert sich mit Interval)", "suffix": "" }, + { + "type": "NumberSpinner", + "name": "Interval", + "caption": "Intervall Neuberechnung der Werte", + "suffix": "Sekunden" + }, { "type": "NumberSpinner", "name": "MaxBatterieleistung", diff --git a/Batterie/module.php b/Batterie/module.php index 06ece7c..0003224 100644 --- a/Batterie/module.php +++ b/Batterie/module.php @@ -15,6 +15,7 @@ class Batterie extends IPSModule $this->RegisterPropertyInteger("Batteriemanagement", 1); $this->RegisterPropertyInteger("MaxNachladen",0); $this->RegisterPropertyInteger("Netzbezug", 0); // Initialisierung mit 0 + $this->RegisterPropertyInteger("Interval", 2); // Recheninterval // Variabeln für Kommunkation mit Manager $this->RegisterVariableFloat("Entladeleistung","Entladeleistung", "",0); @@ -44,7 +45,7 @@ class Batterie extends IPSModule // Initialisiere Idle $this->SetValue("Idle", true); - $this->RegisterTimer("Timer_Do_UserCalc",2000,"IPS_RequestAction(" .$this->InstanceID .', "Do_UserCalc", "");'); + $this->RegisterTimer("Timer_Do_UserCalc_Battery",$this->ReadPropertyInteger("Interval")*1000,"IPS_RequestAction(" .$this->InstanceID .', "Do_UserCalc", "");'); } @@ -55,6 +56,7 @@ class Batterie extends IPSModule $batterieManagement = $this->ReadPropertyInteger("Batteriemanagement"); $this->SetValue("Batteriemanagement_Variabel", $batterieManagement); + $this->SetTimerInterval("Timer_Do_UserCalc_Battery",$this->ReadPropertyInteger("Interval")*1000); } private function GeneratePowerSteps($additionalValue) diff --git a/Boiler_2_Stufig_Mit_Fueler/form.json b/Boiler_2_Stufig_Mit_Fueler/form.json index 055f96a..9cb05ce 100644 --- a/Boiler_2_Stufig_Mit_Fueler/form.json +++ b/Boiler_2_Stufig_Mit_Fueler/form.json @@ -24,12 +24,18 @@ "name": "ZeitKonstante", "caption": "Zeit Konstante", "suffix": "" + }, + { + "type": "NumberSpinner", + "name": "Interval", + "caption": "Intervall Neuberechnung der Werte Erst für spätere Versionen, aktuell auf 5 lassen!", + "suffix": "Sekunden" }, { "type": "NumberSpinner", "name": "IdleCounterMax", - "caption": "Zeit zwischen zwei Leisutungsänderungen", - "suffix": "x5 Sekunden" + "caption": "Zyklen zwischen zwei Leistungsänderungen (Multipliziert sich mit Interval)", + "suffix": "" }, { "type": "NumberSpinner", diff --git a/Boiler_2_Stufig_Mit_Fueler/module.php b/Boiler_2_Stufig_Mit_Fueler/module.php index 58bd605..271f63f 100644 --- a/Boiler_2_Stufig_Mit_Fueler/module.php +++ b/Boiler_2_Stufig_Mit_Fueler/module.php @@ -16,7 +16,8 @@ class Boiler_2_Stufig_Mit_Fueler extends IPSModule $this->RegisterPropertyBoolean("Boilertemperatur_glätten", false); $this->RegisterPropertyInteger("Boilervolumen", 300); $this->RegisterPropertyString("Zeitplan", ""); - + $this->RegisterPropertyInteger("Interval", 5); // Recheninterval + // Boiler spezifische Variablen @@ -46,13 +47,14 @@ class Boiler_2_Stufig_Mit_Fueler extends IPSModule // Initialisiere Idle $this->SetValue("Idle", true); - $this->RegisterTimer("Timer_Do_UserCalc",5000,"IPS_RequestAction(" .$this->InstanceID .', "Do_UserCalc", "");'); + $this->RegisterTimer("Timer_Do_UserCalc_Boiler",$this->ReadPropertyInteger("Interval")*1000,"IPS_RequestAction(" .$this->InstanceID .', "Do_UserCalc", "");'); } public function ApplyChanges() { parent::ApplyChanges(); + $this->SetTimerInterval("Timer_Do_UserCalc_Boiler",$this->ReadPropertyInteger("Interval")*1000); diff --git a/HauptManager/form.json b/HauptManager/form.json index 292da1d..1406fc9 100644 --- a/HauptManager/form.json +++ b/HauptManager/form.json @@ -15,6 +15,12 @@ "name": "Ueberschussleistung", "caption": "Sollwertvorgabe für Solarladen", "suffix": "Watt" + }, + { + "type": "NumberSpinner", + "name": "Interval", + "caption": "Intervall Neuberechnung der Werte", + "suffix": "Sekunden" }, { "type": "List", diff --git a/HauptManager/module.php b/HauptManager/module.php index 8c072ba..097690f 100644 --- a/HauptManager/module.php +++ b/HauptManager/module.php @@ -11,16 +11,19 @@ class HauptManager extends IPSModule $this->RegisterPropertyInteger("Ueberschussleistung", 0); $this->RegisterPropertyInteger("Netzbezug", 0); // Initialisierung mit 0 $this->RegisterPropertyString("Verbraucher_Liste", "[]"); + $this->RegisterPropertyInteger("Interval", 3); // Recheninterval $this->RegisterVariableInteger("Gesamtnetzbezug", "Gesamtnetzbezug", "", 0); // Timer registrieren - $this->RegisterTimer("Timer_DistributeEnergy",5000,"IPS_RequestAction(" .$this->InstanceID .', "DistributeEnergy", "");'); + $this->RegisterTimer("Timer_DistributeEnergy",$this->ReadPropertyInteger("Interval")*1000,"IPS_RequestAction(" .$this->InstanceID .', "DistributeEnergy", "");'); } public function ApplyChanges() { parent::ApplyChanges(); + $this->SetTimerInterval("Timer_DistributeEnergy",$this->ReadPropertyInteger("Interval")*1000); + //Liste aller Verbraucher einlesen } @@ -59,6 +62,9 @@ class HauptManager extends IPSModule } $Netzbezug += $decodedUser["Netzbezug"]; + }else{ + + SetValue($user["User_Up"],'{"timestamp":'.time().',"Is_Peak_Shaving":'true',"User":[]}'); } } @@ -102,8 +108,14 @@ class HauptManager extends IPSModule } // Addiere die aktuell bereits verwendete Leistung auf, um sie bei der verteilung zu berücksichtigen - $totalAktuelle_Leistung += $user["Aktuelle_Leistung"]; - } + if(in_array(0, $user["PowerSteps"], true)){ + + // Addiere die aktuell bereits verwendete Leistung auf, um sie bei der verteilung zu berücksichtigen + $totalAktuelle_Leistung += $Aktuelle_Leistung; + + } + } + // Berücksichtigung der bereits verteilten Leistungen (nachher kann dafür wieder bei 0 begonnen werden zu verteilen) $remainingPower += $totalAktuelle_Leistung; @@ -209,7 +221,7 @@ class HauptManager extends IPSModule 'Writeback' => $user['Writeback'], 'Set_Leistung' => min($entry["PowerSteps"]) ]; - $remainingPower -= $entry["Aktuelle_Leistung"]; + //$remainingPower -= $entry["Aktuelle_Leistung"]; } } @@ -226,6 +238,7 @@ class HauptManager extends IPSModule ]; } + if($remainingPower>=0){ // Alle Schritte der Benutzer in einem Array sammeln $allSteps = []; foreach ($samePriorityUsers as $user) { @@ -294,12 +307,8 @@ class HauptManager extends IPSModule IPS_LogMessage("Manager", $remainingPower); IPS_LogMessage("Manager", $leistung); // Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen - if($leistung <= $remainingPower){ $leistung = max($leistung, $minimalleitsung); - }elseif($remainingPower<=$minimalleitsung){ - $leistung = min($leistung, $minimalleitsung); - - } + // Methode SetAktuelle_Leistung für jeden Verbraucher mit der entsprechenden Energie aufrufen @@ -312,7 +321,93 @@ class HauptManager extends IPSModule } - + } + else{ + + // Alle Schritte der Benutzer in einem Array sammeln + $allSteps = []; + foreach ($samePriorityUsers as $user) { + foreach ($user["PowerSteps"] as $step) { + $allSteps[] = [ + "user" => $user["InstanceID"], + "Writeback" => $user["Writeback"], + "step" => $step*-1, + ]; + } + } + + + // Sortiere die Schritte nach Größe + usort($allSteps, function ($a, $b) { + return $a["step"] <=> $b["step"]; + }); + + $remainingPower = $remainingPower *-1; + + // Iteriere durch alle Schritte + foreach ($allSteps as $entry) { + $user = $entry["user"]; + $manager = $entry["Writeback"]; + $powerstep = $entry["step"]; + + + $aktleistung = array_filter($userEnergyProv, function($entry2) use ($user, $manager) { + + + return $entry2["user"] == $user && $entry2["Writeback"] == $manager; + }); + + foreach($aktleistung as $entry){ + $aktleistung = $entry; + } + + // Überprüfe, ob noch genügend verbleibende Energie für den nächsten Schritt vorhanden ist + if ($remainingPower >= $powerstep - $aktleistung['Set_Leistung']) { + // Aktualisiere die verbleibende Energie und die bereitgestellte Energie für den Benutzer + $remainingPower -= $powerstep - $aktleistung['Set_Leistung']; + + array_walk($userEnergyProv, function(&$entry3) use ($user, $manager, $powerstep) { + if ($entry3["user"] == $user && $entry3["Writeback"] == $manager) { + $entry3["Set_Leistung"] = $powerstep; + } + }); + } + + } + $remainingPower = $remainingPower *-1; + + // Prüfen, dass jeder User mindestens seinen minimalwert an Leistung bekommt + foreach ($userEnergyProv as $userInstanceID => $leistung) { + $minimalleitsung = min( + array_column( + array_filter($allSteps, function ($entry) use ( + $userInstanceID + ) { + return $entry["user"] == $userInstanceID; + }), + "step" + ) + ); + + IPS_LogMessage("Manager", $userInstanceID); + IPS_LogMessage("Manager", $minimalleitsung); + IPS_LogMessage("Manager", $remainingPower); + IPS_LogMessage("Manager", $leistung); + // Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen + $leistung = max($leistung, $minimalleitsung)*-1; + + + // Methode SetAktuelle_Leistung für jeden Verbraucher mit der entsprechenden Energie aufrufen + + $resultArray[] = $userEnergyProv[$userInstanceID]; //[ + // 'InstanceID' => $user['InstanceID'], + // 'Writeback' => $user['Writeback'], + // 'Set_Leistung' => $leistung + // ]; + + } + + } } //IPS_LogMessage("Manager", print_r($resultArray)); diff --git a/Ladestation_Universal/form.json b/Ladestation_Universal/form.json index a385b80..242d2d5 100644 --- a/Ladestation_Universal/form.json +++ b/Ladestation_Universal/form.json @@ -46,9 +46,15 @@ { "type": "NumberSpinner", "name": "IdleCounterMax", - "caption": "Zyklen zwischen zwei Leistungsänderungen", + "caption": "Zyklen zwischen zwei Leistungsänderungen (Multipliziert sich mit Interval)", "suffix": "" }, + { + "type": "NumberSpinner", + "name": "Interval", + "caption": "Intervall Neuberechnung der Werte", + "suffix": "Sekunden" + }, { "type": "ValidationTextBox", "name": "IP_Adresse", diff --git a/Ladestation_Universal/module.php b/Ladestation_Universal/module.php index ba91f8f..27e130a 100644 --- a/Ladestation_Universal/module.php +++ b/Ladestation_Universal/module.php @@ -17,6 +17,7 @@ class Ladestation_Universal extends IPSModule $this->RegisterPropertyString("Seriennummer", ""); $this->RegisterPropertyString("Username", ""); $this->RegisterPropertyString("Password", ""); + $this->RegisterPropertyInteger("Interval", 5); // Recheninterval // Ladestationspezifische Variabeln @@ -47,13 +48,15 @@ class Ladestation_Universal extends IPSModule // Initialisiere Idle $this->SetValue("Idle", true); - $this->RegisterTimer("Timer_Do_UserCalc",5000,"IPS_RequestAction(" .$this->InstanceID .', "Do_UserCalc", "");'); + $this->RegisterTimer("Timer_Do_UserCalc_EVC",$this->ReadPropertyInteger("Interval")*1000,"IPS_RequestAction(" .$this->InstanceID .', "Do_UserCalc", "");'); } public function ApplyChanges() { parent::ApplyChanges(); + $this->SetTimerInterval("Timer_Do_UserCalc_EVC",$this->ReadPropertyInteger("Interval")*1000); + // Zusätzliche Anpassungen nach Bedarf } diff --git a/Manager/form.json b/Manager/form.json index bbebbc2..84dadcb 100644 --- a/Manager/form.json +++ b/Manager/form.json @@ -42,6 +42,12 @@ "name": "DatenZuruck", "caption": "Daten Zurück" }, + { + "type": "NumberSpinner", + "name": "Interval", + "caption": "Intervall Neuberechnung der Werte", + "suffix": "Sekunden" + }, { "type": "List", "name": "Verbraucher_Liste", diff --git a/Manager/module.php b/Manager/module.php index 8adb8a2..7c3bae3 100644 --- a/Manager/module.php +++ b/Manager/module.php @@ -15,16 +15,19 @@ class Manager extends IPSModule $this->RegisterPropertyInteger("ManagerID", 0); // Initialisierung mit 0 $this->RegisterPropertyInteger("DatenHoch", 0); // Initialisierung mit 0 $this->RegisterPropertyInteger("DatenZuruck", 0); // Initialisierung mit 0 + $this->RegisterPropertyInteger("Interval", 2); // Recheninterval - // Timer registrieren - $this->RegisterTimer("Timer_DistributeEnergy",2000,"IPS_RequestAction(" .$this->InstanceID .', "DistributeEnergy", "");'); + // Timer registrieren + + $this->RegisterTimer("Timer_DistributeEnergy",$this->ReadPropertyInteger("Interval")*1000,"IPS_RequestAction(" .$this->InstanceID .', "DistributeEnergy", "");'); } public function ApplyChanges() { parent::ApplyChanges(); //Liste aller Verbraucher einlesen - $Verbraucher_Liste = $this->ReadPropertyString("Verbraucher_Liste"); + $this->SetTimerInterval("Timer_DistributeEnergy",$this->ReadPropertyInteger("Interval")*1000); + } public function RequestAction($Ident, $Value) @@ -146,8 +149,8 @@ class Manager extends IPSModule } // Berücksichtigung der bereits verteilten Leistungen (nachher kann dafür wieder bei 0 begonnen werden zu verteilen) $remainingPower += $totalAktuelle_Leistung; - IPS_LogMessage("Manag nach kalk", $remainingPower); + // Abbrechen wenn es keine gefilterten User gibt if (empty($filteredVerbraucher)) { return; @@ -223,8 +226,8 @@ class Manager extends IPSModule //$remainingPower -= $entry["Aktuelle_Leistung"]; } } - IPS_LogMessage("Manag abzug noller", $remainingPower); + // Nun die verteilen, die 0 erhalten können. $samePriorityUsers = $withZero; diff --git a/Verbraucher_1_Stufig/form.json b/Verbraucher_1_Stufig/form.json index 8b4b348..9f97652 100644 --- a/Verbraucher_1_Stufig/form.json +++ b/Verbraucher_1_Stufig/form.json @@ -8,9 +8,15 @@ { "type": "NumberSpinner", "name": "IdleCounterMax", - "caption": "Zyklen zwischen zwei Leisutungsänderungen", + "caption": "Zyklen zwischen zwei Leistungsänderungen (Multipliziert sich mit Interval)", "suffix": "" }, + { + "type": "NumberSpinner", + "name": "Interval", + "caption": "Intervall Neuberechnung der Werte Erst für spätere Versionen, aktuell auf 5 lassen!", + "suffix": "Sekunden" + }, { "type": "NumberSpinner", "name": "Mindesttlaufzeit", diff --git a/Verbraucher_1_Stufig/module.php b/Verbraucher_1_Stufig/module.php index e4313cc..9f61795 100644 --- a/Verbraucher_1_Stufig/module.php +++ b/Verbraucher_1_Stufig/module.php @@ -12,6 +12,7 @@ class Verbraucher_1_Stufig extends IPSModule $this->RegisterPropertyInteger("Mindesttlaufzeit", 4); // Standardwert für Volllast $this->RegisterPropertyInteger("Zeit_Zwischen_Zustandswechseln", 1); $this->RegisterPropertyInteger("Schaltkontakt1", 0); + $this->RegisterPropertyInteger("Interval", 5); // Recheninterval // Verbraucherspezifische Variabeln $this->RegisterVariableBoolean("IstNacht", "IstNacht", "", 0); @@ -40,13 +41,15 @@ class Verbraucher_1_Stufig extends IPSModule // Initialisiere Idle $this->SetValue("Idle", true); - $this->RegisterTimer("Timer_Do_UserCalc",5000,"IPS_RequestAction(" .$this->InstanceID .', "Do_UserCalc", "");'); + $this->RegisterTimer("Timer_Do_UserCalc_Verb",$this->ReadPropertyInteger("Interval")*1000,"IPS_RequestAction(" .$this->InstanceID .', "Do_UserCalc", "");'); } public function ApplyChanges() { parent::ApplyChanges(); + $this->SetTimerInterval("Timer_Do_UserCalc_Verb",$this->ReadPropertyInteger("Interval")*1000); + } public function RequestAction($Ident, $Value) diff --git a/WP_Steuerung/form.json b/WP_Steuerung/form.json index a86a354..de137ee 100644 --- a/WP_Steuerung/form.json +++ b/WP_Steuerung/form.json @@ -65,6 +65,12 @@ "name": "WW_Temp", "caption": "Variable mit der Aktuellen Warmwassertemperatur", "test": true + }, + { + "type": "NumberSpinner", + "name": "Interval", + "caption": "Intervall Neuberechnung der Werte Erst für spätere Versionen, aktuell auf 5 lassen!", + "suffix": "Sekunden" } ] diff --git a/WP_Steuerung/module.php b/WP_Steuerung/module.php index 1983100..3430842 100644 --- a/WP_Steuerung/module.php +++ b/WP_Steuerung/module.php @@ -16,6 +16,7 @@ class WP_Steuerung extends IPSModule $this->RegisterPropertyBoolean("Schwellwert_Anwenden", false); $this->RegisterPropertyInteger("Schwellwert", 0); $this->RegisterPropertyInteger("WW_Temp", 1); + $this->RegisterPropertyInteger("Interval", 5); // Recheninterval // WP-Spezifische Variabeln $this->RegisterVariableBoolean("Sperrzeit", "Sperrzeit", "", false); @@ -45,13 +46,15 @@ class WP_Steuerung extends IPSModule // Initialisiere Idle $this->SetValue("Idle", true); - $this->RegisterTimer("Timer_Do_UserCalc",5000,"IPS_RequestAction(" .$this->InstanceID .', "Do_UserCalc", "");'); + $this->RegisterTimer("Timer_Do_UserCalc_WP",$this->ReadPropertyInteger("Interval")*1000,"IPS_RequestAction(" .$this->InstanceID .', "Do_UserCalc", "");'); } public function ApplyChanges() { parent::ApplyChanges(); + $this->SetTimerInterval("Timer_Do_UserCalc_WP",$this->ReadPropertyInteger("Interval")*1000); + }