From 88b000e2c3e7b1f95bc32d2fa9eba284d07c90ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=A4fliger?= Date: Fri, 11 Apr 2025 16:25:07 +0200 Subject: [PATCH] =?UTF-8?q?Exterrne=20Verbraucher=20grundger=C3=BCst=20hin?= =?UTF-8?q?zugef=C3=BChtgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Verbraucher_extern/README.md | 67 ++++++++++ Verbraucher_extern/form.json | 75 +++++++++++ Verbraucher_extern/module.json | 12 ++ Verbraucher_extern/module.php | 224 +++++++++++++++++++++++++++++++++ 4 files changed, 378 insertions(+) create mode 100644 Verbraucher_extern/README.md create mode 100644 Verbraucher_extern/form.json create mode 100644 Verbraucher_extern/module.json create mode 100644 Verbraucher_extern/module.php diff --git a/Verbraucher_extern/README.md b/Verbraucher_extern/README.md new file mode 100644 index 0000000..b059e3a --- /dev/null +++ b/Verbraucher_extern/README.md @@ -0,0 +1,67 @@ +# Manager_1 +Beschreibung des Moduls. + +### Inhaltsverzeichnis + +1. [Funktionsumfang](#1-funktionsumfang) +2. [Voraussetzungen](#2-voraussetzungen) +3. [Software-Installation](#3-software-installation) +4. [Einrichten der Instanzen in IP-Symcon](#4-einrichten-der-instanzen-in-ip-symcon) +5. [Statusvariablen und Profile](#5-statusvariablen-und-profile) +6. [WebFront](#6-webfront) +7. [PHP-Befehlsreferenz](#7-php-befehlsreferenz) + +### 1. Funktionsumfang + +* + +### 2. Voraussetzungen + +- IP-Symcon ab Version 7.1 + +### 3. Software-Installation + +* Über den Module Store das 'Manager_1'-Modul installieren. +* Alternativ über das Module Control folgende URL hinzufügen + +### 4. Einrichten der Instanzen in IP-Symcon + + Unter 'Instanz hinzufügen' kann das 'Manager_1'-Modul mithilfe des Schnellfilters gefunden werden. + - Weitere Informationen zum Hinzufügen von Instanzen in der [Dokumentation der Instanzen](https://www.symcon.de/service/dokumentation/konzepte/instanzen/#Instanz_hinzufügen) + +__Konfigurationsseite__: + +Name | Beschreibung +-------- | ------------------ + | + | + +### 5. Statusvariablen und Profile + +Die Statusvariablen/Kategorien werden automatisch angelegt. Das Löschen einzelner kann zu Fehlfunktionen führen. + +#### Statusvariablen + +Name | Typ | Beschreibung +------ | ------- | ------------ + | | + | | + +#### Profile + +Name | Typ +------ | ------- + | + | + +### 6. WebFront + +Die Funktionalität, die das Modul im WebFront bietet. + +### 7. PHP-Befehlsreferenz + +`boolean GEF_BeispielFunktion(integer $InstanzID);` +Erklärung der Funktion. + +Beispiel: +`GEF_BeispielFunktion(12345);` \ No newline at end of file diff --git a/Verbraucher_extern/form.json b/Verbraucher_extern/form.json new file mode 100644 index 0000000..7c016fd --- /dev/null +++ b/Verbraucher_extern/form.json @@ -0,0 +1,75 @@ +{ + "elements": [ + { + "type": "Label", + "caption": "Einstellungen für einstufigen Verbruacher Ein-Aus" + }, + + { + "type": "NumberSpinner", + "name": "IdleCounterMax", + "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", + "suffix": "Sekunden" + }, + { + "type": "SelectVariable", + "name": "Is_Peak", + "caption": "Variable zur Signalisierung der Peakleistung", + "suffix": "Sekunden" + }, + { + "type": "List", + "name": "Verbraucher_Liste", + "caption": "Verbraucher, die gemanagt werden sollen.", + "add": true, + "delete": true, + "sortable": true, + "columns": [ + { + "caption": "Anfragende Variable", + "name": "Read_Var", + "width": "auto", + "add": 0, + "edit": { + "type": "SelectVariable", + "filter": "Verbraucher" + } + }, + { + "caption": "Zu schreibende Variable", + "name": "Write_Var", + "width": "auto", + "add": 0, + "edit": { + "type": "SelectVariable", + "filter": "Verbraucher" + } + }, + { + "caption": "Signal verbracuher ein", + "name": "Geschaltet_var", + "width": "auto", + "add": 0, + "edit": { + "type": "SelectVariable", + "filter": "Verbraucher" + } + }, + { + "type": "NumberSpinner", + "name": "Schaltkontakt1", + "caption": "Nennleistung des Verbrauchers", + "test": true + } + + ] + } + + ] +} diff --git a/Verbraucher_extern/module.json b/Verbraucher_extern/module.json new file mode 100644 index 0000000..5861b98 --- /dev/null +++ b/Verbraucher_extern/module.json @@ -0,0 +1,12 @@ +{ + "id": "{E3D14937-80F8-5728-A3D7-991EA2DBC2D4}", + "name": "Verbraucher_extern", + "type": 3, + "vendor": "Belevo AG", + "aliases": [], + "parentRequirements": [], + "childRequirements": [], + "implemented": [], + "prefix": "GEF", + "url": "" +} \ No newline at end of file diff --git a/Verbraucher_extern/module.php b/Verbraucher_extern/module.php new file mode 100644 index 0000000..80ca176 --- /dev/null +++ b/Verbraucher_extern/module.php @@ -0,0 +1,224 @@ +RegisterPropertyString("Verbraucher_Liste", ""); + $this->RegisterPropertyInteger("Is_Peak", 0); + $this->RegisterPropertyInteger("Interval", 5); // Recheninterval + + // 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"); + $this->RegisterVariableInteger("Power", "Power"); + $this->RegisterVariableBoolean("Is_Peak_Shaving", "Is_Peak_Shaving"); + $this->RegisterVariableInteger("Leistung_Delta", "Leistung_Delta", "", 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_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) + { + switch ($Ident) { + + case "SetAktuelle_Leistung": + $this->SetValue("Power", (int)$Value); + break; + + case "GetCurrentData": + $this->SetValue("Is_Peak_Shaving", (bool)$Value); + break; + + case "ResetPowerSteps": + $this->ResetPowerSteps($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"); + } + } + + + + + // Methode zum Setzen der PowerSteps und Timer starten + public function SetTimerOn() + { + // Timer setzen, der nach "Zeit_Zwischen_Zustandswechseln" abläuft + $zeitZwischenZustandswechseln = $this->ReadPropertyInteger( + "Zeit_Zwischen_Zustandswechseln" + ); + $this->SetTimerInterval( + "ZustandswechselTimer", + $zeitZwischenZustandswechseln * 60000 + ); // Timer in Millisekunden + IPS_LogMessage("Verbraucher", "In Set Methode"); + + // Timer-Status auf true setzen + $this->SetValue("IsTimerActive", true); + } + + // Methode zum Zurücksetzen von PowerSteps nach Ablauf des Timers + public function ResetPowerSteps() + { + // PowerSteps wieder auf den ursprünglichen Zustand setzen (wie vorherige Funktionalität) + $this->SetValue( + "PowerSteps", + json_encode([$this->GetValue("Aktuelle_Leistung")]) + ); + + // Timer stoppen + $this->SetTimerInterval("ZustandswechselTimer", 0); + + // Timer-Status auf false setzen + $this->SetValue("IsTimerActive", false); + } + // Methode zum Setzen des aktuellen Stromverbrauchs + public function SetAktuelle_Leistung(float $power) + { + $this->CheckIdle($power); + if ($this->GetValue("Aktuelle_Leistung") != $power) { + $this->SetTimerOn(); + } + $this->SetValue("Aktuelle_Leistung", $power); + $this->SetValue("Bezogene_Energie", ($this->GetValue("Bezogene_Energie") + ($this->GetValue("Aktuelle_Leistung")*($this->ReadPropertyInteger("Interval")/3600)))); + + $boilerLeistung = $this->ReadPropertyInteger("BoilerLeistung"); + $schaltkontaktID = $this->ReadPropertyInteger("Schaltkontakt1"); + + if ($power == $boilerLeistung) { + $schaltkontaktStatus = true; + } elseif ($power == 0) { + $schaltkontaktStatus = false; + } else { + // Keine Änderung, wenn power nicht 0 oder boilerLeistung entspricht + return; + } + + $currentStatus = GetValue($this->ReadPropertyInteger("Schaltkontakt1")); + + // Schaltkontaktstatus ändern + SetValue( + $this->ReadPropertyInteger("Schaltkontakt1"), + $schaltkontaktStatus + ); + + if ($schaltkontaktStatus) { + $this->SetValue("DailyOnTime", $this->GetValue("DailyOnTime") + 1); + } + } + + // Methode zum Abrufen der aktuellen Daten + public function GetCurrentData(bool $Peak) + { + $IstNacht = $this->GetValue("IstNacht"); + $NeuesIstNacht = $this->ist_nachts(); + + if ($IstNacht == true && $NeuesIstNacht == false) { + $this->SetValue("DailyOnTime", 0); + } + + $this->SetValue("IstNacht", $NeuesIstNacht); + + $DailyOnTime = $this->GetValue("DailyOnTime"); + $Mindestlaufzeit = + $this->ReadPropertyInteger("Mindesttlaufzeit") * 60 * 12; + + // Überprüfen, ob der Timer aktiv ist + if ($this->GetValue("IsTimerActive")) { + // Timer ist aktiv, PowerSteps setzen + $this->SetValue( + "PowerSteps", + json_encode([$this->GetValue("Aktuelle_Leistung")]) + ); + } + // Wenn Nacht und Mindestlaufzeit nicht erreicht ist + elseif ($NeuesIstNacht && $DailyOnTime < $Mindestlaufzeit) { + if ($Peak) { + $this->SetValue( + "PowerSteps", + json_encode([ + 0, + $this->ReadPropertyInteger("BoilerLeistung"), + ]) + ); + } else { + $this->SetValue("PowerSteps",json_encode([$this->ReadPropertyInteger("BoilerLeistung")])); + } + } + // Andernfalls + else { + if ($Peak) { + $this->SetValue("PowerSteps", json_encode([0])); + } else { + $this->SetValue("PowerSteps",json_encode([0,$this->ReadPropertyInteger("BoilerLeistung"),]) + ); + } + } + } + + public function CheckIdle($power) + { + $lastpower = GetValue($this->GetIDForIdent("Aktuelle_Leistung")); + if ($lastpower != $power) { + $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 ist_nachts() + { + date_default_timezone_set("Europe/Berlin"); // Setze hier deine Zeitzone + + $aktuelle_zeit = strtotime(date("H:i")); // Aktuelle Zeit in Stunden und Minuten umwandeln + $start_nacht = strtotime("22:00"); // Startzeit der Nacht (22 Uhr) + $ende_nacht = strtotime("07:00"); // Endzeit der Nacht (7 Uhr) + + if ($aktuelle_zeit >= $start_nacht || $aktuelle_zeit < $ende_nacht) { + return true; + } else { + return false; + } + } +} + +?>