Anpassgunen an zeitintervallen, hauptmanager auf manager angepasst (achtung nciht updaten muss ncoht fertig werden)

This commit is contained in:
2025-03-14 15:57:56 +01:00
parent ec80612c04
commit f71cb57e7c
14 changed files with 179 additions and 26 deletions

View File

@@ -7,9 +7,15 @@
{ {
"type": "NumberSpinner", "type": "NumberSpinner",
"name": "IdleCounterMax", "name": "IdleCounterMax",
"caption": "Zyklen zwischen zwei Leisutungsänderungen", "caption": "Zyklen zwischen zwei Leistungsänderungen (Multipliziert sich mit Interval)",
"suffix": "" "suffix": ""
}, },
{
"type": "NumberSpinner",
"name": "Interval",
"caption": "Intervall Neuberechnung der Werte",
"suffix": "Sekunden"
},
{ {
"type": "NumberSpinner", "type": "NumberSpinner",
"name": "MaxBatterieleistung", "name": "MaxBatterieleistung",

View File

@@ -15,6 +15,7 @@ class Batterie extends IPSModule
$this->RegisterPropertyInteger("Batteriemanagement", 1); $this->RegisterPropertyInteger("Batteriemanagement", 1);
$this->RegisterPropertyInteger("MaxNachladen",0); $this->RegisterPropertyInteger("MaxNachladen",0);
$this->RegisterPropertyInteger("Netzbezug", 0); // Initialisierung mit 0 $this->RegisterPropertyInteger("Netzbezug", 0); // Initialisierung mit 0
$this->RegisterPropertyInteger("Interval", 2); // Recheninterval
// Variabeln für Kommunkation mit Manager // Variabeln für Kommunkation mit Manager
$this->RegisterVariableFloat("Entladeleistung","Entladeleistung", "",0); $this->RegisterVariableFloat("Entladeleistung","Entladeleistung", "",0);
@@ -44,7 +45,7 @@ class Batterie extends IPSModule
// Initialisiere Idle // Initialisiere Idle
$this->SetValue("Idle", true); $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"); $batterieManagement = $this->ReadPropertyInteger("Batteriemanagement");
$this->SetValue("Batteriemanagement_Variabel", $batterieManagement); $this->SetValue("Batteriemanagement_Variabel", $batterieManagement);
$this->SetTimerInterval("Timer_Do_UserCalc_Battery",$this->ReadPropertyInteger("Interval")*1000);
} }
private function GeneratePowerSteps($additionalValue) private function GeneratePowerSteps($additionalValue)

View File

