RegisterPropertyString("DeviceID", ""); } public function ApplyChanges() { parent::ApplyChanges(); // MQTT Server als Parent verbinden $this->ConnectParent("{7F8A48DD-F8AD-4F9C-8E6B-9E4D92DDB8F9}"); if ($this->ReadPropertyString("DeviceID") == "") { $this->SetStatus(104); // config error } else { $this->SetStatus(102); // OK } } /** * Required when using RequestAction */ public function RequestAction($Ident, $Value) { // Im Moment haben wir keine Action-Variablen // Wird aber von Symcon benötigt → also leer implementiert return; } /** * Wird vom MQTT Server aufgerufen wenn Daten ankommen */ public function ReceiveData(string $JSONString) { $buffer = json_decode($JSONString, true); if ($buffer === null) { IPS_LogMessage("Int_VGT", "Invalid JSON received."); return; } if (!isset($buffer['Topic']) || !isset($buffer['Payload'])) { IPS_LogMessage("Int_VGT", "Missing keys in buffer."); return; } $topic = $buffer['Topic']; $payload = $buffer['Payload']; IPS_LogMessage("Int_VGT", "MQTT RX: {$topic} → {$payload}"); $this->HandleIncoming($topic, $payload); } /** * Verarbeitet eingehende MQTT-Nachrichten */ private function HandleIncoming(string $topic, string $payload) { $deviceID = $this->ReadPropertyString("DeviceID"); if ($deviceID == "") { return; // no config } // 1) Feedback Request if ($topic === "feedback-request/{$deviceID}") { $response = json_encode([ "status" => "ok", "timestamp" => time() ]); $this->Publish("feedback-response/{$deviceID}", $response); return; } // 2) Remote Control Echo if ($topic === "remote-control-response/{$deviceID}") { $this->Publish("remote-control-feedback/{$deviceID}", $payload); return; } } /** * Publisht MQTT-Daten über das Gateway */ private function Publish(string $topic, string $payload) { $data = [ "DataID" => "{7F8A48DD-F8AD-4F9C-8E6B-9E4D92DDB8F9}", "Packet" => [ "Topic" => $topic, "Payload" => $payload, "QoS" => 0, "Retain" => false ] ]; IPS_LogMessage("Int_VGT", "MQTT TX: $topic → $payload"); $this->SendDataToParent(json_encode($data)); } } ?>