no message
This commit is contained in:
@@ -6,9 +6,9 @@
|
|||||||
"aliases": [
|
"aliases": [
|
||||||
"VGT MQTT Device"
|
"VGT MQTT Device"
|
||||||
],
|
],
|
||||||
"parentRequirements": ["{F66ADE63-8834-4178-8CA5-AE4465D2E252}"],
|
"parentRequirements": ["{F7A0DD2E-7684-95C0-64C2-D2A9DC47577B}"],
|
||||||
"childRequirements": [],
|
"childRequirements": [],
|
||||||
"implemented": ["{018EF6B5-AB94-40C6-AA53-46943E824ACF}"],
|
"implemented": ["{018EF6B5-AB94-40C6-AA53-46943E824ACF}"],
|
||||||
"prefix": "VGT",
|
"prefix": "VGT",
|
||||||
"version": "1.5"
|
"version": "1.6"
|
||||||
}
|
}
|
||||||
@@ -9,13 +9,14 @@ class VGT_Sub extends IPSModule
|
|||||||
parent::Create();
|
parent::Create();
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
// 1. MQTT Verbindungsdaten (werden an das Gateway durchgereicht)
|
// 1. MQTT Verbindungsdaten (für den IO/Socket)
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
$this->RegisterPropertyString('MQTTBaseTopic', 'Test VGT_Steuerung/Komm');
|
$this->RegisterPropertyString('MQTTBaseTopic', 'Test VGT_Steuerung/Komm');
|
||||||
$this->RegisterPropertyString('MQTTClientID', 'symcon_vgt_client');
|
$this->RegisterPropertyString('MQTTClientID', 'symcon_vgt_client');
|
||||||
$this->RegisterPropertyString('MQTTUser', '');
|
$this->RegisterPropertyString('MQTTUser', '');
|
||||||
$this->RegisterPropertyString('MQTTPassword', '');
|
$this->RegisterPropertyString('MQTTPassword', '');
|
||||||
$this->RegisterPropertyBoolean('UpdateGatewayConfig', true); // Schalter: Sollen wir das Gateway überschreiben?
|
// Checkbox: Sollen die IO-Daten überschrieben werden?
|
||||||
|
$this->RegisterPropertyBoolean('UpdateGatewayConfig', true);
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
// 2. Hardware Verknüpfungen
|
// 2. Hardware Verknüpfungen
|
||||||
@@ -34,7 +35,7 @@ class VGT_Sub extends IPSModule
|
|||||||
$this->RegisterVariableString('Strategy', 'Strategy', '', 10);
|
$this->RegisterVariableString('Strategy', 'Strategy', '', 10);
|
||||||
$this->RegisterVariableInteger('PowerSetpoint', 'Power Setpoint', '', 20);
|
$this->RegisterVariableInteger('PowerSetpoint', 'Power Setpoint', '', 20);
|
||||||
|
|
||||||
// Visu
|
// Visu (Nur zur Anzeige)
|
||||||
$this->RegisterVariableFloat('Visu_SoC', 'State of Charge', '~Intensity.100', 30);
|
$this->RegisterVariableFloat('Visu_SoC', 'State of Charge', '~Intensity.100', 30);
|
||||||
$this->RegisterVariableFloat('Visu_Production', 'Power Production', '~Watt', 40);
|
$this->RegisterVariableFloat('Visu_Production', 'Power Production', '~Watt', 40);
|
||||||
$this->RegisterVariableBoolean('Visu_IsReady', 'Is Ready', '~Switch', 50);
|
$this->RegisterVariableBoolean('Visu_IsReady', 'Is Ready', '~Switch', 50);
|
||||||
@@ -48,17 +49,17 @@ class VGT_Sub extends IPSModule
|
|||||||
parent::ApplyChanges();
|
parent::ApplyChanges();
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
// A. Filter setzen (Automatisches Subscribe)
|
// A. Filter setzen (Subscribe)
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
$topic = $this->ReadPropertyString('MQTTBaseTopic');
|
$topic = $this->ReadPropertyString('MQTTBaseTopic');
|
||||||
if($topic !== "") {
|
if($topic !== "") {
|
||||||
$cleanTopic = preg_quote($topic, '/');
|
$cleanTopic = preg_quote($topic, '/');
|
||||||
// Wir abonnieren ALLES unterhalb des BaseTopics
|
// Filter für den Splitter: Alles empfangen, was mit BaseTopic beginnt
|
||||||
$this->SetReceiveDataFilter(".*\"Topic\":\"" . $cleanTopic . "/.*\".*");
|
$this->SetReceiveDataFilter(".*\"Topic\":\"" . $cleanTopic . "/.*\".*");
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
// B. Gateway (IO) Konfiguration aktualisieren
|
// B. Gateway (IO/Socket) Konfiguration aktualisieren
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
if ($this->ReadPropertyBoolean('UpdateGatewayConfig')) {
|
if ($this->ReadPropertyBoolean('UpdateGatewayConfig')) {
|
||||||
$this->ConfigureGateway();
|
$this->ConfigureGateway();
|
||||||
@@ -76,45 +77,58 @@ class VGT_Sub extends IPSModule
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Diese Funktion sucht die IO-Instanz (MQTT Client) und setzt User/Passwort
|
* Sucht den IO (Socket) und setzt User/Passwort/ClientID
|
||||||
*/
|
*/
|
||||||
private function ConfigureGateway()
|
private function ConfigureGateway()
|
||||||
{
|
{
|
||||||
// 1. Suche Parent (MQTT Splitter)
|
// 1. Parent (Splitter) holen
|
||||||
$instance = IPS_GetInstance($this->InstanceID);
|
$instance = IPS_GetInstance($this->InstanceID);
|
||||||
$splitterID = $instance['ConnectionID'];
|
$splitterID = $instance['ConnectionID'];
|
||||||
|
|
||||||
if ($splitterID > 0) {
|
if ($splitterID > 0) {
|
||||||
// 2. Suche Grandparent (MQTT Client / IO)
|
// 2. Grandparent (IO / Client Socket) holen
|
||||||
$splitter = IPS_GetInstance($splitterID);
|
$splitter = IPS_GetInstance($splitterID);
|
||||||
$ioID = $splitter['ConnectionID'];
|
$ioID = $splitter['ConnectionID'];
|
||||||
|
|
||||||
if ($ioID > 0) {
|
if ($ioID > 0) {
|
||||||
// Prüfen, ob es ein MQTT Client ist (GUID prüfen oder einfach Eigenschaften setzen)
|
|
||||||
// Wir setzen die Eigenschaften, wenn sie existieren.
|
|
||||||
|
|
||||||
$user = $this->ReadPropertyString('MQTTUser');
|
$user = $this->ReadPropertyString('MQTTUser');
|
||||||
$pass = $this->ReadPropertyString('MQTTPassword');
|
$pass = $this->ReadPropertyString('MQTTPassword');
|
||||||
$client = $this->ReadPropertyString('MQTTClientID');
|
$client = $this->ReadPropertyString('MQTTClientID');
|
||||||
|
|
||||||
$hasChanged = false;
|
$hasChanged = false;
|
||||||
|
|
||||||
// ClientID (Achtung: Symcon MQTT Splitter nutzt ClientID meist im Splitter, nicht IO)
|
// --- 1. Benutzer/Passwort am IO setzen (meist MQTT Client Socket) ---
|
||||||
// Wir prüfen, wo die Property existiert.
|
// Prüfen ob Properties existieren, um Fehler zu vermeiden
|
||||||
|
|
||||||
// Versuch 1: IO Konfigurieren (User/Pass)
|
|
||||||
if (@IPS_GetProperty($ioID, 'Username') !== false) {
|
if (@IPS_GetProperty($ioID, 'Username') !== false) {
|
||||||
if (IPS_GetProperty($ioID, 'Username') != $user) { IPS_SetProperty($ioID, 'Username', $user); $hasChanged = true; }
|
if (IPS_GetProperty($ioID, 'Username') != $user) {
|
||||||
if (IPS_GetProperty($ioID, 'Password') != $pass) { IPS_SetProperty($ioID, 'Password', $pass); $hasChanged = true; }
|
IPS_SetProperty($ioID, 'Username', $user);
|
||||||
|
$hasChanged = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (@IPS_GetProperty($ioID, 'Password') !== false) {
|
||||||
|
if (IPS_GetProperty($ioID, 'Password') != $pass) {
|
||||||
|
IPS_SetProperty($ioID, 'Password', $pass);
|
||||||
|
$hasChanged = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Versuch 2: ClientID wird oft im Splitter (dem direkten Parent) konfiguriert
|
// --- 2. ClientID am Splitter setzen (oft ist ClientID im Splitter, nicht IO) ---
|
||||||
|
// Falls ClientID im Splitter definiert ist:
|
||||||
if (@IPS_GetProperty($splitterID, 'ClientID') !== false) {
|
if (@IPS_GetProperty($splitterID, 'ClientID') !== false) {
|
||||||
if (IPS_GetProperty($splitterID, 'ClientID') != $client) { IPS_SetProperty($splitterID, 'ClientID', $client); $hasChanged = true; } // Splitter neu laden
|
if (IPS_GetProperty($splitterID, 'ClientID') != $client) {
|
||||||
if ($hasChanged) IPS_ApplyChanges($splitterID);
|
IPS_SetProperty($splitterID, 'ClientID', $client);
|
||||||
|
IPS_ApplyChanges($splitterID); // Splitter sofort übernehmen
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Falls ClientID doch am IO ist:
|
||||||
|
elseif (@IPS_GetProperty($ioID, 'ClientID') !== false) {
|
||||||
|
if (IPS_GetProperty($ioID, 'ClientID') != $client) {
|
||||||
|
IPS_SetProperty($ioID, 'ClientID', $client);
|
||||||
|
$hasChanged = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Änderungen am IO übernehmen
|
// IO Änderungen speichern
|
||||||
if ($hasChanged) {
|
if ($hasChanged) {
|
||||||
IPS_ApplyChanges($ioID);
|
IPS_ApplyChanges($ioID);
|
||||||
}
|
}
|
||||||
@@ -123,7 +137,7 @@ class VGT_Sub extends IPSModule
|
|||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// MQTT Logik (unverändert)
|
// MQTT Logik
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
public function ReceiveData($JSONString)
|
public function ReceiveData($JSONString)
|
||||||
{
|
{
|
||||||
@@ -132,8 +146,7 @@ class VGT_Sub extends IPSModule
|
|||||||
$topic = $data->Topic;
|
$topic = $data->Topic;
|
||||||
$baseTopic = $this->ReadPropertyString('MQTTBaseTopic');
|
$baseTopic = $this->ReadPropertyString('MQTTBaseTopic');
|
||||||
|
|
||||||
// Debug
|
//$this->SendDebug('MQTT Received', "Topic: $topic | Payload: $payload", 0);
|
||||||
$this->SendDebug('MQTT Received', "Topic: $topic | Payload: $payload", 0);
|
|
||||||
|
|
||||||
if ($topic === $baseTopic . '/Writebefehl') {
|
if ($topic === $baseTopic . '/Writebefehl') {
|
||||||
$this->ProcessWriteCommand($payload);
|
$this->ProcessWriteCommand($payload);
|
||||||
@@ -187,7 +200,6 @@ class VGT_Sub extends IPSModule
|
|||||||
'power_setpoint' => $this->GetValue('PowerSetpoint'),
|
'power_setpoint' => $this->GetValue('PowerSetpoint'),
|
||||||
'strategy' => $this->GetValue('Strategy')
|
'strategy' => $this->GetValue('Strategy')
|
||||||
];
|
];
|
||||||
// Antwort senden
|
|
||||||
$this->SendMQTT($this->ReadPropertyString('MQTTBaseTopic') . '/Writebefehl Antwort', json_encode($output));
|
$this->SendMQTT($this->ReadPropertyString('MQTTBaseTopic') . '/Writebefehl Antwort', json_encode($output));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,7 +217,6 @@ class VGT_Sub extends IPSModule
|
|||||||
'min_soc' => $data['min_soc'],
|
'min_soc' => $data['min_soc'],
|
||||||
'max_soc' => $data['max_soc']
|
'max_soc' => $data['max_soc']
|
||||||
];
|
];
|
||||||
// Antwort senden
|
|
||||||
$this->SendMQTT($this->ReadPropertyString('MQTTBaseTopic') . '/Lesebefehl Antwort', json_encode($mqttData));
|
$this->SendMQTT($this->ReadPropertyString('MQTTBaseTopic') . '/Lesebefehl Antwort', json_encode($mqttData));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,13 +263,17 @@ class VGT_Sub extends IPSModule
|
|||||||
|
|
||||||
protected function SendMQTT($Topic, $Payload)
|
protected function SendMQTT($Topic, $Payload)
|
||||||
{
|
{
|
||||||
// Standard DataID für MQTT Publish an Splitter
|
// DataID für Symcon MQTT Publish.
|
||||||
|
// Falls der Schnittcher-Splitter eine andere ID will, könnte hier ein Fehler kommen.
|
||||||
|
// In den meisten Fällen funktioniert diese ID aber auch mit kompatiblen Splittern.
|
||||||
$Data['DataID'] = '{043EA491-0325-4ADD-8FC2-A30C8EEB4D3F}';
|
$Data['DataID'] = '{043EA491-0325-4ADD-8FC2-A30C8EEB4D3F}';
|
||||||
|
|
||||||
$Data['PacketType'] = 3;
|
$Data['PacketType'] = 3;
|
||||||
$Data['QualityOfService'] = 0;
|
$Data['QualityOfService'] = 0;
|
||||||
$Data['Retain'] = false;
|
$Data['Retain'] = false;
|
||||||
$Data['Topic'] = $Topic;
|
$Data['Topic'] = $Topic;
|
||||||
$Data['Payload'] = $Payload;
|
$Data['Payload'] = $Payload;
|
||||||
|
|
||||||
$JSON = json_encode($Data);
|
$JSON = json_encode($Data);
|
||||||
$this->SendDataToParent($JSON);
|
$this->SendDataToParent($JSON);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user