@@ -25,11 +25,17 @@
"caption": "Zeit Konstante", "caption": "Zeit Konstante",
"suffix": "" "suffix": ""
}, },
{
"type": "NumberSpinner",
"name": "Interval",
"caption": "Intervall Neuberechnung der Werte Erst für spätere Versionen, aktuell auf 5 lassen!",
"suffix": "Sekunden"
},
{ {
"type": "NumberSpinner", "type": "NumberSpinner",
"name": "IdleCounterMax", "name": "IdleCounterMax",
"caption": "Zeit zwischen zwei Leisutungsänderungen", "caption": "Zyklen zwischen zwei Leistungsänderungen (Multipliziert sich mit Interval)",
"suffix": "x5 Sekunden" "suffix": ""
}, },
{ {
"type": "NumberSpinner", "type": "NumberSpinner",

View File

@@ -16,6 +16,7 @@ class Boiler_2_Stufig_Mit_Fueler extends IPSModule
$this->RegisterPropertyBoolean("Boilertemperatur_glätten", false); $this->RegisterPropertyBoolean("Boilertemperatur_glätten", false);
$this->RegisterPropertyInteger("Boilervolumen", 300); $this->RegisterPropertyInteger("Boilervolumen", 300);
$this->RegisterPropertyString("Zeitplan", ""); $this->RegisterPropertyString("Zeitplan", "");
$this->RegisterPropertyInteger("Interval", 5); // Recheninterval
// Boiler spezifische Variablen // Boiler spezifische Variablen
@@ -46,13 +47,14 @@ class Boiler_2_Stufig_Mit_Fueler extends IPSModule
// Initialisiere Idle // Initialisiere Idle
$this->SetValue("Idle", true); $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() public function ApplyChanges()
{ {
parent::ApplyChanges(); parent::ApplyChanges();
$this->SetTimerInterval("Timer_Do_UserCalc_Boiler",$this->ReadPropertyInteger("Interval")*1000);

View File

@@ -16,6 +16,12 @@
"caption": "Sollwertvorgabe für Solarladen", "caption": "Sollwertvorgabe für Solarladen",
"suffix": "Watt" "suffix": "Watt"
}, },
{
"type": "NumberSpinner",
"name": "Interval",
"caption": "Intervall Neuberechnung der Werte",
"suffix": "Sekunden"
},
{ {
"type": "List", "type": "List",
"name": "Verbraucher_Liste", "name": "Verbraucher_Liste",

View File

@@ -11,16 +11,19 @@ class HauptManager extends IPSModule
$this->RegisterPropertyInteger("Ueberschussleistung", 0); $this->RegisterPropertyInteger("Ueberschussleistung", 0);
$this->RegisterPropertyInteger("Netzbezug", 0); // Initialisierung mit 0 $this->RegisterPropertyInteger("Netzbezug", 0); // Initialisierung mit 0
$this->RegisterPropertyString("Verbraucher_Liste", "[]"); $this->RegisterPropertyString("Verbraucher_Liste", "[]");
$this->RegisterPropertyInteger("Interval", 3); // Recheninterval
$this->RegisterVariableInteger("Gesamtnetzbezug", "Gesamtnetzbezug", "", 0); $this->RegisterVariableInteger("Gesamtnetzbezug", "Gesamtnetzbezug", "", 0);
// Timer registrieren // 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() public function ApplyChanges()
{ {
parent::ApplyChanges(); parent::ApplyChanges();
$this->SetTimerInterval("Timer_DistributeEnergy",$this->ReadPropertyInteger("Interval")*1000);
//Liste aller Verbraucher einlesen //Liste aller Verbraucher einlesen
} }
@@ -59,6 +62,9 @@ class HauptManager extends IPSModule
} }
$Netzbezug += $decodedUser["Netzbezug"]; $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 // 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) // Berücksichtigung der bereits verteilten Leistungen (nachher kann dafür wieder bei 0 begonnen werden zu verteilen)
$remainingPower += $totalAktuelle_Leistung; $remainingPower += $totalAktuelle_Leistung;
@@ -209,7 +221,7 @@ class HauptManager extends IPSModule
'Writeback' => $user['Writeback'], 'Writeback' => $user['Writeback'],
'Set_Leistung' => min($entry["PowerSteps"]) '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 // Alle Schritte der Benutzer in einem Array sammeln
$allSteps = []; $allSteps = [];
foreach ($samePriorityUsers as $user) { foreach ($samePriorityUsers as $user) {
@@ -294,12 +307,8 @@ class HauptManager extends IPSModule
IPS_LogMessage("Manager", $remainingPower); IPS_LogMessage("Manager", $remainingPower);
IPS_LogMessage("Manager", $leistung); IPS_LogMessage("Manager", $leistung);
// Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen // Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen
if($leistung <= $remainingPower){
$leistung = max($leistung, $minimalleitsung); $leistung = max($leistung, $minimalleitsung);
}elseif($remainingPower<=$minimalleitsung){
$leistung = min($leistung, $minimalleitsung);
}
// Methode SetAktuelle_Leistung für jeden Verbraucher mit der entsprechenden Energie aufrufen // 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)); //IPS_LogMessage("Manager", print_r($resultArray));

View File

@@ -46,9 +46,15 @@
{ {
"type": "NumberSpinner", "type": "NumberSpinner",
"name": "IdleCounterMax", "name": "IdleCounterMax",
"caption": "Zyklen zwischen zwei Leistungsänderungen", "caption": "Zyklen zwischen zwei Leistungsänderungen (Multipliziert sich mit Interval)",
"suffix": "" "suffix": ""
}, },
{
"type": "NumberSpinner",
"name": "Interval",
"caption": "Intervall Neuberechnung der Werte",
"suffix": "Sekunden"
},
{ {
"type": "ValidationTextBox", "type": "ValidationTextBox",
"name": "IP_Adresse", "name": "IP_Adresse",

View File

@@ -17,6 +17,7 @@ class Ladestation_Universal extends IPSModule
$this->RegisterPropertyString("Seriennummer", ""); $this->RegisterPropertyString("Seriennummer", "");
$this->RegisterPropertyString("Username", ""); $this->RegisterPropertyString("Username", "");
$this->RegisterPropertyString("Password", ""); $this->RegisterPropertyString("Password", "");
$this->RegisterPropertyInteger("Interval", 5); // Recheninterval
// Ladestationspezifische Variabeln // Ladestationspezifische Variabeln
@@ -47,13 +48,15 @@ class Ladestation_Universal extends IPSModule
// Initialisiere Idle // Initialisiere Idle
$this->SetValue("Idle", true); $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() public function ApplyChanges()
{ {
parent::ApplyChanges(); parent::ApplyChanges();
$this->SetTimerInterval("Timer_Do_UserCalc_EVC",$this->ReadPropertyInteger("Interval")*1000);
// Zusätzliche Anpassungen nach Bedarf // Zusätzliche Anpassungen nach Bedarf
} }

View File

@@ -42,6 +42,12 @@
"name": "DatenZuruck", "name": "DatenZuruck",
"caption": "Daten Zurück" "caption": "Daten Zurück"
}, },
{
"type": "NumberSpinner",
"name": "Interval",
"caption": "Intervall Neuberechnung der Werte",
"suffix": "Sekunden"
},
{ {
"type": "List", "type": "List",
"name": "Verbraucher_Liste", "name": "Verbraucher_Liste",

View File

@@ -15,16 +15,19 @@ class Manager extends IPSModule
$this->RegisterPropertyInteger("ManagerID", 0); // Initialisierung mit 0 $this->RegisterPropertyInteger("ManagerID", 0); // Initialisierung mit 0
$this->RegisterPropertyInteger("DatenHoch", 0); // Initialisierung mit 0 $this->RegisterPropertyInteger("DatenHoch", 0); // Initialisierung mit 0
$this->RegisterPropertyInteger("DatenZuruck", 0); // Initialisierung mit 0 $this->RegisterPropertyInteger("DatenZuruck", 0); // Initialisierung mit 0
$this->RegisterPropertyInteger("Interval", 2); // Recheninterval
// Timer registrieren // Timer registrieren
$this->RegisterTimer("Timer_DistributeEnergy",2000,"IPS_RequestAction(" .$this->InstanceID .', "DistributeEnergy", "");');
$this->RegisterTimer("Timer_DistributeEnergy",$this->ReadPropertyInteger("Interval")*1000,"IPS_RequestAction(" .$this->InstanceID .', "DistributeEnergy", "");');
} }
public function ApplyChanges() public function ApplyChanges()
{ {
parent::ApplyChanges(); parent::ApplyChanges();
//Liste aller Verbraucher einlesen //Liste aller Verbraucher einlesen
$Verbraucher_Liste = $this->ReadPropertyString("Verbraucher_Liste"); $this->SetTimerInterval("Timer_DistributeEnergy",$this->ReadPropertyInteger("Interval")*1000);
} }
public function RequestAction($Ident, $Value) public function RequestAction($Ident, $Value)
@@ -146,7 +149,7 @@ class Manager extends IPSModule
} }
// Berücksichtigung der bereits verteilten Leistungen (nachher kann dafür wieder bei 0 begonnen werden zu verteilen) // Berücksichtigung der bereits verteilten Leistungen (nachher kann dafür wieder bei 0 begonnen werden zu verteilen)
$remainingPower += $totalAktuelle_Leistung; $remainingPower += $totalAktuelle_Leistung;
IPS_LogMessage("Manag nach kalk", $remainingPower);
// Abbrechen wenn es keine gefilterten User gibt // Abbrechen wenn es keine gefilterten User gibt
if (empty($filteredVerbraucher)) { if (empty($filteredVerbraucher)) {
@@ -223,7 +226,7 @@ class Manager extends IPSModule
//$remainingPower -= $entry["Aktuelle_Leistung"]; //$remainingPower -= $entry["Aktuelle_Leistung"];
} }
} }
IPS_LogMessage("Manag abzug noller", $remainingPower);
// Nun die verteilen, die 0 erhalten können. // Nun die verteilen, die 0 erhalten können.
$samePriorityUsers = $withZero; $samePriorityUsers = $withZero;

