From 09fe3805809a72e968b4959785f88299848ea811 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=A4fliger?= Date: Fri, 29 Nov 2024 10:42:33 +0100 Subject: [PATCH] Auf stand Von testign gebracht --- Belevo_Server_Kommunikation/module.php | 2 - Boiler_2_Stufig_Mit_Fueler/module.php | 66 ++++----- CC100_HW/module.php | 6 +- Ladestation_Universal/form.json | 2 +- Ladestation_Universal/module.php | 52 ++++--- Manager/form.json | 6 +- Manager/module.php | 187 ++++++++++++------------- Verbraucher_1_Stufig/module.php | 69 ++++----- WP_Steuerung/module.php | 88 ++++++------ library.json | 4 +- 10 files changed, 226 insertions(+), 256 deletions(-) diff --git a/Belevo_Server_Kommunikation/module.php b/Belevo_Server_Kommunikation/module.php index 2ece353..c614140 100644 --- a/Belevo_Server_Kommunikation/module.php +++ b/Belevo_Server_Kommunikation/module.php @@ -46,11 +46,9 @@ class Belevo_Server_Kommunikation extends IPSModule if ($InfluxJaNein) { // Timer auf 5 Minuten setzen $this->SetTimerInterval("Timer_Influx", 300000); // Alle 5 Minuten -> 5*60*1000=300000 - IPS_LogMessage("Belevo_Server_Kommunikation", "Influx Ja"); } else { // Timer stoppen $this->SetTimerInterval("Timer_Influx", 0); - IPS_LogMessage("Belevo_Server_Kommunikation", "Influx Nein"); } } diff --git a/Boiler_2_Stufig_Mit_Fueler/module.php b/Boiler_2_Stufig_Mit_Fueler/module.php index 7da6ab9..742bbc8 100644 --- a/Boiler_2_Stufig_Mit_Fueler/module.php +++ b/Boiler_2_Stufig_Mit_Fueler/module.php @@ -6,37 +6,33 @@ class Boiler_2_Stufig_Mit_Fueler extends IPSModule { parent::Create(); - // Prioritäten - $this->RegisterVariableInteger("LockPrio", "LockPrio"); - $this->RegisterVariableInteger("UserPrio", "UserPrio"); - - // Energiehandling - $this->RegisterVariableBoolean("Idle", "Idle", "", 0); - $this->RegisterVariableInteger("CurrentPower", "CurrentPower", "", 0); - $this->RegisterVariableFloat("UsedEnergy", "UsedEnergy", "", 0); - $this->RegisterVariableString("PowerSteps", "PowerSteps"); // PowerSteps-Variable registrieren - - // Trägheit system - $this->RegisterPropertyInteger("IdleCounterMax", 2); - $this->RegisterVariableInteger("IdleCounter", "IdleCounter", "", 0); - $this->SetValue("IdleCounter", 0); - // Boiler spezifische Properties $this->RegisterPropertyInteger("BoilerLeistungTeillast", 3000); $this->RegisterPropertyInteger("BoilerLeistungVolllast", 6000); $this->RegisterPropertyInteger("Boilertemperatur", 0); - - // Boiler spezifische Variablen - $this->RegisterVariableInteger("Boilermintemp","Boilermintemp","",45); - $this->RegisterVariableInteger("Boilermaxtemp","Boilermaxtemp","",60); - $this->RegisterVariableInteger("Boilerlegiotemp","Boilerlegiotemp","",65); - $this->RegisterVariableInteger("LegioCounter", "LegioCounter", "", 0); - - // Schaltkontakte $this->RegisterPropertyInteger("Kontakt_Teillast", 0); $this->RegisterPropertyInteger("Kontakt_Volllast", 0); - // Initialisieren + // Boiler spezifische Variablen + $this->RegisterVariableInteger("Mindesttemperatur","Mindesttemperatur","",45); + $this->RegisterVariableInteger("Maximaltemperatur","Maximaltemperatur","",60); + $this->RegisterVariableInteger("Legionellentemperatur","Legionellentemperatur","",65); + $this->RegisterVariableInteger("LegioCounter", "LegioCounter", "", 0); + + // Variabeln für Kommunkation mit Manager + $this->RegisterVariableInteger("Sperre_Prio", "Sperre_Prio"); + $this->RegisterVariableInteger("PV_Prio", "PV_Prio"); + $this->RegisterVariableBoolean("Idle", "Idle", "", 0); + $this->RegisterVariableInteger("Aktuelle_Leistung", "Aktuelle_Leistung", "", 0); + $this->RegisterVariableFloat("Bezogene_Energie", "Bezogene_Energie", "", 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); } @@ -49,8 +45,8 @@ class Boiler_2_Stufig_Mit_Fueler extends IPSModule public function RequestAction($Ident, $Value) { switch ($Ident) { - case "SetCurrentPower": - $this->SetCurrentPower($Value); + case "SetAktuelle_Leistung": + $this->SetAktuelle_Leistung($Value); break; case "GetCurrentData": return $this->GetCurrentData($Value); @@ -60,7 +56,7 @@ class Boiler_2_Stufig_Mit_Fueler extends IPSModule } // Methode zum Setzen des aktuellen Stromverbrauchs - public function SetCurrentPower(int $power) + public function SetAktuelle_Leistung(int $power) { // Schalte Kontakt Teillast und Vollast entsprechend der Power-Einstellung if ($power == $this->ReadPropertyInteger("BoilerLeistungVolllast")) { @@ -77,7 +73,7 @@ class Boiler_2_Stufig_Mit_Fueler extends IPSModule } // Prüfe auf Änderung der Power im Vergleich zur letzten Einstellung - $lastPower = GetValue($this->GetIDForIdent("CurrentPower")); + $lastPower = GetValue($this->GetIDForIdent("Aktuelle_Leistung")); if ($power != $lastPower) { $this->SetValue("Idle", false); $this->SetValue( @@ -86,8 +82,8 @@ class Boiler_2_Stufig_Mit_Fueler extends IPSModule ); } - // Setze die neue CurrentPower - $this->SetValue("CurrentPower", $power); + // Setze die neue Aktuelle_Leistung + $this->SetValue("Aktuelle_Leistung", $power); // IdleCounter verarbeiten $this->ProcessIdleCounter(); @@ -99,9 +95,9 @@ class Boiler_2_Stufig_Mit_Fueler extends IPSModule $LegioCounter = $this->GetValue("LegioCounter"); $boilerTemp = GetValue($this->ReadPropertyInteger("Boilertemperatur")); - $minTemp = $this->GetValue("Boilermintemp"); - $maxTemp = $this->GetValue("Boilermaxtemp"); - $LegioTemp = $this->GetValue("Boilerlegiotemp"); + $minTemp = $this->GetValue("Mindesttemperatur"); + $maxTemp = $this->GetValue("Maximaltemperatur"); + $LegioTemp = $this->GetValue("Legionellentemperatur"); $teilLeistung = $this->ReadPropertyInteger("BoilerLeistungTeillast"); $vollLeistung = $this->ReadPropertyInteger("BoilerLeistungVolllast"); @@ -184,8 +180,8 @@ class Boiler_2_Stufig_Mit_Fueler extends IPSModule private function CheckIdle($power) { - $lastpower = GetValue("CurrentPower"); - if ($lastpower != GetValue("CurrentPower")) { + $lastpower = GetValue("Aktuelle_Leistung"); + if ($lastpower != GetValue("Aktuelle_Leistung")) { $this->SetValue("Idle", false); $this->SetValue( "IdleCounter", diff --git a/CC100_HW/module.php b/CC100_HW/module.php index f0b15c3..5a305df 100644 --- a/CC100_HW/module.php +++ b/CC100_HW/module.php @@ -5,7 +5,7 @@ class CC100_HW extends IPSModule private $DigOutPID = "/sys/kernel/dout_drv/DOUT_DATA"; private $PT1PID = "/sys/bus/iio/devices/iio:device2/in_voltage13_raw"; private $PT2PID = "/sys/bus/iio/devices/iio:device2/in_voltage1_raw"; - private $DIN_FILE = "/sys/bus/iio/devices/iio:device2/in_voltage1_raw"; + private $DIN_FILE = "/sys/devices/platform/soc/44009000.spi/spi_master/spi0/spi0.0/din"; private $waitingTime = 1; // Waiting time (in ms) for a new attempt to write a digital output (if file is blocked) private $maxTime = 5000; // Max time (in ms) for the writing process @@ -118,7 +118,7 @@ class CC100_HW extends IPSModule private function TryWriteFile($starttime) { - $this->readAndConvertToBools($DIN_FILE); + $this->readAndConvertToBools($this->DIN_FILE); $currentTime = microtime(true) * 1000; if ($currentTime - $starttime <= $this->maxTime) { @@ -202,4 +202,4 @@ class CC100_HW extends IPSModule } } -?> +?> \ No newline at end of file diff --git a/Ladestation_Universal/form.json b/Ladestation_Universal/form.json index 269236a..f58ea37 100644 --- a/Ladestation_Universal/form.json +++ b/Ladestation_Universal/form.json @@ -35,7 +35,7 @@ { "type": "Label", - "caption": "Aktuell wird nur Go-E ladestation zu testzwecken unterstützt!" + "caption": "Aktuell wird nur Go-E ladestation unterstützt!" } ] } diff --git a/Ladestation_Universal/module.php b/Ladestation_Universal/module.php index 465917a..9c36850 100644 --- a/Ladestation_Universal/module.php +++ b/Ladestation_Universal/module.php @@ -6,41 +6,37 @@ class Ladestation_Universal extends IPSModule { parent::Create(); - // Prioritäten - $this->RegisterVariableInteger("LockPrio", "LockPrio"); - $this->RegisterVariableInteger("UserPrio", "UserPrio"); - - // Energiehandling - $this->RegisterVariableBoolean("Idle", "Idle", "", 0); - $this->RegisterVariableInteger("CurrentPower", "CurrentPower", "", 0); - $this->RegisterVariableFloat("UsedEnergy", "UsedEnergy", "", 0); - $this->RegisterVariableString("PowerSteps", "PowerSteps"); // PowerSteps-Variable registrieren - - // Trägheit - $this->RegisterPropertyInteger("IdleCounterMax", 2); - $this->RegisterVariableInteger("IdleCounter", "IdleCounter", "", 0); - $this->SetValue("IdleCounter", 0); - - // Properties registrieren + // Ladestationspezifische Properties $this->RegisterPropertyInteger("MinLeistung", 3600); $this->RegisterPropertyInteger("MaxLeistung", 11000); - $this->RegisterPropertyInteger("MinLeistung_1ph", 1400); $this->RegisterPropertyInteger("MaxLeistung_1ph", 7800); $this->RegisterPropertyString("IP_Adresse", "0.0.0.0"); - $this->RegisterVariableBoolean("Ladebereit", "Ladebereit", "~Switch", 11); - $this->RegisterVariableBoolean("Solarladen", "Solarladen", "~Switch", 11); + // Ladestationspezifische Variabeln + $this->RegisterVariableBoolean("Ladebereit", "Ladebereit", "~Switch", 1); + $this->RegisterVariableBoolean("Solarladen", "Solarladen", "~Switch", 0); $this->RegisterVariableInteger("Fahrzeugstatus", "Fahrzeugstatus", "", 0); $this->RegisterVariableInteger("Lademodus", "Lademodus", "", 0); $this->RegisterVariableFloat("Ladeleistung_Effektiv", "Ladeleistung_Effektiv", "", 0); - $this->RegisterVariableBoolean("Peak", "Peak", "", 0); - $this->RegisterVariableInteger("Ladestrom", "Ladestrom"); $this->RegisterVariableInteger("Ladeleistung", "Ladeleistung"); + + // Variabeln für Kommunkation mit Manager + $this->RegisterVariableInteger("Sperre_Prio", "Sperre_Prio"); + $this->RegisterVariableInteger("PV_Prio", "PV_Prio"); + $this->RegisterVariableBoolean("Idle", "Idle", "", 0); + $this->RegisterVariableInteger("Aktuelle_Leistung", "Aktuelle_Leistung", "", 0); + $this->RegisterVariableFloat("Bezogene_Energie", "Bezogene_Energie", "", 0); + $this->RegisterVariableString("PowerSteps", "PowerSteps"); - // Initialisieren + // Hilfsvariabeln für Idle zustand + $this->RegisterPropertyInteger("IdleCounterMax", 2); + $this->RegisterVariableInteger("IdleCounter", "IdleCounter", "", 0); + $this->SetValue("IdleCounter", 0); + + // Initialisiere Idle $this->SetValue("Idle", true); } @@ -54,8 +50,8 @@ class Ladestation_Universal extends IPSModule public function RequestAction($Ident, $Value) { switch ($Ident) { - case "SetCurrentPower": - $this->SetCurrentPower($Value); + case "SetAktuelle_Leistung": + $this->SetAktuelle_Leistung($Value); break; case "GetCurrentData": $powerSteps = $this->GetCurrentData($Value); @@ -65,11 +61,11 @@ class Ladestation_Universal extends IPSModule } } - public function SetCurrentPower(int $power) + public function SetAktuelle_Leistung(int $power) { - $internalPower = GetValue($this->GetIDForIdent("CurrentPower")); + $internalPower = GetValue($this->GetIDForIdent("Aktuelle_Leistung")); // Aktuelle Leistungsvorgabe setzen - SetValue($this->GetIDForIdent("CurrentPower"), $power); + SetValue($this->GetIDForIdent("Aktuelle_Leistung"), $power); if ($power != $internalPower) { // Setze die interne Leistungsvorgabe @@ -124,7 +120,7 @@ class Ladestation_Universal extends IPSModule ); } } else { - // Ansonsten setze Ladeleistung auf die aktuelle Leistungsvorgabe (CurrentPower) + // Ansonsten setze Ladeleistung auf die aktuelle Leistungsvorgabe (Aktuelle_Leistung) SetValue($this->GetIDForIdent("Ladeleistung"), $power); if (GetValue($this->GetIDForIdent("Lademodus")) == 0) { diff --git a/Manager/form.json b/Manager/form.json index 23706ae..e3e25f0 100644 --- a/Manager/form.json +++ b/Manager/form.json @@ -24,7 +24,7 @@ }, { "type": "List", - "name": "EnergyUserList", + "name": "Verbraucher_Liste", "caption": "Verbraucher, die gemanagt werden sollen.", "add": true, "delete": true, @@ -32,12 +32,12 @@ "columns": [ { "caption": "Energieverbraucher", - "name": "EnergyUser", + "name": "Verbraucher", "width": "auto", "add": 0, "edit": { "type": "SelectInstance", - "filter": "EnergyUser" + "filter": "Verbraucher" } } ] diff --git a/Manager/module.php b/Manager/module.php index 3d07434..360c54b 100644 --- a/Manager/module.php +++ b/Manager/module.php @@ -10,24 +10,17 @@ class Manager extends IPSModule $this->RegisterPropertyInteger("Peakleistung", 0); $this->RegisterPropertyInteger("Ueberschussleistung", 0); $this->RegisterPropertyInteger("Netzbezug", 0); // Initialisierung mit 0 - $this->RegisterPropertyString("EnergyUserList", "[]"); + $this->RegisterPropertyString("Verbraucher_Liste", "[]"); // Timer registrieren - $this->RegisterTimer( - "Timer_DistributeEnergy", - 5000, - "IPS_RequestAction(" . - $this->InstanceID . - ', "DistributeEnergy", "");' - ); + $this->RegisterTimer("Timer_DistributeEnergy",5000,"IPS_RequestAction(" .$this->InstanceID .', "DistributeEnergy", "");'); } public function ApplyChanges() { parent::ApplyChanges(); - - // Zusätzliche Konfigurationslogik hier hinzufügen - $energyUserList = $this->ReadPropertyString("EnergyUserList"); + //Liste aller Verbraucher einlesen + $Verbraucher_Liste = $this->ReadPropertyString("Verbraucher_Liste"); } public function RequestAction($Ident, $Value) @@ -49,133 +42,134 @@ class Manager extends IPSModule // Systemvariablen abrufen $Netzbezug = GetValue($this->ReadPropertyInteger("Netzbezug")); $Peakleistung = $this->ReadPropertyInteger("Peakleistung"); - $Ueberschussleistung = $this->ReadPropertyInteger( - "Ueberschussleistung" - ); + $Ueberschussleistung = $this->ReadPropertyInteger("Ueberschussleistung"); - // Fallunterscheidung + // Fallunterscheidung ob auf Solarladen oder Peakshaving gerregelt wird. if ($Netzbezug < ($Peakleistung - $Ueberschussleistung) / 2) { $remainingPower = -1 * (-1 * $Ueberschussleistung + $Netzbezug); - $getCurrentDataParam = false; + $Is_Peak_Shaving = false; } else { $remainingPower = $Peakleistung - $Netzbezug; - $getCurrentDataParam = true; + $Is_Peak_Shaving = true; } - // EnergyUserList auslesen und dekodieren - $energyUserListJSON = $this->ReadPropertyString("EnergyUserList"); - $energyUserList = json_decode($energyUserListJSON, true); + // Alle Energieverbraucher auslesen und dekodieren + $Verbraucher_Liste = json_decode($this->ReadPropertyString("Verbraucher_Liste"), true); - if (empty($energyUserList)) { + if (empty($Verbraucher_Liste)) { // Liste ist leer, daher nichts zu tun + IPS_LogMessage("Manager", "aufgerufen leere liste"); + return; } - // Schleife, um IPS_RequestAction für alle Benutzer auszuführen - foreach ($energyUserList as $user) { - if (IPS_InstanceExists($user["EnergyUser"])) { - IPS_RequestAction( - $user["EnergyUser"], - "GetCurrentData", - $getCurrentDataParam - ); + // Frage alle Energieverbraucher ab, was sie für Leistungen benötigen könnten + foreach ($Verbraucher_Liste as $user) { + if (IPS_InstanceExists($user["Verbraucher"])) { + IPS_RequestAction($user["Verbraucher"],"GetCurrentData", $Is_Peak_Shaving); + IPS_LogMessage("Manager", "aufgerufen getcurrentdata"); + } } - $filteredEnergyUsers = []; + $filteredVerbraucher = []; // Array das später mit allen Verbrauchsdaten der Energieverbraucher gefüllt wird $allIdle = true; // Variable zur Überprüfung, ob alle Benutzer Idle = true sind - $totalCurrentPower = 0; // Variable zur Summierung der CurrentPower Werte + $totalAktuelle_Leistung = 0; // Variable zur Summierung der Aktuelle_Leistung Werte + + // Fülle das Array mit allen entsprechenden Werten der Verbraucher ab + foreach ($Verbraucher_Liste as $user) { + if (!IPS_InstanceExists($user["Verbraucher"])) { + IPS_LogMessage("Manager", "aufgerufen komisch"); - foreach ($energyUserList as $user) { - if (!IPS_InstanceExists($user["EnergyUser"])) { continue; } - // Werte direkt von der EnergyUser-Instanz abrufen - $currentPower = GetValue(IPS_GetObjectIDByIdent("CurrentPower", $user["EnergyUser"])); - $usedEnergy = GetValue(IPS_GetObjectIDByIdent("UsedEnergy", $user["EnergyUser"])); - $userPrio = GetValue(IPS_GetObjectIDByIdent("UserPrio", $user["EnergyUser"])); - $lockPrio = GetValue(IPS_GetObjectIDByIdent("LockPrio", $user["EnergyUser"])); - $idle = GetValue(IPS_GetObjectIDByIdent("Idle", $user["EnergyUser"])); - $powerStepsJson = GetValue(IPS_GetObjectIDByIdent("PowerSteps", $user["EnergyUser"])); + // Werte direkt von der Verbraucher-Instanz abrufen + $Aktuelle_Leistung = GetValue(IPS_GetObjectIDByIdent("Aktuelle_Leistung", $user["Verbraucher"])); + $Bezogene_Energie = GetValue(IPS_GetObjectIDByIdent("Bezogene_Energie", $user["Verbraucher"])); + $PV_Prio = GetValue(IPS_GetObjectIDByIdent("PV_Prio", $user["Verbraucher"])); + $Sperre_Prio = GetValue(IPS_GetObjectIDByIdent("Sperre_Prio", $user["Verbraucher"])); + $idle = GetValue(IPS_GetObjectIDByIdent("Idle", $user["Verbraucher"])); + $powerStepsJson = GetValue(IPS_GetObjectIDByIdent("PowerSteps", $user["Verbraucher"])); $powerSteps = json_decode($powerStepsJson, true); - // EnergyUser-Daten zum gefilterten Array hinzufügen - $filteredEnergyUsers[] = [ - "EnergyUser" => $user["EnergyUser"], - "InstanceID" => $user["EnergyUser"], - "CurrentPower" => $currentPower, - "UsedEnergy" => $usedEnergy, - "UserPrio" => $userPrio, - "LockPrio" => $lockPrio, + // Verbraucher-Daten zum gefilterten Array hinzufügen + $filteredVerbraucher[] = [ + "Verbraucher" => $user["Verbraucher"], + "InstanceID" => $user["Verbraucher"], + "Aktuelle_Leistung" => $Aktuelle_Leistung, + "Bezogene_Energie" => $Bezogene_Energie, + "PV_Prio" => $PV_Prio, + "Sperre_Prio" => $Sperre_Prio, "Idle" => $idle, - "PowerSteps" => $powerSteps, // PowerSteps direkt hier hinzufügen + "PowerSteps" => $powerSteps, ]; - // Überprüfen, ob alle Benutzer Idle = true sind + // Überprüfen, ob alle Benutzer Idle = true sind, wenn einer nicht ist, wird später verworfen... if (!$idle) { $allIdle = false; + IPS_LogMessage("Manager", "nciht idle"); + } - // Add the totalCurrentPower to the remainingPower - $totalCurrentPower += $currentPower; + // Addiere die aktuell bereits verwendete Leistung auf, um sie bei der verteilung zu berücksichtigen + $totalAktuelle_Leistung += $Aktuelle_Leistung; } - $remainingPower += $totalCurrentPower; + // Berücksichtigung der bereits verteilten Leistungen (nachher kann dafür wieder bei 0 begonnen werden zu verteilen) + $remainingPower += $totalAktuelle_Leistung; - if (empty($filteredEnergyUsers)) { + // Abbrechen wenn es keine gefilterten User gibt + if (empty($filteredVerbraucher)) { return; } - // Wenn nicht alle Benutzer Idle = true sind, rufe SetCurrentPower mit CurrentPower Werten auf + // Wenn nicht alle Benutzer Idle = true sind, rufe SetAktuelle_Leistung mit Aktuelle_Leistung Werten auf, (alle Verbraucher behalten die aktuelle Leistung) if (!$allIdle) { - foreach ($filteredEnergyUsers as $user) { - IPS_RequestAction( - $user["InstanceID"], - "SetCurrentPower", - $user["CurrentPower"] - ); + foreach ($filteredVerbraucher as $user) { + IPS_RequestAction($user["InstanceID"],"SetAktuelle_Leistung",$user["Aktuelle_Leistung"]); + IPS_LogMessage("Manager", "aufgerufen nicht alle idle"); + } return; } - // Sortiere die EnergyUser nach Priorität basierend auf dem Parameter - usort($filteredEnergyUsers, function ($a, $b) use ( - $getCurrentDataParam + // Sortiere die Verbruacher nach Priorität entweder der PV_Prio oder der Peak Prio + usort($filteredVerbraucher, function ($a, $b) use ( + $Is_Peak_Shaving ) { - $primaryKey = $getCurrentDataParam ? "LockPrio" : "UserPrio"; - + $primaryKey = $Is_Peak_Shaving ? "Sperre_Prio" : "PV_Prio"; + // Wenn die Prio geleich ist, sortiere danach welcher verbraucher bisher am wenigsten Energie bekommen hat. if ($a[$primaryKey] == $b[$primaryKey]) { - return $a["UsedEnergy"] <=> $b["UsedEnergy"]; + return $a["Bezogene_Energie"] <=> $b["Bezogene_Energie"]; } - return $a[$primaryKey] <=> $b[$primaryKey]; }); - // Primärschlüssel für die Priorität basierend auf dem Parameter auswählen - $priorityKey = $getCurrentDataParam ? "LockPrio" : "UserPrio"; + // Primärschlüssel für die Priorität basierend auf dem Parameter auswählen (für sortierung in gruppen anschliessend) + $priorityKey = $Is_Peak_Shaving ? "Sperre_Prio" : "PV_Prio"; // Schleife durch alle Prioritäten $priorities = array_unique( - array_column($filteredEnergyUsers, $priorityKey) + array_column($filteredVerbraucher, $priorityKey) ); $groupedUsers = []; foreach ($priorities as $priority) { $groupedUsers[$priority] = array_filter( - $filteredEnergyUsers, + $filteredVerbraucher, function ($user) use ($priority, $priorityKey) { return $user[$priorityKey] == $priority; } ); } - // Jetzt kannst du die Benutzer gruppenweise verarbeiten + // Jetzt werden die energien pro gruppe verteilt (Immer alle pro prio in einer gruppe miteinander) foreach ($groupedUsers as $priority => $users) { - // EnergyUser mit gleicher Priorität sammeln + // Verbraucher mit gleicher Priorität sammeln $samePriorityUsers = isset($groupedUsers[$priority]) ? $groupedUsers[$priority] : []; - // Wenn keine EnergyUser mit gleicher Priorität vorhanden sind, überspringen + // Wenn keine Verbraucher mit gleicher Priorität vorhanden sind, überspringen if (empty($samePriorityUsers)) { continue; } @@ -189,28 +183,23 @@ class Manager extends IPSModule $withoutZero[] = $entry; } } - // Methode für alle im withoutZero-Array aufrufen + // Verbraucher die nicht 0 annhemen können erhalten nun den minimalwert if (!empty($withoutZero)) { foreach ($withoutZero as $entry) { $instanceID = $entry["InstanceID"]; $minPowerStep = min($entry["PowerSteps"]); - // Simulierte Methode (Debug-Ausgabe) - IPS_RequestAction( - $instanceID, - "SetCurrentPower", - $minPowerStep + IPS_RequestAction($instanceID,"SetAktuelle_Leistung",$minPowerStep ); - $remainingPower -= $entry["CurrentPower"]; + $remainingPower -= $entry["Aktuelle_Leistung"]; } } + + // Nun die verteilen, die 0 erhalten können. $samePriorityUsers = $withZero; // Array für die verteilte Energie pro User erstellen $userEnergyProv = []; - $userEnergyProv = array_fill_keys( - array_column($samePriorityUsers, "InstanceID"), - 0 - ); // Initialisierung für jeden Benutzer auf 0 setzen + $userEnergyProv = array_fill_keys(array_column($samePriorityUsers, "InstanceID"), 0); // Initialisierung für jeden Benutzer auf 0 setzen // Alle Schritte der Benutzer in einem Array sammeln $allSteps = []; @@ -238,17 +227,16 @@ class Manager extends IPSModule // Aktualisiere die verbleibende Energie und die bereitgestellte Energie für den Benutzer $remainingPower -= $powerstep - $userEnergyProv[$user]; $userEnergyProv[$user] = $powerstep; - } //else { - // Wenn nicht genug Energie vorhanden ist, setze die verbleibende Energie - //} + } + } - // Energie für jeden EnergyUser verbrauchen und loggen - foreach ($userEnergyProv as $userInstanceID => $energy) { - $weui = min( + // 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 + $userInstanceID ) { return $entry["user"] == $userInstanceID; }), @@ -256,15 +244,14 @@ class Manager extends IPSModule ) ); - $energy = max($energy, $weui); // Testzeile + // Jedem user den höheren der beiden werte aus minimalwert oder vergebenem zuteilen + $leistung = max($leistung, $minimalleitsung); - // Methode SetCurrentPower für jeden EnergyUser aufrufen + // Methode SetAktuelle_Leistung für jeden Verbraucher mit der entsprechenden Energie aufrufen if (IPS_InstanceExists($userInstanceID)) { - IPS_RequestAction( - $userInstanceID, - "SetCurrentPower", - $energy - ); // Annahme: SetCurrentPower wird über eine Aktionsanfrage ausgeführt + IPS_RequestAction($userInstanceID,"SetAktuelle_Leistung",$leistung); + IPS_LogMessage("Manager", "aufgerufen setleistung normal"); + } } } diff --git a/Verbraucher_1_Stufig/module.php b/Verbraucher_1_Stufig/module.php index 979cd59..586c6c8 100644 --- a/Verbraucher_1_Stufig/module.php +++ b/Verbraucher_1_Stufig/module.php @@ -7,42 +7,35 @@ class Verbraucher_1_Stufig extends IPSModule { parent::Create(); - // Prioritäten - $this->RegisterVariableInteger("LockPrio", "LockPrio"); - $this->RegisterVariableInteger("UserPrio", "UserPrio"); - - // Energiehandling - $this->RegisterVariableBoolean("Idle", "Idle", "", 0); - $this->RegisterVariableBoolean("IstNacht", "IstNacht", "", 0); - $this->RegisterVariableInteger("CurrentPower", "CurrentPower", "", 0); - $this->RegisterVariableInteger("DailyOnTime", "DailyOnTime", "", 0); - $this->RegisterVariableFloat("UsedEnergy", "UsedEnergy", "", 0); - $this->RegisterVariableString("PowerSteps", "PowerSteps"); // PowerSteps-Variable registrieren - - // Neue Variable für den Timer-Status - $this->RegisterVariableBoolean("IsTimerActive", "IsTimerActive", "", 0); - $this->SetValue("IsTimerActive", false); - - // Trägheit - $this->RegisterPropertyInteger("IdleCounterMax", 4); - $this->RegisterVariableInteger("IdleCounter", "IdleCounter", "", 0); - $this->SetValue("IdleCounter", 0); - + // Verbraucherspezifische Properties $this->RegisterPropertyInteger("BoilerLeistung", 6000); // Standardwert für Volllast $this->RegisterPropertyInteger("Mindesttlaufzeit", 4); // Standardwert für Volllast $this->RegisterPropertyInteger("Zeit_Zwischen_Zustandswechseln", 1); $this->RegisterPropertyInteger("Schaltkontakt1", 0); - // Timer für Zeit_Zwischen_Zustandswechseln - $this->RegisterTimer( - "ZustandswechselTimer", - 0, - "IPS_RequestAction(" . - $this->InstanceID . - ', "ResetPowerSteps", "");' - ); + // Verbraucherspezifische Variabeln + $this->RegisterVariableBoolean("IstNacht", "IstNacht", "", 0); + $this->RegisterVariableInteger("DailyOnTime", "DailyOnTime", "", 0); + $this->RegisterVariableBoolean("IsTimerActive", "IsTimerActive", "", 0); - //Initialisieren + // Verbraucherspezifischer Timer + $this->SetValue("IsTimerActive", false); + $this->RegisterTimer("ZustandswechselTimer",0,"IPS_RequestAction(" .$this->InstanceID .', "ResetPowerSteps", "");'); + + // Variabeln für Kommunkation mit Manager + $this->RegisterVariableInteger("Sperre_Prio", "Sperre_Prio"); + $this->RegisterVariableInteger("PV_Prio", "PV_Prio"); + $this->RegisterVariableBoolean("Idle", "Idle", "", 0); + $this->RegisterVariableInteger("Aktuelle_Leistung", "Aktuelle_Leistung", "", 0); + $this->RegisterVariableFloat("Bezogene_Energie", "Bezogene_Energie", "", 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); } @@ -55,8 +48,8 @@ class Verbraucher_1_Stufig extends IPSModule public function RequestAction($Ident, $Value) { switch ($Ident) { - case "SetCurrentPower": - $this->SetCurrentPower($Value); + case "SetAktuelle_Leistung": + $this->SetAktuelle_Leistung($Value); break; case "GetCurrentData": return $this->GetCurrentData($Value); @@ -92,7 +85,7 @@ class Verbraucher_1_Stufig extends IPSModule // PowerSteps wieder auf den ursprünglichen Zustand setzen (wie vorherige Funktionalität) $this->SetValue( "PowerSteps", - json_encode([$this->GetValue("CurrentPower")]) + json_encode([$this->GetValue("Aktuelle_Leistung")]) ); // Timer stoppen @@ -102,13 +95,13 @@ class Verbraucher_1_Stufig extends IPSModule $this->SetValue("IsTimerActive", false); } // Methode zum Setzen des aktuellen Stromverbrauchs - public function SetCurrentPower(float $power) + public function SetAktuelle_Leistung(float $power) { $this->CheckIdle($power); - if ($this->GetValue("CurrentPower") != $power) { + if ($this->GetValue("Aktuelle_Leistung") != $power) { $this->SetTimerOn(); } - $this->SetValue("CurrentPower", $power); + $this->SetValue("Aktuelle_Leistung", $power); $boilerLeistung = $this->ReadPropertyInteger("BoilerLeistung"); $schaltkontaktID = $this->ReadPropertyInteger("Schaltkontakt1"); @@ -155,7 +148,7 @@ class Verbraucher_1_Stufig extends IPSModule // Timer ist aktiv, PowerSteps setzen $this->SetValue( "PowerSteps", - json_encode([$this->GetValue("CurrentPower")]) + json_encode([$this->GetValue("Aktuelle_Leistung")]) ); } // Wenn Nacht und Mindestlaufzeit nicht erreicht ist @@ -185,7 +178,7 @@ class Verbraucher_1_Stufig extends IPSModule public function CheckIdle($power) { - $lastpower = GetValue($this->GetIDForIdent("CurrentPower")); + $lastpower = GetValue($this->GetIDForIdent("Aktuelle_Leistung")); if ($lastpower != $power) { $this->SetValue("Idle", false); $this->SetValue("IdleCounter",$this->ReadPropertyInteger("IdleCounterMax")); diff --git a/WP_Steuerung/module.php b/WP_Steuerung/module.php index fb87125..d69e53a 100644 --- a/WP_Steuerung/module.php +++ b/WP_Steuerung/module.php @@ -5,30 +5,7 @@ class WP_Steuerung extends IPSModule { parent::Create(); - // Prioritäten - $this->RegisterVariableInteger("LockPrio", "LockPrio"); - $this->RegisterVariableInteger("UserPrio", "UserPrio"); - - // Energiehandling - $this->RegisterVariableBoolean("Idle", "Idle", "", true); - $this->RegisterVariableInteger("CurrentPower", "CurrentPower", "", 0); - $this->RegisterVariableBoolean("Sperrzeit", "Sperrzeit", "", false); - $this->RegisterVariableFloat("UsedEnergy", "UsedEnergy", "", 0); - $this->RegisterVariableString("PowerSteps", "PowerSteps"); // PowerSteps-Variable registrieren - - // Trägheit - $this->RegisterPropertyInteger("IdleCounterMax", 4); - $this->RegisterVariableInteger("IdleCounter", "IdleCounter", "", 0); - $this->SetValue("IdleCounter", 0); - - $this->RegisterVariableInteger("Mindestlaufzeit", "IdleCounter", "", 0); - - $this->RegisterVariableInteger("Zustand_WP", "Zustand_WP", "", 1); - - $this->RegisterVariableInteger("WP_Laufzeit_Zahler", "WP_Laufzeit_Zahler", "", 20*12); - $this->RegisterVariableBoolean("LetzterPeakwert", "LetzterPeakwert", "", false); - $this->RegisterVariableBoolean("LetzterPeakwert_Aenderung", "LetzterPeakwert_Aenderung", "", false); - + // WP-Spezifische Properies $this->RegisterPropertyInteger("WP_Leistung", 6000); $this->RegisterPropertyInteger("Wolkenschwellwert", 60); $this->RegisterPropertyInteger("Wolkenwert", 0); @@ -38,9 +15,32 @@ class WP_Steuerung extends IPSModule $this->RegisterPropertyInteger("Kontakt_Erhoeung", 0); $this->RegisterPropertyBoolean("Schwellwert_Anwenden", false); $this->RegisterPropertyInteger("Schwellwert", 0); - $this->RegisterPropertyInteger("WW_Temp", 1); + $this->RegisterPropertyInteger("WW_Temp", 1); - //Initialisieren + // WP-Spezifische Variabeln + $this->RegisterVariableBoolean("Sperrzeit", "Sperrzeit", "", false); + $this->RegisterVariableInteger("Mindestlaufzeit", "IdleCounter", "", 0); + $this->RegisterVariableInteger("Zustand_WP", "Zustand_WP", "", 1); + $this->RegisterVariableInteger("WP_Laufzeit_Zahler", "WP_Laufzeit_Zahler", "", 20*12); + $this->RegisterVariableBoolean("LetzterPeakwert", "LetzterPeakwert", "", false); + $this->RegisterVariableBoolean("LetzterPeakwert_Aenderung", "LetzterPeakwert_Aenderung", "", false); + + + + // Variabeln für Kommunkation mit Manager + $this->RegisterVariableInteger("Sperre_Prio", "Sperre_Prio"); + $this->RegisterVariableInteger("PV_Prio", "PV_Prio"); + $this->RegisterVariableBoolean("Idle", "Idle", "", 0); + $this->RegisterVariableInteger("Aktuelle_Leistung", "Aktuelle_Leistung", "", 0); + $this->RegisterVariableFloat("Bezogene_Energie", "Bezogene_Energie", "", 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); } @@ -53,8 +53,8 @@ class WP_Steuerung extends IPSModule public function RequestAction($Ident, $Value) { switch ($Ident) { - case "SetCurrentPower": - $this->SetCurrentPower($Value); + case "SetAktuelle_Leistung": + $this->SetAktuelle_Leistung($Value); break; case "GetCurrentData": return $this->GetCurrentData($Value); @@ -68,7 +68,7 @@ class WP_Steuerung extends IPSModule } // Methode zum Setzen des aktuellen Stromverbrauchs - public function SetCurrentPower(float $power) + public function SetAktuelle_Leistung(float $power) { $sperrzei_abs = ((60 * @@ -122,7 +122,7 @@ class WP_Steuerung extends IPSModule $this->SetValue("WP_Laufzeit_Zahler", 0); SetValue($this->ReadPropertyInteger("Sperrkontakt"), false); } elseif ( - $this->GetValue("CurrentPower") != $power || + $this->GetValue("Aktuelle_Leistung") != $power || ($this->GetValue("WP_Laufzeit_Zahler") > 240 && $this->GetValue("LetzterPeakwert") != $this->GetValue("LetzterPeakwert_Aenderung")) @@ -145,24 +145,24 @@ class WP_Steuerung extends IPSModule ) { $this->SetValue("Zustand_WP", 1); $this->SetValue( - "CurrentPower", + "Aktuelle_Leistung", $this->ReadPropertyInteger("WP_Leistung") ); } elseif ($LastPeak && $power == 0) { $this->SetValue("Zustand_WP", 2); - $this->SetValue("CurrentPower", 0); + $this->SetValue("Aktuelle_Leistung", 0); } elseif ( $LastPeak == false && $power == $this->ReadPropertyInteger("WP_Leistung") ) { $this->SetValue("Zustand_WP", 3); $this->SetValue( - "CurrentPower", + "Aktuelle_Leistung", $this->ReadPropertyInteger("WP_Leistung") ); } elseif ($LastPeak == false && $power == 0) { $this->SetValue("Zustand_WP", 1); - $this->SetValue("CurrentPower", 0); + $this->SetValue("Aktuelle_Leistung", 0); } } elseif ($state == 2) { // Sperre @@ -172,24 +172,24 @@ class WP_Steuerung extends IPSModule ) { $this->SetValue("Zustand_WP", 1); $this->SetValue( - "CurrentPower", + "Aktuelle_Leistung", $this->ReadPropertyInteger("WP_Leistung") ); } elseif ($LastPeak && $power == 0) { $this->SetValue("Zustand_WP", 2); - $this->SetValue("CurrentPower", 0); + $this->SetValue("Aktuelle_Leistung", 0); } elseif ( $LastPeak == false && $power == $this->ReadPropertyInteger("WP_Leistung") ) { $this->SetValue("Zustand_WP", 3); $this->SetValue( - "CurrentPower", + "Aktuelle_Leistung", $this->ReadPropertyInteger("WP_Leistung") ); } elseif ($LastPeak == false && $power == 0) { $this->SetValue("Zustand_WP", 1); - $this->SetValue("CurrentPower", 0); + $this->SetValue("Aktuelle_Leistung", 0); } } elseif ($state == 3) { // Erhöht @@ -199,24 +199,24 @@ class WP_Steuerung extends IPSModule ) { $this->SetValue("Zustand_WP", 1); $this->SetValue( - "CurrentPower", + "Aktuelle_Leistung", $this->ReadPropertyInteger("WP_Leistung") ); } elseif ($LastPeak && $power == 0) { $this->SetValue("Zustand_WP", 2); - $this->SetValue("CurrentPower", 0); + $this->SetValue("Aktuelle_Leistung", 0); } elseif ( $LastPeak == false && $power == $this->ReadPropertyInteger("WP_Leistung") ) { $this->SetValue("Zustand_WP", 3); $this->SetValue( - "CurrentPower", + "Aktuelle_Leistung", $this->ReadPropertyInteger("WP_Leistung") ); } elseif ($LastPeak == false && $power == 0) { $this->SetValue("Zustand_WP", 1); - $this->SetValue("CurrentPower", 0); + $this->SetValue("Aktuelle_Leistung", 0); } } else { $this->SetValue("Zustand_WP", 1); @@ -255,7 +255,7 @@ class WP_Steuerung extends IPSModule if($this->GetValue("WP_Laufzeit_Zahler")<(20*12)){ - $this->SetValue("PowerSteps", json_encode([$this->GetValue("CurrentPower")])); + $this->SetValue("PowerSteps", json_encode([$this->GetValue("Aktuelle_Leistung")])); }elseif($this->ReadPropertyBoolean("Schwellwert_Anwenden")==true && ($this->ReadPropertyInteger("Schwellwert")>GetValue($this->ReadPropertyInteger("WW_Temp"))) ){ @@ -268,7 +268,7 @@ class WP_Steuerung extends IPSModule public function CheckIdle($power) { - $lastpower = GetValue($this->GetIDForIdent("CurrentPower")); + $lastpower = GetValue($this->GetIDForIdent("Aktuelle_Leistung")); if ($lastpower != $power) { $this->SetValue("Idle", false); $this->SetValue( diff --git a/library.json b/library.json index 3ca86f3..910ffee 100644 --- a/library.json +++ b/library.json @@ -2,11 +2,11 @@ "id": "{89CAF37C-8E6E-5312-8195-6DA8AB7E5E70}", "name": "Manager", "author": "Daniel Haefliger", - "url": "https://git.belevo.ch/dh/Energiemanager_Symconmodule_Demo", + "url": "https://git.belevo.ch/dh/Symcon_Belevo_Energiemanagement", "compatibility": { "version": "7.1" }, - "version": "0.156", + "version": "0.172", "build": 0, "date": 0 } \ No newline at end of file