diff --git a/VGT_Sub/form.json b/VGT_Sub/form.json index 282623b..9f5911e 100644 --- a/VGT_Sub/form.json +++ b/VGT_Sub/form.json @@ -4,44 +4,6 @@ "type": "ValidationTextBox", "name": "DeviceID", "caption": "Device ID" - }, - - { - "type": "NumberSpinner", - "name": "MinSOC", - "caption": "Min SOC (%)" - }, - { - "type": "NumberSpinner", - "name": "MaxSOC", - "caption": "Max SOC (%)" - }, - - { - "type": "SelectVariable", - "name": "VarPowerProduction", - "caption": "Variable – Power Production" - }, - { - "type": "SelectVariable", - "name": "VarStateOfCharge", - "caption": "Variable – State of Charge" - }, - { - "type": "SelectVariable", - "name": "VarIsRunning", - "caption": "Variable – Is Running" - }, - - { - "type": "SelectVariable", - "name": "VarPositiveSetpointTarget", - "caption": "Variable – Positive Power Setpoint Target" - }, - { - "type": "SelectVariable", - "name": "VarNegativeSetpointTarget", - "caption": "Variable – Negative Power Setpoint Target" } ] } diff --git a/VGT_Sub/module.php b/VGT_Sub/module.php index 05da904..5e39296 100644 --- a/VGT_Sub/module.php +++ b/VGT_Sub/module.php @@ -8,39 +8,38 @@ class VGT_Sub extends IPSModule { parent::Create(); - // Device + // Device-ID $this->RegisterPropertyString('DeviceID', ''); - // Variable-Auswahl - $this->RegisterPropertyInteger('VarPowerProduction', 0); - $this->RegisterPropertyInteger('VarStateOfCharge', 0); - $this->RegisterPropertyInteger('VarIsRunning', 0); - $this->RegisterPropertyInteger('VarPositiveSetpointTarget', 0); - $this->RegisterPropertyInteger('VarNegativeSetpointTarget', 0); + // --- Variablen erstellen --- + $this->RegisterVariableFloat('PowerProduction', 'Power Production', '', 10); + $this->RegisterVariableFloat('StateOfCharge', 'State of Charge', '', 11); + $this->RegisterVariableBoolean('IsRunning', 'Is Running', '', 12); + $this->RegisterVariableBoolean('IsReady', 'Is Ready', '', 13); - // Numerische SOC-Grenzen - $this->RegisterPropertyFloat('MinSOC', 20.0); - $this->RegisterPropertyFloat('MaxSOC', 90.0); + $this->RegisterVariableFloat('MinSOC', 'Min SOC', '', 20); + $this->RegisterVariableFloat('MaxSOC', 'Max SOC', '', 21); - // Speicherung des letzten PowerSetpoints - $this->RegisterPropertyFloat('LastPowerSetpoint', 0.0); + // Remote Control Variablen + $this->RegisterVariableFloat('PowerSetpoint', 'Power Setpoint', '', 30); + $this->RegisterVariableString('Strategy', 'Strategy', '', 31); - // Anzeigevariable für Feedback Request - $this->RegisterVariableString('FeedbackRequestPayload', 'Feedback Request', '', 10); - - // Anzeigevariable für Remote Control Request - $this->RegisterVariableString('RemoteControlPayload', 'Remote Control Payload', '', 20); + // Debug / Anzeige + $this->RegisterVariableString('FeedbackRequestPayload', 'Feedback Request Payload', '', 90); + $this->RegisterVariableString('RemoteControlPayload', 'Remote Control Payload', '', 91); + // MQTT Splitter $this->ConnectParent('{F7A0DD2E-7684-95C0-64C2-D2A9DC47577B}'); } public function ApplyChanges() { parent::ApplyChanges(); + $this->ConnectParent('{F7A0DD2E-7684-95C0-64C2-D2A9DC47577B}'); $dev = $this->ReadPropertyString('DeviceID'); - if ($dev != '') { + if ($dev !== '') { $this->Subscribe("feedback-request/$dev"); $this->Subscribe("remote-control-request/$dev"); } @@ -48,38 +47,29 @@ class VGT_Sub extends IPSModule public function RequestAction($Ident, $Value) { - // Einfach akzeptieren und nichts machen + // Variablen schreibbar machen + SetValue($this->GetIDForIdent($Ident), $Value); return true; } + /* --------------------------------------------------------- + * CONFIG FORM + * ---------------------------------------------------------*/ public function GetConfigurationForm() { return json_encode([ "elements" => [ - - ["type" => "ValidationTextBox", "name" => "DeviceID", "caption" => "Device ID"], - - ["type" => "NumberSpinner", "name" => "MinSOC", "caption" => "Min SOC (%)"], - ["type" => "NumberSpinner", "name" => "MaxSOC", "caption" => "Max SOC (%)"], - - ["type" => "SelectVariable", "name" => "VarPowerProduction", "caption" => "Variable – Power Production"], - ["type" => "SelectVariable", "name" => "VarStateOfCharge", "caption" => "Variable – State of Charge"], - ["type" => "SelectVariable", "name" => "VarIsRunning", "caption" => "Variable – Is Running"], - - ["type" => "SelectVariable", "name" => "VarPositiveSetpointTarget", "caption" => "Variable – Positive Power Setpoint"], - ["type" => "SelectVariable", "name" => "VarNegativeSetpointTarget", "caption" => "Variable – Negative Power Setpoint"] + ["type" => "ValidationTextBox", "name" => "DeviceID", "caption" => "Device ID"] ] ]); } - /* ------------------------------------------------------------------------- - * MQTT SUBSCRIBE - * ----------------------------------------------------------------------*/ + /* --------------------------------------------------------- + * MQTT Subscribe + * ---------------------------------------------------------*/ private function Subscribe(string $topic) { - if (!$this->HasActiveParent()) { - return; - } + if (!$this->HasActiveParent()) return; $this->SendDataToParent(json_encode([ "DataID" => "{A1B5C433-4F17-462D-AD71-383F5BBE4F5A}", @@ -88,14 +78,12 @@ class VGT_Sub extends IPSModule ])); } - /* ------------------------------------------------------------------------- - * MQTT PUBLISH - * ----------------------------------------------------------------------*/ + /* --------------------------------------------------------- + * MQTT Publish + * ---------------------------------------------------------*/ private function Publish(string $topic, string $payload) { - if (!$this->HasActiveParent()) { - return; - } + if (!$this->HasActiveParent()) return; $this->SendDataToParent(json_encode([ "DataID" => "{A1B5C433-4F17-462D-AD71-383F5BBE4F5A}", @@ -105,55 +93,51 @@ class VGT_Sub extends IPSModule ])); } - /* ------------------------------------------------------------------------- + /* --------------------------------------------------------- * RECEIVE MQTT - * ----------------------------------------------------------------------*/ + * ---------------------------------------------------------*/ public function ReceiveData($JSONString) { $data = json_decode($JSONString, true); - if (!isset($data['Type'])) { - return; - } + + if (!isset($data['Type'])) return; $type = $data['Type']; + $topic = $data['Topic'] ?? ''; + $payload = $data['Payload'] ?? ''; + $device = $this->ReadPropertyString('DeviceID'); + + // Beim Connect Topics neu abonnieren if ($type === "MQTT_CONNECTED") { - $dev = $this->ReadPropertyString('DeviceID'); - if ($dev != '') { - $this->Subscribe("feedback-request/$dev"); - $this->Subscribe("remote-control-request/$dev"); + if ($device !== '') { + $this->Subscribe("feedback-request/$device"); + $this->Subscribe("remote-control-request/$device"); } return; } - if ($type !== "MESSAGE") { - return; - } + if ($type !== "MESSAGE") return; - $topic = $data['Topic']; - $payload = $data['Payload']; - $device = $this->ReadPropertyString('DeviceID'); - - /* --------------------------------------------------------------------- + /* --------------------------------------------------------- * FEEDBACK REQUEST - * ------------------------------------------------------------------*/ + * ---------------------------------------------------------*/ if ($topic === "feedback-request/$device") { $this->SetValue('FeedbackRequestPayload', $payload); - $varProd = $this->ReadPropertyInteger('VarPowerProduction'); - $varSOC = $this->ReadPropertyInteger('VarStateOfCharge'); - $varRun = $this->ReadPropertyInteger('VarIsRunning'); + // Variablen abrufen + $power = GetValueFloat($this->GetIDForIdent('PowerProduction')); + $soc = GetValueFloat($this->GetIDForIdent('StateOfCharge')); + $run = GetValueBoolean($this->GetIDForIdent('IsRunning')); - $power = ($varProd ? GetValue($varProd) : 0.0); - $soc = ($varSOC ? GetValue($varSOC) : 0.0); - $run = ($varRun ? GetValue($varRun) : false); - - $min = $this->ReadPropertyFloat('MinSOC'); - $max = $this->ReadPropertyFloat('MaxSOC'); + $min = GetValueFloat($this->GetIDForIdent('MinSOC')); + $max = GetValueFloat($this->GetIDForIdent('MaxSOC')); $isReady = ($run && $soc > $min && $soc < $max); + SetValueBoolean($this->GetIDForIdent('IsReady'), $isReady); + // Antwort erstellen $response = [ "power_production" => $power, "state_of_charge" => $soc, @@ -163,42 +147,38 @@ class VGT_Sub extends IPSModule "max_soc" => $max ]; - $this->Publish("feedback-response/$device", json_encode($response)); + // Publish an feedbackresponse/deviceid + $this->Publish("feedbackresponse/$device", json_encode($response)); return; } - /* --------------------------------------------------------------------- + /* --------------------------------------------------------- * REMOTE CONTROL REQUEST - * ------------------------------------------------------------------*/ + * ---------------------------------------------------------*/ if ($topic === "remote-control-request/$device") { $this->SetValue('RemoteControlPayload', $payload); $json = json_decode($payload, true); - if (!is_array($json)) { - return; - } + if (!is_array($json)) return; + // power_setpoint → Float-Variable if (isset($json["power_setpoint"])) { - $power = floatval($json["power_setpoint"]); - IPS_SetProperty($this->InstanceID, 'LastPowerSetpoint', $power); - IPS_ApplyChanges($this->InstanceID); - - // Positive oder negativ? - if ($power > 0) { - $varPos = $this->ReadPropertyInteger('VarPositiveSetpointTarget'); - if ($varPos) { - SetValue($varPos, $power); - } - } else { - $varNeg = $this->ReadPropertyInteger('VarNegativeSetpointTarget'); - if ($varNeg) { - SetValue($varNeg, $power); - } - } + SetValueFloat( + $this->GetIDForIdent('PowerSetpoint'), + floatval($json["power_setpoint"]) + ); } - $this->Publish("remote-control-response/$device", $payload); + // strategy → String-Variable + if (isset($json["strategy"])) { + SetValueString( + $this->GetIDForIdent('Strategy'), + strval($json["strategy"]) + ); + } + + return; } } }