View File

@@ -8,9 +8,15 @@
{ {
"type": "NumberSpinner", "type": "NumberSpinner",
"name": "IdleCounterMax", "name": "IdleCounterMax",
"caption": "Zyklen zwischen zwei Leisutungsänderungen", "caption": "Zyklen zwischen zwei Leistungsänderungen (Multipliziert sich mit Interval)",
"suffix": "" "suffix": ""
}, },
{
"type": "NumberSpinner",
"name": "Interval",
"caption": "Intervall Neuberechnung der Werte Erst für spätere Versionen, aktuell auf 5 lassen!",
"suffix": "Sekunden"
},
{ {
"type": "NumberSpinner", "type": "NumberSpinner",
"name": "Mindesttlaufzeit", "name": "Mindesttlaufzeit",

View File

@@ -12,6 +12,7 @@ class Verbraucher_1_Stufig extends IPSModule
$this->RegisterPropertyInteger("Mindesttlaufzeit", 4); // Standardwert für Volllast $this->RegisterPropertyInteger("Mindesttlaufzeit", 4); // Standardwert für Volllast
$this->RegisterPropertyInteger("Zeit_Zwischen_Zustandswechseln", 1); $this->RegisterPropertyInteger("Zeit_Zwischen_Zustandswechseln", 1);
$this->RegisterPropertyInteger("Schaltkontakt1", 0); $this->RegisterPropertyInteger("Schaltkontakt1", 0);
$this->RegisterPropertyInteger("Interval", 5); // Recheninterval
// Verbraucherspezifische Variabeln // Verbraucherspezifische Variabeln
$this->RegisterVariableBoolean("IstNacht", "IstNacht", "", 0); $this->RegisterVariableBoolean("IstNacht", "IstNacht", "", 0);
@@ -40,13 +41,15 @@ class Verbraucher_1_Stufig extends IPSModule
// Initialisiere Idle // Initialisiere Idle
$this->SetValue("Idle", true); $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() public function ApplyChanges()
{ {
parent::ApplyChanges(); parent::ApplyChanges();
$this->SetTimerInterval("Timer_Do_UserCalc_Verb",$this->ReadPropertyInteger("Interval")*1000);
} }
public function RequestAction($Ident, $Value) public function RequestAction($Ident, $Value)

View File

@@ -65,6 +65,12 @@
"name": "WW_Temp", "name": "WW_Temp",
"caption": "Variable mit der Aktuellen Warmwassertemperatur", "caption": "Variable mit der Aktuellen Warmwassertemperatur",
"test": true "test": true
},
{
"type": "NumberSpinner",
"name": "Interval",
"caption": "Intervall Neuberechnung der Werte Erst für spätere Versionen, aktuell auf 5 lassen!",
"suffix": "Sekunden"
} }
] ]

View File

@@ -16,6 +16,7 @@ class WP_Steuerung extends IPSModule
$this->RegisterPropertyBoolean("Schwellwert_Anwenden", false); $this->RegisterPropertyBoolean("Schwellwert_Anwenden", false);
$this->RegisterPropertyInteger("Schwellwert", 0); $this->RegisterPropertyInteger("Schwellwert", 0);
$this->RegisterPropertyInteger("WW_Temp", 1); $this->RegisterPropertyInteger("WW_Temp", 1);
$this->RegisterPropertyInteger("Interval", 5); // Recheninterval
// WP-Spezifische Variabeln // WP-Spezifische Variabeln
$this->RegisterVariableBoolean("Sperrzeit", "Sperrzeit", "", false); $this->RegisterVariableBoolean("Sperrzeit", "Sperrzeit", "", false);
@@ -45,13 +46,15 @@ class WP_Steuerung extends IPSModule
// Initialisiere Idle // Initialisiere Idle
$this->SetValue("Idle", true); $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() public function ApplyChanges()
{ {
parent::ApplyChanges(); parent::ApplyChanges();
$this->SetTimerInterval("Timer_Do_UserCalc_WP",$this->ReadPropertyInteger("Interval")*1000);
} }